openclaw onboard.
Para servidores locales que solo deberían iniciarse cuando un modelo seleccionado los necesita, consulta Servicios de modelos locales.
Base mínima de hardware
Apunta a 2+ Mac Studios al máximo o un equipo GPU equivalente (~$30k+) para un ciclo de agente cómodo. Una sola GPU de 24 GB solo maneja prompts más ligeros con mayor latencia. Ejecuta siempre la variante más grande / de tamaño completo que puedas alojar: los checkpoints pequeños o muy cuantizados aumentan el riesgo de inyección de prompts (consulta Seguridad).Elige un backend
| Backend | Úsalo cuando |
|---|---|
| ds4 | DeepSeek V4 Flash local en macOS Metal con llamadas a herramientas compatibles con OpenAI |
| LM Studio | Primera configuración local, cargador GUI, Responses API nativa |
| LiteLLM / OAI-proxy / custom OpenAI-compatible proxy | Expones otra API de modelo y necesitas que OpenClaw la trate como OpenAI |
| MLX / vLLM / SGLang | Servicio autoalojado de alto rendimiento con un endpoint HTTP compatible con OpenAI |
| Ollama | Flujo de trabajo CLI, biblioteca de modelos, servicio systemd sin intervención |
api: "openai-responses" cuando el backend lo admita (LM Studio lo hace). De lo contrario, usa api: "openai-completions". Si api se omite en un proveedor personalizado con un baseUrl, OpenClaw usa openai-completions de forma predeterminada.
LM Studio + modelo local grande (Responses API)
Este es el mejor stack local actual. Carga un modelo grande en LM Studio (una compilación de tamaño completo de Qwen, DeepSeek o Llama), habilita el servidor local (http://127.0.0.1:1234 de forma predeterminada) y usa Responses API para mantener el razonamiento separado del texto final.
- Instala LM Studio: https://lmstudio.ai
- Descarga la compilación de modelo más grande disponible (evita variantes “small”/muy cuantizadas), inicia el servidor y confirma que
http://127.0.0.1:1234/v1/modelsla lista. - Reemplaza
my-local-modelpor el ID de modelo real que se muestra en LM Studio. - Mantén el modelo cargado; la carga en frío añade latencia de inicio.
- Ajusta
contextWindow/maxTokenssi tu compilación de LM Studio difiere. - Para WhatsApp, usa Responses API para que solo se envíe el texto final.
- Mantén
models.mode: "merge"para que los modelos alojados sigan disponibles como alternativas.
Configuración híbrida: principal alojado, alternativa local
primary/fallbacks y mantén el mismo bloque providers y models.mode: "merge".
Alojamiento regional / enrutamiento de datos
También existen variantes alojadas de MiniMax/Kimi/GLM en OpenRouter con endpoints fijados por región (por ejemplo, alojados en EE. UU.). Elige la variante regional para mantener el tráfico en la jurisdicción elegida mientras conservasmodels.mode: "merge" para alternativas de Anthropic/OpenAI. Solo local sigue siendo la ruta de privacidad más sólida; el enrutamiento regional alojado es el punto intermedio cuando necesitas funciones del proveedor pero quieres controlar el flujo de datos.
Otros proxies locales compatibles con OpenAI
MLX (mlx_lm.server), vLLM, SGLang, LiteLLM, OAI-proxy o cualquier Gateway personalizado funciona si expone un endpoint /v1/chat/completions de estilo OpenAI. Usa openai-completions salvo que el backend documente explícitamente soporte para /v1/responses.
baseUrl configurado para solicitudes de modelo protegidas, incluidos loopback, LAN, tailnet y hosts DNS privados. Los orígenes metadata/link-local siempre se bloquean de todos modos. Las solicitudes a otros orígenes privados siguen necesitando models.providers.<id>.request.allowPrivateNetwork: true; establece la marca de confianza en false para excluirte de la confianza en el origen exacto.
models.providers.<id>.models[].id es local al proveedor: no incluyas el prefijo del proveedor. Para un servidor MLX iniciado con mlx_lm.server --model mlx-community/Qwen3-30B-A3B-6bit:
models.providers.mlx.models[].id: "mlx-community/Qwen3-30B-A3B-6bit"agents.defaults.model.primary: "mlx/mlx-community/Qwen3-30B-A3B-6bit"
input: ["text", "image"] en modelos locales o de visión con proxy para que los adjuntos de imagen se inyecten en los turnos del agente. El onboarding interactivo de proveedor personalizado infiere IDs comunes de modelos de visión y solo pregunta por nombres desconocidos; el onboarding no interactivo usa la misma inferencia, con --custom-image-input / --custom-text-input para sobrescribirla.
Usa models.providers.<id>.timeoutSeconds para servidores de modelos locales/remotos lentos antes de aumentar agents.defaults.timeoutSeconds. El timeout del proveedor cubre conexión, encabezados, streaming del cuerpo y la anulación total de guarded-fetch solo para solicitudes HTTP de modelo; si el timeout del agente/run es menor, súbelo también, ya que el timeout del proveedor no puede extender toda la ejecución.
Para proveedores personalizados compatibles con OpenAI, se acepta un marcador local no secreto como
apiKey: "ollama-local" cuando baseUrl se resuelve a loopback, una LAN privada, .local o un nombre de host simple: OpenClaw lo trata como una credencial local válida en lugar de informar que falta una clave. Usa un valor real para cualquier proveedor que acepte un nombre de host público./v1 locales/con proxy:
- OpenClaw los trata como rutas compatibles con OpenAI de estilo proxy, no como endpoints nativos de OpenAI.
- La adaptación de solicitudes solo para OpenAI nativo no se aplica: sin
service_tier, sin Responsesstore, sin adaptación de payload de compatibilidad de razonamiento de OpenAI, sin sugerencias de caché de prompts. - Los encabezados ocultos de atribución de OpenClaw (
originator,version,User-Agent) no se inyectan en URLs de proxy personalizadas.
-
Contenido solo como cadena: algunos servidores aceptan solo
messages[].contentcomo cadena, no arrays estructurados de partes de contenido. Establecemodels.providers.<provider>.models[].compat.requiresStringContent: true. -
Claves de mensaje estrictas: si el servidor rechaza entradas de mensaje con más que
role/content, establececompat.strictMessageKeys: true. -
Texto de herramienta entre corchetes: algunos modelos locales emiten solicitudes de herramienta independientes entre corchetes como texto, como
[tool_name]seguido de JSON y[END_TOOL_REQUEST]. OpenClaw las promueve a llamadas de herramienta reales solo cuando el nombre coincide exactamente con una herramienta registrada para el turno; de lo contrario, permanece como texto oculto no admitido. - Texto no estructurado que parece llamada de herramienta: si un modelo emite texto de estilo JSON/XML/ReAct que parece una llamada de herramienta pero no era una invocación estructurada, OpenClaw lo deja como texto y registra una advertencia con el ID de ejecución, proveedor/modelo, patrón detectado y nombre de herramienta cuando está disponible. Eso es una incompatibilidad de proveedor/modelo, no una ejecución de herramienta completada.
-
Forzar el uso de herramientas: si las herramientas aparecen como texto del asistente (JSON/XML/ReAct sin procesar, o un array
tool_callsvacío), primero confirma que la plantilla/parser de chat del servidor admita llamadas a herramientas. Si el parser solo funciona cuando se fuerza el uso de herramientas, sobrescribe el valor de proxy predeterminado detool_choice: "auto"por modelo:Usa esto solo donde cada turno normal debería llamar a una herramienta. Reemplazalocal/my-local-modelcon la referencia exacta deopenclaw models list, o establécelo mediante CLI: -
Esfuerzos de razonamiento adicionales: si un modelo personalizado compatible con OpenAI acepta esfuerzos de razonamiento de OpenAI más allá del perfil integrado, decláralos en el bloque de compatibilidad del modelo. Añadir
"xhigh"lo expone para esa referencia de modelo en/think xhigh, selectores de sesión, validación de Gateway y validación dellm-task:
Backends más pequeños o más estrictos
Si el modelo carga correctamente pero los turnos completos del agente se comportan mal, trabaja de arriba hacia abajo: confirma primero el transporte y luego reduce la superficie.-
Confirma que el modelo local responde: sin herramientas, sin contexto de agente:
-
Confirma el enrutamiento del Gateway - envía solo el prompt, omitiendo la transcripción, el arranque de AGENTS, el ensamblado del motor de contexto, las herramientas y los servidores MCP incluidos, pero aun así ejercita el enrutamiento del Gateway, la autenticación y la selección de proveedor:
-
Prueba el modo ligero si ambas sondas pasan pero los turnos reales del agente fallan con llamadas de herramientas mal formadas o prompts demasiado grandes: establece
agents.defaults.experimental.localModelLean: true. Descarta las herramientas pesadas de navegador, cron, mensajes, generación de medios, voz y PDF salvo que se requieran explícitamente, y coloca por defecto los catálogos de herramientas más grandes detrás de controles estructurados de Tool Search. Consulta Funciones experimentales -> Modo ligero de modelo local para obtener detalles y saber cómo confirmar que está activado. -
Desactiva las herramientas por completo como último recurso estableciendo
models.providers.<provider>.models[].compat.supportsTools: falsepara ese modelo; entonces el agente se ejecuta sin llamadas de herramientas. -
Más allá de eso, el cuello de botella está upstream. Si el backend sigue fallando solo en ejecuciones más grandes de OpenClaw después del modo ligero y
supportsTools: false, el problema restante suele ser el propio modelo o servidor: ventana de contexto, memoria de GPU, expulsión de kv-cache o un error del backend, no la capa de transporte de OpenClaw.
Solución de problemas
- ¿El Gateway no puede alcanzar el proxy?
curl http://127.0.0.1:1234/v1/models. - ¿Modelo de LM Studio descargado? Vuelve a cargarlo; el arranque en frío es una causa común de “bloqueo”.
- ¿El servidor local dice
terminated,ECONNRESETo cierra el flujo a mitad del turno? OpenClaw registra unmodel.call.error.failureKindde baja cardinalidad junto con una instantánea de RSS/heap del proceso de OpenClaw en los diagnósticos. Para presión de memoria en LM Studio/Ollama, compara esa marca de tiempo con el registro del servidor o con un registro de bloqueo/jetsam de macOS para confirmar si el servidor del modelo fue terminado. - ¿Errores de contexto? OpenClaw deriva los umbrales de prevalidación de la ventana de contexto a partir de la ventana del modelo detectada (o la ventana limitada cuando
agents.defaults.contextTokensla reduce), con advertencia por debajo del 20% con un piso de 8k y bloqueo estricto por debajo del 10% con un piso de 4k (limitado a la ventana de contexto efectiva para que los metadatos sobredimensionados del modelo no rechacen un límite de usuario válido). ReducecontextWindowo aumenta el límite de contexto del servidor/modelo. - ¿
messages[].content ... expected a string? Añadecompat.requiresStringContent: trueen esa entrada de modelo. - ¿
validation.keys, o “message entries only allowroleandcontent”? Añadecompat.strictMessageKeys: trueen esa entrada de modelo. - ¿Las llamadas directas a
/v1/chat/completionsfuncionan, peroopenclaw infer model run --localfalla en Gemma u otro modelo local? Revisa primero la URL del proveedor, la referencia del modelo, el marcador de autenticación y los registros del servidor;model runomite por completo las herramientas de agente. Simodel runtiene éxito pero los turnos de agente más grandes fallan, reduce la superficie de herramientas conlocalModelLeanocompat.supportsTools: false. - ¿Las llamadas de herramientas aparecen como texto JSON/XML/ReAct sin procesar, o el proveedor devuelve un arreglo
tool_callsvacío? No añadas un proxy que convierta ciegamente texto del asistente en ejecución de herramientas; corrige primero la plantilla/parser de chat del servidor. Si el modelo solo funciona cuando se fuerza el uso de herramientas, añade la anulaciónparams.extra_body.tool_choice: "required"anterior y usa esa entrada de modelo solo para sesiones donde se espere una llamada de herramienta en cada turno. - Seguridad: los modelos locales omiten los filtros del lado del proveedor. Mantén los agentes acotados y Compaction activado para limitar el radio de impacto de la inyección de prompts.