Architecting Resilient AI Agents with Pydantic AI: Type Safety, Execution Control, and Error Recovery
🚀 Key Takeaways
- Type-Safe Agent Core: Pydantic AI enforces end-to-end type safety and deterministic execution by binding generic dependency and output schemas directly into agent state machines.
- Self-Correcting Retries: Automated schema validation detects malformed tool arguments and structured outputs, re-prompting models dynamically with error context before failures escape.
- Granular Execution Modes: Comprehensive execution primitives support synchronous runs, real-time event streaming, and manual node-by-node graph iteration for full lifecycle control.
- Resilient Run Cancellation: Thread-safe cancellation mechanisms preserve resumable message histories and automatically repair interrupted conversation transcripts upon continuation.
- Strict Cost & Concurrency Guardrails: Configurable usage limits, upfront token pricing passes, and concurrency throttles prevent runaway loops and context degradation.
- Provider-Agnostic Fallback Routing: Decoupled model abstractions enable automated sequential failover across multiple model providers when API errors or invalid responses occur.
- Advanced Context & Cache Optimization: Native support for smart instruction caching, automated compaction, and vendor-specific security screening maximizes throughput across major inference platforms.
Building production-grade AI applications often becomes an operational nightmare when non-deterministic LLM responses bypass type checks and crash downstream business logic. Traditional agent architectures struggle with silent data corruption, unhandled tool schema mismatches, and spiraling token expenses that make large-scale deployment risky.
Pydantic AI transforms agent engineering by extending Python's gold standard for data validation into the core generative AI loop. By treating system dependencies, tool invocations, and structured responses as strict, verifiable contracts, the framework allows developers to construct self-correcting agents that intercept malformed outputs and self-heal in real time.
This comprehensive guide provides an actionable roadmap for architecting runtime error-free AI agents, mastering dynamic execution flows, configuring multi-provider fallback topologies, and enforcing airtight cost and safety constraints across modern enterprise environments.
Pydantic AI transforms agent engineering by extending Python's gold standard for data validation into the core generative AI loop. By treating system dependencies, tool invocations, and structured responses as strict, verifiable contracts, the framework allows developers to construct self-correcting agents that intercept malformed outputs and self-heal in real time.
This comprehensive guide provides an actionable roadmap for architecting runtime error-free AI agents, mastering dynamic execution flows, configuring multi-provider fallback topologies, and enforcing airtight cost and safety constraints across modern enterprise environments.

1. Core Architecture and Execution Flows: Dynamic Graphs and Lifecycle Control
To eliminate runtime failures in production AI agent systems, deterministic execution boundaries and static type enforcement must govern both data dependencies and control transitions.Pydantic AI establishes this reliability layer by grounding its core architecture in type-parameterized generic structures and explicit state graph orchestration.
Generic Type Parameterization and FSM Orchestration
Pydantic AI models agents as fully typed constructs parameterized over dependencies and expected outputs.Every agent is instantiated using the generic signature Agent[DependencyType, OutputType], ensuring that contextual dependencies and structured responses adhere strictly to defined schema contracts.
This parameterization eliminates dynamic type errors by validating dependencies at initialization and guaranteeing output validation against the target schema.
Under the hood, agent execution flows are orchestrated via pydantic-graph finite state machines.
By structuring the agent lifecycle as an explicit finite state machine, state transitions between model requests, tool invocations, and response validations remain strictly controlled and deterministic.
Five Execution Pathways and Stepwise Iteration via agent.iter()
Pydantic AI provides five primary execution methods to accommodate diverse synchronization, streaming, and execution control requirements.| Execution Method | Execution Pathway Type | Operational Mechanism |
|---|---|---|
| agent.run() | Asynchronous Execution | Runs the complete agent workflow asynchronously until a final output matching the schema is generated. |
| agent.run_sync() | Synchronous Execution | Executes the agent workflow in a blocking, synchronous context for direct standard scripting environments. |
| agent.run_stream() | Streaming Response | Streams structured output data incrementally; finalizes on the first valid output match. |
| agent.run_stream_events() | Event Streaming | Streams lifecycle events throughout agent execution for detailed event-driven observability. |
| agent.iter() | Iterative Lifecycle Control | Returns an AgentRun instance for asynchronous iteration or manual step-by-step stepping. |
This instance can be iterated asynchronously or driven manually node-by-node using the .next() method, granting developers precise execution control over each discrete state transition in the graph.
When utilizing agent.run_stream(), an important execution boundary applies: the method considers the first output matching the configured output type as final and will not execute dangling tool calls under default settings.
Declarative Configuration and Real-Time RunUsage Tracking
Separating system architecture from operational configuration is essential for reproducible deployments.Agent specifications can be defined declaratively in YAML or JSON, decoupling agent definitions and prompts from core application logic.
Throughout the lifecycle of an execution, resource consumption and operational overhead are tracked directly.
Usage statistics—including token counts, request counts, and USD cost estimates powered by genai-prices—are accessible via agent_run.usage or the RunUsage structure.
This provides continuous observability into execution costs and computational volume across all run modes.

