Skip to content

fix: settle conversation deletion before propagating cancellation - #4790

Open
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/conversations-clear-cancellation
Open

fix: settle conversation deletion before propagating cancellation#4790
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/conversations-clear-cancellation

Conversation

@Excelius-Wang

@Excelius-WangExcelius-Wang commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Summary

This pull request fixes a cancellation race in OpenAIConversationsSession.clear_session(). If caller cancellation arrives after the Conversations API commits deletion but before the response is received, the method now settles the in-flight delete before re-raising cancellation. This prevents later session operations from reusing a deleted conversation ID and receiving a 404.

If an application installs a replacement through the released public session_id setter while deletion is settling, cleanup now clears the local ID only when it still matches the conversation that was deleted. The replacement therefore survives and is used by the next public session operation.

The fix moves the existing cancellation-safe _await_mutation helper to the neutral session module, preserves the existing SQLite import path through an explicit re-export, and adds controlled regression coverage for both lazy reinitialization and public setter replacement.

Test plan

  • Focused session and import-side-effect suite: 95 passed
  • Targeted Ruff and mypy across 8 runtime/helper consumers
  • make tests-review: 9,345 passed, 33 skipped
  • Repository make format, make lint, and make typecheck passed
  • Default make tests: 9,288 passed and 29 skipped; four unrelated review_optional AdvancedSQLiteSession multiprocessing timing assertions failed under host scheduling, and the complete affected five-case parameter set passed serially
  • Real TCP reproduction: cancellation propagated, deletion settled, and the next public operation created a new conversation

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 31, 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-31T06:50:05.585451Z1094699Manual request
🔒 Security ReviewCompleted2026-08-31T06:53:50.164503Z1094699Manual request
ℹ️ 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:863061ec0d

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

await self._openai_client.conversations.delete(
conversation_id=session_id,
)
self._session_id = None

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Clear only the conversation ID that was deleted

If another task assigns a replacement ID through the public session_id setter after clear_session() is cancelled but before the remote deletion finishes, the surviving delete task unconditionally resets that replacement to None. The next session operation then creates another conversation instead of using the caller's replacement; compare _session_id with the captured session_id before clearing it, or serialize setter updates with the same lock.

AGENTS.md reference: AGENTS.md:L149-L149

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 for catching this. The settled delete now clears the local ID only when it still matches the conversation that was deleted, so a replacement installed through the public session_id setter survives. I also added a controlled cancellation regression test that rebinds the session before deletion completes and verifies that the next public write uses the replacement without creating another conversation.

Validation for the updated diff: the focused session/import suite passes 95 tests, targeted Ruff and mypy pass, and make tests-review passes 9,345 tests with 33 skipped. The required wrapper's format, lint, and typecheck stages pass; its default test run reached 9,288 passed and 29 skipped with four unrelated review_optional AdvancedSQLiteSession multiprocessing timing failures, whose complete five-case parameter set passes serially.

@Excelius-Wang

Copy link
Copy Markdown
ContributorAuthor

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Nice work!

Reviewed commit:1094699ccb

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

@chatgpt-codex-connector

Copy link
Copy Markdown

Security review completed. No security issues were found in this pull request.

Reviewed commit:1094699ccb

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Excelius-Wang
, '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: settle conversation deletion before propagating cancellation by Excelius-Wang · Pull Request #4790 · openai/openai-agents-python · GitHub
Skip to content

fix: settle conversation deletion before propagating cancellation - #4790

Open
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/conversations-clear-cancellation
Open

fix: settle conversation deletion before propagating cancellation#4790
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/conversations-clear-cancellation

Conversation

@Excelius-Wang

@Excelius-WangExcelius-Wang commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Summary

This pull request fixes a cancellation race in OpenAIConversationsSession.clear_session(). If caller cancellation arrives after the Conversations API commits deletion but before the response is received, the method now settles the in-flight delete before re-raising cancellation. This prevents later session operations from reusing a deleted conversation ID and receiving a 404.

