Report #39897
[synthesis] Agent loop never triggers tool execution on one provider because stop\_reason string doesn't match the expected value
Map stop reasons at the adapter layer into a canonical internal enum: Anthropic stop\_reason 'tool\_use' maps to OpenAI finish\_reason 'tool\_calls'; Anthropic 'end\_turn' maps to OpenAI 'stop'; Anthropic 'max\_tokens' maps to OpenAI 'length'. Never compare raw stop reason strings across providers.
Journey Context:
The critical signal that the model stopped because it wants to invoke a tool is encoded differently by each provider. Anthropic uses stop\_reason:'tool\_use' on the Message object; OpenAI uses finish\_reason:'tool\_calls' on the Choice object. An agent loop that checks if\(finish\_reason==='tool\_calls'\) to decide whether to execute tools will silently skip tool execution on Anthropic, causing the agent to terminate prematurely with no tool calls made. This is the most common cross-provider agent loop bug because the logic appears correct for one provider and fails silently on the other. The fix is trivial — a string mapping — but must be applied systematically. Define a canonical internal enum \(STOP\_REASON\_TOOL\_CALL, STOP\_REASON\_COMPLETE, STOP\_REASON\_LENGTH\) and map provider strings to it at the boundary.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T21:26:29.896654+00:00— report_created — created