2. Runtime Type Safety, Structured Output Validation, and Self-Correcting Model Retries
Building reliable AI agents requires deterministic output guarantees and resilient error-handling mechanisms.Pydantic AI achieves runtime type safety by intercepting invalid tool parameters and structured model outputs before application logic can fail.
Pydantic Model Validation and Automated Error Feedback Loops
Runtime type safety is strictly enforced by validating output against Pydantic models directly, such as setting result_type=CodeReviewResult.When a language model returns data that diverges from the defined schema, validation errors in tool parameters or structured outputs are not emitted as unhandled application crashes.
Instead, Pydantic AI captures the validation failure details and passes them back to the model within an automated retry request.
This automated error feedback loop allows the model to inspect its precise schema violations and re-generate a conformant payload.
Explicit ModelRetry Raising and Self-Correction Workflows
Beyond automatic schema verification, developers can enforce domain-specific validation logic within custom tools and output handlers.A ModelRetry exception can be raised explicitly inside tools or output functions to trigger LLM self-correction.
When an explicit ModelRetry is encountered during tool execution, the error message is packaged and returned to the model as instructional feedback for its next generation cycle.
The default retry count for agents is 1.
Engineers can customize this behavior via retries, configure it systematically using AgentRetries, or supply per-run overrides depending on the criticality of the workflow.
Global Text Retry Budgets vs Per-Tool Retry Limits and UnexpectedModelBehavior
Pydantic AI separates execution boundaries between tool invocations and final text or structured outputs.The text output path shares a single global retry budget across the run, preventing unbounded generation attempts.
Conversely, the tool output path applies per-tool retry limits, allowing individual tools to exhaust localized retry attempts independently.
When the maximum output retry limit is exceeded or unexpected API responses occur, Pydantic AI raises an UnexpectedModelBehavior exception.
| Validation & Retry Scope | Budget & Limit Handling | Trigger Mechanism | Exhaustion Behavior |
|---|---|---|---|
| Structured Output Path | Single global retry budget across the run (default count: 1) | Pydantic model validation failure (e.g., result_type=CodeReviewResult) | Raises UnexpectedModelBehavior |
| Tool Output Path | Per-tool retry limits configured via retries or AgentRetries | Tool parameter validation error or explicit ModelRetry exception | Passes error back to model or fails when tool retry budget is spent |
| Runtime Overrides | Per-run overrides modifying default agent retry settings | Explicit configuration at invocation time | Raises UnexpectedModelBehavior on unexpected API responses or budget limits |

