Referencia / Configuración
Página traducida automáticamente
Proveedores
Todos los proveedores de IA y de traducción automática que admite verbatra, con sus opciones y la variable de su clave de API, más el comportamiento común.
Selecciona un proveedor por id en el bloque provider de tu configuración. Anthropic, OpenAI, Gemini, OpenCode y openai-compatible son modelos de lenguaje; DeepL, Google Cloud Translation y LibreTranslate son servicios de traducción automática; none desactiva la traducción automática. La cobertura de idiomas está en Idiomas y locales, y qué recibe cada proveedor en Tratamiento de datos y privacidad.
¿Cuál elijo?
Cualquier proveedor funciona con cualquier formato y comando, y cambiar más tarde significa editar un solo id.
| Si quieres | Usa |
|---|---|
| Gratis, para un proyecto pequeño con cadenas no confidenciales | Gemini: un nivel de API gratuito, cuyas peticiones Google puede hacer que revisen personas fuera del EEE, Suiza y el Reino Unido (condiciones). |
| La mejor calidad para una app de producción | Anthropic u OpenAI, ambos de pago. |
| Alto volumen, un glosario nativo, sin LLM | DeepL, nivel gratuito o de pago. |
| La cobertura más amplia con una clave de API en Google Cloud | Google Cloud Translation (Basic, v2). |
| Sin conexión, sin coste, sin que nada salga de tu red | openai-compatible con LM Studio, Ollama o vLLM. |
| Sin modelo de lenguaje, pero autoalojado | LibreTranslate en tu propio servidor. |
| Nada de traducción automática | none: solo memoria y personas. |
Las claves vienen del entorno
verbatra nunca lee una clave de la configuración. Cada proveedor alojado lee una variable:
| Id de proveedor | Variable de entorno |
|---|---|
anthropic | ANTHROPIC_ |
openai | OPENAI_ |
gemini | GEMINI_ |
deepl | DEEPL_ |
google-translate | GOOGLE_ |
opencode | OPENCODE_ |
Defínela en .env (que verbatra init añade a .gitignore), en tu shell o en el almacén de secretos de tu CI, y nunca la confirmes. Una variable no definida o vacía falla con MISSING_, nombrando la variable pero nunca un valor. openai-compatible y libretranslate normalmente no necesitan clave.
Anthropic
provider: {
id: "anthropic",
options: {
model: "claude-sonnet-4-6", // example model id
maxTokens: 4096,
},
}| Opción | Tipo | Por defecto | Efecto |
|---|---|---|---|
model | string | obligatoria | El id del modelo. |
maxTokens | entero positivo | obligatoria | Limita los tokens de salida de una respuesta (límites); sin relación con el presupuesto de nivel superior. |
requestTimeoutMs | entero positivo | 120000 | Acota cada intento de petición (Tiempo de espera de petición). |
localeMap | mapa de locale a código | ninguno | Sustituye el código enviado por locale (Códigos de locale). |
Lee ANTHROPIC_.
OpenAI
provider: {
id: "openai",
options: {
model: "gpt-5.4-mini", // example model id
maxOutputTokens: 4096,
},
}| Opción | Tipo | Por defecto | Efecto |
|---|---|---|---|
model | string | obligatoria | El id del modelo. |
maxOutputTokens | entero positivo | obligatoria | Limita los tokens de salida de una respuesta. |
requestTimeoutMs | entero positivo | 120000 | Acota cada intento de petición. |
localeMap | mapa de locale a código | ninguno | Sustituye el código enviado por locale. |
Lee OPENAI_.
Gemini
provider: {
id: "gemini",
options: {
model: "gemini-2.5-flash", // example model id
maxOutputTokens: 4096,
},
}| Opción | Tipo | Por defecto | Efecto |
|---|---|---|---|
model | string | obligatoria | El id del modelo. |
maxOutputTokens | entero positivo | obligatoria | Limita los tokens de salida de una respuesta. |
requestTimeoutMs | entero positivo | 120000 | Acota cada intento de petición. |
localeMap | mapa de locale a código | ninguno | Sustituye el código enviado por locale. |
Lee GEMINI_.
El nivel gratuito y sus límites
Una clave de Google AI Studio no necesita facturación, pero sus topes por minuto y por día pueden frenar una primera ejecución sobre muchos locales: traduce un locale cada vez o baja maxBatchSize, y vuelve a ejecutar para recoger el resto.
DeepL
provider: {
id: "deepl",
options: {
glossaryId: "<your-glossary-id>",
},
}| Opción | Tipo | Por defecto | Efecto |
|---|---|---|---|
glossaryId | string | ninguno | Un glosario que creaste en DeepL, aplicado de forma nativa. |
requestTimeoutMs | entero positivo | 120000 | La espera mínima por intento, hasta seis intentos. |
localeMap | mapa de locale a código | ninguno | Sustituye el código enviado por locale. |
Lee DEEPL_; options puede ser {}. DeepL no tiene modelo ni límite de tokens de salida, y se degrada con un aviso en lugar de fallar:
- Los placeholders viajan como marcadores numerados en una etiqueta ignorada (
Hello {{name}}comoHello <x>{0}</x>) y se restauran.PLACEHOLDER_retiene un valor con un placeholder no literal o conUNSUPPORTED <,>,{o}en el resto del texto, y un resultado con un marcador perdido, repetido, cambiado o sin etiqueta, una entidad desconocida o una etiqueta ajena. El marcado sin placeholders va como texto plano. - El tono se asigna a la formalidad (
formalmás,informalmenos,neutralse omite). Una clave del nivel gratuito no envía ninguna formalidad e informaFORMALITY_. Una clave de pago la pide conDOWNGRADED prefer_omore prefer_, así que un idioma sin formalidad, como el sueco, vuelve al registro predeterminado con el mismo aviso en lugar de fallar. El glosario no se aplica.less
verbatra incluye la tabla de idiomas fechada de DeepL y rechaza un idioma que no está en ella con LOCALE_ antes de gastar nada. Un glossaryId solo funciona cuando los dos idiomas están en la lista de glosarios de DeepL (como DE, EN, FR, JA, ZH).
Google Cloud Translation
provider: {
id: "google-translate",
options: {},
}| Opción | Tipo | Por defecto | Efecto |
|---|---|---|---|
requestTimeoutMs | entero positivo | 120000 | Acota la llamada completa (sin reintentos). |
localeMap | mapa de locale a código | ninguno | Sustituye el código enviado por locale. |
Lee GOOGLE_, una clave de API de un proyecto de Google Cloud con la Cloud Translation API activada. Solo funciona Basic (v2): Advanced (v3) necesita una cuenta de servicio.
- Los placeholders se enmascaran como en DeepL, dentro de
<span translate="no">; los saltos de línea, tabuladores y dobles espacios también se retienen. - Códigos. Cada código enviado se comprueba como BCP 47 bien formado antes de cualquier llamada (
en_falla conUS INVALID_). Se permiten códigos regionales; un par que Google rechaza falla conREQUEST INVALID_desde la API.REQUEST
verbatra incluye la tabla de idiomas fechada de Google y rechaza un idioma que no está en ella antes de gastar nada. Un código regional cuyo idioma solo aparece en la lista como un todo, como de-AT, se envía tal como está escrito con un aviso.
OpenCode
Aquí solo funcionan los modelos de OpenCode Zen que se sirven por /chat/completions (la tabla de modelos indica el endpoint de cada uno). OpenCode reserva Go y los modelos gratuitos de Zen para sus propios clientes.
provider: {
id: "opencode",
options: {
model: "glm-5.3", // example: a Zen model served over Chat Completions
maxOutputTokens: 4096,
},
}| Opción | Tipo | Por defecto | Efecto |
|---|---|---|---|
model | string | obligatorio | El id del modelo. |
maxOutputTokens | entero positivo | obligatorio | Limita los tokens de salida de una respuesta. |
requestTimeoutMs | entero positivo | 120000 | Acota cada intento de petición. |
localeMap | mapa de locale a código | ninguno | Sustituye el código enviado por locale. |
Endpoint fijo, sin baseUrl. Lee OPENCODE_.
openai-compatible
Cualquier servidor que hable la API Chat Completions de OpenAI: LM Studio, Ollama, vLLM o una API alojada.
El servidor debe servir Chat Completions en <baseUrl>/chat/completions con salida de JSON schema estricto. Las pasarelas que solo atienden a sus propias apps cliente no funcionan.
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,
},
}| Opción | Tipo | Por defecto | Efecto |
|---|---|---|---|
baseUrl | URL http o https | obligatoria | La raíz de la API, que suele terminar en /v1. Una URL que termina en /chat/completions o /completions se rechaza; una sin /v1 pasa la validación y falla al hacer la petición. |
model | string | obligatoria | El modelo que exponga tu servidor. |
maxOutputTokens | entero positivo | obligatoria | Limita los tokens de salida de una respuesta. |
apiKeyEnvVar | nombre de variable | ninguno | La variable que contiene la clave de este servidor. |
requestTimeoutMs | entero positivo | 120000 | Acota cada intento de petición. |
localeMap | mapa de locale a código | ninguno | Sustituye el código enviado por locale. |
Para una API alojada como 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 respuesta usa el mismo esquema estricto que openai; el primer objeto JSON balanceado se toma de cualquier prosa o bloque de código que lo rodee y se valida. verbatra init --provider openai-compatible --base-url <url> --model <name> escribe este bloque (init), y --api-key-env-var <NAME> añade el nombre de la variable.
Las claves son opcionales
La clave se resuelve en orden:
apiKeyEnvVar: si está definido, su variable debe contener una clave, o la ejecución falla conMISSING_.API_ KEY OPENAI_: se usa si está definida y no vacía.COMPATIBLE_ API_ KEY "local": un placeholder fijo y no secreto, que es lo que hace funcionar un servidor sin clave.
apiKeyEnvVar no puede nombrar la variable de un proveedor alojado, y el cliente nunca lee OPENAI_, así que una clave alojada nunca llega a un baseUrl personalizado.
Una clave real sobre http en claro viaja sin cifrar
Con una clave y una URL http:// que no es loopback, la clave cruza tu red sin cifrar y sin aviso, así que usa https:// para un servidor que necesite clave.
Elegir un modelo local
Prefiere un modelo multilingüe ajustado por instrucciones y sin razonamiento, tan grande como tu hardware ejecute bien, como qwen2.5-14b-instruct. Los modelos de razonamiento y las compilaciones muy cuantizadas tienden a envolver o truncar la respuesta, lo que falla como INVALID_ u OUTPUT_.
LibreTranslate
Un servidor LibreTranslate autoalojado (Argos Translate, sin modelo de lenguaje). verbatra solo llama a su API HTTP, así que la licencia AGPL-3.0 del servidor no se extiende a tu proyecto.
provider: {
id: "libretranslate",
options: {
baseUrl: "http://localhost:5000",
},
}| Opción | Tipo | Por defecto | Efecto |
|---|---|---|---|
baseUrl | URL http o https | obligatoria | La raíz de la API, sin /translate. |
requestTimeoutMs | entero positivo | 120000 | Acota la llamada completa (sin reintentos). |
localeMap | mapa de locale a código | ninguno | Sustituye el código enviado por locale. |
Sus idiomas son los modelos instalados en tu servidor:
docker run -p 5000:5000 libretranslate/libretranslate --load-only en,de,fr- Clave.
LIBRETRANSLATE_se envía comoAPI_ KEY api_solo cuando está definida. Un servidor arrancado conkey --api-keyshace fallar la ejecución conMISSING_cuando no está definida, y conAPI_ KEY AUTH_cuando la rechaza.FAILED - Los placeholders se enmascaran como en DeepL, como marcadores
{0}sin etiqueta; el marcado se conserva, así que solo cuentan las llaves junto a un placeholder. - Marcado. Un valor con etiquetas de estilo HTML se envía en formato
html: el texto dentro de las etiquetas se traduce, las etiquetas se quedan (una frase que cruza una etiqueta puede resentirse) y las etiquetas cambiadas se rechazan. - Comprobación de idiomas. Cada destino avisa
LOCALE_en cada ejecución;UNVERIFIED_ BY_ PROVIDER verbatra doctor --locales --livelos comprueba contra el servidor.
verbatra init --provider libretranslate --base-url <url> escribe este bloque.
none
Desactiva la traducción automática por política, para una norma que prohíbe enviar cadenas a cualquier servicio.
provider: { id: "none" }options puede omitirse o ser {}. No se construye ningún proveedor, no se lee ninguna clave y no se hace ninguna petición; lo que hace cada comando en su lugar está en Trabajar sin traducción automática.
Tono y glosario entre proveedores
Una petición lleva solo los términos del glosario de su locale de destino, y cada salida se comprueba contra ellos.
| Proveedor | tone | glossary |
|---|---|---|
| Anthropic, OpenAI, Gemini, OpenCode, openai-compatible | se envía y se respeta | traducciones, traducciones prohibidas, términos que no se traducen y notas, enviados como datos vinculantes |
| DeepL | se asigna a la formalidad | GLOSSARY_; solo se aplica glossaryId |
| Google Cloud Translation, LibreTranslate | FORMALITY_ con formal o informal | GLOSSARY_ |
Comportamiento que todo proveedor comparte
Lotes
El trabajo de un locale se envía en sublotes secuenciales de como mucho maxBatchSize entradas. Un sublote fallido se retiene y se reintenta en la siguiente ejecución mientras los demás siguen avanzando. DeepL y Google Cloud Translation además dividen un sublote para respetar sus propios topes por petición.
Reintentos
Los límites de tasa y los errores de servidor se reintentan con espera, por el cliente en OpenAI, OpenCode, openai-compatible, Anthropic y DeepL y por verbatra en Gemini. Google Cloud Translation y LibreTranslate no reintentan. Gemini respeta una espera indicada de hasta 5 segundos y hace fallar una más larga, como una cuota diaria agotada, al instante con RATE_, que nombra la espera.
Tiempo de espera de petición
requestTimeoutMs (por defecto 120000 ms) evita que un servidor que nunca responde atasque una ejecución y retenga el bloqueo de escritura de un locale. Súbelo para un modelo local lento o un maxBatchSize grande.
provider: {
id: "openai-compatible",
options: {
baseUrl: "http://192.168.178.74:1234/v1",
model: "qwen2.5-14b-instruct",
maxOutputTokens: 1024,
requestTimeoutMs: 300000, // 5 minutes
},
}- Por intento. Cada reintento recibe el límite completo. Los proveedores LLM también reintentan un intento que agotó el tiempo, y todos menos Gemini un error de conexión, así que un servidor colgado tarda hasta tres límites más las pausas.
- El error nombra la causa.
TIMEOUTsignifica que un intento no recibió respuesta a tiempo; las conexiones rechazadas repetidas fallan comoPROVIDER_.ERROR - DeepL no puede abortar una petición en vuelo, así que una ejecución interrumpida la deja resolverse en DeepL.
Códigos de locale enviados al proveedor
Los archivos, el bloqueo y la memoria siempre usan los códigos de tu configuración. Solo la petición se traduce a lo que espera el proveedor:
| Proveedor | Locale de origen | Locale de destino |
|---|---|---|
| DeepL | Solo el idioma: en-US como EN, zh-Hant-TW como ZH. | zh-Hant, zh-TW, zh-HK, zh-MO como ZH-HANT; zh-Hans, zh-CN, zh-SG como ZH-HANS. Las variantes de DeepL se conservan (EN-GB, EN-US, PT-BR, PT-PT, ES-419, FR-CA, FR-FR, DE-CH, DE-DE). El español con una región de Latinoamérica o del Caribe (MX, AR, CO, CL, PE, VE, EC, GT, CU, BO, DO, HN, PY, SV, NI, CR, PA, UY, PR, US, 419) como ES-419. Las demás regiones y escrituras se descartan: de-AT como DE. |
| Google Cloud Translation | zh-Hant (zh-HK, zh-MO) como zh-TW, zh-Hans (zh-SG) como zh-CN, nb como no; todo lo demás tal como está escrito. | Igual que el origen. |
| LibreTranslate | Solo el idioma (de-AT como de), salvo que pt-BR se conserva y el chino se envía como zh-Hans o zh-Hant (zh-TW como zh-Hant). | Igual que el origen. |
| Anthropic, OpenAI, Gemini, OpenCode, openai-compatible | Tal como está escrito. | Igual que el origen. |
Un LLM recibe además los nombres de idioma, escritura y región. DeepL no tiene un inglés ni un portugués genéricos como destino, así que un destino que acaba siendo un en o pt escueto (como en-AU) se rechaza antes de la ejecución: asígnalo a EN-GB, EN-US, PT-BR o PT-PT.
localeMap sustituye el código por locale:
provider: {
id: "deepl",
options: {
localeMap: {
"en-AU": "EN-GB",
"fr-BE": "FR-FR",
},
},
}- Las claves deben ser
sourceLocaleo un locale de destino como en la configuración, o la configuración falla conCONFIG_. El mapa va bajoINVALID options, en todos los proveedores salvonone. - Los valores son cadenas no vacías de 64 caracteres como máximo, enviadas sin cambios: como código de idioma a un proveedor de traducción automática, en lugar del código a un LLM (
"pt-BR (Brazilian Portuguese)"funciona), cuyos nombres de idioma siguen saliendo de la clave. UnENoPTescueto para DeepL falla conINVALID_; un valor que el proveedor rechace hace fallar su sublote.REQUEST - Efecto en la memoria. Solo las cadenas nuevas y cambiadas se envían con un código nuevo. Un mapa no vacío forma parte de la huella de la memoria, así que cambiarlo abre un compartimento aparte.
Comprobar el soporte de idiomas de un proveedor
Cada locale configurado se evalúa antes de gastar nada:
| Proveedor | Se evalúa contra | Se rechaza antes de la ejecución | Genera un aviso |
|---|---|---|---|
| DeepL | Su tabla de idiomas incluida, con el soporte de glosario y de formalidad por idioma | Un idioma de origen o de destino que no está en la lista | Un glosario para un par fuera de los idiomas de glosario, un tono sin formalidad, un código que aparece solo en parte en la lista |
| Google Cloud Translation | Su tabla de idiomas incluida | Un idioma que no está en la lista | Cualquier glosario, un tono formal o informal, un código regional que aparece en la lista solo como idioma |
| LibreTranslate | Nada antes de una ejecución; el /languages del servidor con doctor --live | Nunca | Cada locale de destino en cada ejecución, cualquier glosario, un tono formal o informal |
| Anthropic, OpenAI, Gemini, OpenCode, openai-compatible | Nada: un LLM acepta cualquier idioma | Nunca | Un idioma fuera de la lista de idiomas bien probados |
| none | No aplica | Nunca | Nunca |
Un locale no admitido se rechaza con LOCALE_ (salida 2) antes de construir ningún proveedor; una advertencia nunca rechaza y aparece como aviso. verbatra doctor informa de cada veredicto, y su opción --live comprueba la lista actual del proveedor, pero translate siempre usa la tabla incluida. Para un idioma añadido después, asigna el locale en localeMap: un código explícito se envía con un aviso, no se rechaza.
Errores estructurados
Un fallo de proveedor aflora como un error estructurado y sin secretos que solo afecta a su propio sublote. Un PROVIDER_ nombra solo el host y el puerto de un baseUrl de openai-compatible o LibreTranslate, y en Google solo translation.googleapis.com, nunca la consulta que lleva su clave.
Límites de tokens de salida
Los proveedores LLM limitan los tokens de cada respuesta; un modelo que se detiene en el tope levanta OUTPUT_. verbatra vuelve a dividir un sublote truncado en mitades, bajando hacia una sola entrada, y retiene solo una entrada que sigue desbordándose. Para resolverlo del todo, baja maxBatchSize o sube maxTokens (Anthropic) o maxOutputTokens. Un modelo de razonamiento gasta tokens de razonamiento ocultos del mismo presupuesto, así que dale margen de sobra.
Señales de revisión
Una traducción sospechosa de cualquier proveedor se marca para revisión, no se rechaza. Consulta los motivos de revisión y Revisar en Studio.
Editar en GitHub