If an application installs a replacement through the released public session_id setter while deletion is settling, cleanup now clears the local ID only when it still matches the conversation that was deleted. The replacement therefore survives and is used by the next public session operation.

The fix moves the existing cancellation-safe _await_mutation helper to the neutral session module, preserves the existing SQLite import path through an explicit re-export, and adds controlled regression coverage for both lazy reinitialization and public setter replacement.

Test plan

  • Focused session and import-side-effect suite: 95 passed
  • Targeted Ruff and mypy across 8 runtime/helper consumers
  • make tests-review: 9,345 passed, 33 skipped
  • Repository make format, make lint, and make typecheck passed
  • Default make tests: 9,288 passed and 29 skipped; four unrelated review_optional AdvancedSQLiteSession multiprocessing timing assertions failed under host scheduling, and the complete affected five-case parameter set passed serially
  • Real TCP reproduction: cancellation propagated, deletion settled, and the next public operation created a new conversation

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 31, 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-31T06:50:05.585451Z1094699Manual request
🔒 Security ReviewCompleted2026-08-31T06:53:50.164503Z1094699Manual request
ℹ️ 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:863061ec0d

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

await self._openai_client.conversations.delete(
conversation_id=session_id,
)
self._session_id = None

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Clear only the conversation ID that was deleted

If another task assigns a replacement ID through the public session_id setter after clear_session() is cancelled but before the remote deletion finishes, the surviving delete task unconditionally resets that replacement to None. The next session operation then creates another conversation instead of using the caller's replacement; compare _session_id with the captured session_id before clearing it, or serialize setter updates with the same lock.

AGENTS.md reference: AGENTS.md:L149-L149

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 for catching this. The settled delete now clears the local ID only when it still matches the conversation that was deleted, so a replacement installed through the public session_id setter survives. I also added a controlled cancellation regression test that rebinds the session before deletion completes and verifies that the next public write uses the replacement without creating another conversation.

Validation for the updated diff: the focused session/import suite passes 95 tests, targeted Ruff and mypy pass, and make tests-review passes 9,345 tests with 33 skipped. The required wrapper's format, lint, and typecheck stages pass; its default test run reached 9,288 passed and 29 skipped with four unrelated review_optional AdvancedSQLiteSession multiprocessing timing failures, whose complete five-case parameter set passes serially.

@Excelius-Wang

Copy link
Copy Markdown
ContributorAuthor

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Nice work!

Reviewed commit:1094699ccb

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

@chatgpt-codex-connector

Copy link
Copy Markdown

Security review completed. No security issues were found in this pull request.

Reviewed commit:1094699ccb

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Excelius-Wang
, '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: settle conversation deletion before propagating cancellation by Excelius-Wang · Pull Request #4790 · openai/openai-agents-python · GitHub
Skip to content

fix: settle conversation deletion before propagating cancellation - #4790

Open
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/conversations-clear-cancellation
Open

fix: settle conversation deletion before propagating cancellation#4790
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/conversations-clear-cancellation

Conversation

@Excelius-Wang

@Excelius-WangExcelius-Wang commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Summary

This pull request fixes a cancellation race in OpenAIConversationsSession.clear_session(). If caller cancellation arrives after the Conversations API commits deletion but before the response is received, the method now settles the in-flight delete before re-raising cancellation. This prevents later session operations from reusing a deleted conversation ID and receiving a 404.

If an application installs a replacement through the released public session_id setter while deletion is settling, cleanup now clears the local ID only when it still matches the conversation that was deleted. The replacement therefore survives and is used by the next public session operation.

The fix moves the existing cancellation-safe _await_mutation helper to the neutral session module, preserves the existing SQLite import path through an explicit re-export, and adds controlled regression coverage for both lazy reinitialization and public setter replacement.

