Skip to content

fix: add run_in_parallel support to OutputGuardrail for sequential ex… - #4791

Open
Showmick119 wants to merge 2 commits into
openai:mainfrom
Showmick119:fix/output-guardrail-parallel
Open

fix: add run_in_parallel support to OutputGuardrail for sequential ex…#4791
Showmick119 wants to merge 2 commits into
openai:mainfrom
Showmick119:fix/output-guardrail-parallel

Conversation

@Showmick119

Copy link
Copy Markdown

This pull request adds support for sequentially executing output guardrails to match the behavior of input guardrails.

Previously, OutputGuardrail did not have a run_in_parallel flag and run_output_guardrails always executed all output guardrails concurrently. This meant it was impossible to run a fast, low-cost guardrail (e.g., regex checks) before a slow, expensive one (e.g., an LLM judge) to trip the wire early and save tokens/time.

  • Adds a run_in_parallel boolean field to OutputGuardrail (defaulting to True for backwards compatibility).
  • Updates the @output_guardrail decorator to accept run_in_parallel.
  • Modifies run_output_guardrails to partition sequential (run_in_parallel=False) and parallel guardrails, running the sequential ones in order before kicking off the concurrent ones. If a sequential guardrail trips, execution halts immediately.

@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:5d570b4250

ℹ️ 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 on lines +159 to +161
run_in_parallel: bool = True
"""Whether the guardrail runs concurrently with other guardrails (True, default) or before
subsequent guardrails (False).

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 Honor sequential output guardrails in Realtime sessions

When these public guardrails are supplied through RealtimeAgent.output_guardrails or RealtimeRunConfig.output_guardrails, RealtimeSession._run_output_guardrails still awaits every guardrail in list order without consulting run_in_parallel (src/agents/realtime/session.py:1663-1669). Consequently, with an expensive default-parallel guardrail listed before a cheap run_in_parallel=False guardrail, the expensive check runs first and cannot be skipped when the cheap check trips—the exact cost-saving behavior this option promises works in Runner but is silently ignored on the supported Realtime path. Partition or otherwise honor the flag in that consumer as well.

AGENTS.md reference: AGENTS.md:L147-L147

Useful? React with 👍 / 👎.

@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:50e1a5c498

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

triggered_results.append(result)
for t in tasks:
t.cancel()
break

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 Preserve all Realtime tripwire results

When two default-parallel Realtime output guardrails both trip, this break reports only the first result and ignores or cancels the others—even if multiple synchronous guardrail tasks have already completed. This regresses the public RealtimeGuardrailTripped.guardrail_results contract (documented as containing all triggered guardrails), and the follow-up message likewise omits their names; the pre-change caller-visible test explicitly covered both results. Preserve all parallel tripwire results before emitting the event while retaining the new sequential short-circuit behavior.

AGENTS.md reference: AGENTS.md:L147-L147

Useful? React with 👍 / 👎.

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

@Showmick119
, '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: add run_in_parallel support to OutputGuardrail for sequential ex… by Showmick119 · Pull Request #4791 · openai/openai-agents-python · GitHub
Skip to content

fix: add run_in_parallel support to OutputGuardrail for sequential ex… - #4791

Open
Showmick119 wants to merge 2 commits into
openai:mainfrom
Showmick119:fix/output-guardrail-parallel
Open

fix: add run_in_parallel support to OutputGuardrail for sequential ex…#4791
Showmick119 wants to merge 2 commits into
openai:mainfrom
Showmick119:fix/output-guardrail-parallel

Conversation

@Showmick119

Copy link
Copy Markdown

This pull request adds support for sequentially executing output guardrails to match the behavior of input guardrails.

Previously, OutputGuardrail did not have a run_in_parallel flag and run_output_guardrails always executed all output guardrails concurrently. This meant it was impossible to run a fast, low-cost guardrail (e.g., regex checks) before a slow, expensive one (e.g., an LLM judge) to trip the wire early and save tokens/time.

  • Adds a run_in_parallel boolean field to OutputGuardrail (defaulting to True for backwards compatibility).
  • Updates the @output_guardrail decorator to accept run_in_parallel.
  • Modifies run_output_guardrails to partition sequential (run_in_parallel=False) and parallel guardrails, running the sequential ones in order before kicking off the concurrent ones. If a sequential guardrail trips, execution halts immediately.

@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:5d570b4250

ℹ️ 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 on lines +159 to +161
run_in_parallel: bool = True
"""Whether the guardrail runs concurrently with other guardrails (True, default) or before
subsequent guardrails (False).

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 Honor sequential output guardrails in Realtime sessions

