Skip to content

fix: close model providers created by Runner - #4785

Open
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/close-runner-owned-model-provider
Open

fix: close model providers created by Runner#4785
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/close-runner-owned-model-provider

Conversation

@Excelius-Wang

Copy link
Copy Markdown
Contributor

Summary

This pull request fixes a resource leak when Runner creates the default model provider for a
single run. Direct Responses WebSocket runs could finish successfully while the provider retained
its cached connection because the existing provider aclose() chain was never called.

Runner now closes only providers it creates implicitly after async, sync, or streamed execution
settles. A caller-supplied RunConfig or model_provider remains caller-owned and reusable, and
cleanup preserves the primary result, exception, and cancellation behavior.

Test plan

  • Added lifecycle coverage for implicit and explicit provider ownership, sync and async runs,
    streamed completion, cancellation, repeated cancellation, cancel-before-start, cleanup failure,
    sandbox wrapping, and a real loopback Responses WebSocket connection.
  • Ran .agents/skills/code-change-verification/scripts/run.sh: format, lint, mypy, pyright, and the
    full test suite passed (9301 passed, 29 skipped).

Issue number

N/A

Checks

  • I've added new tests, if relevant
  • I've run .agents/skills/code-change-verification/scripts/run.sh
  • I've confirmed all verification steps pass
  • If using Codex, I've run /review before submitting this PR

@chatgpt-codex-connector

chatgpt-codex-connectorBot commented Aug 30, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

ReviewStatusCommitReview trigger
📝 Code ReviewCompleted2026-08-31T03:24:21.727741Z99853c0New commits
🔒 Security ReviewCompleted2026-08-31T03:25:41.414262Z99853c0New commits
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

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:55c0e3874f

ℹ️ 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".

Comment threadsrc/agents/run.py Outdated
Comment on lines +550 to +552
def _normalize_run_config_for_runner(
value: RunConfig | dict[str, Any] | None,
) -> tuple[RunConfig, bool]:

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Move provider cleanup policy into run_internal

Move the new ownership normalization and cancellation-resistant provider cleanup helpers into src/agents/run_internal/ and leave only their orchestration calls here. These functions introduce substantive resource-lifecycle policy directly into the public runtime entrypoint, contrary to the repository requirement that new runtime logic live under run_internal; keeping them here further concentrates lifecycle behavior in the already-large run.py.

AGENTS.md reference: AGENTS.md:L190-L191

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Thanks — moved the run-config ownership normalization and cancellation-resistant provider cleanup helpers into src/agents/run_internal/model_provider_lifecycle.py. src/agents/run.py now retains only the orchestration imports and call sites, with behavior and coverage unchanged.

@seratchseratch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Please move the ownership normalization and cancellation-resistant provider cleanup policy out of run.py and into run_internal/, leaving only orchestration calls in the public runtime entrypoint.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Excelius-Wang@seratch
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
fix: close model providers created by Runner by Excelius-Wang · Pull Request #4785 · openai/openai-agents-python · GitHub
Skip to content

fix: close model providers created by Runner - #4785

Open
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/close-runner-owned-model-provider
Open

fix: close model providers created by Runner#4785
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/close-runner-owned-model-provider

Conversation

@Excelius-Wang

Copy link
Copy Markdown
Contributor

Summary

This pull request fixes a resource leak when Runner creates the default model provider for a
single run. Direct Responses WebSocket runs could finish successfully while the provider retained
its cached connection because the existing provider aclose() chain was never called.

Runner now closes only providers it creates implicitly after async, sync, or streamed execution
settles. A caller-supplied RunConfig or model_provider remains caller-owned and reusable, and
cleanup preserves the primary result, exception, and cancellation behavior.

Test plan

  • Added lifecycle coverage for implicit and explicit provider ownership, sync and async runs,
    streamed completion, cancellation, repeated cancellation, cancel-before-start, cleanup failure,
    sandbox wrapping, and a real loopback Responses WebSocket connection.
  • Ran .agents/skills/code-change-verification/scripts/run.sh: format, lint, mypy, pyright, and the
    full test suite passed (9301 passed, 29 skipped).

