Configuración del proveedor
Cada proveedor de modelos vive en [providers.models.<type>.<alias>]. <type> es un slot de familia canónico (consulta el Catálogo para ver cada slot con su endpoint). <alias> es el nombre de instancia asignado por el operador; elige cualquier nombre descriptivo (home, work, cn, gpt5, …).
Ejemplo mínimo funcional
La configuración más pequeña que carga sin errores tiene cuatro encabezados de sección: una entrada de proveedor, un agente que hace referencia a ella y un perfil de riesgo contra el cual el agente aplica las restricciones. Configúralos a través del gateway, zerocode o zeroclaw config set; la referencia de configuración tiene el índice completo de campos.
Referencia de campos: entrada de proveedor
Casi todas las familias también toman los campos compartidos de ModelProviderConfig:
api_key: credencial para proveedores que usan claves API de tipo bearer o de suscripción.uri: anulación completa del endpoint. Déjelo sin establecer para usar el resolvedor de endpoints de la familia.model: identificador del modelo enviado al proveedor.temperature: temperatura opcional de muestreo.timeout_secs: tiempo de espera de la solicitud HTTP en segundos.max_tokens: límite opcional de longitud de la respuesta.extra_headers: encabezados HTTP adicionales para puertas de enlace personalizadas o puentes de autenticación.fallback_models: IDs de modelo alternativos en el mismo alias de proveedor.fallback: lista ordenada de otros alias de proveedor con notación de puntos que se intentarán después de que este alias falle.wire_api,native_tools,provider_extra,thinkychat_template_kwargs: protocolo avanzado y anulaciones del cuerpo de la solicitud.vision: anula la capacidad de entrada de imagen (visión) del proveedor. Déjalo sin establecer para usar el valor predeterminado integrado de la familia. Establecefalsepara un modelo de solo texto servido por una familia con capacidad de visión (por ejemplo, un modelo de texto tras llama.cpp) de modo que los mensajes con imágenes se enruten a un[multimodal] vision_model_providerconfigurado en lugar de generar un error; establecetruepara forzar su activación.tool_result_image_policy: gestión de los marcadores de imagen en los resultados nativos derole = "tool"enviados a proveedores compatibles con chat-completions. De forma predeterminada, es"image_url"; establece"omit"para eliminar las cargas de URI/base64 de imagen y añadir un aviso fijo. Esto no cambia las imágenes directas de los usuarios ni los proveedores de OpenAI Responses.tls_ca_cert_path: ruta absoluta a un certificado CA codificado en PEM para conexiones TLS a este proveedor (una anulación de confianza por proveedor, distinta de la TLS del gatewayca_cert_path). No se realiza expansión de shell como~; déjelo sin establecer para usar el almacén de confianza del sistema.
Las entradas específicas de cada familia añaden sus propios campos tipados sobre estos campos compartidos.
Orden de resolución de campos
Para la mayoría de las familias, la URL se resuelve en este orden:
- Anulación del operador: campo
urien la entrada del alias, si está establecido. - Endpoint de familia: el enum
*Endpointde la familia proporciona la URL (p. ej.OpenAIEndpoint::Default->https://api.openai.com/v1). Las familias multirregión tienen un campoendpointen la entrada del alias que selecciona la variante (p. ej.endpoint = "cn"para Moonshot). - Familias con plantillas: Azure toma entradas tipadas (
resource,deployment,api_version) y las sustituye en la plantilla de URI de la familia. Los campos faltantes provocan un error explícito en tiempo de ejecución.
Bedrock es una excepción: el nombre de host del endpoint se construye en el momento de la solicitud a partir de la región de firma resuelta mediante la cadena de credenciales de AWS (AWS_REGION, AWS_DEFAULT_REGION o region del credential_process activo o del perfil de IMDS). El campo de alias uri y el campo providers.models.bedrock.<alias>.region del nivel del esquema no tienen ningún efecto en la implementación actual.
Espacios familiares
Cada slot, su endpoint predeterminado y si se ejecuta localmente está en el Catálogo. Hay una clave canónica por proveedor: sin sinónimos.
Credenciales
Formas de entrada y almacenamiento de credenciales compatibles:
api_key = "..."en línea en la entrada de alias (aceptable para desarrollo, arriesgado para configuraciones incluidas en el control de versiones).- Referencias de 1Password: establece un campo secreto en
op://vault/item/field. ZeroClaw mantiene la referencia en la configuración y la resuelve en tiempo de ejecución conop read, por lo que el CLI de 1Password debe estar instalado y con sesión iniciada. - Almacén de secretos a nivel de configuración: cifrado en
~/.zeroclaw/secretsmediante un archivo de clave local. - Anulación genérica por variable de entorno:
ZEROCLAW_providers__models__<type>__<alias>__api_key=...estableceproviders.models.<type>.<alias>.api_keyal iniciar. Consulta Variables de entorno para la gramática completa.
Las anulaciones de entorno schema-mirror prevalecen al iniciar. Reemplazan la credencial en memoria de ese proceso sin reescribir el valor almacenado inline, cifrado o op:// en disco.
zeroclaw quickstart escribe las credenciales en el almacén de secretos de forma predeterminada. Las configuraciones que confirmes no deben contener claves en línea. Para los nombres predeterminados del ecosistema que ya exportas en tu shell ($ANTHROPIC_API_KEY, $OPENROUTER_API_KEY, …), la referencia de env-vars muestra las expansiones de bash de una sola línea que apuntan un nombre espejo del esquema al valor existente.
Autenticación OAuth y autenticación por suscripción
Varios proveedores aceptan tokens de OAuth o de tipo suscripción en lugar de claves de API sin procesar. Obtén el token desde el panel de control o el flujo de la CLI del propio proveedor y luego colócalo en la entrada del alias de la misma manera que lo harías con una clave de API:
- Anthropic / Claude: Las claves de API de la consola y los tokens generados por
claude setup-tokenpara Claude Max van enapi_keyen[providers.models.anthropic.<alias>]. En Quickstart, eligeapi_keyosetup_token; la entrada de proveedor guardada sigue siendo la ranura canónicaanthropic. - OpenAI Codex subscription: ejecuta
zeroclaw auth login --model-provider openai-codex(o importa un inicio de sesión existente de Codex CLI con--import ~/.codex/auth.json), luego establecerequires_openai_auth = truey dejaapi_keysin definir en[providers.models.openai.<alias>]; en tiempo de ejecución se lee el perfil de autenticaciónopenai-codexalmacenado de ZeroClaw. - Gemini CLI:
[providers.models.gemini_cli.<alias>]ejecuta el CLIgeminimediante shell; usa el flujo de autenticación propio del CLI. - Grok Build CLI:
[providers.models.grok_cli.<alias>]ejecuta un proceso externo mediante la interfaz ACP documentada degrok agent stdio. El prompt ensamblado se envía como JSON-RPC por stdin, nunca mediante argv ni un archivo de prompt. De forma predeterminada, la autenticación usa la caché de inicio de sesión de la CLI. Para la autenticación mediante clave de API, exportaXAI_API_KEYal entorno del demonio y añade explícitamenteenv_passthrough = ["XAI_API_KEY"]al alias; el alias tipadoapi_keysigue sin admitirse. Se requiere unworking_directoryabsoluto existente, que define tanto el cwd del proceso hijo como el límite de la sesión ACP. El entorno del proceso hijo se vacía antes de iniciarlo, y env_passthrough está vacío de forma predeterminada. Los demás nombresXAI_*propios del proveedor y todos los nombresGROK_*se rechazan. De forma predeterminada, ZeroClaw usa--sandbox strict,--permission-mode dontAsk, un conjunto vacío de herramientas integradas y respuestas de permisos ACP con denegación por defecto en caso de fallo.extra_argses la activación explícita por alias para relajar esos controles. Las opciones de omisión--always-approve,--dangerously-skip-permissions,--yoloy--permission-mode=bypassPermissionshacen que el cliente ACP sin interfaz seleccioneallow_once; los demás modos de permisos siguen seleccionandoreject_once. Las opciones de transporte, modelo, sesión y cwd de ACP, además de los argumentos posicionales y abreviados, están reservados; las opciones largas desconocidas que aceptan valores usan--flag=value. El aliasvision = truesolo habilita a ZeroClaw para enviar bloques de imagen ACP; Grok sigue anunciandopromptCapabilities.image = falsehasta la versión 0.2.118 y no usa de forma fiable el contenido de imagen - déjalo sin establecer en producción; consulta Visión de ACP / entrada de imágenes. - Qwen / MiniMax: establece
auth_mode = "o_auth"en la entrada del alias, junto con los camposoauth_*relevantes (consulta env-vars → OAuth y campos de ruta de CLI).
Anulaciones compatibles con contenedores
Cuando ZeroClaw se ejecuta dentro de un contenedor y un proveedor está en el host (p. ej., Ollama), establezca uri en una dirección accesible desde el host. El mecanismo genérico de sobrescritura mediante variables de entorno (ZEROCLAW_<dotted_path_with_double_underscores>=<value>) puede establecer el mismo campo en tiempo de ejecución sin editar la configuración:
sh
ZEROCLAW_providers__models__ollama__home__uri=http://ollama:11434 zeroclaw agent -a assistant
__ es el separador de rutas; el ejemplo anterior establece providers.models.ollama.home.uri. Consulta Variables de entorno para conocer la gramática completa.
Capacidad de visión por modelo
Utiliza vision cuando una familia de proveedores puede servir tanto modelos multimodales como modelos de solo texto. El valor pertenece al alias del proveedor, por lo que las rutas de enrutamiento y de reserva lo resuelven junto con el endpoint, las credenciales y el modelo de ese alias:
[providers.models.openai.vision]
model = "gpt-4o"
wire_api = "responses"
vision = true
[providers.models.llamacpp.text]
model = "qwen3-4b"
vision = false
Dejar vision sin definir conserva el valor predeterminado integrado de la familia del proveedor. Para los alias de OpenAI Responses, establece vision = true para los modelos que aceptan entrada de imagen; esta habilitación explícita evita que los modelos de Responses de solo texto reciban cargas de imagen accidentalmente.
Configurar vision = true es una afirmación explícita del operador de que el alias seleccionado acepta entradas de imagen. Cambia el enrutamiento de imágenes: ZeroClaw mantiene los archivos adjuntos de imagen en ese alias en lugar de tratarlos como contenido de solo texto o enrutarlos a multimodal.vision_model_provider. Configúralo solo para una combinación de proveedor y modelo probada. Para grok_cli, el mismo campo solo controla si ZeroClaw envía bloques de imagen de ACP; no modifica el anuncio de promptCapabilities.image de Grok (sigue siendo false hasta la versión 0.2.118) ni hace que la CLI describa la imagen de forma fiable. Consulta visión de ACP / entrada de imágenes.
Cuando [multimodal] vision_model_provider nombra un alias de proveedor con puntos, su model se usa automáticamente. Un [multimodal] vision_model explícito tiene prioridad sobre el modelo del alias; si no se establece ninguno, se usa el modelo de turno principal por compatibilidad con versiones anteriores.
Visualización nativa del razonamiento (Anthropic)
agent.thinking.display controla cómo se entrega el razonamiento extendido de Anthropic cuando el razonamiento nativo está habilitado (agent.thinking.native_thinking = true). Valores aceptados:
off(predeterminado): no se envía ningún campodisplay; las solicitudes son idénticas a nivel de bytes a las de versiones anteriores de ZeroClaw y las solicitudes de razonamiento usan la alternativa sin transmisión.omitted: Anthropic omite el texto de razonamiento de la respuesta; los bloques llegan solo con la firma (thinkingvacío, firma obligatoria), manteniendo intacta la reproducción y minimizando el razonamiento visible.updates: la solicitud incluye la versión betathinking-display-updates-2026-08-18y usa la ruta de respuesta de streaming. El progreso legible del razonamiento se muestra en directo mientras el modelo trabaja; la carga útil de razonamiento firmada se conserva por separado para reproducir el historial y nunca se muestra.summarized: mismo comportamiento de streaming, solicitando un razonamiento resumido.
[agent.thinking]
native_thinking = true
display = "updates"
Esta configuración requiere una cuenta de Anthropic inscrita en la versión beta thinking-display-updates; sin la inscripción, la API rechaza la solicitud. Establece display = "off" (o elimina el campo) para volver al comportamiento anterior del protocolo.
Ajustes por familia: ejemplos prácticos
Ollama
Ollama usa como valor predeterminado el extremo local, por lo que un alias local solo necesita el nombre del modelo:
[providers.models.ollama.local]
model = "llama3.1"
Establece uri cuando ZeroClaw no se esté ejecutando en el mismo host que Ollama:
[providers.models.ollama.host]
model = "llama3.1"
uri = "http://host.docker.internal:11434"
Los campos opcionales específicos de Ollama son num_ctx, num_predict y temperature_override.
Azure OpenAI
Azure OpenAI calcula su extremo a partir de los campos de Azure escritos:
[providers.models.azure.work]
api_key = "op://platform/azure-openai/api-key"
model = "gpt-4o"
resource = "example-resource"
deployment = "gpt-4o-prod"
api_version = "2024-10-21"
Los valores de resource, deployment y api_version residen en esta configuración tipada; no se leen de variables de entorno específicas de Azure. Usa uri solo cuando necesites invalidar por completo el endpoint calculado.
Amazon Bedrock
Bedrock necesita un alias con un modelo; la región del endpoint actualmente proviene de la ruta de entorno/perfil de autenticación de Bedrock:
[providers.models.bedrock.work]
model = "anthropic.claude-sonnet-4-6"
El proveedor Bedrock utiliza las rutas de credenciales implementadas en crates/zeroclaw-providers/src/bedrock.rs:
api_keyen el alias de Bedrock, oBEDROCK_API_KEY, usa la autenticación por token bearer de Bedrock y tiene prioridad sobre las credenciales SigV4.AWS_ACCESS_KEY_IDmásAWS_SECRET_ACCESS_KEYutiliza SigV4.AWS_SESSION_TOKENes opcional.AWS_REGIONoAWS_DEFAULT_REGIONselecciona la región de firma y usaus-east-1como valor predeterminado.credential_processen el perfil activo de~/.aws/config, o deAWS_CONFIG_FILE, usa SigV4.AWS_PROFILEselecciona el perfil y tiene como valor predeterminadodefault.- Las credenciales de instancia EC2 IMDSv2 son el recurso SigV4 de último recurso.
El esquema de configuración también define un campo providers.models.bedrock.<alias>.region, pero la implementación actual no lo lee. La región del endpoint siempre se resuelve a partir de la cadena de credenciales de AWS (variables de entorno, credential_process o IMDS) como se describe anteriormente.
La implementación actual de Bedrock no lee un perfil estático normal en ~/.aws/credentials. ~/.zeroclaw/secrets solo almacena secretos de configuración de ZeroClaw, como un alias api_key; no exporta variables AWS_* para el proveedor.
Para reutilizar un perfil de AWS CLI a través de la ruta de perfil implementada, coloca un credential_process en ~/.aws/config:
[profile zeroclaw-bedrock]
credential_process = /usr/bin/aws configure export-credentials --profile my-existing-profile
region = us-east-1
/usr/bin/aws es la ruta predeterminada en Debian y Ubuntu. En otros sistemas, utiliza la ruta absoluta de command -v aws.
Luego ejecuta ZeroClaw con AWS_PROFILE=zeroclaw-bedrock. Para un servicio de usuario systemd, consulta Gestión de servicios.
Multirregión (Moonshot / Qwen / GLM / MiniMax / …)
Un tipo por familia; selecciona la región mediante el campo tipado endpoint en la entrada del alias.
Endpoint personalizado compatible con OpenAI
La ranura custom requiere uri. Consulta Proveedores personalizados.
Elección del proveedor que utiliza un agente
Los agentes hacen referencia a un proveedor mediante un alias con puntos. Las entradas de proveedor por sí solas no hacen nada.
risk_profile y runtime_profile hacen referencia a mapas de alias independientes, por lo que sus nombres no tienen por qué coincidir (runtime_profile también es opcional). Config::validate() falla de forma explícita al iniciar si model_provider no se resuelve a una entrada [providers.models.<type>.<alias>] configurada, o si risk_profile no se resuelve a una entrada [risk_profiles.<alias>] configurada.
Para varios agentes que apuntan a distintos proveedores, consulta Routing.
Respaldo en caso de fallo
Cuando una solicitud a un proveedor falla después de agotar sus reintentos (proveedor caído, clave con límite de velocidad alcanzado, modelo no disponible), el alias puede conmutar a las alternativas que declares en la entrada del alias. Dos ejes independientes y ordenados:
fallback_models: IDs de modelos alternativos que se intentan en este proveedor, usando el mismo endpoint, clave y encabezados. Solo cambia el identificador del modelo. Úselo cuando un proveedor ofrece un modelo de respaldo (una variante más pequeña o más antigua) que debe intentarse antes de abandonar el proveedor por completo.fallback: una lista ordenada de otros alias de proveedor (referencias con puntos<type>.<alias>a[providers.models]). Cada alias de respaldo se resuelve con sus propias credenciales, endpoint y modelo; un respaldo nunca hereda la clave del alias que falla.
Orden de intentos
El recorrido es en profundidad: la lista completa de modelos de un alias se agota antes de abandonarlo, luego se desciende por cada alias de fallback por turno, aplicando recursivamente los propios fallback_models y fallback de ese alias. Supongamos que anthropic.prod sirve claude-sonnet-4-5, incluye claude-haiku-4-5 en sus fallback_models y nombra a openai.backup (que sirve gpt-4.1) en su fallback. El orden de intentos es entonces:
anthropic.prod/claude-sonnet-4-5
-> anthropic.prod/claude-haiku-4-5
-> openai.backup/gpt-4.1
-> (request fails)
Los alias de fallback pueden a su vez declarar fallback, por lo que la cadena es tan larga como tu configuración lo determine, hasta una profundidad máxima de 3 aliases. Una cadena que forma un bucle sobre sí misma (a -> b -> a) se detecta y la arista del ciclo se elimina, y a una cadena acíclica más profunda que el límite se le eliminan los enlaces restantes; en ningún caso se producen bucles, bloqueos ni desbordamientos de la pila.
Configuración incorrecta
Una entrada fallback que nombra un alias que no está configurado, una que cierra un ciclo, o una cadena que excede la profundidad máxima es no fatal: Config::validate() aún tiene éxito, el enlace problemático se omite en tiempo de ejecución, y el problema se muestra como una advertencia de validación (dangling_fallback_ref / fallback_cycle / max_fallback_depth_exceeded) en la CLI y en el dashboard. Una entrada fallback_models que está en blanco o duplica el model primario del alias se omite igualmente en tiempo de ejecución y se muestra (empty_fallback_model / fallback_model_duplicates_primary). Un enlace de fallback incorrecto se degrada con elegancia, nunca impide que el agente se ejecute.
Ver también
- Visión general
- Catálogo de proveedores: ejemplo de configuración concreto para cada familia
- Streaming
- Enrutamiento
- Proveedores personalizados