-   Notifications  
You must be signed in to change notification settings  - Fork 2.8k
 
fix: #2008 Fix agent memory leak using weakref #2014
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  
  DanieleMorotti wants to merge 1 commit into openai:main       Choose a base branch                                                 from DanieleMorotti:fix_agent_memory_leak                
 base: main
Could not load branches
    Branch not found: {{ refName }} 
     Loading  
 Could not load tags
   Nothing to show
        Loading  
 Are you sure you want to change the base?
 Some commits from the old base branch may be removed from the timeline, and old review comments may become outdated. 
    Open  
 Changes from all commits
 Commits 
  File filter
Filter by extension
Conversations
 Failed to load comments.  
    Loading  
 Jump to
  Jump to file  
  Failed to load files.  
    Loading  
 Diff view
Diff view
There are no files selected for viewing
   This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters   
        This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters   
     | Original file line number | Diff line number | Diff line change | 
|---|---|---|
| @@ -0,0 +1,34 @@ | ||
| from __future__ import annotations | ||
|   |  ||
| import gc | ||
| import weakref | ||
|   |  ||
| import pytest | ||
| from openai.types.responses import ResponseOutputMessage, ResponseOutputText | ||
|   |  ||
| from agents import Agent, Runner | ||
| from tests.fake_model import FakeModel | ||
|   |  ||
|   |  ||
| def _make_message(text: str) -> ResponseOutputMessage: | ||
| return ResponseOutputMessage( | ||
| id="msg-1", | ||
| content=[ResponseOutputText(annotations=[], text=text, type="output_text")], | ||
| role="assistant", | ||
| status="completed", | ||
| type="message", | ||
| ) | ||
|   |  ||
|   |  ||
| @pytest.mark.asyncio | ||
| async def test_agent_is_released_after_run() -> None: | ||
| fake_model = FakeModel(initial_output=[_make_message("Paris")]) | ||
| agent = Agent(name="leaker", instructions="Answer questions.", model=fake_model) | ||
| agent_ref = weakref.ref(agent) | ||
|   |  ||
| await Runner.run(agent, "What is the capital of France?") | ||
|   |  ||
| del agent | ||
| gc.collect() | ||
|   |  ||
| assert agent_ref() is None | 
 Add this suggestion to a batch that can be applied as a single commit. This suggestion is invalid because no changes were made to the code. Suggestions cannot be applied while the pull request is closed. Suggestions cannot be applied while viewing a subset of changes. Only one suggestion per line can be applied in a batch. Add this suggestion to a batch that can be applied as a single commit. Applying suggestions on deleted lines is not supported. You must change the existing code in this line in order to create a valid suggestion. Outdated suggestions cannot be applied. This suggestion has been applied or marked resolved. Suggestions cannot be applied from pending reviews. Suggestions cannot be applied on multi-line comments. Suggestions cannot be applied while the pull request is queued to merge. Suggestion cannot be applied right now. Please check back later.    
 
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.
The new weak‑reference logic in
RunItemBase.__post_init__storesagentin_agent_refand immediately deletes the only strong attribute, so aRunItemno longer retains the agent that produced it. Any item constructed with an inline agent (e.g. the fixtures created viaMessageOutputItem(agent=Agent(name="test"), ...)intests/test_items_helpers.py) now seesitem.agent is Noneas soon as the constructor returns, because no other strong references exist. Likewise, user code that keeps onlyresult.new_itemswhile discarding theAgentcannot executenew_item.agent.nameornew_item.source_agent.nameas inexamples/customer_service/main.py:157‑164; those attributes becomeNoneimmediately and raiseAttributeError. This regresses the documented contractagent: Agent[Any]and makes run items unusable once the caller lets the agent go. The fix needs to preserve a strong reference (or store the identifying metadata) instead of deleting the field, and the same applies to the handoffsource_agent/target_agentweakrefs below.Useful? React with 👍 / 👎.
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 is a fair point. I explored a solution, and this may be good to go:
@rm-openai do you have any thoughts?