3. Thread-Safe Cancellation Architecture, Transcript Repair, and Resumption
Achieving runtime error-free execution in production agent systems requires deterministic interruption handling that does not corrupt message transcripts or discard computational state.Pydantic AI provides a structured cancellation architecture designed to handle abrupt halts, maintain resume-ready session histories, and prevent protocol desynchronization.
CancellationToken Mechanics and RunCancelled vs CancelledError
Core cancellation workflows in Pydantic AI rely onCancellationToken instances.These tokens are engineered to be thread-safe, idempotent, and strictly single-use per run or explicit stop gesture.
Invoking cancellation across asynchronous boundaries guarantees that duplicate signals do not trigger conflicting state transitions.
The framework separates cancellation into first-party application signals and external system interrupts.
First-party cancellation intentionally raises
RunCancelled, an application-level catchable exception that retains the full resumable message history and accumulated token usage.Conversely, external cancellation preserves native
CancelledError propagation to maintain standard compatibility with asyncio.timeout(), structured concurrency via TaskGroups, and distributed orchestrators such as Temporal workflows.| Cancellation Type | Exception Raised | Context & Target Ecosystem | State & Usage Preservation |
|---|---|---|---|
| First-Party Cancellation | RunCancelled |
Explicit application-level stop gestures via CancellationToken |
Preserves resumable message history and recorded usage metrics |
| External Cancellation | CancelledError |
asyncio.timeout(), TaskGroups, and Temporal workflows |
Propagates standard cancellation flow across async boundaries |
Interrupted Message States and Automated Transcript Repair with ToolReturnPart
When an ongoing streaming generation is aborted mid-flight, Pydantic AI prevents malformed transcript persistence.Cancelled streams record incomplete model responses directly into the message history with state='interrupted'.
This explicit state marking signals that the model's generation turn was severed before reaching a natural completion or tool execution boundary.
When a session is subsequently resumed, interrupted transcripts undergo automated repair.
If an interrupted turn contained dangling or unanswered tool calls, the framework automatically repairs the transcript by synthesizing
ToolReturnPart objects for those unfulfilled calls.This synthetic reconciliation satisfies model API schema requirements, ensuring that resuming agents do not crash with protocol or validation runtime errors due to missing tool execution responses.
Tool-Level RunContext.cancel() and Streaming Token Billing Limitations
Individual tools executed within an agent turn can also initiate first-party cancellation usingRunContext.cancel().This localized cancellation stops the immediate operation cleanly without killing the entire parent agent run unless the cancellation signal is explicitly forwarded to the outer scope.
Developers must account for provider-level constraints when monitoring resource consumption during aborted runs.
Token usage reporting following the cancellation of an active stream is partial and provider-dependent.
Because upstream model providers handle partial stream termination inconsistently, these post-cancellation token figures are unsuitable for strict financial billing guarantees.

4. Operational Cost Guardrails, Context Bounding, and Concurrency Management
Building production-grade agents under Pydantic AI requires strict execution governance to prevent runaway execution cycles, context bloating, and infrastructure exhaustion.Runtime stability depends not only on type validation but also on proactive constraints that intercept unbounded execution patterns before they result in financial overruns or service degradation.
Enforcing UsageLimits and Upfront Cost Verification
Pydantic AI provides the UsageLimits structure to enforce deterministic constraints across critical operational axes.Developers can explicitly define boundaries for request_limit, tool_calls_limit, input and output token consumption, and cumulative cost_limit.
To prevent issuing requests that exceed budgetary constraints before network execution, setting count_tokens_before_request=True triggers an upfront token-counting pass.
This mechanism calculates token volume and prices input tokens prior to dispatching payloads to the model provider.
When utilizing cost_limit, the system checks pricing benchmarks via internal registries; if genai-prices lacks pricing data for the specified model or provider, Pydantic AI emits a CostNotFoundWarning while maintaining execution flow.
| Governance Mechanism | Configuration / Class | Operational Function |
|---|---|---|
| Execution & Cost Caps | UsageLimits (request_limit, tool_calls_limit, cost_limit) | Enforces strict bounds on external API calls, tool invocations, token volumes, and total financial expenditure. |
| Pre-flight Token Evaluation | count_tokens_before_request=True | Executes an upfront token-counting and pricing pass before dispatching requests to external provider endpoints. |
| Context Size Bounding | per_request_input_tokens_limit | Restricts input token volume per single request to mitigate prompt degradation and minimize cache-miss penalties. |
| Parallelism Throttling | max_concurrency, max_queued | Regulates parallel execution slots and raises ConcurrencyLimitExceeded when queue capacity is reached. |
| Cross-Instance Limiting | ConcurrencyLimiter, ConcurrencyLimitedModel | Manages shared concurrency limits and queue pools across multiple provider instances simultaneously. |
Context Window Bounding via per_request_input_tokens_limit
Managing context growth across complex multi-step reasoning runs is essential for maintaining output coherence and preventing systemic performance drops.The per_request_input_tokens_limit parameter establishes an explicit upper threshold on the input token count for individual model requests.
Bounding input tokens on a per-request basis prevents prompt degradation caused by unbounded message accumulation.
Additionally, this threshold prevents unexpected cache-miss costs by ensuring request structures stay within optimal caching boundaries during repeated tool-calling interactions.
Provider-Wide Concurrency Limiting and Queue Management
High-throughput production environments require resilient concurrency management to avoid breaching upstream rate limits or starving local process pools.Pydantic AI introduces fine-grained parallel run controls through the max_concurrency and max_queued parameters.
When execution demand exceeds available active slots, incoming requests enter a bounded queue until capacity clears.
If the queue fills completely, the system immediately raises a ConcurrencyLimitExceeded exception, enabling upstream components to handle backpressure predictably.
For distributed or multi-model architectures, ConcurrencyLimiter and ConcurrencyLimitedModel provide shared concurrency governance across multiple model provider instances to ensure balanced operational capacity.

