{
  "slug": "tool-calling-contracts-for-ai-agents",
  "title": "How to Make AI Agent Tool Calling Reliable",
  "description": "An operator playbook for tool-calling contracts: per-provider strict-mode config (OpenAI, Anthropic, Gemini, self-hosted grammars), the full failure-mode-to-fix table, what BFCL actually measures, and how to stop parallel tool calls from breaking a dependency chain.",
  "kind": "sub",
  "order": 1,
  "target_query": "how to make AI agent tool calling reliable",
  "secondary_queries": [
    "OpenAI strict mode tool calling",
    "Anthropic strict tool definitions",
    "Gemini ANY mode function calling",
    "GBNF grammar for tool calls",
    "disable_parallel_tool_use",
    "Berkeley Function Calling Leaderboard"
  ],
  "tags": [
    "agents",
    "reliability",
    "tool-calling",
    "constrained-decoding",
    "bfcl",
    "production"
  ],
  "published": "2026-08-26",
  "updated": "2026-08-26",
  "words": 1791,
  "estimated_tokens": 2382,
  "premium": false,
  "rights": {
    "access": "free",
    "note": "Editorial guides are always free and never part of the licensed corpus.",
    "license": "https://changegamer.ai/license.xml",
    "pricing": "https://changegamer.ai/api/pricing.json",
    "payment": "https://changegamer.ai/api/payment.json"
  },
  "license": "https://changegamer.ai/license.xml",
  "citation": "ChangeGamer (2026-08-26). How to Make AI Agent Tool Calling Reliable. ChangeGamer. https://changegamer.ai/articles/tool-calling-contracts-for-ai-agents (updated 2026-08-26).",
  "bibtex": "@misc{changegamer_tool_calling_contracts_for_ai_agents, title = {How to Make AI Agent Tool Calling Reliable}, publisher = {ChangeGamer}, year = {2026}, url = {https://changegamer.ai/articles/tool-calling-contracts-for-ai-agents}, note = {Updated 2026-08-26}}",
  "canonical": "https://changegamer.ai/articles/tool-calling-contracts-for-ai-agents",
  "markdown": "https://changegamer.ai/articles/tool-calling-contracts-for-ai-agents.md",
  "takeaways": [
    "OpenAI's strict tool-calling mode requires every schema object to set additionalProperties: false and every property to appear in required, which physically blocks the model from emitting a field outside that contract as of August 2026.",
    "Anthropic separates two distinct guarantees under similar-looking names: strict: true on a tool definition constrains that tool's arguments, while a separate output_config json_schema mechanism constrains only the model's final text reply, and the two are configured independently.",
    "Gemini's ANY-mode function calling forces the model to call a declared function rather than reply in free text, but the claim that Gemini 3 relaxes the historical exclusivity between function calling and a response schema through a VALIDATED mode is WebSearch-corroborated only as of August 2026, not independently confirmed against Google's own documentation.",
    "The Berkeley Function Calling Leaderboard scores both serial and parallel tool calls through abstract-syntax-tree comparison against a reference call, and its fourth iteration folds in multi-step agentic tasks rather than testing isolated single calls only.",
    "Setting disable_parallel_tool_use to true on an Anthropic tool call, or forcing tool_choice to a specific tool one call at a time, is the standard fix when one tool call's arguments depend on a value only a prior tool call can return."
  ],
  "outline": [
    {
      "depth": 2,
      "text": "What makes a tool call reliable enough to trust in production?",
      "anchor": "what-makes-a-tool-call-reliable-enough-to-trust-in-production",
      "url": "https://changegamer.ai/articles/tool-calling-contracts-for-ai-agents#what-makes-a-tool-call-reliable-enough-to-trust-in-production"
    },
    {
      "depth": 2,
      "text": "How does each provider enforce a tool-calling contract?",
      "anchor": "how-does-each-provider-enforce-a-tool-calling-contract",
      "url": "https://changegamer.ai/articles/tool-calling-contracts-for-ai-agents#how-does-each-provider-enforce-a-tool-calling-contract"
    },
    {
      "depth": 3,
      "text": "OpenAI: strict mode",
      "anchor": "openai-strict-mode",
      "url": "https://changegamer.ai/articles/tool-calling-contracts-for-ai-agents#openai-strict-mode"
    },
    {
      "depth": 3,
      "text": "Anthropic: strict tool definitions plus separate output control",
      "anchor": "anthropic-strict-tool-definitions-plus-separate-output-control",
      "url": "https://changegamer.ai/articles/tool-calling-contracts-for-ai-agents#anthropic-strict-tool-definitions-plus-separate-output-control"
    },
    {
      "depth": 3,
      "text": "Gemini: ANY-mode function calls",
      "anchor": "gemini-any-mode-function-calls",
      "url": "https://changegamer.ai/articles/tool-calling-contracts-for-ai-agents#gemini-any-mode-function-calls"
    },
    {
      "depth": 3,
      "text": "Self-hosted models: grammar-constrained sampling",
      "anchor": "self-hosted-models-grammar-constrained-sampling",
      "url": "https://changegamer.ai/articles/tool-calling-contracts-for-ai-agents#self-hosted-models-grammar-constrained-sampling"
    },
    {
      "depth": 2,
      "text": "The tool-calling failure-mode-to-fix table",
      "anchor": "the-tool-calling-failure-mode-to-fix-table",
      "url": "https://changegamer.ai/articles/tool-calling-contracts-for-ai-agents#the-tool-calling-failure-mode-to-fix-table"
    },
    {
      "depth": 2,
      "text": "What does the Berkeley Function Calling Leaderboard actually measure?",
      "anchor": "what-does-the-berkeley-function-calling-leaderboard-actually-measure",
      "url": "https://changegamer.ai/articles/tool-calling-contracts-for-ai-agents#what-does-the-berkeley-function-calling-leaderboard-actually-measure"
    },
    {
      "depth": 2,
      "text": "Why do parallel tool calls break dependency chains, and how do you force ordering?",
      "anchor": "why-do-parallel-tool-calls-break-dependency-chains-and-how-do-you-force-ordering",
      "url": "https://changegamer.ai/articles/tool-calling-contracts-for-ai-agents#why-do-parallel-tool-calls-break-dependency-chains-and-how-do-you-force-ordering"
    },
    {
      "depth": 2,
      "text": "Where this leaves you",
      "anchor": "where-this-leaves-you",
      "url": "https://changegamer.ai/articles/tool-calling-contracts-for-ai-agents#where-this-leaves-you"
    }
  ],
  "faq": [
    {
      "question": "What is the difference between OpenAI strict mode and Anthropic strict tool definitions?",
      "answer": "OpenAI's strict mode is a single flag on a function definition or response format that requires additionalProperties: false and a fully populated required array, and it applies the same constrained-decoding guarantee to both tool-call arguments and a JSON-mode final answer; Anthropic instead splits the two into separate mechanisms — strict: true on an individual tool schema for call arguments, and a distinct output_config json_schema field for the model's own concluding reply — so a builder porting a contract between the two providers has to configure both halves rather than assuming one flag covers both."
    },
    {
      "question": "Does Gemini guarantee schema-valid tool calls the way OpenAI and Anthropic do?",
      "answer": "Gemini's ANY-mode function calling, set via tool_config.function_calling_config.mode, forces the model to call one of the declared functions and gives schema adherence comparable to OpenAI or Anthropic strict mode as of August 2026, but function calling and a response schema have historically been mutually exclusive in any mode on Gemini — declaring both together errors. Google's own documentation reportedly describes a newer VALIDATED mode on Gemini 3 that combines the two, but that specific detail is carried in the reference corpus as WebSearch-corroborated only this cycle, not independently confirmed by a direct fetch of Google's pages, so treat it as directionally likely rather than settled before depending on it in production."
    },
    {
      "question": "What is a GBNF grammar and why do self-hosted models need one?",
      "answer": "A GBNF grammar is a Backus-Naur-Form-based rule set that llama.cpp compiles into a constraint on which tokens the model is allowed to sample at each position, which matters for self-hosted models because they have no provider-side strict-mode flag to guarantee schema-valid tool-call output — the constraint has to be enforced at the token-sampling layer itself, inside the inference runtime, rather than requested from an API."
    },
    {
      "question": "Should tool calls run in parallel by default?",
      "answer": "No, not when one call's arguments depend on a value only a previous call returns — running them in parallel by default means the dependent call is built before the value it needs exists, producing a wrong or hallucinated argument instead of a correct one. Anthropic's disable_parallel_tool_use: true field, or forcing tool_choice to name one specific tool per turn, is the standard way to guarantee sequential execution when call order is load-bearing rather than incidental."
    }
  ],
  "body": "Tool-calling reliability is one discipline inside the twelve-part stack the [agent reliability in production](/articles/agent-reliability-in-production) pillar surveys — this article deep-dives that one discipline: what a tool-calling contract enforces, how each provider implements it, the failure modes a strict contract still doesn't eliminate, and how call ordering breaks under naive parallel execution.\n\n## What makes a tool call reliable enough to trust in production?\n\nA tool call is reliable enough to trust in production when the calling application never has to guess whether the model's output is schema-valid — when a decoding-level guarantee rules out a malformed shape outright, rather than the application hoping a well-written prompt was enough. That is the core distinction between a \"contract\" and a suggestion: a prompt asking the model to \"always return valid JSON\" is advice it can still ignore under a long context or ambiguous input; a schema flagged `strict: true` with `additionalProperties: false` is a constraint the decoder cannot violate, because the sampler itself excludes any token that would break the declared shape. As of August 2026 all three major hosted providers — OpenAI, Anthropic, Google Gemini — ship some version of this guarantee, and every serious self-hosted inference stack enforces the equivalent at the sampling layer through a grammar. None of them eliminates every failure mode below; a valid shape is not the same as a correct value, and that gap is where the rest of this playbook lives.\n\n## How does each provider enforce a tool-calling contract?\n\nEach of the three major hosted providers enforces schema validity through a different mechanism, and porting a tool contract between them means re-implementing the guarantee, not just re-declaring the same schema.\n\n### OpenAI: strict mode\n\nSet `strict: true` on a function definition. OpenAI's constrained decoding then guarantees the output matches the schema exactly, provided every object sets `additionalProperties: false` and every property appears in `required` — model an optional field as a nullable union, not an omission from `required`:\n\n```json\n{\n  \"type\": \"function\",\n  \"function\": {\n    \"name\": \"get_weather\",\n    \"strict\": true,\n    \"parameters\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"location\": { \"type\": \"string\" },\n        \"unit\": { \"type\": [\"string\", \"null\"], \"enum\": [\"celsius\", \"fahrenheit\"] }\n      },\n      \"required\": [\"location\", \"unit\"],\n      \"additionalProperties\": false\n    }\n  }\n}\n```\n\nWithout `strict: true`, the call falls back to best-effort generation with no compliance guarantee — the flag is the entire mechanism, not a tuning knob.\n\n### Anthropic: strict tool definitions plus separate output control\n\nAnthropic's tool schemas carry their own `strict: true` field on the tool definition, constraining that tool's *arguments* specifically — it says nothing about the model's own final reply, which a separate `output_config` mechanism governs instead. `tool_choice` independently controls whether a tool is used at all: `auto` lets the model decide, `any` forces at least one call, `tool` with a name forces that specific tool, and `none` blocks tool use.\n\n```json\n{\n  \"name\": \"get_weather\",\n  \"strict\": true,\n  \"input_schema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"location\": { \"type\": \"string\" },\n      \"unit\": { \"type\": \"string\", \"enum\": [\"celsius\", \"fahrenheit\"] }\n    },\n    \"required\": [\"location\", \"unit\"],\n    \"additionalProperties\": false\n  }\n}\n```\n\n### Gemini: ANY-mode function calls\n\nGemini enforces schema-typed tool output by setting `tool_config.function_calling_config.mode` to `ANY`, forcing the model to call a declared function rather than answer in free text, with adherence Google's own documentation describes as comparable to the strict-mode guarantees above:\n\n```json\n{\n  \"tool_config\": {\n    \"function_calling_config\": {\n      \"mode\": \"ANY\",\n      \"allowed_function_names\": [\"get_weather\"]\n    }\n  }\n}\n```\n\nHistorically, Gemini's function calling and its `responseSchema` for a final answer have been mutually exclusive within a single call — declaring both errors. Google's docs reportedly describe a Gemini 3 `VALIDATED` mode combining the two, a detail the reference corpus carries as WebSearch-corroborated only this cycle and not independently confirmed by a direct fetch of Google's own pages — treat it as directionally likely, not settled.\n\n### Self-hosted models: grammar-constrained sampling\n\nSelf-hosted models have no provider API to flag `strict: true` against, so the constraint moves into the inference runtime itself. llama.cpp compiles a GBNF (GGML BNF) grammar — or an auto-converted JSON Schema — into rules that restrict which tokens the sampler can choose:\n\n```\n# Illustrative — the shape of a GBNF grammar constraining a tool call's\n# output to a fixed JSON structure, not tied to a specific llama.cpp\n# version. grammar and function-calling cannot be used simultaneously in\n# llama.cpp; function calling uses its own internal grammar.\nroot    ::= \"{\" ws \"\\\"tool\\\"\" ws \":\" ws \"\\\"get_weather\\\"\" ws \",\" ws \"\\\"location\\\"\" ws \":\" ws string \"}\"\nstring  ::= \"\\\"\" [^\"]* \"\\\"\"\nws      ::= [ \\t\\n]*\n```\n\nvLLM, SGLang, TensorRT-LLM, and MLC-LLM instead default to XGrammar as of 2025, exposed through a `guided_json` parameter compiling a JSON Schema to a pushdown automaton at well under 40 microseconds of token-masking overhead; Outlines is a third option, compiling a schema or regex to a finite-state machine on the same runtimes. All three guarantee the same thing strict mode guarantees — a valid shape — under the operator's own control rather than a provider flag.\n\n## The tool-calling failure-mode-to-fix table\n\nReal tool calls still fail in a small, well-documented set of shapes even under full strict-mode or grammar enforcement, and each one needs its own fix rather than one universal validator.\n\n| Failure mode | What it looks like | Fix |\n|---|---|---|\n| Hallucinated tool name | Model calls a tool never in the declared set | Validate the returned name against your schema before executing; reject unknown names outright |\n| Missing required argument | Model omits a field the schema marks required | `required` + `additionalProperties: false` under strict mode; a schema-validation library catches gaps before execution |\n| Extraneous fields | Model adds keys not present in the schema | `additionalProperties: false`, or strip unknown keys defensively if the provider doesn't enforce it |\n| Unparsable JSON | Output isn't valid JSON at all | Enable provider strict mode or grammar decoding; otherwise wrap parsing in try/catch and resubmit the error to the model |\n| Wrong field types | A string where an integer or enum was expected | Prefer enum/const values over free text; validate types with a schema library (Pydantic, Zod) before consuming a value |\n| Over-calling | Model invokes a tool that wasn't needed | Constrain with `tool_choice: auto` and a minimal toolset; measure against your production traffic, since a benchmark score alone won't surface it |\n| Under-calling | Model answers in text when a call was required | Force tool use: Anthropic `tool_choice: any`, Gemini `mode: ANY`, or remove the text-only response path entirely |\n| Out-of-order parallel calls | Simultaneous calls with an unstated dependency | Declare the dependency explicitly and force sequential execution — see below |\n\nTwo mitigations cut across nearly every row: trim each schema down to the smallest possible set of required fields, since a field left optional is a slot the model is free to skip, garble, or invent a value for; and build a resubmission loop around raw output — parse it, validate it, and on failure hand the exact validator error back to the model in a follow-up turn instead of letting a bad call crash the calling application outright. A related but distinct discipline lives one layer downstream: [common MCP server failure modes](/articles/mcp-server-failure-modes) covers what an MCP handler does when a malformed or hallucinated call reaches it despite this contract, and how it recovers from a crash mid-call — this article stops at the contract that produces the call.\n\n## What does the Berkeley Function Calling Leaderboard actually measure?\n\nBFCL (the Berkeley Function Calling Leaderboard) measures tool-call correctness by comparing a model's emitted call against a reference answer through abstract-syntax-tree comparison, across both serial and parallel call scenarios — the Gorilla team at UC Berkeley builds and runs it. AST comparison checks the *structure* of the call — the tool name and argument tree — against a known-correct reference rather than scoring free-text similarity, which makes it harder to game with verbose or plausible-sounding output than an LLM-as-judge approach. Its fourth iteration, current as of August 2026, extends the leaderboard beyond isolated single calls to fold in multi-step, agentic tasks — a model can pass a single-call AST check perfectly and still fail a multi-step BFCL task if it gets the *order* of dependent calls wrong, a distinct failure from getting any individual call's shape wrong.\n\n## Why do parallel tool calls break dependency chains, and how do you force ordering?\n\nParallel tool calls break a dependency chain when one call's correct arguments depend on a value only a prior call can return, and the model issues both calls in the same turn instead of waiting for the first result. Consider an agent refunding a customer: it must first call `lookup_order` to get an order ID, then call `issue_refund` with that ID. If the model treats both as independent and parallelizable — a shape it has no inherent reason to avoid unless told to — `issue_refund` fires with a fabricated or empty order ID before `lookup_order`'s result ever returns, because nothing in a naive parallel tool-call turn guarantees one call's output reaches another call issued in the same turn.\n\nThe fix makes the dependency explicit rather than implicit in the prompt, using ordering controls each provider already exposes:\n\n- **Anthropic** — set `disable_parallel_tool_use: true` on `tool_choice` to cap the model at one call per turn, guaranteeing the second call in a chain only fires after the first call's result is back in context.\n- **Forced sequential `tool_choice`** — on any provider that supports naming a specific tool, force `lookup_order` first and only expose `issue_refund` once its result is available, rather than declaring both tools simultaneously and hoping the model sequences them correctly.\n\nNeither fix requires the model to reason about dependency order on its own — both remove the opportunity for a parallel call to fire before its precondition exists, which is more reliable than trusting a prompt instruction like \"call these in order\" to hold under every input the agent will see in production.\n\n## Where this leaves you\n\nProvider-side strict mode and grammar-based decoding solve the shape problem — a call that cannot be malformed — but not the value or ordering problem, which is why the failure-mode table and the parallel-call fix above both still matter with strict mode fully enabled. Validate tool names and argument values defensively regardless of which provider's guarantee you rely on, force sequential execution wherever one call's arguments depend on another call's result, and treat BFCL as a proxy for cross-model comparison rather than a guarantee about your own task distribution's failure rate. The full mechanism and mitigation reference this article draws from is [reliable tool calling and structured outputs](/resources/reliable-tool-calling); for the other eleven reliability disciplines this fits inside, see the [agent reliability in production](/articles/agent-reliability-in-production) pillar.",
  "cluster": {
    "id": "agent-reliability",
    "title": "Agent reliability in production",
    "description": "How to make an AI agent reliable — tool-calling contracts, structured outputs, retries and idempotency, timeouts, durable execution, guardrails, evaluation in CI, observability, incident response, and rollout.",
    "status": "complete",
    "pillar": {
      "slug": "agent-reliability-in-production",
      "title": "Agent Guardrails and the AI Agent Reliability Playbook",
      "description": "Agent guardrails plus the eleven other disciplines that make an AI agent reliable in production: tool calling, retries, durable execution and rollout.",
      "kind": "pillar",
      "order": 0,
      "html": "https://changegamer.ai/articles/agent-reliability-in-production",
      "markdown": "https://changegamer.ai/articles/agent-reliability-in-production.md",
      "json": "https://changegamer.ai/api/articles/agent-reliability-in-production.json"
    },
    "articles": [
      {
        "slug": "tool-calling-contracts-for-ai-agents",
        "title": "How to Make AI Agent Tool Calling Reliable",
        "description": "An operator playbook for tool-calling contracts: per-provider strict-mode config (OpenAI, Anthropic, Gemini, self-hosted grammars), the full failure-mode-to-fix table, what BFCL actually measures, and how to stop parallel tool calls from breaking a dependency chain.",
        "kind": "sub",
        "order": 1,
        "html": "https://changegamer.ai/articles/tool-calling-contracts-for-ai-agents",
        "markdown": "https://changegamer.ai/articles/tool-calling-contracts-for-ai-agents.md",
        "json": "https://changegamer.ai/api/articles/tool-calling-contracts-for-ai-agents.json"
      },
      {
        "slug": "structured-outputs-vs-tool-calling",
        "title": "Structured Outputs vs Tool Calling: When to Use Each",
        "description": "A decision framework for structured outputs versus tool calling in AI agents, with runnable JSON Schema examples for OpenAI, Anthropic, Gemini, vLLM/SGLang, and llama.cpp, plus mitigation code for truncation, refusal, and grammar-compilation latency.",
        "kind": "sub",
        "order": 2,
        "html": "https://changegamer.ai/articles/structured-outputs-vs-tool-calling",
        "markdown": "https://changegamer.ai/articles/structured-outputs-vs-tool-calling.md",
        "json": "https://changegamer.ai/api/articles/structured-outputs-vs-tool-calling.json"
      },
      {
        "slug": "retries-and-idempotency-for-ai-agents",
        "title": "How to Make AI Agent Retries Idempotent",
        "description": "A deep-dive on retrying agent tool calls safely: the transient-vs-terminal decision, why an agent side effect can fire before a failure signal reaches the caller, idempotency-key mechanics (run ID + step index), the unknown-outcome edge case, and where idempotency keys do not reach.",
        "kind": "sub",
        "order": 3,
        "html": "https://changegamer.ai/articles/retries-and-idempotency-for-ai-agents",
        "markdown": "https://changegamer.ai/articles/retries-and-idempotency-for-ai-agents.md",
        "json": "https://changegamer.ai/api/articles/retries-and-idempotency-for-ai-agents.json"
      },
      {
        "slug": "durable-execution-for-ai-agents",
        "title": "When Do AI Agents Need Durable Execution?",
        "description": "A deep-dive on durable execution for AI agents: the persisted event log, the replay-determinism constraint, the four architectural shapes mapped across ten engines and frameworks, and a decision framework for when a durable execution engine is worth adding at all.",
        "kind": "sub",
        "order": 4,
        "html": "https://changegamer.ai/articles/durable-execution-for-ai-agents",
        "markdown": "https://changegamer.ai/articles/durable-execution-for-ai-agents.md",
        "json": "https://changegamer.ai/api/articles/durable-execution-for-ai-agents.json"
      },
      {
        "slug": "agent-guardrails-for-reliability",
        "title": "How to Design Guardrails for AI Agent Reliability",
        "description": "An operator playbook for reliability guardrails: the three checkpoints (input, output, action), layering cheap checks under slow ones with a fail-closed default, the two-of-three-properties rule for when a tool call needs human approval, and logging every verdict against the run trace ID.",
        "kind": "sub",
        "order": 5,
        "html": "https://changegamer.ai/articles/agent-guardrails-for-reliability",
        "markdown": "https://changegamer.ai/articles/agent-guardrails-for-reliability.md",
        "json": "https://changegamer.ai/api/articles/agent-guardrails-for-reliability.json"
      },
      {
        "slug": "evaluating-ai-agents-in-ci",
        "title": "How to Evaluate AI Agents in CI",
        "description": "An operator playbook for gating an AI agent release in CI: why agent eval needs trajectory-level scoring across the tasks it actually runs, how public benchmarks diverge as proxies, ground-truth vs LLM-as-judge tool-call scoring, and the three-layer test pyramid that keeps CI fast and non-flaky.",
        "kind": "sub",
        "order": 6,
        "html": "https://changegamer.ai/articles/evaluating-ai-agents-in-ci",
        "markdown": "https://changegamer.ai/articles/evaluating-ai-agents-in-ci.md",
        "json": "https://changegamer.ai/api/articles/evaluating-ai-agents-in-ci.json"
      },
      {
        "slug": "agent-rollout-and-rollback",
        "title": "How to Roll Out a New AI Agent Version Safely",
        "description": "An operator playbook for shipping a new agent version without breaking production: in-repo vs. registry prompt storage, a version-numbering comparison, the six-step promotion flow, A/B-test mechanics, the composite-version trace fields, and a rollback drill.",
        "kind": "sub",
        "order": 7,
        "html": "https://changegamer.ai/articles/agent-rollout-and-rollback",
        "markdown": "https://changegamer.ai/articles/agent-rollout-and-rollback.md",
        "json": "https://changegamer.ai/api/articles/agent-rollout-and-rollback.json"
      },
      {
        "slug": "agent-incident-response-runbooks",
        "title": "How to Build an Incident Response Runbook for AI Agent Failures",
        "description": "An operator playbook for the moment an AI agent fails in production: a triage step to classify the failure fast, trace freezing before rollback destroys the evidence, first-response depth on the four failure classes, and a blameless post-mortem that feeds back into guardrails and eval.",
        "kind": "sub",
        "order": 8,
        "html": "https://changegamer.ai/articles/agent-incident-response-runbooks",
        "markdown": "https://changegamer.ai/articles/agent-incident-response-runbooks.md",
        "json": "https://changegamer.ai/api/articles/agent-incident-response-runbooks.json"
      },
      {
        "slug": "timeouts-and-deadlines-for-ai-agents",
        "title": "How to Set Timeouts for AI Agent Tool Calls",
        "description": "A deep-dive on timeout and deadline design for AI agents: sizing LLM-call, tool-call, and sub-agent-hop timeouts differently, allocating a wall-clock budget across a multi-step chain, and propagating a remaining-deadline value from parent to child calls.",
        "kind": "sub",
        "order": 9,
        "html": "https://changegamer.ai/articles/timeouts-and-deadlines-for-ai-agents",
        "markdown": "https://changegamer.ai/articles/timeouts-and-deadlines-for-ai-agents.md",
        "json": "https://changegamer.ai/api/articles/timeouts-and-deadlines-for-ai-agents.json"
      },
      {
        "slug": "circuit-breakers-and-degraded-mode-for-ai-agents",
        "title": "How to Design a Circuit Breaker for AI Agents",
        "description": "A deep-dive on the circuit breaker pattern for AI agents: the Closed/Open/Half-Open state machine with a worked open-source example, where to place a breaker in an agent's call path, and degraded-mode fallback design as its own discipline per dependency type.",
        "kind": "sub",
        "order": 10,
        "html": "https://changegamer.ai/articles/circuit-breakers-and-degraded-mode-for-ai-agents",
        "markdown": "https://changegamer.ai/articles/circuit-breakers-and-degraded-mode-for-ai-agents.md",
        "json": "https://changegamer.ai/api/articles/circuit-breakers-and-degraded-mode-for-ai-agents.json"
      },
      {
        "slug": "agent-observability-for-reliability",
        "title": "What Should an AI Agent's Observability System Capture?",
        "description": "An operator playbook for instrumenting an AI agent: the trace/span model behind a run, the OpenTelemetry GenAI attributes that name each field, the fields worth capturing per span, and what to redact before any of it gets logged.",
        "kind": "sub",
        "order": 11,
        "html": "https://changegamer.ai/articles/agent-observability-for-reliability",
        "markdown": "https://changegamer.ai/articles/agent-observability-for-reliability.md",
        "json": "https://changegamer.ai/api/articles/agent-observability-for-reliability.json"
      },
      {
        "slug": "agent-reliability-production-checklist",
        "title": "The AI Agent Production Reliability Checklist",
        "description": "A go/no-go checklist that turns the agent reliability pillar's twelve-discipline closing list into checkable gates — the specific artifact, header, or trace field that proves each one holds, with a link to whichever sibling article owns its mechanics.",
        "kind": "sub",
        "order": 12,
        "html": "https://changegamer.ai/articles/agent-reliability-production-checklist",
        "markdown": "https://changegamer.ai/articles/agent-reliability-production-checklist.md",
        "json": "https://changegamer.ai/api/articles/agent-reliability-production-checklist.json"
      }
    ]
  },
  "navigation": {
    "pillar": {
      "slug": "agent-reliability-in-production",
      "title": "Agent Guardrails and the AI Agent Reliability Playbook",
      "description": "Agent guardrails plus the eleven other disciplines that make an AI agent reliable in production: tool calling, retries, durable execution and rollout.",
      "kind": "pillar",
      "order": 0,
      "html": "https://changegamer.ai/articles/agent-reliability-in-production",
      "markdown": "https://changegamer.ai/articles/agent-reliability-in-production.md",
      "json": "https://changegamer.ai/api/articles/agent-reliability-in-production.json"
    },
    "previous": null,
    "next": {
      "slug": "structured-outputs-vs-tool-calling",
      "title": "Structured Outputs vs Tool Calling: When to Use Each",
      "description": "A decision framework for structured outputs versus tool calling in AI agents, with runnable JSON Schema examples for OpenAI, Anthropic, Gemini, vLLM/SGLang, and llama.cpp, plus mitigation code for truncation, refusal, and grammar-compilation latency.",
      "kind": "sub",
      "order": 2,
      "html": "https://changegamer.ai/articles/structured-outputs-vs-tool-calling",
      "markdown": "https://changegamer.ai/articles/structured-outputs-vs-tool-calling.md",
      "json": "https://changegamer.ai/api/articles/structured-outputs-vs-tool-calling.json"
    }
  },
  "resources": [
    {
      "slug": "reliable-tool-calling",
      "html": "https://changegamer.ai/resources/reliable-tool-calling",
      "markdown": "https://changegamer.ai/resources/reliable-tool-calling.md",
      "json": "https://changegamer.ai/api/resources/reliable-tool-calling.json"
    }
  ]
}