> ## Documentation Index
> Fetch the complete documentation index at: https://afk.arpan.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# Adapters

> Built-in LLM providers and custom adapter registration.

Providers translate between AFK's normalized contracts (`LLMRequest`/`LLMResponse`) and provider-specific APIs. AFK ships with three built-in providers and supports custom providers for internal deployments.

## Built-in providers

<CardGroup cols={3}>
  <Card title="OpenAI" icon="circle-o">
    Direct integration via the OpenAI Python SDK. Supports all GPT-4.1 and
    o-series models.
  </Card>

  <Card title="Anthropic" icon="circle-a">
    Direct integration via the Anthropic SDK. Supports Claude Opus 4.5 and Opus.
  </Card>

  <Card title="LiteLLM" icon="circle-l">
    Proxy adapter for 100+ providers (Azure, Bedrock, Gemini, Mistral, local
    models, etc.).
  </Card>
</CardGroup>

## Capability comparison

| Feature              | OpenAI                                                 | Anthropic                                              | LiteLLM                                                                     |
| -------------------- | ------------------------------------------------------ | ------------------------------------------------------ | --------------------------------------------------------------------------- |
| Text generation      | <Icon icon="check" iconType="solid" color="#22c55e" /> | <Icon icon="check" iconType="solid" color="#22c55e" /> | <Icon icon="check" iconType="solid" color="#22c55e" />                      |
| Tool calling         | <Icon icon="check" iconType="solid" color="#22c55e" /> | <Icon icon="check" iconType="solid" color="#22c55e" /> | <Icon icon="check" iconType="solid" color="#22c55e" /> (provider-dependent) |
| Structured output    | <Icon icon="check" iconType="solid" color="#22c55e" /> | <Icon icon="check" iconType="solid" color="#22c55e" /> | Provider-dependent                                                          |
| Streaming            | <Icon icon="check" iconType="solid" color="#22c55e" /> | <Icon icon="check" iconType="solid" color="#22c55e" /> | <Icon icon="check" iconType="solid" color="#22c55e" />                      |
| Vision (image input) | <Icon icon="check" iconType="solid" color="#22c55e" /> | <Icon icon="check" iconType="solid" color="#22c55e" /> | Provider-dependent                                                          |
| Custom endpoints     | <Icon icon="check" iconType="solid" color="#22c55e" /> | <Icon icon="check" iconType="solid" color="#22c55e" /> | <Icon icon="check" iconType="solid" color="#22c55e" />                      |

## Usage

```python theme={null}
from afk.llms import LLMBuilder

# OpenAI
openai_client = LLMBuilder().provider("openai").model("gpt-5.5").build()

# Anthropic
anthropic_client = LLMBuilder().provider("anthropic").model("opus-4.8").build()

# LiteLLM (any provider)
gemini_client = LLMBuilder().provider("litellm").model("gemini/gemini-2.5-pro").build()
```

## Custom provider

Register your own provider for unsupported inference servers:

<Steps>
  <Step title="Implement provider and transport contracts">
    ```python theme={null}
    from afk.llms import LLMProvider, LLMRequest, LLMResponse, LLMTransport

    class MyTransport(LLMTransport):
        provider_id = "my-provider"

        async def chat(self, request: LLMRequest, *, response_model=None) -> LLMResponse:
            # Translate LLMRequest → your provider's format
            payload = self._build_payload(request)
            resp = await self._post(payload)
            return self._parse_response(resp.json())

    class MyProvider(LLMProvider):
        provider_id = "my-provider"

        def create_transport(self, *, settings, middlewares=None, observers=None, provider_settings=None):
            return MyTransport()
    ```
  </Step>

  <Step title="Register the provider">
    ```python theme={null}
    from afk.llms import register_llm_provider

    register_llm_provider(MyProvider())
    ```
  </Step>

  <Step title="Use it">
    ```python theme={null}
    client = LLMBuilder().provider("my-provider").model("my-model").build()

    agent = Agent(name="demo", model=client, instructions="...")
    ```
  </Step>
</Steps>

## Custom transport

Use provider-specific settings for custom endpoints, proxy URLs, or credentials:

```python theme={null}
client = (
    LLMBuilder()
    .provider("openai")
    .model("gpt-5.5")
    .with_provider_settings("openai", {"base_url": "https://proxy.example.com/v1"})
    .build()
)
```

## Next steps

<CardGroup cols={2}>
  <Card title="Control & Session" icon="sliders" href="/llms/control-and-session">
    Retry, caching, rate limiting, and circuit breaking.
  </Card>

  <Card title="Agent Integration" icon="link" href="/llms/agent-integration">
    How agents resolve and use LLM clients.
  </Card>
</CardGroup>