5. Multi-Provider Abstractions, Model Profiles, and Dynamic Fallback Architectures
Building runtime error-free AI agents requires robust abstractions that decouple underlying vendor SDKs from operational agent logic.In Pydantic AI, multi-provider handling and dynamic failover pipelines ensure agent execution remains resilient against endpoint outages, schema incompatibilities, and network-level anomalies.
Decoupled Provider Architecture and ModelProfile Schema Transforms
Pydantic AI establishes a clear separation of concerns by splitting vendor interaction across distinct layers.Model classes wrap vendor SDKs into a fully agnostic API, abstracting away disparate low-level client interfaces.
Complementing this, Provider classes handle authentication mechanisms and manage target network endpoints independently.
To address variations in how different LLMs consume structured data, ModelProfile defines JSON schema transformations and tool support capabilities completely independent of the model classes themselves.
This abstraction ensures agents adapt schema formats and tool call conventions dynamically without mutating core application code.
Sequential Failover with FallbackModel and ModelHTTPError Inspection
High-availability agent workflows rely on seamless multi-tier model failovers when primary model calls encounter critical operational errors.FallbackModel automatically tries multiple models in sequence upon encountering a ModelAPIError or predefined custom HTTP error conditions.
When investigating failure causes, ModelHTTPError exposes crucial diagnostics, including the raw status_code, the full response body, response headers, and parsed retry_after values designed for rate-limiting mitigation.
Importantly, output validation errors do not trigger FallbackModel transitions; schema validation failures rely strictly on the internal LLM retry budget to refine outputs with the active model before resorting to model swapping.
Response-Based Fallback and FallbackExceptionGroup Management
Beyond low-level HTTP or network failures, downstream logic often requires switching models based on the semantic payload of the completion itself.Response-based fallback mechanisms enable dynamic model switching based on direct inspections of the ModelResponse object in non-streaming mode.
This inspection evaluates criteria such as the finish_reason or native tool failure flags returned by the provider.
If all configured backup models in a sequential execution chain fail, FallbackModel raises a unified FallbackExceptionGroup.
Inheriting directly from Python's standard ExceptionGroup, this exception structure aggregates every underlying failure across the entire fallback chain, allowing comprehensive introspection of every failed attempt.