When these public guardrails are supplied through RealtimeAgent.output_guardrails or RealtimeRunConfig.output_guardrails, RealtimeSession._run_output_guardrails still awaits every guardrail in list order without consulting run_in_parallel (src/agents/realtime/session.py:1663-1669). Consequently, with an expensive default-parallel guardrail listed before a cheap run_in_parallel=False guardrail, the expensive check runs first and cannot be skipped when the cheap check trips—the exact cost-saving behavior this option promises works in Runner but is silently ignored on the supported Realtime path. Partition or otherwise honor the flag in that consumer as well.

AGENTS.md reference: AGENTS.md:L147-L147

Useful? React with 👍 / 👎.

@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:50e1a5c498

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

triggered_results.append(result)
for t in tasks:
t.cancel()
break

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 Preserve all Realtime tripwire results

When two default-parallel Realtime output guardrails both trip, this break reports only the first result and ignores or cancels the others—even if multiple synchronous guardrail tasks have already completed. This regresses the public RealtimeGuardrailTripped.guardrail_results contract (documented as containing all triggered guardrails), and the follow-up message likewise omits their names; the pre-change caller-visible test explicitly covered both results. Preserve all parallel tripwire results before emitting the event while retaining the new sequential short-circuit behavior.

AGENTS.md reference: AGENTS.md:L147-L147

Useful? React with 👍 / 👎.

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

@Showmick119
, '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: add run_in_parallel support to OutputGuardrail for sequential ex… by Showmick119 · Pull Request #4791 · openai/openai-agents-python · GitHub
Skip to content

fix: add run_in_parallel support to OutputGuardrail for sequential ex… - #4791

Open
Showmick119 wants to merge 2 commits into
openai:mainfrom
Showmick119:fix/output-guardrail-parallel
Open

fix: add run_in_parallel support to OutputGuardrail for sequential ex…#4791
Showmick119 wants to merge 2 commits into
openai:mainfrom
Showmick119:fix/output-guardrail-parallel

Conversation

@Showmick119

Copy link
Copy Markdown

This pull request adds support for sequentially executing output guardrails to match the behavior of input guardrails.

Previously, OutputGuardrail did not have a run_in_parallel flag and run_output_guardrails always executed all output guardrails concurrently. This meant it was impossible to run a fast, low-cost guardrail (e.g., regex checks) before a slow, expensive one (e.g., an LLM judge) to trip the wire early and save tokens/time.

  • Adds a run_in_parallel boolean field to OutputGuardrail (defaulting to True for backwards compatibility).
  • Updates the @output_guardrail decorator to accept run_in_parallel.
  • Modifies run_output_guardrails to partition sequential (run_in_parallel=False) and parallel guardrails, running the sequential ones in order before kicking off the concurrent ones. If a sequential guardrail trips, execution halts immediately.

@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:5d570b4250

