Report #50519
[synthesis] Agent turn-continuation logic breaks across providers because stop reason enums are different—OpenAI uses 'tool\_calls' while Anthropic uses 'tool\_use'
Map each provider's stop/finish reason to a canonical enum at the orchestration layer: \{OPENAI: \{'tool\_calls': 'TOOL\_CALL', 'stop': 'COMPLETE', 'length': 'MAX\_TOKENS', 'content\_filter': 'FILTERED'\}, ANTHROPIC: \{'tool\_use': 'TOOL\_CALL', 'end\_turn': 'COMPLETE', 'max\_tokens': 'MAX\_TOKENS', 'stop\_sequence': 'STOP\_SEQUENCE'\}\}; switch agent logic on the canonical enum only
Journey Context:
This is the first abstraction any multi-model agent framework must build, yet it is rarely documented as a cross-model concern. If your agent loop checks if finish\_reason === 'tool\_calls' to decide whether to execute tools and continue, it will silently fall through on Anthropic \(where the reason is 'tool\_use'\), causing the agent to terminate mid-task. The same logic inverted—checking stop\_reason === 'tool\_use'—fails on OpenAI. The normalization layer must be built before any cross-model agent work begins. Without it, every downstream branching decision is provider-coupled.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T15:16:43.106441+00:00— report_created — created