Providers
vLLM
vLLM puede servir modelos de código abierto (y algunos personalizados) mediante una API HTTP compatible con OpenAI. OpenClaw se conecta a vLLM usando la API openai-completions.
OpenClaw también puede detectar automáticamente los modelos disponibles de vLLM cuando lo habilitas con VLLM_API_KEY (cualquier valor funciona si tu servidor no exige autenticación) y no defines una entrada explícita models.providers.vllm.
OpenClaw trata vllm como un proveedor local compatible con OpenAI que admite
cómputo de uso en streaming, por lo que los conteos de tokens de estado/contexto pueden actualizarse a partir de
respuestas stream_options.include_usage.
| 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 |
Primeros pasos
Iniciar vLLM con un servidor compatible con OpenAI
Tu URL base debe exponer endpoints /v1 (por ejemplo, /v1/models, /v1/chat/completions). vLLM suele ejecutarse en:
http://127.0.0.1:8000/v1
Configurar la variable de entorno de la clave de API
Cualquier valor funciona si tu servidor no exige autenticación:
export VLLM_API_KEY="vllm-local"
Seleccionar un modelo
Sustitúyelo por uno de tus ID de modelo de vLLM:
{
agents: {
defaults: {
model: { primary: "vllm/your-model-id" },
},
},
}
Verificar que el modelo esté disponible
openclaw models list --provider vllm
Detección de modelos (proveedor implícito)
Cuando VLLM_API_KEY está configurada (o existe un perfil de autenticación) y no defines models.providers.vllm, OpenClaw consulta:
GET http://127.0.0.1:8000/v1/models
y convierte los ID devueltos en entradas de modelo.
Configuración explícita (modelos manuales)
Usa una configuración explícita cuando:
- vLLM se ejecute en otro host o puerto
- Quieras fijar valores de
contextWindowomaxTokens - Tu servidor requiera una clave de API real (o quieras controlar los encabezados)
- Te conectes a un endpoint de vLLM de confianza mediante loopback, LAN o Tailscale
{
models: {
providers: {
vllm: {
baseUrl: "http://127.0.0.1:8000/v1",
apiKey: "${VLLM_API_KEY}",
api: "openai-completions",
request: { allowPrivateNetwork: true },
timeoutSeconds: 300, // Optional: extend connect/header/body/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,
},
],
},
},
},
}
Configuración avanzada
Comportamiento de estilo proxy
vLLM se trata como un backend /v1 compatible con OpenAI de estilo proxy, no como un endpoint
nativo de OpenAI. Esto significa:
| Comportamiento | ¿Se aplica? |
|---|---|
| Modelado de solicitud nativo de OpenAI | No |
service_tier |
No se envía |
store de Responses |
No se envía |
| Sugerencias de caché de prompts | No se envían |
| Modelado de payload compatible con reasoning 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 modelos Qwen servidos mediante vLLM, configura
params.qwenThinkingFormat: "chat-template" en la entrada del modelo cuando el
servidor espere kwargs de plantilla de chat de Qwen. 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 endpoint
espera en su lugar flags de nivel superior de estilo DashScope, usa
params.qwenThinkingFormat: "top-level" para enviar enable_thinking en la
raíz de la solicitud. También se acepta params.qwen_thinking_format en snake case.
Controles de pensamiento de Nemotron 3
vLLM/Nemotron 3 puede usar kwargs de plantilla de chat para controlar si el reasoning se
devuelve como reasoning oculto o como texto de respuesta visible. Cuando una sesión de OpenClaw
usa vllm/nemotron-3-* con el pensamiento desactivado, el Plugin de vLLM incluido envía:
{
"chat_template_kwargs": {
"enable_thinking": false,
"force_nonempty_content": true
}
}
Para personalizar estos valores, configura chat_template_kwargs bajo los parámetros del modelo.
Si también configuras params.extra_body.chat_template_kwargs, ese valor tiene
precedencia final 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 asegúrate de que vLLM se haya iniciado con el parser de llamadas a herramientas y la
plantilla de chat correctos para el modelo. Por ejemplo, vLLM documenta hermes para modelos
Qwen2.5 y qwen3_xml para modelos Qwen3-Coder.
Síntomas:
- las skills o herramientas nunca se ejecutan
- el asistente imprime JSON/XML sin procesar, como
{"name":"read","arguments":...} - vLLM devuelve un array
tool_callsvacío cuando OpenClaw envíatool_choice: "auto"
Algunas combinaciones de Qwen/vLLM devuelven llamadas a herramientas estructuradas solo cuando la
solicitud usa tool_choice: "required". Para esas entradas de modelo, fuerza el
campo de solicitud compatible con OpenAI con params.extra_body:
{
agents: {
defaults: {
models: {
"vllm/Qwen-Qwen2.5-Coder-32B-Instruct": {
params: {
extra_body: {
tool_choice: "required",
},
},
},
},
},
},
}
Sustituye Qwen-Qwen2.5-Coder-32B-Instruct por el id exacto devuelto por:
openclaw models list --provider vllm
Puedes aplicar 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 --merge
Esta es una solución de compatibilidad opcional. Hace que cada turno del modelo con herramientas requiera una llamada a herramienta, así que úsala solo para una entrada de modelo local dedicada donde ese comportamiento sea aceptable. No la uses como valor predeterminado global para todos los modelos vLLM, y no uses un proxy que convierta a ciegas texto arbitrario del asistente en llamadas a herramientas ejecutables.
URL base personalizada
Si tu servidor vLLM se ejecuta en un host o puerto no predeterminado, configura 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",
request: { allowPrivateNetwork: true },
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 timeout del servidor remoto
Para modelos locales grandes, hosts LAN remotos o enlaces tailnet, configura un timeout de solicitud con alcance de proveedor:
{
models: {
providers: {
vllm: {
baseUrl: "http://192.168.1.50:8000/v1",
apiKey: "${VLLM_API_KEY}",
api: "openai-completions",
request: { allowPrivateNetwork: true },
timeoutSeconds: 300,
models: [{ id: "your-model-id", name: "Local vLLM Model" }],
},
},
},
}
timeoutSeconds se aplica solo a las solicitudes HTTP de modelos vLLM, incluido el
establecimiento de conexión, los encabezados de respuesta, el streaming del cuerpo y la cancelación total
de guarded-fetch. Prefiere esto antes 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 accesible:
curl http://127.0.0.1:8000/v1/models
Si ves un error de conexión, verifica el host, el puerto y que vLLM se haya iniciado con el modo de servidor compatible con OpenAI.
Para endpoints explícitos de loopback, LAN o Tailscale, configura también
models.providers.vllm.request.allowPrivateNetwork: true; las solicitudes del proveedor
bloquean las URL de red privada de forma predeterminada a menos que el proveedor sea
explícitamente de confianza.
Errores de autenticación en solicitudes
Si las solicitudes fallan con errores de autenticación, configura una VLLM_API_KEY real que coincida con la configuración de tu servidor, o configura el proveedor explícitamente bajo models.providers.vllm.
No se detectan modelos
La detección automática requiere que VLLM_API_KEY esté configurada y que no haya una entrada de configuración explícita models.providers.vllm. Si has definido el proveedor manualmente, OpenClaw omite la detección y usa solo los modelos declarados.
Las herramientas se representan como texto sin procesar
Si un modelo Qwen imprime sintaxis de herramientas JSON/XML en lugar de ejecutar una skill, consulta la guía de Qwen en Configuración avanzada más arriba. La corrección habitual es:
- iniciar vLLM con el parser/plantilla correctos para ese modelo
- confirmar el id exacto del modelo con
openclaw models list --provider vllm - añadir una sobrescritura dedicada por modelo
params.extra_body.tool_choice: "required"solo sitool_choice: "auto"sigue devolviendo llamadas a herramientas vacías o solo como texto
Relacionado
Elegir proveedores, referencias de modelo 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 comunes y cómo resolverlos.