Test plan

  • Focused session and import-side-effect suite: 95 passed
  • Targeted Ruff and mypy across 8 runtime/helper consumers
  • make tests-review: 9,345 passed, 33 skipped
  • Repository make format, make lint, and make typecheck passed
  • Default make tests: 9,288 passed and 29 skipped; four unrelated review_optional AdvancedSQLiteSession multiprocessing timing assertions failed under host scheduling, and the complete affected five-case parameter set passed serially
  • Real TCP reproduction: cancellation propagated, deletion settled, and the next public operation created a new conversation

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 31, 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-31T06:50:05.585451Z1094699Manual request
🔒 Security ReviewCompleted2026-08-31T06:53:50.164503Z1094699Manual request
ℹ️ 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:863061ec0d

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

await self._openai_client.conversations.delete(
conversation_id=session_id,
)
self._session_id = None

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Clear only the conversation ID that was deleted

If another task assigns a replacement ID through the public session_id setter after clear_session() is cancelled but before the remote deletion finishes, the surviving delete task unconditionally resets that replacement to None. The next session operation then creates another conversation instead of using the caller's replacement; compare _session_id with the captured session_id before clearing it, or serialize setter updates with the same lock.

AGENTS.md reference: AGENTS.md:L149-L149

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 for catching this. The settled delete now clears the local ID only when it still matches the conversation that was deleted, so a replacement installed through the public session_id setter survives. I also added a controlled cancellation regression test that rebinds the session before deletion completes and verifies that the next public write uses the replacement without creating another conversation.

Validation for the updated diff: the focused session/import suite passes 95 tests, targeted Ruff and mypy pass, and make tests-review passes 9,345 tests with 33 skipped. The required wrapper's format, lint, and typecheck stages pass; its default test run reached 9,288 passed and 29 skipped with four unrelated review_optional AdvancedSQLiteSession multiprocessing timing failures, whose complete five-case parameter set passes serially.

@Excelius-Wang

Copy link
Copy Markdown
ContributorAuthor

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Nice work!

Reviewed commit:1094699ccb

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

@chatgpt-codex-connector

Copy link
Copy Markdown

Security review completed. No security issues were found in this pull request.

Reviewed commit:1094699ccb

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Excelius-Wang
, '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: settle conversation deletion before propagating cancellation by Excelius-Wang · Pull Request #4790 · openai/openai-agents-python · GitHub
Skip to content

fix: settle conversation deletion before propagating cancellation - #4790

Open
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/conversations-clear-cancellation
Open

fix: settle conversation deletion before propagating cancellation#4790
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/conversations-clear-cancellation

Conversation

@Excelius-Wang

@Excelius-WangExcelius-Wang commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Summary

This pull request fixes a cancellation race in OpenAIConversationsSession.clear_session(). If caller cancellation arrives after the Conversations API commits deletion but before the response is received, the method now settles the in-flight delete before re-raising cancellation. This prevents later session operations from reusing a deleted conversation ID and receiving a 404.

If an application installs a replacement through the released public session_id setter while deletion is settling, cleanup now clears the local ID only when it still matches the conversation that was deleted. The replacement therefore survives and is used by the next public session operation.

The fix moves the existing cancellation-safe _await_mutation helper to the neutral session module, preserves the existing SQLite import path through an explicit re-export, and adds controlled regression coverage for both lazy reinitialization and public setter replacement.

Test plan

  • Focused session and import-side-effect suite: 95 passed
  • Targeted Ruff and mypy across 8 runtime/helper consumers
  • make tests-review: 9,345 passed, 33 skipped
  • Repository make format, make lint, and make typecheck passed
  • Default make tests: 9,288 passed and 29 skipped; four unrelated review_optional AdvancedSQLiteSession multiprocessing timing assertions failed under host scheduling, and the complete affected five-case parameter set passed serially
  • Real TCP reproduction: cancellation propagated, deletion settled, and the next public operation created a new conversation

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 31, 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-31T06:50:05.585451Z1094699Manual request
🔒 Security ReviewCompleted2026-08-31T06:53:50.164503Z1094699Manual request
ℹ️ 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:863061ec0d

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

