> ## Documentation Index
> Fetch the complete documentation index at: https://docs-code.palyra.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Model Provider Subsystem

<details>
  <summary>Relevant source files</summary>

  The following files were used as context for generating this wiki page:

  * crates/palyra-cli/src/client/control\_plane.rs
  * crates/palyra-cli/src/commands/runtime\_reload.rs
  * crates/palyra-common/src/daemon\_config\_schema.rs
  * crates/palyra-common/src/feature\_rollouts.rs
  * crates/palyra-daemon/src/application/route\_message/response.rs
  * crates/palyra-daemon/src/config/load.rs
  * crates/palyra-daemon/src/config/schema.rs
  * crates/palyra-daemon/src/model\_provider.rs
  * crates/palyra-daemon/src/model\_provider/adapters.rs
  * crates/palyra-daemon/tests/current\_state\_inventory.rs
  * crates/palyra-daemon/tests/support/mod.rs
  * crates/palyra-model-providers/Cargo.toml
  * crates/palyra-model-providers/src/config.rs
  * crates/palyra-model-providers/src/contract.rs
  * crates/palyra-model-providers/src/error\_envelope.rs
  * crates/palyra-model-providers/src/errors.rs
  * crates/palyra-model-providers/src/lib.rs
  * crates/palyra-model-providers/src/providers.rs
  * crates/palyra-model-providers/src/providers/antropic.rs
  * crates/palyra-model-providers/src/providers/google.rs
  * crates/palyra-model-providers/src/providers/minimax.rs
  * crates/palyra-model-providers/src/providers/openai.rs
  * crates/palyra-model-providers/src/redaction.rs
  * crates/palyra-model-providers/src/streaming.rs
  * crates/palyra-model-providers/src/tool\_repair.rs
</details>

The Model Provider Subsystem is the architectural layer responsible for abstracting, routing, and executing requests to Large Language Models (LLMs). It provides a unified interface for chat completions, embeddings generation, and audio transcription, shielding the rest of the Palyra daemon from provider-specific wire formats and transport nuances.

