tools array, the same tool_calls shape in the response. What’s different is what happens underneath: as soon as a request includes tools, Routor filters to tool-capable models and reranks them by measured function-calling accuracy (BFCL - Berkeley Function Calling Leaderboard) for the specific kind of tool use in that request, not just by price.
Basic Request
What Happens Differently
The instant a request has a non-emptytools array, Routor:
- Filters the candidate chain to tool-capable models only (same as it filters to vision-capable models when an image is attached)
- Classifies the kind of tool use - a single expected call, a web-search-shaped tool, a memory/vector-store tool, several tools that might fire in parallel, or a multi-turn tool conversation already in progress - and reranks the remaining candidates by that scenario’s BFCL score specifically, not a generic overall score
- Still applies the normal difficulty scoring on top - a one-tool weather lookup and a multi-step agentic tool chain don’t land on the same tier just because both have
toolsset
Requiring a Minimum Tool-Calling Quality
If your use case can’t tolerate a weak tool-caller (an agent loop where a malformed call breaks the next step, for example), set a floor directly in the request:Debugging a Tool-Routing Decision
POST /v1/routing/debug accepts the same tools array and returns the scenario it detected and the BFCL score of the model it would pick, without spending a real request:
Where to Go Next
- Full request/response reference - every routing-related body field
- Build your first app - the non-tool starting point this guide builds on
- Use with Claude Code - Claude Code’s own tool calls (file edits, bash, etc.) go through this same path