await self._openai_client.conversations.delete(
conversation_id=session_id,
)
self._session_id = None

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Clear only the conversation ID that was deleted

If another task assigns a replacement ID through the public session_id setter after clear_session() is cancelled but before the remote deletion finishes, the surviving delete task unconditionally resets that replacement to None. The next session operation then creates another conversation instead of using the caller's replacement; compare _session_id with the captured session_id before clearing it, or serialize setter updates with the same lock.

AGENTS.md reference: AGENTS.md:L149-L149

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 for catching this. The settled delete now clears the local ID only when it still matches the conversation that was deleted, so a replacement installed through the public session_id setter survives. I also added a controlled cancellation regression test that rebinds the session before deletion completes and verifies that the next public write uses the replacement without creating another conversation.

Validation for the updated diff: the focused session/import suite passes 95 tests, targeted Ruff and mypy pass, and make tests-review passes 9,345 tests with 33 skipped. The required wrapper's format, lint, and typecheck stages pass; its default test run reached 9,288 passed and 29 skipped with four unrelated review_optional AdvancedSQLiteSession multiprocessing timing failures, whose complete five-case parameter set passes serially.

@Excelius-Wang

Copy link
Copy Markdown
ContributorAuthor

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Nice work!

Reviewed commit:1094699ccb

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

@chatgpt-codex-connector

Copy link
Copy Markdown

Security review completed. No security issues were found in this pull request.

Reviewed commit:1094699ccb

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Excelius-Wang
, '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: settle conversation deletion before propagating cancellation by Excelius-Wang · Pull Request #4790 · openai/openai-agents-python · GitHub
Skip to content

fix: settle conversation deletion before propagating cancellation - #4790

Open
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/conversations-clear-cancellation
Open

fix: settle conversation deletion before propagating cancellation#4790
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/conversations-clear-cancellation

Conversation

@Excelius-Wang

@Excelius-WangExcelius-Wang commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Summary

This pull request fixes a cancellation race in OpenAIConversationsSession.clear_session(). If caller cancellation arrives after the Conversations API commits deletion but before the response is received, the method now settles the in-flight delete before re-raising cancellation. This prevents later session operations from reusing a deleted conversation ID and receiving a 404.

If an application installs a replacement through the released public session_id setter while deletion is settling, cleanup now clears the local ID only when it still matches the conversation that was deleted. The replacement therefore survives and is used by the next public session operation.

The fix moves the existing cancellation-safe _await_mutation helper to the neutral session module, preserves the existing SQLite import path through an explicit re-export, and adds controlled regression coverage for both lazy reinitialization and public setter replacement.

Test plan

  • Focused session and import-side-effect suite: 95 passed
  • Targeted Ruff and mypy across 8 runtime/helper consumers
  • make tests-review: 9,345 passed, 33 skipped
  • Repository make format, make lint, and make typecheck passed
  • Default make tests: 9,288 passed and 29 skipped; four unrelated review_optional AdvancedSQLiteSession multiprocessing timing assertions failed under host scheduling, and the complete affected five-case parameter set passed serially
  • Real TCP reproduction: cancellation propagated, deletion settled, and the next public operation created a new conversation

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 31, 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-31T06:50:05.585451Z1094699Manual request
🔒 Security ReviewCompleted2026-08-31T06:53:50.164503Z1094699Manual request
ℹ️ 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:863061ec0d

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

await self._openai_client.conversations.delete(
conversation_id=session_id,
)
self._session_id = None

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Clear only the conversation ID that was deleted

If another task assigns a replacement ID through the public session_id setter after clear_session() is cancelled but before the remote deletion finishes, the surviving delete task unconditionally resets that replacement to None. The next session operation then creates another conversation instead of using the caller's replacement; compare _session_id with the captured session_id before clearing it, or serialize setter updates with the same lock.