The subsystem supports a variety of backends including OpenAI, Anthropic, Google, and MiniMax, while also providing a deterministic "offline" provider for testing and fixtures [crates/palyra-daemon/src/model\_provider.rs#7-12](http://crates/palyra-daemon/src/model_provider.rs#7-12).

### Subsystem Overview

The subsystem is built on a "Registry-Backed" architecture. Instead of hardcoding a single provider, Palyra maintains a registry of configured model entries that can be ranked and selected based on the request requirements (e.g., vision support, reasoning effort, or tool-calling capabilities).

### Core Components and Entities

The following diagram illustrates the relationship between the core traits and the concrete implementations within the `palyra-daemon` and `palyra-model-providers` crates.

**Model Provider Interface Mapping**

```mermaid theme={null}
graph TD
    subgraph "Trait Layer (Code Entity Space)"
        MP["ModelProvider (Trait)"]
        EP["EmbeddingsProvider (Trait)"]
    end

    subgraph "Routing Layer"
        RBMP["RegistryBackedModelProvider"]
    end

    subgraph "Adapter Layer (palyra-daemon)"
        OACA["OpenAiCompatibleChatAdapter"]
        ORCA["OpenAiResponsesChatAdapter"]
        ANCA["AnthropicCompatibleChatAdapter"]
    end

    subgraph "Wire Payload Layer (palyra-model-providers)"
        OCP["openai_chat_completions_payload"]
        ORP["openai_responses_payload"]
        AMP["anthropic_messages_payload"]
    end

    RBMP -- implements --> MP
    RBMP -- implements --> EP

    RBMP -- uses --> OACA
    RBMP -- uses --> ORCA
    RBMP -- uses --> ANCA

    OACA -- calls --> OCP
    ORCA -- calls --> ORP
    ANCA -- calls --> AMP
```

**Sources:** [crates/palyra-daemon/src/model\_provider.rs#5-12](http://crates/palyra-daemon/src/model_provider.rs#5-12), [crates/palyra-daemon/src/model\_provider/adapters.rs#16-57](http://crates/palyra-daemon/src/model_provider/adapters.rs#16-57), [crates/palyra-model-providers/src/lib.rs#71-77](http://crates/palyra-model-providers/src/lib.rs#71-77)

***

## 5.1 Provider Registry and Routing

The `RegistryBackedModelProvider` serves as the primary entry point for the orchestrator. It manages the lifecycle of provider requests, including:

* **Candidate Selection:** Filtering the `ModelProviderRegistryConfig` to find models that support specific features like `ProviderReasoningEffort` or `ProviderImageInput` [crates/palyra-daemon/src/model\_provider.rs#80-87](http://crates/palyra-daemon/src/model_provider.rs#80-87).
* **Circuit Breaking & Failover:** Monitoring provider health and automatically failing over to secondary candidates if the primary provider returns retryable errors (e.g., HTTP 429, 503) [crates/palyra-daemon/src/model\_provider.rs#118-120](http://crates/palyra-daemon/src/model_provider.rs#118-120).
* **Response Caching:** TTL-bounded caching of responses to reduce latency and cost for repetitive queries [crates/palyra-daemon/src/model\_provider.rs#1-3](http://crates/palyra-daemon/src/model_provider.rs#1-3).
* **Normalization:** Converting provider-specific events into a uniform `ProviderEvent` stream, allowing the `AgentRunLoop` to process tokens and tool calls regardless of the underlying backend [crates/palyra-daemon/src/model\_provider.rs#14-18](http://crates/palyra-daemon/src/model_provider.rs#14-18).

For details, see [Provider Registry and Routing](/model_provider_subsystem/provider_registry_and_routing).

**Sources:** [crates/palyra-daemon/src/model\_provider.rs#1-18](http://crates/palyra-daemon/src/model_provider.rs#1-18), [crates/palyra-daemon/src/model\_provider.rs#118-120](http://crates/palyra-daemon/src/model_provider.rs#118-120), [crates/palyra-model-providers/src/lib.rs#86-88](http://crates/palyra-model-providers/src/lib.rs#86-88)

***

## 5.2 Provider Adapters and Configuration

The adapter layer handles the translation between Palyra's internal `ProviderRequest` and the specific JSON dialects required by external APIs.

* **Dialect Support:** Concrete adapters like `OpenAiCompatibleChatAdapter` and `AnthropicCompatibleChatAdapter` project the `ToolVisibleToolCatalogSnapshot` into the correct schema (e.g., OpenAI Function Calling vs. Anthropic Tool Use) [crates/palyra-daemon/src/model\_provider/adapters.rs#25-57](http://crates/palyra-daemon/src/model_provider/adapters.rs#25-57).
* **Configuration Pipeline:** The system uses a multi-layer loading strategy where `palyra.toml` settings are merged with `PALYRA_MODEL_PROVIDER_*` environment variables [crates/palyra-daemon/src/config/load.rs#109-110](http://crates/palyra-daemon/src/config/load.rs#109-110).
* **Secret Management:** Sensitive credentials (API keys) are handled via `SecretRef`, allowing them to be sourced from environment variables, files, or the `palyra-vault` [crates/palyra-common/src/daemon\_config\_schema.rs#22-38](http://crates/palyra-common/src/daemon_config_schema.rs#22-38).
* **Tool Repair:** An experimental feature (`TOOL_REPAIR_ROLLOUT_ENV`) that attempts to normalize and fix malformed tool-call markup generated by models [crates/palyra-daemon/src/model\_provider.rs#71-77](http://crates/palyra-daemon/src/model_provider.rs#71-77).

For details, see [Provider Adapters and Configuration](/model_provider_subsystem/provider_adapters_and_configuration).

**Provider Configuration Flow**

```mermaid theme={null}
graph LR
    subgraph "Input Sources"
        TOML["palyra.toml"]
        ENV["PALYRA_OPENAI_API_KEY"]
        Vault["palyra-vault"]
    end

    subgraph "Config Engine"
        LC["load_config()"]
        MPC["ModelProviderConfig"]
    end

    subgraph "Runtime"
        Registry["ModelProviderRegistry"]
        Adapter["ProviderChatAdapter"]
    end

    TOML --> LC
    ENV --> LC
    Vault --> LC
    LC --> MPC
    MPC --> Registry
    Registry --> Adapter
```

**Sources:** [crates/palyra-daemon/src/config/load.rs#91-110](http://crates/palyra-daemon/src/config/load.rs#91-110), [crates/palyra-common/src/daemon\_config\_schema.rs#168-198](http://crates/palyra-common/src/daemon_config_schema.rs#168-198), [crates/palyra-daemon/src/model\_provider/adapters.rs#16-19](http://crates/palyra-daemon/src/model_provider/adapters.rs#16-19)

## Child Pages

* [Provider Registry and Routing](/model_provider_subsystem/provider_registry_and_routing)
* [Provider Adapters and Configuration](/model_provider_subsystem/provider_adapters_and_configuration)