6. OpenAI Ecosystem Integration: Responses API, Compaction, and Caching Controls
In building runtime error-free AI agents with Pydantic AI 2.0, establishing a deterministic, resilient connection to foundation model providers is critical.Pydantic AI provides deep, native support for the OpenAI ecosystem, decoupling transport complexity from agent logic and managing state, caching, and execution models directly through strongly typed configurations.
Responses API Architecture and Stateful Context Retention
Pydantic AI 2.0 aligns directly with modern OpenAI API primitives by differentiating model interfaces via endpoint-specific string prefixes.Configuring an agent with the default openai: prefix automatically resolves to OpenAIResponsesModel, utilizing OpenAI's Responses API architecture.
Conversely, specifying the openai-chat: prefix routes executions to the traditional OpenAIChatModel interface.
For complex multi-turn workflows, the Responses API integration facilitates conversation continuity without requiring manual client-side payload reconstruction.
Developers can enforce server-side state retention by passing previous_response_id='auto' alongside a defined openai_conversation_id.
This mechanism delegates conversation history management directly to the server, eliminating client-side serialization errors and payload drift across long agent runs.
Prompt Caching Economics and Background Long-Running Reasoning
To optimize operational latency and cost in production pipelines, Pydantic AI integrates seamlessly with OpenAI's prompt caching controls.Both implicit and explicit prompt caching require a shared message prefix of at least 1024 tokens and operate on a 30-minute request-wide TTL (time-to-live).
Understanding the billing structure is crucial when designing high-throughput agents: OpenAI bills initial cache writes at 1.25 times the uncached input token rate on GPT-5.6 and later models.
For complex computational workloads and deep reasoning agents that exceed standard HTTP timeout boundaries, Pydantic AI provides native background processing.
By activating the openai_background execution parameter, the agent initiates long-running reasoning tasks asynchronously and executes automated polling until the response payload is successfully materialized, avoiding socket drops and runtime timeout exceptions.
OpenAICompaction Modes and Integration Lifecycle Deprecations
Context window exhaustion is mitigated through the OpenAICompaction suite, which offers dual operating modes for agent token management.Developers can deploy stateful server-side auto-compaction to automatically condense historical turns on the provider side, or invoke stateless /responses/compact modes to programmatically compress messages before submission.
Maintaining a runtime error-free environment requires staying aligned with upstream API lifecycle deprecations.
Support for legacy httpx.AsyncClient client instances emits explicit deprecation warnings in Pydantic AI v2 and is scheduled for complete removal in v3.
Additionally, following the retirement of GitHub Models on July 30, 2026, the corresponding GitHubProvider integration is officially deprecated and slated for removal in v3.
| Feature / Parameter | Model / API Scope | Technical Specification & Lifecycle Behavior |
|---|---|---|
| openai: | OpenAIResponsesModel | Default model prefix resolving to the OpenAI Responses API. |
| openai-chat: | OpenAIChatModel | Explicit prefix resolving to the legacy Chat Completions model interface. |
| previous_response_id='auto' & openai_conversation_id | OpenAIResponsesModel | Server-side state retention controls for automated conversation continuity. |
| Prompt Caching | Implicit & Explicit Caching | Requires >= 1024 tokens prefix; 30-min TTL; cache writes billed at 1.25x uncached rate on GPT-5.6+. |
| openai_background | Reasoning Tasks | Background execution mode with automated polling for long-running workloads. |
| OpenAICompaction | Context Management | Supports stateful server-side auto-compaction and stateless /responses/compact endpoints. |
| httpx.AsyncClient (Legacy) | HTTP Transport | Emits deprecation warnings in v2; scheduled for full removal in v3. |
| GitHubProvider | GitHub Models | Service retired on July 30, 2026; provider deprecated for removal in v3. |

7. Anthropic Integration: Smart Instruction Caching, Compaction, and Extended Thinking
Achieving runtime stability and predictable performance in AI agent workflows requires tight synchronization between framework-level message management and model-specific API mechanisms.In Pydantic AI, Anthropic integration provides specialized controls designed to prevent runtime errors, optimize latency, and manage token consumption across multi-step execution loops.
Smart Instruction Caching and 4-Point Cache Marker Pruning
Anthropic enforces strict prompt caching rules, limiting prompt caching to a maximum of 4 cache points per request.Pydantic AI handles this constraint deterministically through Smart Instruction Caching, which automatically places cache points between static instructions and dynamic instructions.
When multi-turn conversations grow and the total number of cache markers exceeds the allowed ceiling, Pydantic AI trims excess
CachePoint markers from older messages while explicitly preserving system and tool cache points.Furthermore, mid-conversation system prompts are positioned between turns without invalidating prior cached prefixes, maintaining cache efficiency throughout iterative agent runs.
| Feature / Parameter | Specification / Value | Operational Rule & Compatibility |
|---|---|---|
| Prompt Cache Point Limit | Maximum 4 cache points per request | Excess CachePoint markers are automatically pruned from older messages while preserving system and tool cache points. |
| Instruction Partitioning | Smart Instruction Caching | Cache points are automatically placed between static instructions and dynamic instructions. |
| AnthropicCompaction Threshold | Default: 150,000 tokens Minimum: 50,000 tokens |
Triggers server-side compaction once message history reaches the defined token boundary. |
| Task Budget Management | anthropic_task_budget |
Provides advisory token limits across full multi-step agent loops; incompatible with task_budget.remaining when compaction is enabled. |
Task Budgets vs AnthropicCompaction Execution Constraints
Managing long-horizon agent state demands predictable context window management.AnthropicCompaction operates with a default token_threshold of 150,000 tokens, subject to a minimum threshold of 50,000 tokens.To govern cumulative consumption across multi-turn agent iterations, Pydantic AI supports advisory token limits via
anthropic_task_budget.However, an operational limitation exists between these two mechanisms:
task_budget.remaining cannot be combined with AnthropicCompaction because the Anthropic server manages compaction tracking automatically.Adhering to this boundary prevents configuration conflicts and runtime budget resolution errors during execution.
Extended Thinking Output Modes and Tool Choice Compatibility
Anthropic extended thinking enables deep reasoning capabilities but introduces specific operational constraints within agent tool-calling lifecycles.Extended thinking is incompatible with forced tool choice.
To prevent runtime execution failures when extended thinking is active, Pydantic AI automatically switches structured output processing to either Native Output or Prompted Output fallback modes.
Understanding these mode switches ensures that structured data extraction and reasoning-heavy agent steps operate reliably without triggering schema validation exceptions.

