Providers
vLLM
vLLM może obsługiwać modele open-source (oraz niektóre niestandardowe) przez zgodny z OpenAI interfejs API HTTP. OpenClaw łączy się z vLLM za pomocą API openai-completions.
OpenClaw może też automatycznie wykrywać dostępne modele z vLLM, gdy włączysz tę funkcję przez VLLM_API_KEY (dowolna wartość działa, jeśli serwer nie wymusza uwierzytelniania) i nie zdefiniujesz jawnego wpisu models.providers.vllm.
OpenClaw traktuje vllm jako lokalnego dostawcę zgodnego z OpenAI, który obsługuje
strumieniowe rozliczanie użycia, więc liczby tokenów statusu/kontekstu mogą być aktualizowane z
odpowiedzi stream_options.include_usage.
| Właściwość | Wartość |
|---|---|
| ID dostawcy | vllm |
| API | openai-completions (zgodne z OpenAI) |
| Uwierzytelnianie | zmienna środowiskowa VLLM_API_KEY |
| Domyślny bazowy URL | http://127.0.0.1:8000/v1 |
Pierwsze kroki
Start vLLM with an OpenAI-compatible server
Bazowy URL powinien udostępniać endpointy /v1 (np. /v1/models, /v1/chat/completions). vLLM zwykle działa pod adresem:
http://127.0.0.1:8000/v1
Set the API key environment variable
Dowolna wartość działa, jeśli serwer nie wymusza uwierzytelniania:
export VLLM_API_KEY="vllm-local"
Select a model
Zastąp jednym z identyfikatorów modeli vLLM:
{
agents: {
defaults: {
model: { primary: "vllm/your-model-id" },
},
},
}
Verify the model is available
openclaw models list --provider vllm
Wykrywanie modeli (niejawny dostawca)
Gdy VLLM_API_KEY jest ustawiony (lub istnieje profil uwierzytelniania) i nie definiujesz models.providers.vllm, OpenClaw wysyła zapytanie do:
GET http://127.0.0.1:8000/v1/models
i konwertuje zwrócone identyfikatory na wpisy modeli.
Jawna konfiguracja (modele ręczne)
Użyj jawnej konfiguracji, gdy:
- vLLM działa na innym hoście lub porcie
- Chcesz przypiąć wartości
contextWindowlubmaxTokens - Serwer wymaga prawdziwego klucza API (lub chcesz kontrolować nagłówki)
- Łączysz się z zaufanym endpointem vLLM przez loopback, LAN lub 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,
},
],
},
},
},
}
Konfiguracja zaawansowana
Proxy-style behavior
vLLM jest traktowany jako zgodny z OpenAI backend /v1 w stylu proxy, a nie jako natywny
endpoint OpenAI. Oznacza to:
| Zachowanie | Zastosowane? |
|---|---|
| Natywne kształtowanie żądań OpenAI | Nie |
service_tier |
Nie wysyłane |
store odpowiedzi |
Nie wysyłane |
| Wskazówki prompt-cache | Nie wysyłane |
| Kształtowanie payloadu zgodności rozumowania OpenAI | Nie stosowane |
| Ukryte nagłówki atrybucji OpenClaw | Nie wstrzykiwane przy niestandardowych bazowych URL-ach |
Qwen thinking controls
W przypadku modeli Qwen obsługiwanych przez vLLM ustaw
params.qwenThinkingFormat: "chat-template" we wpisie modelu, gdy
serwer oczekuje argumentów kwargs szablonu czatu Qwen. OpenClaw mapuje /think off na:
{
"chat_template_kwargs": {
"enable_thinking": false,
"preserve_thinking": true
}
}
Poziomy myślenia inne niż off wysyłają enable_thinking: true. Jeśli endpoint
oczekuje zamiast tego flag najwyższego poziomu w stylu DashScope, użyj
params.qwenThinkingFormat: "top-level", aby wysłać enable_thinking w katalogu głównym
żądania. Akceptowane jest również params.qwen_thinking_format w zapisie snake case.
Nemotron 3 thinking controls
vLLM/Nemotron 3 może używać kwargs szablonu czatu do kontrolowania, czy rozumowanie jest
zwracane jako ukryte rozumowanie czy widoczny tekst odpowiedzi. Gdy sesja OpenClaw
używa vllm/nemotron-3-* z wyłączonym myśleniem, dołączony Plugin vLLM wysyła:
{
"chat_template_kwargs": {
"enable_thinking": false,
"force_nonempty_content": true
}
}
Aby dostosować te wartości, ustaw chat_template_kwargs w parametrach modelu.
Jeśli ustawisz również params.extra_body.chat_template_kwargs, ta wartość ma
ostateczny priorytet, ponieważ extra_body jest ostatnim nadpisaniem treści żądania.
{
agents: {
defaults: {
models: {
"vllm/nemotron-3-super": {
params: {
chat_template_kwargs: {
enable_thinking: false,
force_nonempty_content: true,
},
},
},
},
},
},
}
Qwen tool calls appear as text
Najpierw upewnij się, że vLLM został uruchomiony z właściwym parserem wywołań narzędzi i szablonem czatu
dla modelu. Na przykład vLLM dokumentuje hermes dla modeli Qwen2.5
oraz qwen3_xml dla modeli Qwen3-Coder.
Objawy:
- Skills lub narzędzia nigdy się nie uruchamiają
- asystent wypisuje surowy JSON/XML, taki jak
{"name":"read","arguments":...} - vLLM zwraca pustą tablicę
tool_calls, gdy OpenClaw wysyłatool_choice: "auto"
Niektóre kombinacje Qwen/vLLM zwracają ustrukturyzowane wywołania narzędzi tylko wtedy, gdy
żądanie używa tool_choice: "required". Dla takich wpisów modeli wymuś
zgodne z OpenAI pole żądania za pomocą params.extra_body:
{
agents: {
defaults: {
models: {
"vllm/Qwen-Qwen2.5-Coder-32B-Instruct": {
params: {
extra_body: {
tool_choice: "required",
},
},
},
},
},
},
}
Zastąp Qwen-Qwen2.5-Coder-32B-Instruct dokładnym identyfikatorem zwróconym przez:
openclaw models list --provider vllm
Możesz zastosować to samo nadpisanie z CLI:
openclaw config set agents.defaults.models '{"vllm/Qwen-Qwen2.5-Coder-32B-Instruct":{"params":{"extra_body":{"tool_choice":"required"}}}}' --strict-json --merge
To opcjonalne obejście zgodności. Sprawia, że każda tura modelu z narzędziami wymaga wywołania narzędzia, więc używaj go tylko dla dedykowanego wpisu lokalnego modelu, gdzie takie zachowanie jest akceptowalne. Nie używaj go jako globalnej wartości domyślnej dla wszystkich modeli vLLM i nie używaj proxy, które bezrefleksyjnie konwertuje dowolny tekst asystenta na wykonywalne wywołania narzędzi.
Custom base URL
Jeśli serwer vLLM działa na niestandardowym hoście lub porcie, ustaw baseUrl w jawnej konfiguracji dostawcy:
{
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,
},
],
},
},
},
}
Rozwiązywanie problemów
Slow first response or remote server timeout
W przypadku dużych modeli lokalnych, zdalnych hostów LAN lub połączeń tailnet ustaw limit czasu żądania w zakresie dostawcy:
{
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 dotyczy tylko żądań HTTP modeli vLLM, w tym
ustanawiania połączenia, nagłówków odpowiedzi, strumieniowania treści oraz całkowitego
przerwania chronionego pobierania. Preferuj to przed zwiększaniem
agents.defaults.timeoutSeconds, które kontroluje cały przebieg agenta.
Server not reachable
Sprawdź, czy serwer vLLM działa i jest dostępny:
curl http://127.0.0.1:8000/v1/models
Jeśli widzisz błąd połączenia, zweryfikuj host, port oraz to, czy vLLM został uruchomiony w trybie serwera zgodnego z OpenAI.
Dla jawnych endpointów loopback, LAN lub Tailscale ustaw również
models.providers.vllm.request.allowPrivateNetwork: true; żądania dostawcy
domyślnie blokują URL-e sieci prywatnych, chyba że dostawca jest
jawnie zaufany.
Auth errors on requests
Jeśli żądania kończą się błędami uwierzytelniania, ustaw prawdziwy VLLM_API_KEY, który pasuje do konfiguracji serwera, albo skonfiguruj dostawcę jawnie w models.providers.vllm.
No models discovered
Automatyczne wykrywanie wymaga ustawienia VLLM_API_KEY oraz braku jawnego wpisu konfiguracji models.providers.vllm. Jeśli dostawca został zdefiniowany ręcznie, OpenClaw pomija wykrywanie i używa tylko zadeklarowanych modeli.
Tools render as raw text
Jeśli model Qwen wypisuje składnię narzędzi JSON/XML zamiast wykonywać skill, sprawdź wskazówki dotyczące Qwen w sekcji Konfiguracja zaawansowana powyżej. Typowa poprawka to:
- uruchomienie vLLM z poprawnym parserem/szablonem dla tego modelu
- potwierdzenie dokładnego identyfikatora modelu za pomocą
openclaw models list --provider vllm - dodanie dedykowanego nadpisania per model
params.extra_body.tool_choice: "required"tylko wtedy, gdytool_choice: "auto"nadal zwraca puste lub wyłącznie tekstowe wywołania narzędzi
Powiązane
Wybieranie dostawców, referencji modeli i zachowania przełączania awaryjnego.
Natywny dostawca OpenAI i zachowanie tras zgodnych z OpenAI.
Szczegóły uwierzytelniania i reguły ponownego używania poświadczeń.
Typowe problemy i sposoby ich rozwiązania.