Handle tool_calls stop reason from OpenRouter #141
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Note: 🤖 Generated with Claude Code -- but the problem did impact me
Problem
OpenRouter can return "tool_calls" as finish_reason when the model decides to use tools. The field_validator only handled "tool_use" (Anthropic format), causing a ValidationError:
This is particularly bad because InferenceAPI is commonly used with asyncio.gather() for batch processing. An unhandled exception from one request kills the entire batch, potentially losing hours of work and all in-flight requests.
Fix
Map "tool_calls" to StopReason.TOOL_USE in the field_validator.
Context: Occurred during single-turn puzzle generation via OpenRouter with gpt-oss-120b, grok-4.1-fast, claude-haiku-4.5. No tools were passed in the request - the model unexpectedly returned tool_calls anyway.