Issue number

N/A

Checks

  • I've added new tests, if relevant
  • I've run .agents/skills/code-change-verification/scripts/run.sh
  • I've confirmed all verification steps pass
  • If using Codex, I've run /review before submitting this PR

@chatgpt-codex-connector

chatgpt-codex-connectorBot commented Aug 30, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

ReviewStatusCommitReview trigger
📝 Code ReviewCompleted2026-08-31T03:24:21.727741Z99853c0New commits
🔒 Security ReviewCompleted2026-08-31T03:25:41.414262Z99853c0New commits
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

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:55c0e3874f

ℹ️ 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".

Comment threadsrc/agents/run.py Outdated
Comment on lines +550 to +552
def _normalize_run_config_for_runner(
value: RunConfig | dict[str, Any] | None,
) -> tuple[RunConfig, bool]:

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Move provider cleanup policy into run_internal

Move the new ownership normalization and cancellation-resistant provider cleanup helpers into src/agents/run_internal/ and leave only their orchestration calls here. These functions introduce substantive resource-lifecycle policy directly into the public runtime entrypoint, contrary to the repository requirement that new runtime logic live under run_internal; keeping them here further concentrates lifecycle behavior in the already-large run.py.

AGENTS.md reference: AGENTS.md:L190-L191

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Thanks — moved the run-config ownership normalization and cancellation-resistant provider cleanup helpers into src/agents/run_internal/model_provider_lifecycle.py. src/agents/run.py now retains only the orchestration imports and call sites, with behavior and coverage unchanged.

@seratchseratch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Please move the ownership normalization and cancellation-resistant provider cleanup policy out of run.py and into run_internal/, leaving only orchestration calls in the public runtime entrypoint.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Excelius-Wang@seratch
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix: close model providers created by Runner by Excelius-Wang · Pull Request #4785 · openai/openai-agents-python · GitHub
Skip to content

fix: close model providers created by Runner - #4785

Open
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/close-runner-owned-model-provider
Open

fix: close model providers created by Runner#4785
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/close-runner-owned-model-provider

Conversation

@Excelius-Wang

Copy link
Copy Markdown
Contributor

Summary

This pull request fixes a resource leak when Runner creates the default model provider for a
single run. Direct Responses WebSocket runs could finish successfully while the provider retained
its cached connection because the existing provider aclose() chain was never called.

Runner now closes only providers it creates implicitly after async, sync, or streamed execution
settles. A caller-supplied RunConfig or model_provider remains caller-owned and reusable, and
cleanup preserves the primary result, exception, and cancellation behavior.

Test plan

  • Added lifecycle coverage for implicit and explicit provider ownership, sync and async runs,
    streamed completion, cancellation, repeated cancellation, cancel-before-start, cleanup failure,
    sandbox wrapping, and a real loopback Responses WebSocket connection.
  • Ran .agents/skills/code-change-verification/scripts/run.sh: format, lint, mypy, pyright, and the
    full test suite passed (9301 passed, 29 skipped).

Issue number

N/A

Checks

  • I've added new tests, if relevant
  • I've run .agents/skills/code-change-verification/scripts/run.sh
  • I've confirmed all verification steps pass
  • If using Codex, I've run /review before submitting this PR

@chatgpt-codex-connector

chatgpt-codex-connectorBot commented Aug 30, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

ReviewStatusCommitReview trigger
📝 Code ReviewCompleted2026-08-31T03:24:21.727741Z99853c0New commits
🔒 Security ReviewCompleted2026-08-31T03:25:41.414262Z99853c0New commits
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

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:55c0e3874f

ℹ️ 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".

Comment threadsrc/agents/run.py Outdated
Comment on lines +550 to +552
def _normalize_run_config_for_runner(
value: RunConfig | dict[str, Any] | None,
) -> tuple[RunConfig, bool]:

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Move provider cleanup policy into run_internal

