Models & catalog

Open-source models with tool calling (measured)

Published 2026-08-12 · 5 min read

Tool calling is what turns a language model from a thing that answers into a thing that acts: it lets the model emit a structured request to call a function — get_weather, query_database, send_email — and then continue from the tool's result. Nearly every serious open-source model now supports it in principle. But “in principle” is the trap. Whether a model actually returns a clean tool_call with well-formed arguments depends on the serving stack as much as the weights: the same model that calls tools cleanly on one provider can be refused or mangle its arguments on another. That is why, when we add a model to our catalog, we re-measure tool calling with a real call on every provider lane we route through — and why you should verify it on the exact API you will use before building an agent on it.

What tool calling actually is

Tool calling (a.k.a. function calling) is the mechanism behind every agent framework. You declare the available functions — with names, descriptions, and JSON schemas for their arguments — and when the model decides it needs to act, it emits a structured tool_calls object instead of plain text. The runtime executes the function and feeds the result back; the model then continues. That loop — model → tool → result → model — is the entire foundation of agents, API integration with external services, and workflows that touch the outside world.

A model that cannot do this reliably cannot be an agent; it can only chat. So the question “which open-source model supports tool calling” is really “which models can I build an agent on, and which lanes actually serve that ability”.

It is a property of the serving stack

Here is the part that surprises people who only read model cards: tool calling is not fully determined by the weights. It depends on whether the serving framework and the provider have wired up the tool-calling path — the special tokens, the schema parser, the tool_calls response contract. A provider can refuse the feature, return it malformed, or simply not support it on a given deployment.

We have concrete evidence of this in our own routing. The same Qwen2.5-VL 72B calls tools cleanly on one of our providers but is refused with a 400 on another — even though it is the same model. That is why, on our catalog, toolCalling is a per-entry field measured by a real call on the lane that actually serves it, never assumed from the weights or copied between providers.

How to verify it in one call

You do not need a benchmark to know whether a lane serves tool calling. Run one small real call:

  1. Declare a trivial function — say get_weather(city) with a JSON schema.
  2. Send a prompt that clearly requires it, e.g. “What's the weather in Paris?”.
  3. Inspect the response: you want a valid tool_calls array with a well-formed arguments JSON object.

That is exactly the test we run on every model we add — our registry notes even record the city used (a get_weather on Paris for DeepSeek V4 Flash, Lyon for Llama 3.3 70B on OVHcloud). A clean, parseable tool_call with correct JSON is the difference between an agent that works and a string of text that happens to look like a function call.

Failure modes in practice

When tool calling is not actually wired through the serving stack, the failure is rarely a hard error — it is a subtle degradation that looks like the feature is working. Three patterns dominate.

The argument-as-string trap. A model returns a tool_call whose arguments is a quoted blob or a prose description instead of a parseable JSON object. The call “succeeds”; your parser, expecting JSON.parse, throws. This is the single most common production failure and the reason we check for well-formed JSON in every verification, not just for the presence of a tool_calls key.

The silent text fallback. When it genuinely cannot call the tool, a model may decide to answer in prose — “I don't have a weather tool” — instead of emitting a tool_call. In an automated loop that quietly halts the workflow rather than erroring, which is harder to catch than a crash.

The hallucinated tool name. The model invokes a function that was never declared, or one with the wrong signature. The runtime rejects it, and unless your agent re-sends the request, that single turn is lost.

Each of these is why a benchmark that checks “did it occasionally return a tool_call” is not enough. The useful test is the one we run per lane: a required call, a strict check on name and parseable arguments and correct values. That is the bar an agent actually depends on.

Which models we route with tool calling

Every chat-and-reasoning model in our current catalog is served with tool calling verified on its lane. It is a curated selection, not the whole market, and the exact list is public on the model catalog. It spans Qwen (235B, Qwen3.5 397B, Qwen3 32B, Qwen3 Coder 30B), GLM-5.2, DeepSeek V4 Flash, Llama 3.3 70B, GPT-OSS 120B/20B, Mistral Small 3.2 24B, and the fast-access Kimi K3 lane.

All of them are billed the same way — per token from prepaid credit, no subscription — so building a small agent to test tool calling costs fractions of a euro. You do not commit to a contract to find out whether a model can use tools; you measure it for cents.