AGENTS.md reference: AGENTS.md:L149-L149

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 for catching this. The settled delete now clears the local ID only when it still matches the conversation that was deleted, so a replacement installed through the public session_id setter survives. I also added a controlled cancellation regression test that rebinds the session before deletion completes and verifies that the next public write uses the replacement without creating another conversation.

Validation for the updated diff: the focused session/import suite passes 95 tests, targeted Ruff and mypy pass, and make tests-review passes 9,345 tests with 33 skipped. The required wrapper's format, lint, and typecheck stages pass; its default test run reached 9,288 passed and 29 skipped with four unrelated review_optional AdvancedSQLiteSession multiprocessing timing failures, whose complete five-case parameter set passes serially.

@Excelius-Wang

Copy link
Copy Markdown
ContributorAuthor

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Nice work!

Reviewed commit:1094699ccb

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

@chatgpt-codex-connector

Copy link
Copy Markdown

Security review completed. No security issues were found in this pull request.

Reviewed commit:1094699ccb

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Excelius-Wang
, '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: settle conversation deletion before propagating cancellation by Excelius-Wang · Pull Request #4790 · openai/openai-agents-python · GitHub
Skip to content

fix: settle conversation deletion before propagating cancellation - #4790

Open
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/conversations-clear-cancellation
Open

fix: settle conversation deletion before propagating cancellation#4790
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/conversations-clear-cancellation

Conversation

@Excelius-Wang

@Excelius-WangExcelius-Wang commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Summary

This pull request fixes a cancellation race in OpenAIConversationsSession.clear_session(). If caller cancellation arrives after the Conversations API commits deletion but before the response is received, the method now settles the in-flight delete before re-raising cancellation. This prevents later session operations from reusing a deleted conversation ID and receiving a 404.

If an application installs a replacement through the released public session_id setter while deletion is settling, cleanup now clears the local ID only when it still matches the conversation that was deleted. The replacement therefore survives and is used by the next public session operation.

The fix moves the existing cancellation-safe _await_mutation helper to the neutral session module, preserves the existing SQLite import path through an explicit re-export, and adds controlled regression coverage for both lazy reinitialization and public setter replacement.

Test plan

  • Focused session and import-side-effect suite: 95 passed
  • Targeted Ruff and mypy across 8 runtime/helper consumers
  • make tests-review: 9,345 passed, 33 skipped
  • Repository make format, make lint, and make typecheck passed
  • Default make tests: 9,288 passed and 29 skipped; four unrelated review_optional AdvancedSQLiteSession multiprocessing timing assertions failed under host scheduling, and the complete affected five-case parameter set passed serially
  • Real TCP reproduction: cancellation propagated, deletion settled, and the next public operation created a new conversation

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 31, 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-31T06:50:05.585451Z1094699Manual request
🔒 Security ReviewCompleted2026-08-31T06:53:50.164503Z1094699Manual request
ℹ️ 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:863061ec0d

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

await self._openai_client.conversations.delete(
conversation_id=session_id,
)
self._session_id = None

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Clear only the conversation ID that was deleted

If another task assigns a replacement ID through the public session_id setter after clear_session() is cancelled but before the remote deletion finishes, the surviving delete task unconditionally resets that replacement to None. The next session operation then creates another conversation instead of using the caller's replacement; compare _session_id with the captured session_id before clearing it, or serialize setter updates with the same lock.

AGENTS.md reference: AGENTS.md:L149-L149

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 for catching this. The settled delete now clears the local ID only when it still matches the conversation that was deleted, so a replacement installed through the public session_id setter survives. I also added a controlled cancellation regression test that rebinds the session before deletion completes and verifies that the next public write uses the replacement without creating another conversation.