Move the new ownership normalization and cancellation-resistant provider cleanup helpers into src/agents/run_internal/ and leave only their orchestration calls here. These functions introduce substantive resource-lifecycle policy directly into the public runtime entrypoint, contrary to the repository requirement that new runtime logic live under run_internal; keeping them here further concentrates lifecycle behavior in the already-large run.py.

AGENTS.md reference: AGENTS.md:L190-L191

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Thanks — moved the run-config ownership normalization and cancellation-resistant provider cleanup helpers into src/agents/run_internal/model_provider_lifecycle.py. src/agents/run.py now retains only the orchestration imports and call sites, with behavior and coverage unchanged.

@seratchseratch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Please move the ownership normalization and cancellation-resistant provider cleanup policy out of run.py and into run_internal/, leaving only orchestration calls in the public runtime entrypoint.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Excelius-Wang@seratch
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix: close model providers created by Runner by Excelius-Wang · Pull Request #4785 · openai/openai-agents-python · GitHub
Skip to content

fix: close model providers created by Runner - #4785

Open
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/close-runner-owned-model-provider
Open

fix: close model providers created by Runner#4785
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/close-runner-owned-model-provider

Conversation

@Excelius-Wang

Copy link
Copy Markdown
Contributor

Summary

This pull request fixes a resource leak when Runner creates the default model provider for a
single run. Direct Responses WebSocket runs could finish successfully while the provider retained
its cached connection because the existing provider aclose() chain was never called.

Runner now closes only providers it creates implicitly after async, sync, or streamed execution
settles. A caller-supplied RunConfig or model_provider remains caller-owned and reusable, and
cleanup preserves the primary result, exception, and cancellation behavior.

Test plan

  • Added lifecycle coverage for implicit and explicit provider ownership, sync and async runs,
    streamed completion, cancellation, repeated cancellation, cancel-before-start, cleanup failure,
    sandbox wrapping, and a real loopback Responses WebSocket connection.
  • Ran .agents/skills/code-change-verification/scripts/run.sh: format, lint, mypy, pyright, and the
    full test suite passed (9301 passed, 29 skipped).

Issue number

N/A

Checks

  • I've added new tests, if relevant
  • I've run .agents/skills/code-change-verification/scripts/run.sh
  • I've confirmed all verification steps pass
  • If using Codex, I've run /review before submitting this PR

@chatgpt-codex-connector

chatgpt-codex-connectorBot commented Aug 30, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

ReviewStatusCommitReview trigger
📝 Code ReviewCompleted2026-08-31T03:24:21.727741Z99853c0New commits
🔒 Security ReviewCompleted2026-08-31T03:25:41.414262Z99853c0New commits
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

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:55c0e3874f

ℹ️ 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".

Comment threadsrc/agents/run.py Outdated
Comment on lines +550 to +552
def _normalize_run_config_for_runner(
value: RunConfig | dict[str, Any] | None,
) -> tuple[RunConfig, bool]:

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Move provider cleanup policy into run_internal

Move the new ownership normalization and cancellation-resistant provider cleanup helpers into src/agents/run_internal/ and leave only their orchestration calls here. These functions introduce substantive resource-lifecycle policy directly into the public runtime entrypoint, contrary to the repository requirement that new runtime logic live under run_internal; keeping them here further concentrates lifecycle behavior in the already-large run.py.

AGENTS.md reference: AGENTS.md:L190-L191

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Thanks — moved the run-config ownership normalization and cancellation-resistant provider cleanup helpers into src/agents/run_internal/model_provider_lifecycle.py. src/agents/run.py now retains only the orchestration imports and call sites, with behavior and coverage unchanged.

@seratchseratch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Please move the ownership normalization and cancellation-resistant provider cleanup policy out of run.py and into run_internal/, leaving only orchestration calls in the public runtime entrypoint.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Excelius-Wang@seratch
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' fix: close model providers created by Runner by Excelius-Wang · Pull Request #4785 · openai/openai-agents-python · GitHub
Skip to content

