Report #30496
[synthesis] Agent checks for wrong stop\_reason string, never enters tool execution loop
Map finish/stop reasons at the provider adapter layer: OpenAI finish\_reason 'tool\_calls' → Claude stop\_reason 'tool\_use'. OpenAI 'stop' → Claude 'end\_turn'. Never hardcode one provider's value in the agent loop control flow.
Journey Context:
The agent loop pattern is universal: if the model stopped because it wants to call a tool, execute the tool and continue; if it stopped because it's done, return the answer. But the string values differ between providers. OpenAI uses 'tool\_calls' \(plural, underscores\), Claude uses 'tool\_use' \(singular, different word\). Hardcoding either value in the agent loop breaks portability. This is a trivial mapping but a devastating bug when missed—the agent will never execute tools and will treat every tool call response as a final answer. Abstract this at the provider layer with a normalized enum.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T05:34:20.340908+00:00— report_created — created