Validation for the updated diff: the focused session/import suite passes 95 tests, targeted Ruff and mypy pass, and make tests-review passes 9,345 tests with 33 skipped. The required wrapper's format, lint, and typecheck stages pass; its default test run reached 9,288 passed and 29 skipped with four unrelated review_optional AdvancedSQLiteSession multiprocessing timing failures, whose complete five-case parameter set passes serially.

@Excelius-Wang

Copy link
Copy Markdown
ContributorAuthor

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Nice work!

Reviewed commit:1094699ccb

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

@chatgpt-codex-connector

Copy link
Copy Markdown

Security review completed. No security issues were found in this pull request.

Reviewed commit:1094699ccb

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Excelius-Wang
, '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: settle conversation deletion before propagating cancellation by Excelius-Wang · Pull Request #4790 · openai/openai-agents-python · GitHub
Skip to content

fix: settle conversation deletion before propagating cancellation - #4790

Open
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/conversations-clear-cancellation
Open

fix: settle conversation deletion before propagating cancellation#4790
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/conversations-clear-cancellation

Conversation

@Excelius-Wang

@Excelius-WangExcelius-Wang commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Summary

This pull request fixes a cancellation race in OpenAIConversationsSession.clear_session(). If caller cancellation arrives after the Conversations API commits deletion but before the response is received, the method now settles the in-flight delete before re-raising cancellation. This prevents later session operations from reusing a deleted conversation ID and receiving a 404.

If an application installs a replacement through the released public session_id setter while deletion is settling, cleanup now clears the local ID only when it still matches the conversation that was deleted. The replacement therefore survives and is used by the next public session operation.

The fix moves the existing cancellation-safe _await_mutation helper to the neutral session module, preserves the existing SQLite import path through an explicit re-export, and adds controlled regression coverage for both lazy reinitialization and public setter replacement.

Test plan

  • Focused session and import-side-effect suite: 95 passed
  • Targeted Ruff and mypy across 8 runtime/helper consumers
  • make tests-review: 9,345 passed, 33 skipped
  • Repository make format, make lint, and make typecheck passed
  • Default make tests: 9,288 passed and 29 skipped; four unrelated review_optional AdvancedSQLiteSession multiprocessing timing assertions failed under host scheduling, and the complete affected five-case parameter set passed serially
  • Real TCP reproduction: cancellation propagated, deletion settled, and the next public operation created a new conversation

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 31, 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-31T06:50:05.585451Z1094699Manual request
🔒 Security ReviewCompleted2026-08-31T06:53:50.164503Z1094699Manual request
ℹ️ 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:863061ec0d

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

await self._openai_client.conversations.delete(
conversation_id=session_id,
)
self._session_id = None

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Clear only the conversation ID that was deleted

If another task assigns a replacement ID through the public session_id setter after clear_session() is cancelled but before the remote deletion finishes, the surviving delete task unconditionally resets that replacement to None. The next session operation then creates another conversation instead of using the caller's replacement; compare _session_id with the captured session_id before clearing it, or serialize setter updates with the same lock.

AGENTS.md reference: AGENTS.md:L149-L149

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 for catching this. The settled delete now clears the local ID only when it still matches the conversation that was deleted, so a replacement installed through the public session_id setter survives. I also added a controlled cancellation regression test that rebinds the session before deletion completes and verifies that the next public write uses the replacement without creating another conversation.

Validation for the updated diff: the focused session/import suite passes 95 tests, targeted Ruff and mypy pass, and make tests-review passes 9,345 tests with 33 skipped. The required wrapper's format, lint, and typecheck stages pass; its default test run reached 9,288 passed and 29 skipped with four unrelated review_optional AdvancedSQLiteSession multiprocessing timing failures, whose complete five-case parameter set passes serially.

@Excelius-Wang

Copy link
Copy Markdown
ContributorAuthor

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Nice work!

Reviewed commit:1094699ccb

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

@chatgpt-codex-connector