fix: close model providers created by Runner - #4785

Open
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/close-runner-owned-model-provider
Open

fix: close model providers created by Runner#4785
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/close-runner-owned-model-provider

Conversation

@Excelius-Wang

Copy link
Copy Markdown
Contributor

Summary

This pull request fixes a resource leak when Runner creates the default model provider for a
single run. Direct Responses WebSocket runs could finish successfully while the provider retained
its cached connection because the existing provider aclose() chain was never called.

Runner now closes only providers it creates implicitly after async, sync, or streamed execution
settles. A caller-supplied RunConfig or model_provider remains caller-owned and reusable, and
cleanup preserves the primary result, exception, and cancellation behavior.

Test plan

  • Added lifecycle coverage for implicit and explicit provider ownership, sync and async runs,
    streamed completion, cancellation, repeated cancellation, cancel-before-start, cleanup failure,
    sandbox wrapping, and a real loopback Responses WebSocket connection.
  • Ran .agents/skills/code-change-verification/scripts/run.sh: format, lint, mypy, pyright, and the
    full test suite passed (9301 passed, 29 skipped).

Issue number

N/A

Checks

  • I've added new tests, if relevant
  • I've run .agents/skills/code-change-verification/scripts/run.sh
  • I've confirmed all verification steps pass
  • If using Codex, I've run /review before submitting this PR

@chatgpt-codex-connector

chatgpt-codex-connectorBot commented Aug 30, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

ReviewStatusCommitReview trigger
📝 Code ReviewCompleted2026-08-31T03:24:21.727741Z99853c0New commits
🔒 Security ReviewCompleted2026-08-31T03:25:41.414262Z99853c0New commits
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

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:55c0e3874f

ℹ️ 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".

Comment threadsrc/agents/run.py Outdated
Comment on lines +550 to +552
def _normalize_run_config_for_runner(
value: RunConfig | dict[str, Any] | None,
) -> tuple[RunConfig, bool]:

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Move provider cleanup policy into run_internal

Move the new ownership normalization and cancellation-resistant provider cleanup helpers into src/agents/run_internal/ and leave only their orchestration calls here. These functions introduce substantive resource-lifecycle policy directly into the public runtime entrypoint, contrary to the repository requirement that new runtime logic live under run_internal; keeping them here further concentrates lifecycle behavior in the already-large run.py.

AGENTS.md reference: AGENTS.md:L190-L191

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Thanks — moved the run-config ownership normalization and cancellation-resistant provider cleanup helpers into src/agents/run_internal/model_provider_lifecycle.py. src/agents/run.py now retains only the orchestration imports and call sites, with behavior and coverage unchanged.

@seratchseratch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Please move the ownership normalization and cancellation-resistant provider cleanup policy out of run.py and into run_internal/, leaving only orchestration calls in the public runtime entrypoint.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Excelius-Wang@seratch
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix: close model providers created by Runner by Excelius-Wang · Pull Request #4785 · openai/openai-agents-python · GitHub
Skip to content

fix: close model providers created by Runner - #4785

Open
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/close-runner-owned-model-provider
Open

fix: close model providers created by Runner#4785
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/close-runner-owned-model-provider

Conversation

@Excelius-Wang

Copy link
Copy Markdown
Contributor

Summary

This pull request fixes a resource leak when Runner creates the default model provider for a
single run. Direct Responses WebSocket runs could finish successfully while the provider retained
its cached connection because the existing provider aclose() chain was never called.

Runner now closes only providers it creates implicitly after async, sync, or streamed execution
settles. A caller-supplied RunConfig or model_provider remains caller-owned and reusable, and
cleanup preserves the primary result, exception, and cancellation behavior.

Test plan

  • Added lifecycle coverage for implicit and explicit provider ownership, sync and async runs,
    streamed completion, cancellation, repeated cancellation, cancel-before-start, cleanup failure,
    sandbox wrapping, and a real loopback Responses WebSocket connection.
  • Ran .agents/skills/code-change-verification/scripts/run.sh: format, lint, mypy, pyright, and the
    full test suite passed (9301 passed, 29 skipped).

