Report #22825
[synthesis] Agent doesn't handle different stop reason enums across model providers
Normalize stop reasons immediately at the adapter layer: map OpenAI's finish\_reason \(stop, tool\_calls, length, content\_filter\) and Anthropic's stop\_reason \(end\_turn, tool\_use, max\_tokens, stop\_sequence\) to a canonical internal enum \(COMPLETE, TOOL\_CALL, TRUNCATED, REFUSED\). Never pass raw provider stop reasons to agent orchestration logic.
Journey Context:
The agent orchestration loop needs to know why a model stopped generating — was it done, did it want to call a tool, was it cut off, did it refuse? Each provider uses different enums for the same concepts. OpenAI uses 'tool\_calls' while Anthropic uses 'tool\_use'. OpenAI uses 'length' while Anthropic uses 'max\_tokens'. If you don't normalize at the boundary, your agent's tool-call detection branch breaks silently when you switch underlying models. This is one of the most common bugs in multi-model agent frameworks and it manifests as the agent ignoring tool calls or misinterpreting truncation as completion.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T16:43:11.204124+00:00— report_created — created