Providers
vLLM
vLLM pode servir modelos de código aberto (e alguns modelos personalizados) por meio de uma API HTTP compatível com OpenAI. OpenClaw se conecta ao vLLM usando a API openai-completions.
OpenClaw também pode descobrir automaticamente modelos disponíveis do vLLM quando você opta por isso com VLLM_API_KEY (qualquer valor funciona se o servidor não exigir autenticação) e não define uma entrada explícita models.providers.vllm.
OpenClaw trata vllm como um provedor local compatível com OpenAI que oferece suporte
à contabilidade de uso em streaming, para que as contagens de tokens de status/contexto possam ser atualizadas a partir das
respostas de stream_options.include_usage.
| Propriedade | Valor |
|---|---|
| ID do provedor | vllm |
| API | openai-completions (compatível com OpenAI) |
| Autenticação | variável de ambiente VLLM_API_KEY |
| URL base padrão | http://127.0.0.1:8000/v1 |
Primeiros passos
Start vLLM with an OpenAI-compatible server
Sua URL base deve expor endpoints /v1 (por exemplo, /v1/models, /v1/chat/completions). vLLM normalmente é executado em:
http://127.0.0.1:8000/v1
Set the API key environment variable
Qualquer valor funciona se o servidor não exigir autenticação:
export VLLM_API_KEY="vllm-local"
Select a model
Substitua por um dos IDs de modelo do seu vLLM:
{
agents: {
defaults: {
model: { primary: "vllm/your-model-id" },
},
},
}
Verify the model is available
openclaw models list --provider vllm
Descoberta de modelos (provedor implícito)
Quando VLLM_API_KEY está definido (ou existe um perfil de autenticação) e você não define models.providers.vllm, o OpenClaw consulta:
GET http://127.0.0.1:8000/v1/models
e converte os IDs retornados em entradas de modelo.
Configuração explícita (modelos manuais)
Use a configuração explícita quando:
- vLLM é executado em outro host ou porta
- Você quer fixar valores de
contextWindowoumaxTokens - Seu servidor exige uma chave de API real (ou você quer controlar cabeçalhos)
- Você se conecta a um endpoint vLLM confiável de loopback, LAN ou 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,
},
],
},
},
},
}
Configuração avançada
Proxy-style behavior
vLLM é tratado como um backend /v1 compatível com OpenAI em estilo proxy, não como um endpoint
nativo da OpenAI. Isso significa:
| Comportamento | Aplicado? |
|---|---|
| Formatação nativa de requisições da OpenAI | Não |
service_tier |
Não enviado |
Responses store |
Não enviado |
| Dicas de cache de prompt | Não enviadas |
| Formatação de payload compatível com reasoning da OpenAI | Não aplicada |
| Cabeçalhos ocultos de atribuição do OpenClaw | Não injetados em URLs base personalizadas |
Qwen thinking controls
Para modelos Qwen servidos pelo vLLM, defina
params.qwenThinkingFormat: "chat-template" na entrada do modelo quando o
servidor esperar kwargs de chat-template do Qwen. OpenClaw mapeia /think off para:
{
"chat_template_kwargs": {
"enable_thinking": false,
"preserve_thinking": true
}
}
Níveis de thinking diferentes de off enviam enable_thinking: true. Se o seu endpoint
espera flags de nível superior no estilo DashScope, use
params.qwenThinkingFormat: "top-level" para enviar enable_thinking na
raiz da requisição. params.qwen_thinking_format em snake-case também é aceito.
Nemotron 3 thinking controls
vLLM/Nemotron 3 pode usar kwargs de chat-template para controlar se o reasoning é
retornado como reasoning oculto ou texto de resposta visível. Quando uma sessão do OpenClaw
usa vllm/nemotron-3-* com thinking desativado, o Plugin vLLM incluído envia:
{
"chat_template_kwargs": {
"enable_thinking": false,
"force_nonempty_content": true
}
}
Para personalizar esses valores, defina chat_template_kwargs nos parâmetros do modelo.
Se você também definir params.extra_body.chat_template_kwargs, esse valor terá
precedência final porque extra_body é a última substituição do corpo da requisição.
{
agents: {
defaults: {
models: {
"vllm/nemotron-3-super": {
params: {
chat_template_kwargs: {
enable_thinking: false,
force_nonempty_content: true,
},
},
},
},
},
},
}
Qwen tool calls appear as text
Primeiro, confirme que o vLLM foi iniciado com o parser de tool-call e o chat
template corretos para o modelo. Por exemplo, a documentação do vLLM indica hermes para modelos
Qwen2.5 e qwen3_xml para modelos Qwen3-Coder.
Sintomas:
- skills ou ferramentas nunca são executadas
- o assistente imprime JSON/XML bruto, como
{"name":"read","arguments":...} - o vLLM retorna um array
tool_callsvazio quando o OpenClaw enviatool_choice: "auto"
Algumas combinações de Qwen/vLLM retornam chamadas de ferramenta estruturadas somente quando a
requisição usa tool_choice: "required". Para essas entradas de modelo, force o
campo de requisição compatível com OpenAI com params.extra_body:
{
agents: {
defaults: {
models: {
"vllm/Qwen-Qwen2.5-Coder-32B-Instruct": {
params: {
extra_body: {
tool_choice: "required",
},
},
},
},
},
},
}
Substitua Qwen-Qwen2.5-Coder-32B-Instruct pelo ID exato retornado por:
openclaw models list --provider vllm
Você pode aplicar a mesma substituição pela CLI:
openclaw config set agents.defaults.models '{"vllm/Qwen-Qwen2.5-Coder-32B-Instruct":{"params":{"extra_body":{"tool_choice":"required"}}}}' --strict-json --merge
Esta é uma solução alternativa de compatibilidade opcional. Ela faz com que todo turno do modelo com ferramentas exija uma chamada de ferramenta, então use-a somente para uma entrada dedicada de modelo local em que esse comportamento seja aceitável. Não a use como padrão global para todos os modelos vLLM, e não use um proxy que converta cegamente texto arbitrário do assistente em chamadas de ferramenta executáveis.
Custom base URL
Se o servidor vLLM for executado em um host ou porta não padrão, defina baseUrl na configuração explícita do provedor:
{
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,
},
],
},
},
},
}
Solução de problemas
Slow first response or remote server timeout
Para modelos locais grandes, hosts de LAN remotos ou links de tailnet, defina um timeout de requisição no escopo do provedor:
{
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 somente às requisições HTTP de modelo do vLLM, incluindo
a configuração da conexão, cabeçalhos de resposta, streaming do corpo e a interrupção
total do guarded-fetch. Prefira isso antes de aumentar
agents.defaults.timeoutSeconds, que controla toda a execução do agente.
Server not reachable
Verifique se o servidor vLLM está em execução e acessível:
curl http://127.0.0.1:8000/v1/models
Se você vir um erro de conexão, verifique o host, a porta e se o vLLM foi iniciado com o modo de servidor compatível com OpenAI.
Para endpoints explícitos de loopback, LAN ou Tailscale, também defina
models.providers.vllm.request.allowPrivateNetwork: true; requisições do provedor
bloqueiam URLs de rede privada por padrão, a menos que o provedor seja
explicitamente confiável.
Auth errors on requests
Se as requisições falharem com erros de autenticação, defina uma VLLM_API_KEY real que corresponda à configuração do servidor, ou configure o provedor explicitamente em models.providers.vllm.
No models discovered
A descoberta automática exige que VLLM_API_KEY esteja definida e que não haja uma entrada explícita de configuração models.providers.vllm. Se você definiu o provedor manualmente, o OpenClaw ignora a descoberta e usa somente os modelos declarados.
Tools render as raw text
Se um modelo Qwen imprimir a sintaxe de ferramenta em JSON/XML em vez de executar uma skill, consulte a orientação sobre Qwen na Configuração avançada acima. A correção usual é:
- iniciar o vLLM com o parser/template correto para esse modelo
- confirmar o ID exato do modelo com
openclaw models list --provider vllm - adicionar uma substituição dedicada por modelo
params.extra_body.tool_choice: "required"somente setool_choice: "auto"ainda retornar chamadas de ferramenta vazias ou apenas em texto
Relacionados
Escolha de provedores, referências de modelo e comportamento de failover.
Provedor nativo da OpenAI e comportamento de rotas compatíveis com OpenAI.
Detalhes de autenticação e regras de reutilização de credenciais.
Problemas comuns e como resolvê-los.