Issue number

N/A

Checks

  • I've added new tests, if relevant
  • I've run .agents/skills/code-change-verification/scripts/run.sh
  • I've confirmed all verification steps pass
  • If using Codex, I've run /review before submitting this PR

@chatgpt-codex-connector

chatgpt-codex-connectorBot commented Aug 30, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

ReviewStatusCommitReview trigger
📝 Code ReviewCompleted2026-08-31T03:24:21.727741Z99853c0New commits
🔒 Security ReviewCompleted2026-08-31T03:25:41.414262Z99853c0New commits
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

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:55c0e3874f

ℹ️ 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".

Comment threadsrc/agents/run.py Outdated
Comment on lines +550 to +552
def _normalize_run_config_for_runner(
value: RunConfig | dict[str, Any] | None,
) -> tuple[RunConfig, bool]:

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Move provider cleanup policy into run_internal

Move the new ownership normalization and cancellation-resistant provider cleanup helpers into src/agents/run_internal/ and leave only their orchestration calls here. These functions introduce substantive resource-lifecycle policy directly into the public runtime entrypoint, contrary to the repository requirement that new runtime logic live under run_internal; keeping them here further concentrates lifecycle behavior in the already-large run.py.

AGENTS.md reference: AGENTS.md:L190-L191

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Thanks — moved the run-config ownership normalization and cancellation-resistant provider cleanup helpers into src/agents/run_internal/model_provider_lifecycle.py. src/agents/run.py now retains only the orchestration imports and call sites, with behavior and coverage unchanged.

@seratchseratch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Please move the ownership normalization and cancellation-resistant provider cleanup policy out of run.py and into run_internal/, leaving only orchestration calls in the public runtime entrypoint.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Excelius-Wang@seratch
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix: close model providers created by Runner by Excelius-Wang · Pull Request #4785 · openai/openai-agents-python · GitHub
Skip to content

fix: close model providers created by Runner - #4785

Open
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/close-runner-owned-model-provider
Open

fix: close model providers created by Runner#4785
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/close-runner-owned-model-provider

Conversation

@Excelius-Wang

Copy link
Copy Markdown
Contributor

Summary

This pull request fixes a resource leak when Runner creates the default model provider for a
single run. Direct Responses WebSocket runs could finish successfully while the provider retained
its cached connection because the existing provider aclose() chain was never called.

Runner now closes only providers it creates implicitly after async, sync, or streamed execution
settles. A caller-supplied RunConfig or model_provider remains caller-owned and reusable, and
cleanup preserves the primary result, exception, and cancellation behavior.

Test plan

  • Added lifecycle coverage for implicit and explicit provider ownership, sync and async runs,
    streamed completion, cancellation, repeated cancellation, cancel-before-start, cleanup failure,
    sandbox wrapping, and a real loopback Responses WebSocket connection.
  • Ran .agents/skills/code-change-verification/scripts/run.sh: format, lint, mypy, pyright, and the
    full test suite passed (9301 passed, 29 skipped).

Issue number

N/A

Checks

  • I've added new tests, if relevant
  • I've run .agents/skills/code-change-verification/scripts/run.sh
  • I've confirmed all verification steps pass
  • If using Codex, I've run /review before submitting this PR

@chatgpt-codex-connector

chatgpt-codex-connectorBot commented Aug 30, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

ReviewStatusCommitReview trigger
📝 Code ReviewCompleted2026-08-31T03:24:21.727741Z99853c0New commits
🔒 Security ReviewCompleted2026-08-31T03:25:41.414262Z99853c0New commits
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

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:55c0e3874f

ℹ️ 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".

Comment threadsrc/agents/run.py Outdated
Comment on lines +550 to +552
def _normalize_run_config_for_runner(
value: RunConfig | dict[str, Any] | None,
) -> tuple[RunConfig, bool]:

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Move provider cleanup policy into run_internal