ℹ️ 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 on lines +159 to +161
run_in_parallel: bool = True
"""Whether the guardrail runs concurrently with other guardrails (True, default) or before
subsequent guardrails (False).

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 Honor sequential output guardrails in Realtime sessions

When these public guardrails are supplied through RealtimeAgent.output_guardrails or RealtimeRunConfig.output_guardrails, RealtimeSession._run_output_guardrails still awaits every guardrail in list order without consulting run_in_parallel (src/agents/realtime/session.py:1663-1669). Consequently, with an expensive default-parallel guardrail listed before a cheap run_in_parallel=False guardrail, the expensive check runs first and cannot be skipped when the cheap check trips—the exact cost-saving behavior this option promises works in Runner but is silently ignored on the supported Realtime path. Partition or otherwise honor the flag in that consumer as well.

AGENTS.md reference: AGENTS.md:L147-L147

Useful? React with 👍 / 👎.

@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:50e1a5c498

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

triggered_results.append(result)
for t in tasks:
t.cancel()
break

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 Preserve all Realtime tripwire results

When two default-parallel Realtime output guardrails both trip, this break reports only the first result and ignores or cancels the others—even if multiple synchronous guardrail tasks have already completed. This regresses the public RealtimeGuardrailTripped.guardrail_results contract (documented as containing all triggered guardrails), and the follow-up message likewise omits their names; the pre-change caller-visible test explicitly covered both results. Preserve all parallel tripwire results before emitting the event while retaining the new sequential short-circuit behavior.

AGENTS.md reference: AGENTS.md:L147-L147

Useful? React with 👍 / 👎.

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

@Showmick119
, '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: add run_in_parallel support to OutputGuardrail for sequential ex… by Showmick119 · Pull Request #4791 · openai/openai-agents-python · GitHub
Skip to content

fix: add run_in_parallel support to OutputGuardrail for sequential ex… - #4791

Open
Showmick119 wants to merge 2 commits into
openai:mainfrom
Showmick119:fix/output-guardrail-parallel
Open

fix: add run_in_parallel support to OutputGuardrail for sequential ex…#4791
Showmick119 wants to merge 2 commits into
openai:mainfrom
Showmick119:fix/output-guardrail-parallel

Conversation

@Showmick119

Copy link
Copy Markdown

This pull request adds support for sequentially executing output guardrails to match the behavior of input guardrails.

Previously, OutputGuardrail did not have a run_in_parallel flag and run_output_guardrails always executed all output guardrails concurrently. This meant it was impossible to run a fast, low-cost guardrail (e.g., regex checks) before a slow, expensive one (e.g., an LLM judge) to trip the wire early and save tokens/time.

  • Adds a run_in_parallel boolean field to OutputGuardrail (defaulting to True for backwards compatibility).
  • Updates the @output_guardrail decorator to accept run_in_parallel.
  • Modifies run_output_guardrails to partition sequential (run_in_parallel=False) and parallel guardrails, running the sequential ones in order before kicking off the concurrent ones. If a sequential guardrail trips, execution halts immediately.

@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:5d570b4250

ℹ️ 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 on lines +159 to +161
run_in_parallel: bool = True
"""Whether the guardrail runs concurrently with other guardrails (True, default) or before
subsequent guardrails (False).

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 Honor sequential output guardrails in Realtime sessions

When these public guardrails are supplied through RealtimeAgent.output_guardrails or RealtimeRunConfig.output_guardrails, RealtimeSession._run_output_guardrails still awaits every guardrail in list order without consulting run_in_parallel (src/agents/realtime/session.py:1663-1669). Consequently, with an expensive default-parallel guardrail listed before a cheap run_in_parallel=False guardrail, the expensive check runs first and cannot be skipped when the cheap check trips—the exact cost-saving behavior this option promises works in Runner but is silently ignored on the supported Realtime path. Partition or otherwise honor the flag in that consumer as well.

AGENTS.md reference: AGENTS.md:L147-L147

Useful? React with 👍 / 👎.

@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:50e1a5c498

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

triggered_results.append(result)
for t in tasks:
t.cancel()
break

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 Preserve all Realtime tripwire results

When two default-parallel Realtime output guardrails both trip, this break reports only the first result and ignores or cancels the others—even if multiple synchronous guardrail tasks have already completed. This regresses the public RealtimeGuardrailTripped.guardrail_results contract (documented as containing all triggered guardrails), and the follow-up message likewise omits their names; the pre-change caller-visible test explicitly covered both results. Preserve all parallel tripwire results before emitting the event while retaining the new sequential short-circuit behavior.

AGENTS.md reference: AGENTS.md:L147-L147

Useful? React with 👍 / 👎.

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

@Showmick119
, '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: add run_in_parallel support to OutputGuardrail for sequential ex… by Showmick119 · Pull Request #4791 · openai/openai-agents-python · GitHub
Skip to content

fix: add run_in_parallel support to OutputGuardrail for sequential ex… - #4791

Open
Showmick119 wants to merge 2 commits into
openai:mainfrom
Showmick119:fix/output-guardrail-parallel
Open

fix: add run_in_parallel support to OutputGuardrail for sequential ex…#4791
Showmick119 wants to merge 2 commits into
openai:mainfrom
Showmick119:fix/output-guardrail-parallel

Conversation

@Showmick119

Copy link
Copy Markdown

