Référence / Configuration
Page traduite automatiquement
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. 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, et ce que reçoit chaque fournisseur dans Traitement des données et confidentialité.
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). |
| 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
verbatra ne lit jamais une clé depuis la configuration. Chaque fournisseur hébergé lit une variable :
| Id du fournisseur | Variable d'environnement |
|---|---|
anthropic | ANTHROPIC_ |
openai | OPENAI_ |
gemini | GEMINI_ |
deepl | DEEPL_ |
google-translate | GOOGLE_ |
opencode | OPENCODE_ |
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_, en nommant la variable mais jamais une valeur. openai-compatible et libretranslate n'ont généralement besoin d'aucune clé.
Anthropic
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) ; sans lien avec le budget de premier niveau. |
requestTimeoutMs | entier positif | 120000 | Borne chaque tentative de requête (Délai de requête). |
localeMap | table de locale vers code | aucun | Remplace le code envoyé par locale (Codes de locale). |
Lit ANTHROPIC_.
OpenAI
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_.
Gemini
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_.
L'offre gratuite et ses limites
Une clé de Google AI Studio 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.
DeepL
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_ ; 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}}commeHello <x>{0}</x>) puis sont restaurés.PLACEHOLDER_retient une valeur avec un placeholder non littéral ou avecUNSUPPORTED <,>,{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. - Le ton se mappe sur la formalité (
formalplus formel,informalmoins,neutralomis). Une clé de l'offre gratuite n'envoie aucune formalité et signaleFORMALITY_. Une clé payante la demande avecDOWNGRADED prefer_oumore prefer_, 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 n'est pas appliqué.less
verbatra embarque la table de langues datée de DeepL et refuse une langue non listée avec LOCALE_ 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
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_, 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. - Codes. Chaque code envoyé est vérifié comme du BCP 47 bien formé avant tout appel (
en_échoue avecUS INVALID_). Les codes régionaux sont autorisés ; une paire que Google rejette échoue avecREQUEST INVALID_venant de l'API.REQUEST
verbatra embarque la table de langues 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
Seuls les modèles d'OpenCode 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.
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_.
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.
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 :
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), et --api-key-env-var <NAME> ajoute le nom de la variable.
Les clés sont optionnelles
La clé se résout dans cet ordre :
apiKeyEnvVar: s'il est défini, sa variable doit contenir une clé, sinon l'exécution échoue avecMISSING_.API_ KEY OPENAI_: utilisée quand elle est définie et non vide.COMPATIBLE_ API_ KEY "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_, donc une clé hébergée n'atteint jamais un baseUrl personnalisé.
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é.
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_ ou OUTPUT_.
LibreTranslate
Un serveur 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.
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 :
docker run -p 5000:5000 libretranslate/libretranslate --load-only en,de,fr- Clé.
LIBRETRANSLATE_est envoyée commeAPI_ KEY api_seulement si elle est définie. Un serveur démarré aveckey --api-keysfait échouer l'exécution avecMISSING_quand elle est absente, et avecAPI_ KEY AUTH_quand il la rejette.FAILED - 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_à chaque exécution ;UNVERIFIED_ BY_ PROVIDER verbatra doctor --locales --liveles vérifie auprès du serveur.
verbatra init --provider libretranslate --base-url <url> écrit ce bloc.
none
Désactive la traduction automatique par principe, pour une règle qui interdit d'envoyer des chaînes à un service.
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.
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_ ; seul glossaryId s'applique |
| Google Cloud Translation, LibreTranslate | FORMALITY_ pour formal ou informal | GLOSSARY_ |
Comportement partagé par tous les fournisseurs
Découpage en lots
Le travail d'une locale part en sous-lots séquentiels d'au plus 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
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_, qui nomme l'attente.
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.
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 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.
TIMEOUTveut dire qu'une tentative n'a reçu aucune réponse à temps ; des connexions refusées répétées échouent enPROVIDER_.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
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. 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 :
provider: {
id: "deepl",
options: {
localeMap: {
"en-AU": "EN-GB",
"fr-BE": "FR-FR",
},
},
}- Les clés doivent être
sourceLocaleou une locale cible comme dans la configuration, sinon la configuration échoue avecCONFIG_. La table se place sousINVALID options, pour tous les fournisseurs saufnone. - 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é. UnENouPTnu pour DeepL échoue avecINVALID_; une valeur que le fournisseur rejette fait échouer son sous-lot.REQUEST - 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, donc la modifier ouvre un compartiment séparé.
Vérifier les langues prises en charge par un fournisseur
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 |
| none | Sans objet | Jamais | Jamais |
Une locale non prise en charge est refusée avec LOCALE_ (code de sortie 2) avant qu'aucun fournisseur ne soit construit ; un avertissement ne refuse jamais et apparaît comme avis. verbatra doctor 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
Un échec de fournisseur remonte comme une erreur structurée, sans secret, qui ne touche que son propre sous-lot. Un PROVIDER_ 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
Les fournisseurs LLM plafonnent les tokens de chaque réponse ; un modèle qui s'arrête au plafond lève OUTPUT_. 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
Une traduction suspecte est signalée pour relecture, quel que soit le fournisseur, plutôt que rejetée. Voir les raisons de relecture et Réviser dans Studio.
Modifier sur GitHub