-
Notifications
You must be signed in to change notification settings - Fork 3.1k
feat: #2228 Add tool origin tracking to ToolCallItem and ToolCallOutputItem #2242
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
base: main
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Codex Review
Here are some automated review suggestions for this pull request.
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
seratch
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Our current top priority is to merge HITL enhancement, which changes runner internals a lot. So, we may ask you to resolve the conflicts after the big PR is merged.
src/agents/agent.py
Outdated
|
|
||
| return run_result.final_output | ||
|
|
||
| # Set origin tracking on the FunctionTool created by @function_tool |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
it seems the code comment here is incorrect
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Changed to Set origin tracking on run_agent (the FunctionTool returned by @function_tool) for more clarity
src/agents/tool.py
Outdated
| mcp_server_name: str | None = None | ||
| """The name of the MCP server. Only set when type is MCP.""" | ||
|
|
||
| agent_as_tool_name: str | None = None |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This object may receive feature requests to have more properties, so simply having the reference to the agent object may be fine. Same for mcp_server_name too
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Makes sense. I've changed the implementation so that the objects are stored. I'm not too sure about the custom __repr__, below is an example of what ToolOrigin would look like with and without it. Let me know what you think.
Without a __repr__ method, ToolOrigin would look like:
- MCP
ToolOrigin(type=<ToolOriginType.MCP: 'mcp'>, mcp_server=<tests.mcp.helpers.FakeMCPServer object at 0x...>, agent_as_tool=None)
- Agent as tool:
ToolOrigin(type=<ToolOriginType.AGENT_AS_TOOL: 'agent_as_tool'>, mcp_server=None, agent_as_tool=Agent(name='test_agent', handoff_description=None, tools=[], mcp_servers=[], mcp_config={}, instructions='Test agent', prompt=None, handoffs=[], model=<tests.fake_model.FakeModel object at 0x...>, model_settings=ModelSettings(...), input_guardrails=[], output_guardrails=[], output_type=None, hooks=None, tool_use_behavior='run_llm_again', reset_tool_choice=True))
- Function:
ToolOrigin(type=<ToolOriginType.FUNCTION: 'function'>, mcp_server=None, agent_as_tool=None)
With the custom __repr__:
ToolOrigin(type='mcp', mcp_server_name='test_server')ToolOrigin(type='agent_as_tool', agent_as_tool_name='test_agent')ToolOrigin(type='function')
|
@codex review |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 8b2d12a8b0
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| mcp_server: MCPServer | None = None | ||
| """The MCP server object. Only set when type is MCP.""" | ||
|
|
||
| agent_as_tool: Agent[Any] | None = None | ||
| """The agent object. Only set when type is AGENT_AS_TOOL.""" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Avoid retaining nested agents via tool_origin
ToolOrigin stores a strong reference to agent_as_tool, and ToolCallItem/ToolCallOutputItem now keep a ToolOrigin. RunResult.release_agents() only clears item.agent (and a few handoff refs), so if a caller keeps new_items from an agent-as-tool run and calls release_agents(), the nested agent graph is still strongly referenced and won’t be GC’d. This defeats the memory-release mechanism and can cause unbounded retention in long-running processes. Consider using a weakref for agent_as_tool or clearing it in ToolCallItem.release_agent/ToolCallOutputItem.release_agent.
Useful? React with 👍 / 👎.
Adds
tool_originfield toToolCallItemandToolCallOutputItemto track where function tools came from (regular functions, MCP servers, or agent-as-tool). This helps with debugging and tracing which MCP server handled a call when using multiple servers.The
tool_originis aToolOriginobject that contains:type: The origin type (FUNCTION,MCP, orAGENT_AS_TOOL)mcp_server_name: The MCP server name (only set for MCP tools)agent_as_tool_name: The agent name (only set for agent-as-tool)New tests added
Closes #2228