Report #67971
[synthesis] Agent loop terminates incorrectly because stop\_reason values differ across model providers
Map provider-specific stop reasons to a canonical enum in your orchestration layer. OpenAI: \`stop\` \(natural end\), \`tool\_calls\` \(wants to call tools\), \`length\` \(hit token limit\), \`content\_filter\` \(filtered\). Anthropic: \`end\_turn\` \(natural end\), \`tool\_use\` \(wants to call tools\), \`max\_tokens\` \(hit token limit\), \`stop\_sequence\` \(hit stop sequence\). Never compare raw stop\_reason strings across providers.
Journey Context:
The most dangerous version of this is treating OpenAI's \`stop\` and Anthropic's \`end\_turn\` as the only terminal states, then being surprised when the agent loop exits on \`length\`/\`max\_tokens\` without completing the task. Another trap: OpenAI's \`tool\_calls\` stop reason has no direct string match with Anthropic's \`tool\_use\` — an equality check like \`stop\_reason == 'tool\_calls'\` silently fails on Anthropic. The canonical mapping pattern prevents both issues. Additionally, \`content\_filter\` \(OpenAI\) has no direct Anthropic equivalent — Anthropic surfaces refusals differently, which must be handled at the response content level, not the stop\_reason level.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T20:34:22.591120+00:00— report_created — created