Skip to content

add tool result call #2118

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 58 additions & 7 deletions py/core/agent/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -557,17 +557,68 @@ async def sse_generator() -> AsyncGenerator[str, None]:
calls_list, partial_text_buffer
)

# (c) Execute each tool call in parallel
await asyncio.gather(
*[
self.handle_function_or_tool_call(
# (c) Execute each tool call and emit tool result events
for c in calls_list:
try:
tool_result = await self.handle_function_or_tool_call(
c["name"],
c["arguments"],
tool_id=c["tool_call_id"],
save_messages=True, # Set to True to add tool results to conversation
)
for c in calls_list
]
)
result_content = tool_result.llm_formatted_result
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The variable result_content is assigned but not used later. If unnecessary, consider removing it to clean up the code.

Suggested change
result_content = tool_result.llm_formatted_result


# Extract the ids from the tool tool_result.content
ids = self.BRACKET_PATTERN.findall(tool_result.llm_formatted_result)
# Get the raw result from source_collector
raw_results = []
for id in ids:
raw_result = self.search_results_collector.find_by_short_id(
id
)
if raw_result:
raw_results.append(raw_result)

# Create the result data with raw results
result_data = {
"tool_call_id": c["tool_call_id"],
"role": "tool",
"content": json.dumps(raw_results),
}

# Emit SSE tool result event
async for line in SSEFormatter.yield_tool_result_event(
result_data
):
yield line
except Exception as e:
error_content = f"Error in tool '{c['name']}': {str(e)}"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the exception block, the error is both logged and added to conversation. Ensure that sensitive error details are not exposed to clients if that is a concern.

Suggested change
error_content = f"Error in tool '{c['name']}': {str(e)}"
error_content = f"Error in tool '{c['name']}': An unexpected error occurred."

logger.error(error_content)

# Add error message to conversation
await self.conversation.add_message(
Message(
role="tool",
content=error_content,
name=c["name"],
tool_call_id=c["tool_call_id"],
)
)

# Emit error as tool result
result_data = {
"tool_call_id": c["tool_call_id"],
"role": "tool",
"content": json.dumps(
convert_nonserializable_objects(
error_content
)
),
}
async for line in SSEFormatter.yield_tool_result_event(
result_data
):
yield line

# Reset buffer & calls
pending_tool_calls.clear()
Expand Down