Copy link
Copy Markdown

Security review completed. No security issues were found in this pull request.

Reviewed commit:1094699ccb

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Excelius-Wang
, '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: settle conversation deletion before propagating cancellation by Excelius-Wang · Pull Request #4790 · openai/openai-agents-python · GitHub
Skip to content

fix: settle conversation deletion before propagating cancellation - #4790

Open
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/conversations-clear-cancellation
Open

fix: settle conversation deletion before propagating cancellation#4790
Excelius-Wang wants to merge 2 commits into
openai:mainfrom
Excelius-Wang:fix/conversations-clear-cancellation

Conversation

@Excelius-Wang

@Excelius-WangExcelius-Wang commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Summary

This pull request fixes a cancellation race in OpenAIConversationsSession.clear_session(). If caller cancellation arrives after the Conversations API commits deletion but before the response is received, the method now settles the in-flight delete before re-raising cancellation. This prevents later session operations from reusing a deleted conversation ID and receiving a 404.

If an application installs a replacement through the released public session_id setter while deletion is settling, cleanup now clears the local ID only when it still matches the conversation that was deleted. The replacement therefore survives and is used by the next public session operation.

The fix moves the existing cancellation-safe _await_mutation helper to the neutral session module, preserves the existing SQLite import path through an explicit re-export, and adds controlled regression coverage for both lazy reinitialization and public setter replacement.

Test plan

  • Focused session and import-side-effect suite: 95 passed
  • Targeted Ruff and mypy across 8 runtime/helper consumers
  • make tests-review: 9,345 passed, 33 skipped
  • Repository make format, make lint, and make typecheck passed
  • Default make tests: 9,288 passed and 29 skipped; four unrelated review_optional AdvancedSQLiteSession multiprocessing timing assertions failed under host scheduling, and the complete affected five-case parameter set passed serially
  • Real TCP reproduction: cancellation propagated, deletion settled, and the next public operation created a new conversation

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 31, 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-31T06:50:05.585451Z1094699Manual request
🔒 Security ReviewCompleted2026-08-31T06:53:50.164503Z1094699Manual request
ℹ️ 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:863061ec0d

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

await self._openai_client.conversations.delete(
conversation_id=session_id,
)
self._session_id = None

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Clear only the conversation ID that was deleted

If another task assigns a replacement ID through the public session_id setter after clear_session() is cancelled but before the remote deletion finishes, the surviving delete task unconditionally resets that replacement to None. The next session operation then creates another conversation instead of using the caller's replacement; compare _session_id with the captured session_id before clearing it, or serialize setter updates with the same lock.

AGENTS.md reference: AGENTS.md:L149-L149

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 for catching this. The settled delete now clears the local ID only when it still matches the conversation that was deleted, so a replacement installed through the public session_id setter survives. I also added a controlled cancellation regression test that rebinds the session before deletion completes and verifies that the next public write uses the replacement without creating another conversation.

Validation for the updated diff: the focused session/import suite passes 95 tests, targeted Ruff and mypy pass, and make tests-review passes 9,345 tests with 33 skipped. The required wrapper's format, lint, and typecheck stages pass; its default test run reached 9,288 passed and 29 skipped with four unrelated review_optional AdvancedSQLiteSession multiprocessing timing failures, whose complete five-case parameter set passes serially.

@Excelius-Wang

Copy link
Copy Markdown
ContributorAuthor

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Nice work!

Reviewed commit:1094699ccb

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

@chatgpt-codex-connector

Copy link
Copy Markdown

Security review completed. No security issues were found in this pull request.

Reviewed commit:1094699ccb

View security finding report

Only the user who started this review can view the report in Codex.

ℹ️ About Codex security reviews in GitHub

This is an experimental Codex feature. Security reviews are triggered when:

  • You comment "@codex security review"
  • A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review

Once complete, Codex will leave suggestions, or a comment if no findings are found.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Excelius-Wang