Providers
vLLM
vLLM sirve modelos de código abierto (y algunos personalizados) mediante una API HTTP compatible con OpenAI. OpenClaw se conecta mediante la API openai-completions y puede detectar automáticamente los modelos cuando habilitas esta opción con VLLM_API_KEY.
| Propiedad | Valor |
|---|---|
| ID del proveedor | vllm |
| API | openai-completions (compatible con OpenAI) |
| Autenticación | Variable de entorno VLLM_API_KEY |
| URL base predeterminada | http://127.0.0.1:8000/v1 |
| Uso en transmisión | Compatible (stream_options.include_usage) |
Primeros pasos
Inicia vLLM con un servidor compatible con OpenAI
Tu URL base debe exponer puntos de conexión /v1 (/v1/models, /v1/chat/completions). vLLM suele ejecutarse en:
http://127.0.0.1:8000/v1Establece la variable de entorno de la clave de API
Cualquier valor no vacío funciona si tu servidor no exige autenticación:
export VLLM_API_KEY="vllm-local"Selecciona un modelo
Sustitúyelo por uno de los ID de modelo de vLLM:
{ agents: { defaults: { model: { primary: "vllm/your-model-id" }, }, },}Verifica que el modelo esté disponible
openclaw models list --provider vllmDetección de modelos (proveedor implícito)
Cuando se establece VLLM_API_KEY (o existe un perfil de autenticación) y no se define models.providers.vllm, OpenClaw consulta GET http://127.0.0.1:8000/v1/models y convierte los ID devueltos en entradas de modelos.
Configuración explícita
Configúralo explícitamente cuando vLLM se ejecute en otro host o puerto, quieras fijar contextWindow/maxTokens, el servidor requiera una clave de API real o te conectes a un punto de conexión local loopback, de LAN o de Tailscale de confianza:
{ models: { providers: { vllm: { baseUrl: "http://127.0.0.1:8000/v1", apiKey: "${VLLM_API_KEY}", api: "openai-completions", timeoutSeconds: 300, // Optional: extend request timeout for slow local models models: [ { id: "your-model-id", name: "Local vLLM Model", reasoning: false, input: ["text"], cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, contextWindow: 128000, maxTokens: 8192, }, ], }, }, },}Para mantener el proveedor dinámico sin enumerar todos los modelos, añade un comodín al catálogo de modelos visible:
{ agents: { defaults: { models: { "vllm/*": {}, }, }, },}Configuración avanzada
Comportamiento de tipo proxy
vLLM se trata como un backend /v1 de tipo proxy compatible con OpenAI, no como un punto de conexión nativo de OpenAI:
| Comportamiento | ¿Se aplica? |
|---|---|
| Estructuración nativa de solicitudes de OpenAI | No |
service_tier |
No se envía |
store de Responses |
No se envía |
| Indicaciones para la caché de prompts | No se envían |
| Estructuración de la carga útil de compatibilidad con el razonamiento de OpenAI | No se aplica |
| Encabezados ocultos de atribución de OpenClaw | No se inyectan en URL base personalizadas |
Controles de pensamiento de Qwen
Para los modelos Qwen, establece compat.thinkingFormat: "qwen-chat-template" en la fila del modelo cuando el servidor espere argumentos de palabra clave de la plantilla de chat de Qwen. Estos modelos exponen un perfil binario /think (off, on) porque el pensamiento de la plantilla de chat de Qwen es una opción de activación o desactivación, no una escala de esfuerzo al estilo de OpenAI.
{ models: { providers: { vllm: { models: [ { id: "Qwen/Qwen3-8B", name: "Qwen3 8B", reasoning: true, compat: { thinkingFormat: "qwen-chat-template" }, }, ], }, }, },}OpenClaw asigna /think off a:
{ "chat_template_kwargs": { "enable_thinking": false, "preserve_thinking": true }}Los niveles de pensamiento distintos de off envían enable_thinking: true. Si tu punto de conexión espera en su lugar indicadores de nivel superior al estilo de DashScope, usa compat.thinkingFormat: "qwen" para enviar enable_thinking en la raíz de la solicitud.
Controles de pensamiento de Nemotron 3
Para los modelos vllm/nemotron-3-* con el pensamiento desactivado, el Plugin incluido envía:
{ "chat_template_kwargs": { "enable_thinking": false, "force_nonempty_content": true }}Para personalizar estos valores, establece chat_template_kwargs en los parámetros del modelo. Si también estableces params.extra_body.chat_template_kwargs, ese valor prevalece porque extra_body es la última sobrescritura del cuerpo de la solicitud.
{ agents: { defaults: { models: { "vllm/nemotron-3-super": { params: { chat_template_kwargs: { enable_thinking: false, force_nonempty_content: true, }, }, }, }, }, },}Las llamadas a herramientas de Qwen aparecen como texto
Primero, confirma que vLLM se haya iniciado con el analizador de llamadas a herramientas y la plantilla de chat correctos para el modelo. La documentación de vLLM especifica hermes para los modelos Qwen2.5 y qwen3_xml para los modelos Qwen3-Coder.
Síntomas: las Skills o herramientas nunca se ejecutan, el asistente imprime JSON/XML sin procesar, como {"name":"read","arguments":...}, o vLLM devuelve una matriz tool_calls vacía cuando OpenClaw envía tool_choice: "auto".
Algunas combinaciones de Qwen y vLLM solo devuelven llamadas a herramientas estructuradas cuando la solicitud utiliza tool_choice: "required". Fuérzalo para cada modelo mediante params.extra_body:
{ agents: { defaults: { models: { "vllm/Qwen-Qwen2.5-Coder-32B-Instruct": { params: { extra_body: { tool_choice: "required", }, }, }, }, }, },}Sustituye el ID del modelo por el ID exacto que muestra openclaw models list --provider vllm, o aplica la misma sobrescritura desde la CLI:
openclaw config set agents.defaults.models '{"vllm/Qwen-Qwen2.5-Coder-32B-Instruct":{"params":{"extra_body":{"tool_choice":"required"}}}}' --strict-json --mergeEsta es una solución alternativa opcional: obliga a que cada turno con herramientas realice una llamada a una herramienta, por lo que debes usarla únicamente en una entrada de modelo dedicada donde ese comportamiento sea aceptable. No la establezcas como valor predeterminado global para todos los modelos de vLLM ni la combines con un proxy que convierta texto arbitrario del asistente en llamadas ejecutables a herramientas.
URL base personalizada
Si tu servidor vLLM se ejecuta en un host o puerto distinto del predeterminado, establece baseUrl en la configuración explícita del proveedor:
{ models: { providers: { vllm: { baseUrl: "http://192.168.1.50:9000/v1", apiKey: "${VLLM_API_KEY}", api: "openai-completions", timeoutSeconds: 300, models: [ { id: "my-custom-model", name: "Remote vLLM Model", reasoning: false, input: ["text"], contextWindow: 64000, maxTokens: 4096, }, ], }, }, },}Solución de problemas
Primera respuesta lenta o tiempo de espera agotado del servidor remoto
Para modelos locales grandes, hosts remotos de la LAN o enlaces de la red de Tailscale, establece un tiempo de espera para las solicitudes limitado al proveedor:
{ models: { providers: { vllm: { baseUrl: "http://192.168.1.50:8000/v1", apiKey: "${VLLM_API_KEY}", api: "openai-completions", timeoutSeconds: 300, models: [{ id: "your-model-id", name: "Local vLLM Model" }], }, }, },}timeoutSeconds se aplica únicamente a las solicitudes HTTP de modelos vLLM: establecimiento de la conexión, encabezados de respuesta, transmisión del cuerpo y cancelación total de la solicitud protegida. También eleva el límite del supervisor de inactividad o transmisión del LLM por encima del valor predeterminado implícito de unos 120 segundos para este proveedor. Es preferible usar esta opción en lugar de aumentar agents.defaults.timeoutSeconds, que controla toda la ejecución del agente.
No se puede acceder al servidor
Comprueba que el servidor vLLM esté en ejecución y sea accesible:
curl http://127.0.0.1:8000/v1/modelsSi aparece un error de conexión, verifica el host, el puerto y que vLLM se haya iniciado en modo de servidor compatible con OpenAI. OpenClaw confía en el origen exacto configurado en models.providers.vllm.baseUrl para las solicitudes protegidas de modelos en puntos de conexión local loopback, de LAN y de Tailscale. Los orígenes de metadatos o de vínculo local permanecen bloqueados sin una habilitación explícita. Establece models.providers.vllm.request.allowPrivateNetwork: true únicamente cuando las solicitudes de vLLM deban llegar a otro origen privado, o false para desactivar la confianza en el origen exacto.
Errores de autenticación en las solicitudes
Si las solicitudes fallan con errores de autenticación, establece una VLLM_API_KEY real que coincida con la configuración del servidor o configura el proveedor explícitamente en models.providers.vllm.
No se detectan modelos
La detección automática requiere que se establezca VLLM_API_KEY. Si has definido models.providers.vllm, OpenClaw utiliza únicamente los modelos que hayas declarado, salvo que agents.defaults.models incluya "vllm/*": {}.
Las herramientas se muestran como texto sin procesar
Si un modelo Qwen imprime sintaxis JSON/XML de herramientas en lugar de ejecutar una Skill:
- Inicia vLLM con el analizador y la plantilla correctos para ese modelo.
- Confirma el ID exacto del modelo con
openclaw models list --provider vllm. - Añade una sobrescritura dedicada por modelo
params.extra_body.tool_choice: "required"únicamente sitool_choice: "auto"sigue devolviendo llamadas a herramientas vacías o solo como texto.
Contenido relacionado
Elección de proveedores, referencias de modelos y comportamiento de conmutación por error.
Proveedor nativo de OpenAI y comportamiento de rutas compatibles con OpenAI.
Detalles de autenticación y reglas de reutilización de credenciales.
Problemas habituales y cómo resolverlos.