8. Google Gemini and Ollama Integration: Context Caching, Safety Armor, and Grammar Constraints
In runtime error-free AI agent development, robust execution depends on understanding how model providers enforce schemas, cache large prompts, and apply security controls.Pydantic AI bridges proprietary and self-hosted model ecosystems through dedicated model abstractions, ensuring that provider-specific behaviors like context caching, safety filtering, and JSON constraint fallbacks operate predictably.
GoogleModel Providers and Context Caching Size Thresholds
The GoogleModel wrapper unifies access across Google ecosystems by supporting both GoogleProvider (for Google AI Studio and the Gemini API) and GoogleCloudProvider (for Google Cloud Vertex AI).To optimize throughput and reduce latency during complex multi-turn agent evaluations, developers can leverage reusable context caching via the google_cached_content parameter.
Context caching is governed by strict minimum prompt size thresholds.
Gemini context caches require minimum token size thresholds of approximately 2048 tokens for Gemini 2.5 and 4096 tokens for Gemini 3.
Requests containing prompt contexts below these respective thresholds will not initialize or utilize context caching structures, making token budgeting an essential consideration when configuring persistent memory stores.
Google Cloud Model Armor Non-Streaming Security Screening
Enterprise agent deployments integrated with Google Cloud can configure Google Cloud Model Armor to screen requests for prompt injection attacks and sensitive data leaks.This security layer inspects payloads to neutralize adversarial inputs and maintain data governance standards before responses are generated.
However, an important architectural limitation applies: Google Cloud Model Armor screening is not applied by Google Cloud during streaming requests invoked through agent.run_stream().
Model Armor security screening operates strictly on non-streaming request pipelines.
System architects must account for this boundary when designing input sanitization and output validation strategies across real-time streaming interfaces.
Ollama Grammar-Constrained JSON Schema vs Ollama Cloud Fallbacks
For local and self-hosted environments, Ollama v0.5.0+ natively supports grammar-constrained JSON decoding using the json_schema response format parameter.This feature restricts the model vocabulary during sampling to tokens that conform strictly to the Pydantic-defined output schema, effectively eliminating structural syntax runtime errors.
Differences emerge when shifting execution from self-hosted Ollama runtimes to Ollama Cloud environments.
The Ollama Cloud inference backend accepts json_schema without returning an error, but it does not actively enforce grammar-constrained decoding during generation.
To prevent malformed payload extraction, OllamaModel inspects endpoint routes, automatically switches off supports_json_schema_output when detecting Ollama Cloud paths, and seamlessly falls back to ToolOutput or PromptedOutput mechanisms.
| Dimension / Capability | Google Gemini (GoogleModel) | Ollama (OllamaModel) |
|---|---|---|
| Supported Provider Interfaces | GoogleProvider (Gemini API / Google AI Studio) and GoogleCloudProvider (Vertex AI) | Self-hosted Ollama instances and Ollama Cloud endpoints |
| Context Caching Parameters & Limits | Configured via google_cached_content; minimum thresholds of ~2048 tokens (Gemini 2.5) and ~4096 tokens (Gemini 3) | Not applicable in standard schema integration specs |
| Structured Output & Grammar Enforcement | Native structured output validation via Google API wrappers | Grammar-constrained JSON decoding on self-hosted Ollama v0.5.0+ via response_format json_schema |
| Security Filtering & Fallback Behavior | Google Cloud Model Armor screens prompt injection and leaks in non-streaming mode (disabled during agent.run_stream()) | Automatically disables supports_json_schema_output on Ollama Cloud and falls back to ToolOutput or PromptedOutput |



