---
title: "AI Providers"
manual: "AI Foundation"
version: "2.0"
permalink: "https://docs.typo3.org/permalink/nitsan/ns-t3af:provider-fields@2.0"
source: "Configuration/AIProviders/Index.rst"
rendered: "2026-10-09T13:46:48+00:00"
---

# AI Providers {#provider-fields}

Providers represent connections to AI services. Each provider stores an adapter
type, optional endpoint, encrypted credentials, models, and capability flags.

**Path:** **AI Foundation > AI Providers**

[AI Foundation Providers Demo](https://app.supademo.com/embed/cmrbo0w7i0d96qmo57ifnabvz?embed_v=2&utm_source=embed)

![AI Providers with Own API Keys mode, provider list, models, and connection status](../../Images/provider-01.png)

Without at least one working provider, no AI feature runs.

Alternatively, use [T3Planet Credits](https://docs.typo3.org/permalink/nitsan/ns-t3af:t3planet-credit-system@2.0) when you
want AI without configuring your own vendor API keys.

## Adding a provider {#adding-a-provider}

1.  Open **AI Foundation > AI Providers**.
1.  Click **Add provider**.
1.  Fill in the required fields:

    -   **Display name** — Friendly label for your team (for example \``OpenAI
        production`\`).
    -   **Adapter type** — Vendor protocol (OpenAI, Anthropic, Gemini, Azure,
        Mistral, DeepSeek, xAI, Ollama, or custom OpenAI-compatible).
    -   **API key** — Cloud vendors need a key. Leave empty for local Ollama.
    -   **Model ID** — Completion model (for example `gpt-4o-mini`).
1.  Optionally set the endpoint URL, embedding model, capabilities, temperature,
    and pricing fields.
1.  Click **Save**.
1.  Enable **Default** on exactly one provider.

> [!TIP]
> For first-time setup, use **Quick Setup** in the AI Foundation module
> header. It walks through provider creation with fewer decisions.

![Edit AI Provider drawer with adapter, API key, model, and capabilities](../../Images/provider-02.png)

## Testing a connection {#testing-a-connection}

After saving a provider, click **Test connection** to verify the setup.
The test calls the provider API and reports:

-   Connection status (success or failure)
-   Error details on failure
-   Model / capability hints when the adapter can list them

> [!NOTE]
> Self-hosted endpoints (such as Ollama) must be reachable from the TYPO3
> server. Typical causes of a failed test:
>
> -   Wrong host or port in **Endpoint URL** (default
>     `http://localhost:11434` for Ollama)
> -   Docker/network isolation between PHP and the model host
> -   Outbound HTTPS blocked for cloud vendors
>
> Local adapters usually do not need an API key. Cloud adapters do.

If your server reaches the internet only through a corporate proxy, configure
TYPO3 HTTP settings:

**config/system/additional.php**

```php
$GLOBALS['TYPO3_CONF_VARS']['HTTP']['proxy'] = 'http://proxy.example.com:8080';
```

## Editing and deleting providers {#editing-and-deleting-providers}

-   Click a provider row to edit its settings in the drawer.
-   Use **Test connection** after rotating an API key or changing the
    model.
-   Use **Delete** to remove a provider. Features that pointed at that
    provider fall back to the global default (or fail until another provider is
    assigned).

> [!WARNING]
> Deleting the only default provider leaves child extensions without a global
> fallback. Set another provider as **Default** first.

## Supported adapters {#supported-adapters}

Built-in and discovered adapters include:

-   `symfony.openai` — OpenAI
-   `symfony.anthropic` — Anthropic Claude
-   `symfony.gemini` — Google Gemini
-   `symfony.mistral` — Mistral AI
-   `symfony.ollama` — Local Ollama
-   `symfony.openrouter` — OpenRouter
-   `nst3af.openai_compatible` — Custom / OpenAI-compatible endpoints
-   Additional Symfony AI bridges when their Composer packages are installed
    (for example Azure, DeepSeek, xAI)

Custom adapters: [Custom AI Providers](https://docs.typo3.org/permalink/nitsan/ns-t3af:custom-ai-providers@2.0).

## Capabilities and their purpose {#ai-provider-capabilities}

Pick a model that supports what you need. **Test connection** helps
validate the choice.

| Capability | Purpose |
| --- | --- |
| `chat` | Normal text generation: SEO, Pages, Content, News, LLM translation, chatbot answers. This is the main flag for message-style APIs, and every `complete()` request is allowed when it is ticked. |
| `completion` | Legacy/raw text completion. AI Foundation treats it as equivalent to `chat`: either one is enough for the `complete()` path, and text features are blocked only when both are unticked. |
| `embeddings` | Only for `embed()`, which turns text into vectors for semantic search, RAG and similarity matching. It has no effect on normal text generation, and an embedding model should also be set on the provider. |
| `vision` | Only needed when a request includes images (for example alt-text generation or image description). Text-only requests do not need it, but requests with images are blocked without it. |
| `streaming` | Only for `stream()`, where the answer arrives piece by piece (for example a live chatbot). Without it, streaming calls are blocked, but normal `complete()` requests still work. |
| `tts` | Only for text-to-speech: converting text into audio (for example audio for content elements). It is always checked strictly and must be ticked explicitly. |
| `image_generation` | Only for creating images from a text prompt (for example the T3AI image generator). It is always checked strictly and must be ticked explicitly. |

## Multiple providers — when and why {#multiple-providers-when-and-why}

**Dev and live** — Separate rows with different API keys per environment.

**Cost saving** — Cheap model as global default; premium model assigned in
[AI Features](https://docs.typo3.org/permalink/nitsan/ns-t3af:ai-features@2.0) for important tasks.

**EU hosting** — Mistral or Azure in an EU region for data residency
requirements.

## Provider fields {#provider-fields-1}

Fields below map to the **AI Providers** drawer and the
`tx_nst3af_provider` table.

### Required {#required}

-   **identifier**

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

    Unique slug for programmatic access (for example `openai-prod`,
    `ollama-local`). Must be unique.

-   **title**

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

    Display name shown in the backend and dropdowns.

-   **adapter_type**

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

    Adapter protocol identifier, for example `symfony.openai` or
    `nst3af.openai_compatible`.

-   **capabilities**

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

    Enabled capabilities: `chat`, `completion`, `embeddings`, `vision`,
    `streaming`, `tts`, `image_generation`. Tick at least one capability
    the model supports. See
    [Capabilities and their purpose](https://docs.typo3.org/permalink/nitsan/ns-t3af:ai-provider-capabilities@2.0).

### Connection {#connection}

-   **api_key**

    -   *Type:* string

    API key for authentication. Stored as sodium ciphertext with an
    `enc:v1:` prefix — raw keys are never kept in the database. Required for
    cloud adapters; usually empty for local Ollama.

-   **endpoint_url**

    -   *Type:* string
    -   *Default:* Adapter default

    Custom API base URL. Required for OpenAI-compatible and Ollama-style
    adapters when the default host is wrong for your network.

-   **model_id**

    -   *Type:* string

    Default completion / chat model ID.

-   **embedding_model_id**

    -   *Type:* string

    Default embedding model ID when embeddings are enabled.

### Optional configuration {#optional-configuration}

-   **temperature**

    -   *Type:* float
    -   *Default:* `0.7`

    Default sampling temperature (`0.0`–`2.0`).

-   **system_prompt**

    -   *Type:* text

    Optional provider-level system message prepended to requests.

-   **is_default**

    -   *Type:* bool
    -   *Default:* `false`

    Mark as the global default. Keep exactly one default among enabled rows.

-   **is_enabled**

    -   *Type:* bool
    -   *Default:* `true`

    Soft on/off switch without deleting the row.

-   **priority**

    -   *Type:* integer
    -   *Default:* `50`

    Ordering hint (`0`–`100`) when multiple providers are listed.

-   **be_groups**

    -   *Type:* backend groups

    Restrict this provider to selected backend groups. Empty means available to
    all groups.

-   **privacy_level**

    -   *Type:* string
    -   *Default:* `standard`

    **Logging privacy only** — controls how much is stored in the local request
    log (`standard`, `reduced` without prompt fingerprint, or `none`).
    This setting does **not** redact, strip, or block prompts, brand context, or
    documents sent to the AI provider. Full table and GDPR notes:
    [DPA & GDPR](https://docs.typo3.org/permalink/nitsan/ns-t3af:data-processing-agreement@2.0).

### Governance and status {#governance-and-status}

Optional pricing (`pricing_input_per_1m`, `pricing_output_per_1m`,
`pricing_currency`, `cost_center`), retention overrides, dashboard analytics
flags, and read-only status fields (`last_status`, `last_status_at`,
`last_status_message`, `last_used_at`) support monitoring and cost tracking.
Status fields update after **Test connection** and live requests.

## Troubleshooting {#troubleshooting}

**Test fails** — Check the API key, model ID, endpoint URL, and outbound
HTTPS/firewall rules.

**Rate limit** — Wait or upgrade the vendor plan.

**Vision returns empty** — Use a vision-capable model (for example GPT-4o with
vision).

**Module works but child extension fails** — Check
[AI Features](https://docs.typo3.org/permalink/nitsan/ns-t3af:ai-features@2.0) for per-task overrides.

## Security {#security}

-   Rotate keys every 90 days
-   Use one key per environment (dev, staging, live)
-   Restrict access via [AI Permissions](https://docs.typo3.org/permalink/nitsan/ns-t3af:ai-permissions@2.0)
-   Never commit API keys to Git

## Where to get API keys {#where-to-get-api-keys}

> [!NOTE]
> -   OpenAI: [https://platform.openai.com/api-keys](https://platform.openai.com/api-keys)
> -   Anthropic: [https://console.anthropic.com/](https://console.anthropic.com/)
> -   Google Gemini: [https://aistudio.google.com/apikey](https://aistudio.google.com/apikey)
> -   Mistral: [https://console.mistral.ai/](https://console.mistral.ai/)
> -   Azure OpenAI: [https://portal.azure.com/](https://portal.azure.com/)
> -   DeepL Translation: [https://www.deepl.com/pro-api](https://www.deepl.com/pro-api)

More links: [Helpful Links](https://docs.typo3.org/permalink/nitsan/ns-t3af:helpful-links@2.0)