This pull request adds support for sequentially executing output guardrails to match the behavior of input guardrails.

Previously, OutputGuardrail did not have a run_in_parallel flag and run_output_guardrails always executed all output guardrails concurrently. This meant it was impossible to run a fast, low-cost guardrail (e.g., regex checks) before a slow, expensive one (e.g., an LLM judge) to trip the wire early and save tokens/time.

  • Adds a run_in_parallel boolean field to OutputGuardrail (defaulting to True for backwards compatibility).
  • Updates the @output_guardrail decorator to accept run_in_parallel.
  • Modifies run_output_guardrails to partition sequential (run_in_parallel=False) and parallel guardrails, running the sequential ones in order before kicking off the concurrent ones. If a sequential guardrail trips, execution halts immediately.

@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:5d570b4250

ℹ️ 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 on lines +159 to +161
run_in_parallel: bool = True
"""Whether the guardrail runs concurrently with other guardrails (True, default) or before
subsequent guardrails (False).

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 Honor sequential output guardrails in Realtime sessions

When these public guardrails are supplied through RealtimeAgent.output_guardrails or RealtimeRunConfig.output_guardrails, RealtimeSession._run_output_guardrails still awaits every guardrail in list order without consulting run_in_parallel (src/agents/realtime/session.py:1663-1669). Consequently, with an expensive default-parallel guardrail listed before a cheap run_in_parallel=False guardrail, the expensive check runs first and cannot be skipped when the cheap check trips—the exact cost-saving behavior this option promises works in Runner but is silently ignored on the supported Realtime path. Partition or otherwise honor the flag in that consumer as well.

AGENTS.md reference: AGENTS.md:L147-L147

Useful? React with 👍 / 👎.

@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:50e1a5c498

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

triggered_results.append(result)
for t in tasks:
t.cancel()
break

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 Preserve all Realtime tripwire results

When two default-parallel Realtime output guardrails both trip, this break reports only the first result and ignores or cancels the others—even if multiple synchronous guardrail tasks have already completed. This regresses the public RealtimeGuardrailTripped.guardrail_results contract (documented as containing all triggered guardrails), and the follow-up message likewise omits their names; the pre-change caller-visible test explicitly covered both results. Preserve all parallel tripwire results before emitting the event while retaining the new sequential short-circuit behavior.

AGENTS.md reference: AGENTS.md:L147-L147

Useful? React with 👍 / 👎.

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

@Showmick119
, '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: add run_in_parallel support to OutputGuardrail for sequential ex… by Showmick119 · Pull Request #4791 · openai/openai-agents-python · GitHub
Skip to content

fix: add run_in_parallel support to OutputGuardrail for sequential ex… - #4791

Open
Showmick119 wants to merge 2 commits into
openai:mainfrom
Showmick119:fix/output-guardrail-parallel
Open

fix: add run_in_parallel support to OutputGuardrail for sequential ex…#4791
Showmick119 wants to merge 2 commits into
openai:mainfrom
Showmick119:fix/output-guardrail-parallel

Conversation

@Showmick119

Copy link
Copy Markdown

This pull request adds support for sequentially executing output guardrails to match the behavior of input guardrails.

Previously, OutputGuardrail did not have a run_in_parallel flag and run_output_guardrails always executed all output guardrails concurrently. This meant it was impossible to run a fast, low-cost guardrail (e.g., regex checks) before a slow, expensive one (e.g., an LLM judge) to trip the wire early and save tokens/time.

  • Adds a run_in_parallel boolean field to OutputGuardrail (defaulting to True for backwards compatibility).
  • Updates the @output_guardrail decorator to accept run_in_parallel.
  • Modifies run_output_guardrails to partition sequential (run_in_parallel=False) and parallel guardrails, running the sequential ones in order before kicking off the concurrent ones. If a sequential guardrail trips, execution halts immediately.

@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:5d570b4250

ℹ️ 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 on lines +159 to +161
run_in_parallel: bool = True
"""Whether the guardrail runs concurrently with other guardrails (True, default) or before
subsequent guardrails (False).

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 Honor sequential output guardrails in Realtime sessions

