Tool calling compared: 27 models, three request shapes
Every text model in the catalog supports tools. What separates them is the route — /v1/messages, /v1/responses or /v1/chat/completions — and what a multi-turn loop costs at each price point.
Tool support is not the filter
27 of the 31 catalog entries list tools. Every one of the 27 text models has it — all 12 Claude ids, all 7 text-capable OpenAI ids, grok-4.6, grok-4.5 and grok-composer-2.5-fast, and all 5 Gemini ids. The four without it are gpt-image-2, grok-imagine-image, grok-imagine-image-quality and grok-imagine-video-1.5, which generate media rather than call functions.
That is unusual enough to state plainly: "does it support tools" narrows the catalog from 31 to 27 and then stops being useful. Any comparison built on the capability flag alone would be listing the same models twice.
The differences that do decide a choice sit in three other columns — the route, the context and output ceilings, and the price — and this page takes them in that order, because the route is the one that costs you code.
Three routes, three tool schemas
The catalog assigns each model an apiRoute, and tool-calling models are split across three of them. 13 entries answer on /v1/messages: every Claude id plus stable-gpt-6-astra. Six answer on /v1/responses: gpt-5.6-sol, gpt-5.6-terra, gpt-5.6-luna, gpt-5.5, gpt-5.4 and gpt-5.4-mini. Eight answer on /v1/chat/completions: grok-4.6, grok-4.5, grok-composer-2.5-fast and the five Gemini ids.
These are not cosmetic differences. On /v1/messages a tool is declared with name, description and input_schema, authentication is x-api-key plus anthropic-version, and max_tokens is required. On /v1/chat/completions a tool is declared as {"type": "function", "function": {name, description, parameters}} and authentication is Authorization: Bearer. Tool results come back in different envelopes too, so your dispatch code changes with the route, not just the model id.
The practical consequence for an agent: switching models within a route is a one-field change, and switching across routes is an integration task. Note that stable-gpt-6-astra is the exception to the naming pattern — it is an OpenAI-lineup model on the Anthropic-shaped route, so it is drop-in for a Claude client and not for a Responses client.
# Anthropic shape — claude-sonnet-5 (also stable-gpt-6-astra)
curl -sS https://token-share.app/v1/messages \
-H "x-api-key: $TOKEN_SHARE_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-5",
"max_tokens": 1024,
"tools": [{
"name": "get_build_status",
"description": "Return the status of a CI build.",
"input_schema": {
"type": "object",
"properties": {"build_id": {"type": "string"}},
"required": ["build_id"]
}
}],
"messages": [{"role": "user", "content": "Did build 4417 pass?"}]
}'
# OpenAI shape — grok-4.6 (also every gemini-* id)
curl -sS https://token-share.app/v1/chat/completions \
-H "Authorization: Bearer $TOKEN_SHARE_KEY" \
-H "content-type: application/json" \
-d '{
"model": "grok-4.6",
"tools": [{
"type": "function",
"function": {
"name": "get_build_status",
"description": "Return the status of a CI build.",
"parameters": {
"type": "object",
"properties": {"build_id": {"type": "string"}},
"required": ["build_id"]
}
}
}],
"messages": [{"role": "user", "content": "Did build 4417 pass?"}]
}'What a tool loop does to the bill
A tool-calling agent resends the accumulated transcript on every turn: the system prompt, the tool declarations, every prior message and every tool result. So input tokens grow with each step while output stays roughly constant, and a ten-step loop can pay for the same prefix ten times.
That makes the input rate matter far more in agent work than in single-shot work, and it makes the context ceiling a hard limit on loop length. Among tool-capable ids the input rates run from $0.050 per million (gemini-3-flash) through $0.075 (gemini-3.7-flash-high, gemini-3.6-flash-high, gpt-5.4-mini), $0.20 (grok-4.6, grok-4.5, gpt-5.6-terra, gemini-3.1-pro-low), $0.30 (claude-sonnet-5), $0.50 (claude-opus-5, gpt-5.6-sol) up to $4.00 on the Fable stable lanes.
Context is the other half. A loop on grok-composer-2.5-fast stops at 200,000 tokens; on gpt-5.6-sol at 372,000; on grok-4.6 at 500,000; on claude-sonnet-5 or any Gemini id at 1,000,000. The catalog prices cache reads separately from fresh input on these models, which is the lever that exists precisely because agent prefixes repeat.
Choosing, and the part the catalog cannot tell you
Work through it in this order. First the route, because it costs code: if your client already speaks one shape, the candidates inside that shape start with a real advantage. Then the context ceiling, because it is a hard stop on how long a loop can run. Then the input rate, because that is what a growing transcript multiplies. Two of the 27 have no thinking to spend tokens on — stable-claude-haiku-4-5 and grok-composer-2.5-fast — which is a cost property worth knowing if your tools do the reasoning.
What the capability flag does not record is reliability: whether a model emits well-formed arguments, respects a schema under pressure, and knows when to stop calling tools. Those are the failures that actually break an agent, and no column in models.json describes them.
So test them. Give two or three candidates the same tool set and the same twenty tasks, and count malformed calls, wrong-tool calls and runaway loops — not just successes. Then multiply the input tokens each run consumed by that model’s rate. A model that finishes in four turns at $0.30 per million can beat one that takes nine turns at $0.075, and only the measurement tells you which is which.