Why this matters for agents

For agentic work, tool calling is not a checkbox — it is the core loop, and the failure modes are specific:

  • Malformed arguments. A model that returns arguments as a string inside the wrapper, or with a schema mismatch, breaks every downstream parser.
  • Missing tool_calls. A model that answers in text when you asked for a tool call silently breaks the loop.
  • Lane-dependent behaviour. The same model works on one provider and fails on another — exactly why capability must be verified on the lane you serve from.

So the practical advice mirrors our own process: pick the model, but verify tool calling on the provider lane you will actually use, with one cheap real call, before you wire an agent around it.

Tool calling on EU-sovereign infrastructure

Agentic workloads often touch sensitive data — a tool call can read an internal database or an inbox. If that data must stay under EU jurisdiction, you want a lane whose operator is outside non-EU control, not just a model that can call tools. All our tool-calling models that run on EU-owned operators are labeled sovereign; the fast-access Kimi K3 lane is under non-EU control and is labeled accordingly, never advertised as sovereign.

The combination you would actually want — open-source weights, verified tool calling, and EU-sovereign hosting — is exactly what the sovereign lane of the catalog exists to provide. One OpenAI-compatible call, a prepaid balance that stops at zero, and no non-EU jurisdiction in the loop.

FAQ

Which open-source models support tool calling?

Nearly every serious 2026 open-weight model supports it in principle, but support depends on the serving stack, not just the weights — the same model can work on one provider and be refused on another. Every model in Frontière AI's catalog is served with tool calling verified by a real call on its lane; the exact list is public on the model catalog.

Is tool calling the same as function calling?

Yes — tool calling and function calling are the same mechanism, the structured request a model emits to invoke an external function. It is the foundation of agents and AI assistants: the model requests a call, the runtime executes it, and the model continues from the result.

Do I need tool calling to build an AI agent?

Yes, for any agent that touches the outside world. Without a reliable tool_call contract, a model can only chat — it cannot query a database, call an API, or act on your behalf. Verifying tool calling on your actual provider lane is the first step of agent work.

Why would tool calling work on one provider and not another?

Because tool calling is wired into the serving stack — special tokens, schema parsing and the tool_calls response contract. A provider can refuse, mangle or skip the feature even for a capable model. We re-measure it per lane because we have seen the same model work on one provider and return a 400 on another.

Can I test tool calling with open-source models cheaply?

Yes. Frontière AI bills per token from prepaid credit — no subscription, no trial, top-up from €10, calls stop at zero. A single small real call with one declared function is all you need to verify tool calling on a lane, and it costs a fraction of a euro.

Do reasoning models support tool calling too?

Yes — several of the strongest reasoning models also route tool calling, and on our catalog both the reasoning and tool-calling flags are verified per lane by a real call. Because reasoning burns output tokens while thinking, a tool-calling reasoning agent costs more per turn at the output rate — worth checking on your own workload with one cheap call.

How do I build a reliable agent loop around tool calling?

Start with a strict contract check: a required call, a verifiable tool name, parseable JSON arguments. Then handle the three failure modes — argument-as-string, silent text fallback, hallucinated tool name — by validating the response and re-sending on a malformed turn. Verifying tool calling on your actual provider lane first is the cheapest insurance.

What is the difference between tool calling and structured output?

Structured output forces the model to return JSON in a given schema. Tool calling goes further: the model emits a request to invoke a declared function, the runtime executes it, and the result feeds back into the model. Structured output is one-way formatting; tool calling is a loop that lets the model act and observe the outcome.

Does tool calling increase latency or cost?

Marginally. A tool call requires at least a second round-trip to execute the function and feed the result back, so the wall-clock time is a couple of calls, not one. Cost is negligible for the tool tokens themselves; for reasoning models the thinking tokens on each turn dominate. Neither is a reason to avoid tool calling if your workflow needs to act.

Can I use tools with models that do not natively support them?

Sometimes, via a sidecar or prompt-engineering trick, but it is fragile: the model may return prose instead of a structured call. If tool calling matters to you, choose a model whose serving lane verifiably supports it, and confirm with one real call — that is what we measure per model on our catalog.

Ready to try it?

Create an account and call any model in the catalog in minutes.

Create an account