When these public guardrails are supplied through RealtimeAgent.output_guardrails or RealtimeRunConfig.output_guardrails, RealtimeSession._run_output_guardrails still awaits every guardrail in list order without consulting run_in_parallel (src/agents/realtime/session.py:1663-1669). Consequently, with an expensive default-parallel guardrail listed before a cheap run_in_parallel=False guardrail, the expensive check runs first and cannot be skipped when the cheap check trips—the exact cost-saving behavior this option promises works in Runner but is silently ignored on the supported Realtime path. Partition or otherwise honor the flag in that consumer as well.

AGENTS.md reference: AGENTS.md:L147-L147

Useful? React with 👍 / 👎.

@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:50e1a5c498

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

triggered_results.append(result)
for t in tasks:
t.cancel()
break

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 Preserve all Realtime tripwire results

When two default-parallel Realtime output guardrails both trip, this break reports only the first result and ignores or cancels the others—even if multiple synchronous guardrail tasks have already completed. This regresses the public RealtimeGuardrailTripped.guardrail_results contract (documented as containing all triggered guardrails), and the follow-up message likewise omits their names; the pre-change caller-visible test explicitly covered both results. Preserve all parallel tripwire results before emitting the event while retaining the new sequential short-circuit behavior.

AGENTS.md reference: AGENTS.md:L147-L147

Useful? React with 👍 / 👎.

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

@Showmick119
, '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); } })(); })(); fix: add run_in_parallel support to OutputGuardrail for sequential ex… by Showmick119 · Pull Request #4791 · openai/openai-agents-python · GitHub
Skip to content

fix: add run_in_parallel support to OutputGuardrail for sequential ex… - #4791

Open
Showmick119 wants to merge 2 commits into
openai:mainfrom
Showmick119:fix/output-guardrail-parallel
Open

fix: add run_in_parallel support to OutputGuardrail for sequential ex…#4791
Showmick119 wants to merge 2 commits into
openai:mainfrom
Showmick119:fix/output-guardrail-parallel

Conversation

@Showmick119

Copy link
Copy Markdown

This pull request adds support for sequentially executing output guardrails to match the behavior of input guardrails.

Previously, OutputGuardrail did not have a run_in_parallel flag and run_output_guardrails always executed all output guardrails concurrently. This meant it was impossible to run a fast, low-cost guardrail (e.g., regex checks) before a slow, expensive one (e.g., an LLM judge) to trip the wire early and save tokens/time.

  • Adds a run_in_parallel boolean field to OutputGuardrail (defaulting to True for backwards compatibility).
  • Updates the @output_guardrail decorator to accept run_in_parallel.
  • Modifies run_output_guardrails to partition sequential (run_in_parallel=False) and parallel guardrails, running the sequential ones in order before kicking off the concurrent ones. If a sequential guardrail trips, execution halts immediately.

@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:5d570b4250

ℹ️ 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 on lines +159 to +161
run_in_parallel: bool = True
"""Whether the guardrail runs concurrently with other guardrails (True, default) or before
subsequent guardrails (False).

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 Honor sequential output guardrails in Realtime sessions

When these public guardrails are supplied through RealtimeAgent.output_guardrails or RealtimeRunConfig.output_guardrails, RealtimeSession._run_output_guardrails still awaits every guardrail in list order without consulting run_in_parallel (src/agents/realtime/session.py:1663-1669). Consequently, with an expensive default-parallel guardrail listed before a cheap run_in_parallel=False guardrail, the expensive check runs first and cannot be skipped when the cheap check trips—the exact cost-saving behavior this option promises works in Runner but is silently ignored on the supported Realtime path. Partition or otherwise honor the flag in that consumer as well.

AGENTS.md reference: AGENTS.md:L147-L147

Useful? React with 👍 / 👎.

@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:50e1a5c498

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

triggered_results.append(result)
for t in tasks:
t.cancel()
break

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 Preserve all Realtime tripwire results

When two default-parallel Realtime output guardrails both trip, this break reports only the first result and ignores or cancels the others—even if multiple synchronous guardrail tasks have already completed. This regresses the public RealtimeGuardrailTripped.guardrail_results contract (documented as containing all triggered guardrails), and the follow-up message likewise omits their names; the pre-change caller-visible test explicitly covered both results. Preserve all parallel tripwire results before emitting the event while retaining the new sequential short-circuit behavior.

AGENTS.md reference: AGENTS.md:L147-L147

Useful? React with 👍 / 👎.

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

@Showmick119