Move the new ownership normalization and cancellation-resistant provider cleanup helpers into src/agents/run_internal/ and leave only their orchestration calls here. These functions introduce substantive resource-lifecycle policy directly into the public runtime entrypoint, contrary to the repository requirement that new runtime logic live under run_internal; keeping them here further concentrates lifecycle behavior in the already-large run.py.

AGENTS.md reference: AGENTS.md:L190-L191

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Thanks — moved the run-config ownership normalization and cancellation-resistant provider cleanup helpers into src/agents/run_internal/model_provider_lifecycle.py. src/agents/run.py now retains only the orchestration imports and call sites, with behavior and coverage unchanged.

@seratchseratch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Please move the ownership normalization and cancellation-resistant provider cleanup policy out of run.py and into run_internal/, leaving only orchestration calls in the public runtime entrypoint.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Excelius-Wang@seratch
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); fix: close model providers created by Runner by Excelius-Wang · Pull Request #4785 · openai/openai-agents-python · GitHub
Skip to content

fix: close model providers created by Runner - #4785

Open
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/close-runner-owned-model-provider
Open

fix: close model providers created by Runner#4785
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/close-runner-owned-model-provider

Conversation

@Excelius-Wang

Copy link
Copy Markdown
Contributor

Summary

This pull request fixes a resource leak when Runner creates the default model provider for a
single run. Direct Responses WebSocket runs could finish successfully while the provider retained
its cached connection because the existing provider aclose() chain was never called.

Runner now closes only providers it creates implicitly after async, sync, or streamed execution
settles. A caller-supplied RunConfig or model_provider remains caller-owned and reusable, and
cleanup preserves the primary result, exception, and cancellation behavior.

Test plan

  • Added lifecycle coverage for implicit and explicit provider ownership, sync and async runs,
    streamed completion, cancellation, repeated cancellation, cancel-before-start, cleanup failure,
    sandbox wrapping, and a real loopback Responses WebSocket connection.
  • Ran .agents/skills/code-change-verification/scripts/run.sh: format, lint, mypy, pyright, and the
    full test suite passed (9301 passed, 29 skipped).

Issue number

N/A

Checks

  • I've added new tests, if relevant
  • I've run .agents/skills/code-change-verification/scripts/run.sh
  • I've confirmed all verification steps pass
  • If using Codex, I've run /review before submitting this PR

@chatgpt-codex-connector

chatgpt-codex-connectorBot commented Aug 30, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

ReviewStatusCommitReview trigger
📝 Code ReviewCompleted2026-08-31T03:24:21.727741Z99853c0New commits
🔒 Security ReviewCompleted2026-08-31T03:25:41.414262Z99853c0New commits
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

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:55c0e3874f

ℹ️ 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".

Comment threadsrc/agents/run.py Outdated
Comment on lines +550 to +552
def _normalize_run_config_for_runner(
value: RunConfig | dict[str, Any] | None,
) -> tuple[RunConfig, bool]:

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Move provider cleanup policy into run_internal

Move the new ownership normalization and cancellation-resistant provider cleanup helpers into src/agents/run_internal/ and leave only their orchestration calls here. These functions introduce substantive resource-lifecycle policy directly into the public runtime entrypoint, contrary to the repository requirement that new runtime logic live under run_internal; keeping them here further concentrates lifecycle behavior in the already-large run.py.

AGENTS.md reference: AGENTS.md:L190-L191

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

Thanks — moved the run-config ownership normalization and cancellation-resistant provider cleanup helpers into src/agents/run_internal/model_provider_lifecycle.py. src/agents/run.py now retains only the orchestration imports and call sites, with behavior and coverage unchanged.

@seratchseratch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Please move the ownership normalization and cancellation-resistant provider cleanup policy out of run.py and into run_internal/, leaving only orchestration calls in the public runtime entrypoint.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Excelius-Wang@seratch