LLM Function Calling: Tool-Use Patterns for 2026
How function calling lets LLMs take action in 2026: schema design, parallel tool calls, the ReAct loop, and scaling to large toolsets.

A language model on its own can only produce text. The moment you want it to check a database, send an email, or run a calculation, you need function calling, the mechanism that lets a model decide to invoke a tool you defined, hand you the arguments, and use the result. By 2026 function calling is the foundation under nearly every serious AI product: agents, retrieval pipelines, structured extraction, automation. Getting the patterns right is the difference between an agent that works and one that flails.
Quick answer
Function calling lets a model request a tool with structured arguments; your code runs the tool and returns the result, so execution and permissions stay under your control. The biggest lever is schema quality, clear tool descriptions and tight types can lift accuracy 10 to 20 percent across any model. Parallelize independent, read-only calls and serialize anything with shared side effects. Use the ReAct loop (reason, act, observe, repeat) with a step limit for multi-step work, and once you pass roughly 20 tools, group them or add a routing step.
Key takeaways
- Function calling lets a model request a tool with structured arguments; your code runs the tool and returns the result for the model to use.
- Schema quality matters more than model choice, clear tool definitions can improve accuracy 10-20% across every model.
- Parallel tool calls run independent tools at once for big latency wins; disable them when calls share side effects or must be ordered.
- The ReAct loop, reason, act, observe, repeat, is the standard pattern for multi-step tasks in 2026.
- Past roughly 20 tools, selection errors climb; group tools or add a routing step.
The core loop
The mechanics are simpler than they sound:
- You define tools as JSON schemas, a name, a description, and typed parameters.
- You send the user's request along with those tool definitions to the model.
- The model either answers directly or responds with a tool call: which function it wants and the arguments.
- Your code executes the function locally and sends the result back to the model.
- The model incorporates the result and either answers or calls another tool.
Critically, the model never runs anything itself. It only requests calls; your application stays in control of execution, which is where you enforce permissions, validation, and safety.
Schema design is the real lever
The single most overlooked truth about function calling: the model's accuracy depends more on how you describe your tools than on which model you pick. Well-designed schemas have been measured to improve accuracy by 10-20% across all models. That makes schema design the highest-leverage work you can do.
Good practice:
- Write descriptions for the model, not your teammates. Explain when to use the tool and what each parameter means, in plain language.
- Use precise types and enums. Constraining a parameter to a fixed set of values prevents the model from inventing invalid ones.
- Make required vs optional explicit, and give examples in the description for anything ambiguous.
- Name tools by intent,
search_orders_by_customerbeatsquery2.
Tip
When function calls fail, suspect the schema before the model. A vague description or a loosely typed parameter causes far more wrong calls than model weakness. Tighten the schema and re-test before reaching for a bigger, more expensive model.

Parallel tool calls
All three major providers now let a model request several tool calls in a single turn. When those calls are independent, checking the weather in five cities, fetching three unrelated records, running them in parallel collapses what would be five sequential round-trips into one, a large latency win. A 2026 study found scaling the number of tool calls per step delivered roughly a 4x speedup on agentic search.
The catch is dependency. If one call's result feeds another, or two calls touch the same state, parallel execution is wrong, you must run them in order. The rule:
- Parallelize read-only, independent calls.
- Serialize calls that share side effects or must execute in sequence.
Disable parallel calling explicitly for ordered or side-effecting workflows rather than hoping the model gets it right.
A quick reference for when to parallelize and when not to:
| Call pattern | Run them | Why |
|---|---|---|
| Read-only, independent (5 weather lookups) | In parallel | No shared state; collapses round-trips |
| One result feeds the next | In sequence | Later call needs the earlier output |
| Two calls touch the same resource | In sequence | Avoid races and conflicting writes |
| Any irreversible side effect (send, pay) | In sequence + confirm | Order and a human gate matter |
The ReAct loop for multi-step work
For tasks that take more than one action, the dominant 2026 pattern is ReAct: the model alternates reasoning about what to do next, acting by calling a tool, and observing the result, then loops. This lets the agent adjust as it goes, exactly what you want for debugging code or conducting research, where the right next step depends on what the last step revealed.
The loop also needs guardrails: a step limit so it cannot run forever, and error handling so a failed tool call becomes an observation the model can recover from rather than a crash. Tracing these loops is essential to debugging them, which is where AI agent observability with OpenTelemetry earns its keep.
Scaling to many tools
Function calling degrades as the toolset grows. Past roughly 20 functions, the model's selection error rate climbs, it gets confused about which tool fits. Two fixes:
- Group related tools so the model chooses among a smaller, coherent set.
- Two-step routing, a first call picks the relevant category of tools, a second call picks the specific tool within it.
This keeps the model's decision narrow at each step. The same discipline that makes structured outputs reliable applies here; reliable structured outputs from LLMs covers the validation patterns that catch malformed tool arguments before they hit your code. For the orchestration layer above all this, see multi-agent frameworks like LangGraph and CrewAI.
What to do right now
If your function-calling agent is flaky, fix these in order of impact:
- Rewrite tool descriptions for the model, explaining when to use each tool and what every parameter means.
- Tighten types and add enums so the model cannot invent invalid arguments.
- Validate tool arguments before execution and turn failures into observations the model can recover from.
- Set a step limit on your ReAct loop so it cannot run forever.
- Mark parallel-safe vs ordered calls explicitly rather than trusting the model to infer dependencies.
- If you have more than ~20 tools, group them or add a category-routing step before tool selection.
Frequently asked questions
Does the model actually run my functions?
No. The model only decides it wants to call a function and produces the arguments. Your application executes the function and returns the result. This separation is deliberate, it keeps execution, permissions, and safety under your control, not the model's.
Why are my tool calls returning wrong arguments?
Most often the schema is the problem. Vague descriptions, loose types, or missing constraints lead the model to guess. Tighten parameter types, use enums for fixed choices, and rewrite descriptions to explain when and how to use each tool. Schema fixes resolve the majority of bad calls.
When should I avoid parallel tool calls?
Whenever calls depend on each other or share side effects. If one call's output feeds another, or two calls modify the same resource, they must run in order. Parallel calling is only safe for independent, typically read-only operations.
How many tools is too many?
Accuracy starts to suffer past around 20 tools, as the model struggles to pick the right one. If you need more, group them into coherent sets or use a two-step routing approach where the model first selects a category, then a specific tool within it.


