Hostovani vllm a pripojeni opencodeKódovací agent s vlastním LLM

zdroj: https://cefboud.com/posts/coding-agent-self-hosted-llm-opencode-vllm

Publikováno 7. března 2026, autor Moncef Abboud

Obsah:

Zajištění GPU

Pro ukázku použiji Lambda jako poskytovatele GPU, ale libovolný poskytovatel funguje. Stačí se zaregistrovat zde, doplnit platební údaje a vytvořit virtuální stroj s GPU.

Lambda GPU nabídka

Po vytvoření VM získáte veřejnou IP adresu a přidáte SSH‑klíč (privátní klíč, který použijete později):

export IP=<vaše_ip_adresa>
ssh -i path/to/private_key ubuntu@$IP

Na serveru máte k dispozici GPU např. NVIDIA A10 (96 GB VRAM). Ověřit můžete příkazem:

nvidia-smi

Spuštění vLLM

V našem příkladu použijeme model Qwen/Qwen2.5-Coder-7B-Instruct (7 M parametrů, solidní výkon). vLLM je knihovna umožňující rychlé nasazení LLM s OpenAI‑kompatibilním API.

Docker příkaz, který spustí vLLM a stáhne model z Hugging Face, vypadá takto:

# proměnná s názvem modelu
export MODEL="Qwen/Qwen2.5-Coder-7B-Instruct"

# spustíme kontejner (použijeme všechny GPU)
sudo docker run --gpus all --rm -p 8000:8000 \
    vllm/vllm-openai:latest \
    --model $MODEL \
    --dtype auto \
    --max-model-len 32768 \
    --gpu-memory-utilization 0.95 \
    --enable-auto-tool-choice \
    --tool-call-parser hermes

Po stažení modelu (cca 7–10 GB) kontejner spustí HTTP‑server na portu 8000. GPU jsou sdíleny díky parametru --gpus all.

Bezpečný přístup k modelu (SSH‑tunel)

Na Lambda serveru je otevřen pouze port 22 (SSH). Pro přístup z lokálního počítače použijeme SSH‑tunel:

ssh -i path/to/private_key -N -L 8000:localhost:8000 ubuntu@$IP

Po tomto příkazu můžete k modelu přistupovat na http://localhost:8000 (na svém počítači).

Testování modelu

Jednoduchý test pomocí curl:

curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
        "model": "Qwen/Qwen2.5-Coder-7B-Instruct",
        "messages": [
          {"role":"user","content":"Napiš HTML stránku, která popisuje nějaké zábavné téma."}
        ]
      }'

Pro streamování tokenů (stejně jako u OpenAI) přidejte "stream": true:

curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
        "model": "Qwen/Qwen2.5-Coder-7B-Instruct",
        "messages": [
          {"role":"user","content":"Napiš HTML stránku, která popisuje nějaké zábavné téma."}
        ],
        "stream": true
      }'

Propojení s Opencode

Opencode je otevřený coding‑agent (podobný Claude Code nebo Codex). Jeho konfigurace je v souboru opencode.json (nebo globálně v ~/.config/opencode/opencode.json).

Přidejte následující nastavení, aby Opencode používal náš lokální vLLM server:

{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "cefprovider": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "Cef Lambda Provider",
      "options": {
        "baseURL": "http://localhost:8000/v1"
      },
      "models": {
        "Qwen/Qwen2.5-Coder-7B-Instruct": {
          "name": "Cef Model",
          "options": {
            "max_tokens": 20000
          }
        }
      }
    }
  }
}

Spusťte opencode a zadejte /models – nový model by se měl objevit v seznamu. Nyní můžete do Opencode zadávat požadavky (např. „Napiš funkci v Pythonu, která načte CSV“).

O nastavení max_tokens

V našem configu je nastaveno "max_tokens": 20000, i když model má limit 32768. Důvod: max_tokens představuje celkový výstup (včetně vstupního promptu). Bezpečné číslo spočítáte jako:

# max_context - input_tokens
32768 - 10694 = 22074   # takže 20000 je v bezpečném rozmezí

Příliš vysoké max_tokens vyvolá chybu:

'max_tokens' or 'max_completion_tokens' is too large: 32000.
This model's maximum context length is 32768 tokens and your request has 10694 input tokens (32000 > 32768 - 10694).

Měření výkonu vLLM

vLLM poskytuje endpoint /metrics (Prometheus kompatibilní). Můžete ho přidat do Grafana dashboardu a sledovat např.:

  • E2E latency – celkový čas od přijetí požadavku po poslední token.
  • TTFT (Time‑to‑First‑Token) – čas do první tokenové výstupní.
  • TPOT / ITL (Time‑per‑Output‑Token) – průměrná doba mezi tokeny.

Ukázka nasazení Grafana dashboardu (z vllm/examples/online_serving/prometheus_grafana):

# klonování a spuštění
git clone https://github.com/vllm-project/vllm.git
cd vllm/examples/online_serving/prometheus_grafana
docker compose up

Po nasazení přidejte Prometheus data source a importujte soubor grafana.json. Výsledek by měl vypadat přibližně takto:

Grafana dashboard vLLM

Závěr

Takto získáte plně self‑hostovaný stack pro kódovací agenty – model, inference server, SSH tunel a samotný agent (Opencode). Vše běží pod vaší kontrolou, bez potřeby komerčních API.


Článek přeložil ChatGPT (OpenAI) a upravil pro WordPress.

Napsat komentář