---
title: "Fournisseurs"
description: "Tous les fournisseurs d'IA et de traduction automatique pris en charge par verbatra, avec leurs options et leur variable de clé d'API, et ce qu'ils partagent."
type: "reference"
---
# Fournisseurs

Tous les fournisseurs d'IA et de traduction automatique pris en charge par verbatra, avec leurs options et leur variable de clé d'API, et ce qu'ils partagent.

Sélectionne un fournisseur par `id` dans le bloc `provider` de ta [configuration](https://verbatra.kreitz-webdev.de/fr/docs/config-file.md). Anthropic, OpenAI, Gemini, OpenCode et openai-compatible sont des modèles de langage ; DeepL, Google Cloud Translation et LibreTranslate sont des services de traduction automatique ; `none` désactive la traduction automatique. La couverture des langues se trouve dans [Langues et locales](https://verbatra.kreitz-webdev.de/fr/docs/language-support.md), et ce que reçoit chaque fournisseur dans [Traitement des données et confidentialité](https://verbatra.kreitz-webdev.de/fr/docs/data-handling.md).

## Lequel choisir ? [#lequel-choisir-]

Tout fournisseur fonctionne avec tout format et toute commande, et en changer plus tard revient à modifier un seul `id`.

| Si tu veux | Utilise |
| --- | --- |
| Gratuit, pour un petit projet aux chaînes non confidentielles | **Gemini** : une offre d'API gratuite, dont Google peut faire lire les requêtes par des humains hors EEE, Suisse et Royaume-Uni ([conditions](https://verbatra.kreitz-webdev.de/fr/docs/data-handling.md#conservation-et-traitement-des-données-chez-le-fournisseur)). |
| La meilleure qualité pour une appli en production | **Anthropic** ou **OpenAI**, tous deux payants. |
| Gros volume, un glossaire natif, pas de LLM | **DeepL**, offre gratuite ou payante. |
| La couverture la plus large avec une clé d'API sur Google Cloud | **Google Cloud Translation** (Basic, v2). |
| Hors ligne, sans coût, rien ne quitte ton réseau | **openai-compatible** avec LM Studio, Ollama ou vLLM. |
| Pas de modèle de langage, mais auto-hébergé | **LibreTranslate** sur ton propre serveur. |
| Aucune traduction automatique | **none** : mémoire et humains uniquement. |

## Les clés viennent de l'environnement [#les-clés-viennent-de-lenvironnement]

verbatra ne lit jamais une clé depuis la configuration. Chaque fournisseur hébergé lit une variable :

| Id du fournisseur | Variable d'environnement |
| --- | --- |
| `anthropic` | `ANTHROPIC_API_KEY` |
| `openai` | `OPENAI_API_KEY` |
| `gemini` | `GEMINI_API_KEY` |
| `deepl` | `DEEPL_API_KEY` |
| `google-translate` | `GOOGLE_TRANSLATE_API_KEY` |
| `opencode` | `OPENCODE_API_KEY` |

Définis-la dans `.env` (que `verbatra init` ajoute au `.gitignore`), dans ton shell ou dans le coffre de secrets de ta CI, et ne la commite jamais. Une variable absente ou vide échoue avec [`MISSING_API_KEY`](https://verbatra.kreitz-webdev.de/fr/docs/error-codes.md#missing_api_key), en nommant la variable mais jamais une valeur. `openai-compatible` et `libretranslate` n'ont généralement besoin d'aucune clé.

## Anthropic [#anthropic]

```ts title="verbatra.config.ts"
provider: {
  id: "anthropic",
  options: {
    model: "claude-sonnet-4-6", // example model id
    maxTokens: 4096,
  },
}
```

| Option | Type | Défaut | Effet |
| --- | --- | --- | --- |
| `model` | chaîne | requis | L'identifiant du modèle. |
| `maxTokens` | entier positif | requis | Plafonne les tokens de sortie d'une réponse ([limites](#limites-de-tokens-de-sortie)) ; sans lien avec le budget de premier niveau. |
| `requestTimeoutMs` | entier positif | `120000` | Borne chaque tentative de requête ([Délai de requête](#délai-de-requête)). |
| `localeMap` | table de locale vers code | aucun | Remplace le code envoyé par locale ([Codes de locale](#codes-de-locale-envoyés-au-fournisseur)). |

Lit `ANTHROPIC_API_KEY`.

## OpenAI [#openai]

```ts title="verbatra.config.ts"
provider: {
  id: "openai",
  options: {
    model: "gpt-5.4-mini", // example model id
    maxOutputTokens: 4096,
  },
}
```

| Option | Type | Défaut | Effet |
| --- | --- | --- | --- |
| `model` | chaîne | requis | L'identifiant du modèle. |
| `maxOutputTokens` | entier positif | requis | Plafonne les tokens de sortie d'une réponse. |
| `requestTimeoutMs` | entier positif | `120000` | Borne chaque tentative de requête. |
| `localeMap` | table de locale vers code | aucun | Remplace le code envoyé par locale. |

Lit `OPENAI_API_KEY`.

## Gemini [#gemini]

```ts title="verbatra.config.ts"
provider: {
  id: "gemini",
  options: {
    model: "gemini-2.5-flash", // example model id
    maxOutputTokens: 4096,
  },
}
```

| Option | Type | Défaut | Effet |
| --- | --- | --- | --- |
| `model` | chaîne | requis | L'identifiant du modèle. |
| `maxOutputTokens` | entier positif | requis | Plafonne les tokens de sortie d'une réponse. |
| `requestTimeoutMs` | entier positif | `120000` | Borne chaque tentative de requête. |
| `localeMap` | table de locale vers code | aucun | Remplace le code envoyé par locale. |

Lit `GEMINI_API_KEY`.

<Callout title="L'offre gratuite et ses limites">
Une clé de [Google AI Studio](https://aistudio.google.com/apikey) ne demande aucune facturation, mais ses plafonds par minute et par jour peuvent arrêter une première exécution sur beaucoup de locales : traduis une locale à la fois ou baisse `maxBatchSize`, puis relance pour reprendre le reste.
</Callout>

## DeepL [#deepl]

```ts title="verbatra.config.ts"
provider: {
  id: "deepl",
  options: {
    glossaryId: "<your-glossary-id>",
  },
}
```

| Option | Type | Défaut | Effet |
| --- | --- | --- | --- |
| `glossaryId` | chaîne | aucun | Un glossaire que tu as créé dans DeepL, appliqué nativement. |
| `requestTimeoutMs` | entier positif | `120000` | L'attente minimale par tentative, jusqu'à six tentatives. |
| `localeMap` | table de locale vers code | aucun | Remplace le code envoyé par locale. |

Lit `DEEPL_API_KEY` ; `options` peut valoir `{}`. DeepL n'a ni modèle ni limite de tokens de sortie, et se dégrade avec un avis plutôt que d'échouer :

- **Les placeholders** voyagent comme des marqueurs numérotés dans une balise ignorée (`Hello {{name}}` comme `Hello <x>{0}</x>`) puis sont restaurés. `PLACEHOLDER_UNSUPPORTED` retient une valeur avec un placeholder non littéral ou avec `<`, `>`, `{` ou `}` dans le reste du texte, et un résultat avec un marqueur perdu, répété, modifié ou nu, une entité inconnue ou une balise étrangère. Le balisage seul part en texte brut. <AvailableFrom version="0.12.0" />
- **Le ton** se mappe sur la formalité (`formal` plus formel, `informal` moins, `neutral` omis). Une clé de l'offre gratuite n'envoie aucune formalité et signale `FORMALITY_DOWNGRADED`. Une clé payante la demande avec `prefer_more` ou `prefer_less`, donc une langue sans formalité, comme le suédois, retombe sur le registre par défaut avec le même avis au lieu d'échouer. Le [glossaire](#ton-et-glossaire-selon-les-fournisseurs) n'est pas appliqué.

<AvailableFrom version="0.12.0" />

verbatra embarque la [table de langues](https://developers.deepl.com/docs/getting-started/supported-languages) datée de DeepL et refuse une langue non listée avec `LOCALE_UNSUPPORTED_BY_PROVIDER` avant toute dépense. Un `glossaryId` ne fonctionne que si les deux langues figurent dans la liste des glossaires de DeepL (comme `DE`, `EN`, `FR`, `JA`, `ZH`).

## Google Cloud Translation [#google-cloud-translation]

<AvailableFrom version="0.10.0" />

```ts title="verbatra.config.ts"
provider: {
  id: "google-translate",
  options: {},
}
```

| Option | Type | Défaut | Effet |
| --- | --- | --- | --- |
| `requestTimeoutMs` | entier positif | `120000` | Borne l'appel entier (sans nouvelle tentative). |
| `localeMap` | table de locale vers code | aucun | Remplace le code envoyé par locale. |

Lit `GOOGLE_TRANSLATE_API_KEY`, une clé d'API d'un projet Google Cloud où l'API Cloud Translation est activée. Seul Basic (v2) fonctionne : Advanced (v3) exige un compte de service.

- **Les placeholders** sont masqués comme pour DeepL, dans `<span translate="no">` ; les sauts de ligne, tabulations et doubles espaces sont aussi retenus. <AvailableFrom version="0.12.0" />
- **Codes.** Chaque code envoyé est vérifié comme du BCP 47 bien formé avant tout appel (`en_US` échoue avec `INVALID_REQUEST`). Les codes régionaux sont autorisés ; une paire que Google rejette échoue avec `INVALID_REQUEST` venant de l'API.

<AvailableFrom version="0.12.0" />

verbatra embarque la [table de langues](https://docs.cloud.google.com/translate/docs/languages) datée de Google et refuse une langue non listée avant toute dépense. Un code régional dont la langue n'est listée que dans son ensemble, comme `de-AT`, est envoyé tel qu'il est écrit avec un avertissement.

## OpenCode [#opencode]

<AvailableFrom version="0.12.0" />

Seuls les modèles d'[OpenCode Zen](https://opencode.ai/docs/zen/) servis par `/chat/completions` fonctionnent ici (le tableau des modèles indique l'endpoint de chacun). OpenCode réserve Go et les modèles gratuits de Zen à ses propres clients.

```ts title="verbatra.config.ts"
provider: {
  id: "opencode",
  options: {
    model: "glm-5.3", // example: a Zen model served over Chat Completions
    maxOutputTokens: 4096,
  },
}
```

| Option | Type | Défaut | Effet |
| --- | --- | --- | --- |
| `model` | chaîne | requis | L'identifiant du modèle. |
| `maxOutputTokens` | entier positif | requis | Plafonne les tokens de sortie d'une réponse. |
| `requestTimeoutMs` | entier positif | `120000` | Borne chaque tentative de requête. |
| `localeMap` | map de locale vers code | aucun | Remplace le code envoyé par locale. |

Endpoint fixe, sans `baseUrl`. Lit `OPENCODE_API_KEY`.

## openai-compatible [#openai-compatible]

Tout serveur qui parle l'API Chat Completions d'OpenAI : LM Studio, Ollama, vLLM, ou une API hébergée.

Le serveur doit servir Chat Completions à `<baseUrl>/chat/completions` avec une sortie en JSON schema strict. Les passerelles qui ne servent que leurs propres applications clientes ne fonctionnent pas.

```ts title="verbatra.config.ts"
provider: {
  id: "openai-compatible",
  options: {
    baseUrl: "http://192.168.178.74:1234/v1",
    model: "qwen2.5-14b-instruct", // example: whatever your server exposes
    maxOutputTokens: 1024,
  },
}
```

| Option | Type | Défaut | Effet |
| --- | --- | --- | --- |
| `baseUrl` | URL `http` ou `https` | requis | La racine de l'API, qui finit généralement par `/v1`. Une URL qui se termine par `/chat/completions` ou `/completions` est refusée ; une URL sans `/v1` passe la validation puis échoue à la requête. |
| `model` | chaîne | requis | Le modèle que ton serveur expose. |
| `maxOutputTokens` | entier positif | requis | Plafonne les tokens de sortie d'une réponse. |
| `apiKeyEnvVar` | nom de variable | aucun | La variable qui contient la clé de ce serveur. |
| `requestTimeoutMs` | entier positif | `120000` | Borne chaque tentative de requête. |
| `localeMap` | table de locale vers code | aucun | Remplace le code envoyé par locale. |

Pour une API hébergée comme Mistral :

```ts title="verbatra.config.ts"
provider: {
  id: "openai-compatible",
  options: {
    baseUrl: "https://api.mistral.ai/v1",
    model: "mistral-large-latest", // example: check Mistral's current model list
    maxOutputTokens: 4096,
    apiKeyEnvVar: "MISTRAL_API_KEY",
  },
}
```

La réponse suit le même schéma strict que `openai` ; le premier objet JSON équilibré est pris dans toute prose ou bloc de code qui l'entoure, puis validé. `verbatra init --provider openai-compatible --base-url <url> --model <name>` écrit ce bloc ([init](https://verbatra.kreitz-webdev.de/fr/docs/cli/init.md#fournisseurs)), et `--api-key-env-var <NAME>` ajoute le nom de la variable.

### Les clés sont optionnelles [#les-clés-sont-optionnelles]

La clé se résout dans cet ordre :

1. **`apiKeyEnvVar`** : s'il est défini, sa variable doit contenir une clé, sinon l'exécution échoue avec `MISSING_API_KEY`.
2. **`OPENAI_COMPATIBLE_API_KEY`** : utilisée quand elle est définie et non vide.
3. **`"local"`** : un placeholder fixe et non secret, qui est ce qui fait fonctionner un serveur sans clé.

`apiKeyEnvVar` ne peut pas nommer la variable d'un fournisseur hébergé, et le client ne lit jamais `OPENAI_API_KEY`, donc une clé hébergée n'atteint jamais un `baseUrl` personnalisé.

<Callout type="warn" title="Une vraie clé envoyée en http non chiffré circule en clair">
Avec une clé et une URL `http://` non loopback, la clé traverse ton réseau sans chiffrement et sans avertissement : utilise donc `https://` pour un serveur qui exige une clé.
</Callout>

### Choisir un modèle local [#choisir-un-modèle-local]

Préfère un modèle multilingue ajusté par instructions et sans raisonnement, aussi grand que ton matériel l'exécute bien, comme `qwen2.5-14b-instruct`. Les modèles de raisonnement et les builds fortement quantifiés ont tendance à envelopper ou tronquer la réponse, ce qui échoue en `INVALID_RESPONSE` ou `OUTPUT_TRUNCATED`.

## LibreTranslate [#libretranslate]

<AvailableFrom version="0.12.0" />

Un serveur [LibreTranslate](https://github.com/LibreTranslate/LibreTranslate) auto-hébergé (Argos Translate, sans modèle de langage). verbatra appelle seulement son API HTTP, donc la licence AGPL-3.0 du serveur ne s'étend pas à ton projet.

```ts title="verbatra.config.ts"
provider: {
  id: "libretranslate",
  options: {
    baseUrl: "http://localhost:5000",
  },
}
```

| Option | Type | Défaut | Effet |
| --- | --- | --- | --- |
| `baseUrl` | URL `http` ou `https` | requis | La racine de l'API, sans `/translate`. |
| `requestTimeoutMs` | entier positif | `120000` | Borne l'appel entier (sans nouvelle tentative). |
| `localeMap` | table de locale vers code | aucun | Remplace le code envoyé par locale. |

Ses langues sont les modèles installés sur ton serveur :

```bash
docker run -p 5000:5000 libretranslate/libretranslate --load-only en,de,fr
```

- **Clé.** `LIBRETRANSLATE_API_KEY` est envoyée comme `api_key` seulement si elle est définie. Un serveur démarré avec `--api-keys` fait échouer l'exécution avec `MISSING_API_KEY` quand elle est absente, et avec `AUTH_FAILED` quand il la rejette.
- **Les placeholders** sont masqués comme pour DeepL, par de simples marqueurs `{0}` ; le balisage est conservé, donc seules les accolades à côté d'un placeholder comptent.
- **Balisage.** Une valeur avec des balises de style HTML est envoyée au format `html` : le texte dans les balises est traduit, les balises restent (une formulation qui traverse une balise peut en souffrir) et des balises modifiées sont refusées.
- **Vérification des langues.** Chaque cible avertit `LOCALE_UNVERIFIED_BY_PROVIDER` à chaque exécution ; `verbatra doctor --locales --live` les vérifie auprès du serveur.

`verbatra init --provider libretranslate --base-url <url>` écrit ce bloc.

## none [#none]

<AvailableFrom version="0.12.0" />

Désactive la traduction automatique par principe, pour une règle qui interdit d'envoyer des chaînes à un service.

```ts title="verbatra.config.ts"
provider: { id: "none" }
```

`options` peut être omis ou valoir `{}`. Aucun fournisseur n'est construit, aucune clé n'est lue et aucune requête n'est faite ; ce que fait chaque commande à la place est décrit dans [Travailler sans traduction automatique](https://verbatra.kreitz-webdev.de/fr/docs/human-only-workflow.md).

## Ton et glossaire selon les fournisseurs [#ton-et-glossaire-selon-les-fournisseurs]

Une requête ne porte que les termes du glossaire de sa locale cible, et chaque sortie est vérifiée par rapport à eux.

| Fournisseur | `tone` | `glossary` |
| --- | --- | --- |
| Anthropic, OpenAI, Gemini, OpenCode, openai-compatible | envoyé et respecté | traductions, traductions interdites, termes à ne pas traduire et notes envoyés comme données contraignantes |
| DeepL | mappé sur la formalité | `GLOSSARY_IGNORED` ; seul `glossaryId` s'applique |
| Google Cloud Translation, LibreTranslate | `FORMALITY_DOWNGRADED` pour `formal` ou `informal` | `GLOSSARY_IGNORED` |

## Comportement partagé par tous les fournisseurs [#comportement-partagé-par-tous-les-fournisseurs]

### Découpage en lots [#découpage-en-lots]

Le travail d'une locale part en sous-lots séquentiels d'au plus [`maxBatchSize`](https://verbatra.kreitz-webdev.de/fr/docs/config-file.md#maxbatchsize) entrées. Un sous-lot échoué est retenu et retenté à l'exécution suivante pendant que les autres avancent. DeepL et Google Cloud Translation découpent aussi un sous-lot pour respecter leurs propres plafonds par requête.

### Nouvelles tentatives [#nouvelles-tentatives]

Les limites de débit et les erreurs serveur sont retentées avec backoff, par le client chez OpenAI, OpenCode, openai-compatible, Anthropic et DeepL et par verbatra pour Gemini. Google Cloud Translation et LibreTranslate ne réessaient pas. Gemini respecte une attente indiquée jusqu'à 5 secondes et fait échouer une attente plus longue, comme un quota quotidien épuisé, aussitôt avec `RATE_LIMITED`, qui nomme l'attente.

### Délai de requête [#délai-de-requête]

`requestTimeoutMs` (`120000` ms par défaut) empêche un serveur qui ne répond jamais de bloquer une exécution et de garder le verrou d'écriture d'une locale. Augmente-le pour un modèle local lent ou un gros `maxBatchSize`.

```ts title="verbatra.config.ts"
provider: {
  id: "openai-compatible",
  options: {
    baseUrl: "http://192.168.178.74:1234/v1",
    model: "qwen2.5-14b-instruct",
    maxOutputTokens: 1024,
    requestTimeoutMs: 300000, // 5 minutes
  },
}
```

- **Par tentative.** Chaque [nouvelle tentative](#nouvelles-tentatives) dispose du délai complet. Les fournisseurs LLM réessaient aussi une tentative qui a dépassé le délai, et tous sauf Gemini une erreur de connexion : un serveur figé met donc jusqu'à trois délais plus les pauses.
- **L'erreur nomme la cause.** `TIMEOUT` veut dire qu'une tentative n'a reçu aucune réponse à temps ; des connexions refusées répétées échouent en `PROVIDER_ERROR`.
- **DeepL** ne peut pas interrompre une requête en cours : une exécution interrompue la laisse donc aller à son terme chez DeepL.

### Codes de locale envoyés au fournisseur [#codes-de-locale-envoyés-au-fournisseur]

<AvailableFrom version="0.12.0" />

Les fichiers, le fichier de verrouillage et la mémoire utilisent toujours les codes de ta configuration. Seule la requête est traduite vers ce qu'attend le fournisseur :

| Fournisseur | Locale source | Locale cible |
| --- | --- | --- |
| DeepL | La langue seule : `en-US` comme `EN`, `zh-Hant-TW` comme `ZH`. | `zh-Hant`, `zh-TW`, `zh-HK`, `zh-MO` comme `ZH-HANT` ; `zh-Hans`, `zh-CN`, `zh-SG` comme `ZH-HANS`. Les variantes DeepL sont conservées (`EN-GB`, `EN-US`, `PT-BR`, `PT-PT`, `ES-419`, `FR-CA`, `FR-FR`, `DE-CH`, `DE-DE`). L'espagnol avec une région d'Amérique latine ou des Caraïbes (`MX`, `AR`, `CO`, `CL`, `PE`, `VE`, `EC`, `GT`, `CU`, `BO`, `DO`, `HN`, `PY`, `SV`, `NI`, `CR`, `PA`, `UY`, `PR`, `US`, `419`) comme `ES-419`. Les autres régions et écritures sont retirées : `de-AT` comme `DE`. |
| Google Cloud Translation | `zh-Hant` (`zh-HK`, `zh-MO`) comme `zh-TW`, `zh-Hans` (`zh-SG`) comme `zh-CN`, `nb` comme `no` ; tout le reste tel qu'il est écrit. | Comme pour la source. |
| LibreTranslate | La langue seule (`de-AT` comme `de`), sauf que `pt-BR` est conservé et que le chinois part comme `zh-Hans` ou `zh-Hant` (`zh-TW` comme `zh-Hant`). | Comme pour la source. |
| Anthropic, OpenAI, Gemini, OpenCode, openai-compatible | Tel qu'il est écrit. | Comme pour la source. |

Un LLM reçoit aussi les [noms de langue, d'écriture et de région](https://verbatra.kreitz-webdev.de/fr/docs/translation-safety.md#noms-de-langue-décriture-et-de-région). DeepL n'a pas de cible anglaise ni portugaise générique, donc une cible qui aboutit à un `en` ou `pt` nu (comme `en-AU`) est refusée avant l'exécution : fais-la correspondre à `EN-GB`, `EN-US`, `PT-BR` ou `PT-PT`.

`localeMap` remplace le code par locale :

```ts title="verbatra.config.ts"
provider: {
  id: "deepl",
  options: {
    localeMap: {
      "en-AU": "EN-GB",
      "fr-BE": "FR-FR",
    },
  },
}
```

- **Les clés** doivent être `sourceLocale` ou une locale cible comme dans la configuration, sinon la configuration échoue avec `CONFIG_INVALID`. La table se place sous `options`, pour tous les fournisseurs sauf `none`.
- **Les valeurs** sont des chaînes non vides de 64 caractères au plus, envoyées telles quelles : comme code de langue à un fournisseur de traduction automatique, à la place du code pour un LLM (`"pt-BR (Brazilian Portuguese)"` fonctionne), dont les noms de langue viennent toujours de la clé. Un `EN` ou `PT` nu pour DeepL échoue avec `INVALID_REQUEST` ; une valeur que le fournisseur rejette fait échouer son sous-lot.
- **Effet sur la mémoire.** Seules les chaînes nouvelles et modifiées partent avec un nouveau code. Une table non vide fait partie de l'empreinte de la [mémoire](https://verbatra.kreitz-webdev.de/fr/docs/the-cache.md), donc la modifier ouvre un compartiment séparé.

### Vérifier les langues prises en charge par un fournisseur [#vérifier-les-langues-prises-en-charge-par-un-fournisseur]

<AvailableFrom version="0.12.0" />

Chaque locale configurée est jugée avant toute dépense :

| Fournisseur | Jugé d'après | Refusé avant l'exécution | Avertissement pour |
| --- | --- | --- | --- |
| DeepL | Sa table de langues embarquée, avec la prise en charge du glossaire et de la formalité par langue | Une langue source ou cible non listée | Un glossaire pour une paire hors des langues de glossaire, un ton sans formalité, un code listé seulement en partie |
| Google Cloud Translation | Sa table de langues embarquée | Une langue non listée | Tout glossaire, un ton `formal` ou `informal`, un code régional listé seulement comme langue |
| LibreTranslate | Rien avant une exécution ; la liste `/languages` du serveur avec `doctor --live` | Jamais | Chaque locale cible à chaque exécution, tout glossaire, un ton `formal` ou `informal` |
| Anthropic, OpenAI, Gemini, OpenCode, openai-compatible | Rien : un LLM accepte toutes les langues | Jamais | Une langue hors de la [liste des langues bien testées](https://verbatra.kreitz-webdev.de/fr/docs/language-support.md#vérifier-la-prise-en-charge-avant-une-exécution) |
| none | Sans objet | Jamais | Jamais |

Une locale non prise en charge est refusée avec [`LOCALE_UNSUPPORTED_BY_PROVIDER`](https://verbatra.kreitz-webdev.de/fr/docs/error-codes.md#locale_unsupported_by_provider) (code de sortie `2`) avant qu'aucun fournisseur ne soit construit ; un avertissement ne refuse jamais et apparaît comme [avis](https://verbatra.kreitz-webdev.de/fr/docs/error-codes.md#sdk-notice-codes). [`verbatra doctor`](https://verbatra.kreitz-webdev.de/fr/docs/cli/doctor.md#prise-en-charge-des-locales) donne chaque verdict, et son option `--live` vérifie la liste actuelle du fournisseur, mais `translate` utilise toujours la table embarquée. Pour une langue ajoutée depuis, associe la locale dans `localeMap` : un code explicite est envoyé avec un avertissement, pas refusé.

### Erreurs structurées [#erreurs-structurées]

Un échec de fournisseur remonte comme une [erreur structurée, sans secret](https://verbatra.kreitz-webdev.de/fr/docs/translation-safety.md#les-erreurs-ne-fuient-jamais), qui ne touche que son propre sous-lot. Un `PROVIDER_ERROR` ne nomme que l'hôte et le port d'un `baseUrl` openai-compatible ou LibreTranslate, et pour Google que `translation.googleapis.com`, jamais la chaîne de requête qui porte sa clé.

### Limites de tokens de sortie [#limites-de-tokens-de-sortie]

Les fournisseurs LLM plafonnent les tokens de chaque réponse ; un modèle qui s'arrête au plafond lève [`OUTPUT_TRUNCATED`](https://verbatra.kreitz-webdev.de/fr/docs/error-codes.md#output_truncated). verbatra redécoupe un sous-lot tronqué en deux moitiés, en descendant jusqu'à une seule entrée, et ne retient qu'une entrée qui déborde encore. Pour régler cela durablement, baisse `maxBatchSize` ou augmente `maxTokens` (Anthropic) ou `maxOutputTokens`. Un modèle de raisonnement puise ses tokens de raisonnement cachés dans le même budget : donne-lui donc une marge généreuse.

### Signalements de relecture [#signalements-de-relecture]

Une traduction suspecte est signalée pour relecture, quel que soit le fournisseur, plutôt que rejetée. Voir les [raisons de relecture](https://verbatra.kreitz-webdev.de/fr/docs/error-codes.md#review-reason-codes) et [Réviser dans Studio](https://verbatra.kreitz-webdev.de/fr/docs/review-in-studio.md).
