---
title: "Provider fields"
manual: "LLM Foundation"
version: "0.43"
permalink: "https://docs.typo3.org/permalink/netresearch/nr-llm:configuration-provider@0.43"
source: "Configuration/ProviderFields.rst"
rendered: "2026-11-04T13:45:29+00:00"
---

# Provider fields {#configuration-provider}

Providers represent API connections with credentials.

![LLM providers list with connection status](../Images/backend-providers.png)

## Required {#configuration-provider-required}

-   **identifier**

    -   *Type:* string
    -   *Required:* true

    Unique slug for programmatic access
    (e.g., `openai-prod`, `ollama-local`).

-   **name**

    -   *Type:* string
    -   *Required:* true

    Display name shown in the backend.

-   **adapter_type**

    -   *Type:* string
    -   *Required:* true

    The protocol to use:

    -   `openai` — OpenAI API
    -   `anthropic` — Anthropic Claude API
    -   `gemini` — Google Gemini API
    -   `ollama` — Local Ollama instance
    -   `openrouter` — OpenRouter multi-model API
    -   `mistral` — Mistral AI API
    -   `groq` — Groq inference API
    -   `azure_openai` — Azure OpenAI Service
    -   `custom` — OpenAI-compatible endpoint
    -   `typesafe` — TypeSafe decision API
        (decisions only, [Decision service](https://docs.typo3.org/permalink/netresearch/nr-llm:api-decision-service@0.43))
    -   `decision_sidecar` — local decision sidecar
        (decisions only, no API key)

-   **api_key**

    -   *Type:* string

    API key for authentication. Stored as a
    [nr-vault](https://github.com/netresearch/t3x-nr-vault)
    UUID identifier (envelope encryption).
    nr-llm never stores raw API keys in the
    database. Required for cloud providers
    (OpenAI, Claude, Gemini, etc.); not required
    for local providers like Ollama.

## Optional {#configuration-provider-optional}

-   **endpoint_url**

    -   *Type:* string
    -   *Default:* (adapter default)

    Custom API endpoint URL.

    For `azure_openai` it is required and names the URL shape
    ([ADR-247](https://docs.typo3.org/permalink/netresearch/nr-llm:adr-247@0.43)):

    -   the resource URL, for example `https://contoso.openai.azure.com`:
        requests go to
        `/openai/deployments/<model id>/<operation>?api-version=<version>`,
        so the model record's model id is the **deployment name**;
    -   a URL ending in `/openai/v1`: requests go to the OpenAI paths below
        it, the deployment name travels as the body's `model`, and no
        `api-version` is sent.

    Both send the key in the `api-key` header.

    Name a deployment after the model it serves (`gpt-5.2`): nr-llm reads
    the model's capabilities, such as a reasoning profile, from the model id,
    and a custom deployment name does not carry them. For reasoning models
    prefer the v1 URL or set a recent `apiVersion`; older versions of the
    deployment API reject newer request fields. Enter the resource URL, not
    the portal's full target URI with `/chat/completions` in it. A resource
    behind a private endpoint resolves to a private address, which the
    nr-vault host filter refuses until the host is listed in its
    `allowed_hosts`.

-   **organization_id**

    -   *Type:* string
    -   *Default:* (empty)

    Organization ID (OpenAI). Sent as the `OpenAI-Organization`
    request header by the OpenAI-compatible adapters (`openai`,
    `together`, `fireworks`, `perplexity`, `custom`). Azure OpenAI does not
    read it, and `azure_openai` does not send it.

-   **timeout**

    -   *Type:* integer
    -   *Default:* 120

    Maximum time in seconds to wait for the complete API response. A
    configuration- or model-level timeout overrides this value per request.

-   **max_retries**

    -   *Type:* integer
    -   *Default:* 3

    Number of retries after the first failed request (0 = try once, no
    retries). Timed-out requests are not retried.

-   **options**

    -   *Type:* JSON
    -   *Default:* {}

    Additional adapter-specific options. Supported keys:

    -   **`customHeaders`**

        Object mapping header names to values, sent on every API request
        (including streaming), for example:

        ```json
        {"customHeaders": {"X-Custom-Header": "value"}}
        ```

        Custom headers are applied after the adapter's own headers, so a
        colliding name overrides the adapter value — a mistyped
        `Content-Type` breaks that provider's calls.

    -   **`apiVersion`**

        `azure_openai` on the deployment API only: the `api-version` to
        send, for example `{"apiVersion": "2025-04-01-preview"}`. Default
        `2024-10-21`; a value not shaped like a version falls back to it.

    > [!NOTE]
    > A per-provider `proxy` is not supported; TYPO3's global HTTP proxy
    > configuration (`$GLOBALS['TYPO3_CONF_VARS']['HTTP']['proxy']`)
    > applies to all outgoing provider requests.
