Local model serving¶
Argus local-executor runs reach the 5070 Ti through LiteLLM, not by calling llama.cpp directly from the runner. These facts were measured on 2026-08-23 and should be updated when the homelab serving chain changes.
Serving chain¶
| Layer | Host | Port | Name or alias | Role |
|---|---|---|---|---|
| Argus runner | pve-builder |
n/a | backend=opencode or gateway backend=claude |
Executes the harness and calls LiteLLM. |
| LiteLLM | pve-llm-infra / 192.168.1.28 |
4000 |
local-30b |
OpenAI/Anthropic-shaped gateway alias. |
| LiteLLM model entry | apps/llm-infra/litellm-config.yaml |
n/a | hosted_vllm/qwen3.8-27b-q3 |
Bridges the alias to the hosted local server. |
| llama-swap | pve-gpu / 192.168.1.27 |
8003 |
qwen3.8-27b-q3 |
Starts llama-server for the q3 Qwen3.8 model. |
local-30b is the Argus-facing model id. The backing model is the
Qwen3.8-27B q3 entry served by llama-swap on the 16 GB 5070 Ti. The agent
alias carries chat_template_kwargs: {enable_thinking: false} so Qwen3.8's
hybrid thinking is off per request (a thinking model that emits its tool
call inside the reasoning block then stops is the failure class this fixes);
the raw alias qwen3.8-27b-q3 keeps thinking on for interactive use.
q3 llama-swap flags¶
The qwen3.8-27b-q3 entry in homelab-apps gpu/llama-swap/models.yaml
uses these llama-server flags:
--ctx-size 98304 \
-fa on \
-ctk q4_0 \
-ctv q4_0 \
-ngl 99 \
-ub 512 \
--jinja \
--chat-template-file /etc/llama-swap/templates/qwen3.8-tolerant-system.jinja \
--parallel 1 \
--cont-batching \
--spec-type draft-mtp,ngram-mod \
--spec-draft-n-max 2 \
--cache-reuse 256 \
--reasoning-budget 5000
The context limit is 98,304 tokens. KV cache uses q4_0 for both keys and
values. The chat template is the tolerant Qwen3.8 system template at
/etc/llama-swap/templates/qwen3.8-tolerant-system.jinja. The trailing
flags are native MTP speculative decoding (no draft model; the MTP heads
cost no VRAM), prefix KV-cache reuse across requests, and a 5,000-token cap
on chain-of-thought.
Measurements¶
All numbers in this section were measured on 2026-08-23 against the q3 server above.
| Measurement | Value |
|---|---|
llama-server VRAM in use |
15,576 MiB of 16,303 MiB |
| Prompt load | 61,863-token prompt plus 256 tokens in 65.8 s |
| Decode throughput | about 68 tok/s for a short-prompt 256-token generation |
| Configured context | 98,304 tokens |
Harness base-request sizes, also measured on 2026-08-23:
| Harness shape | Prompt tokens |
|---|---|
| Claude Code, no MCP servers | 29,696 |
| Claude Code with the MetaMCP hub-build namespace, 39 tools | 39,608 |
| Claude Code with the host default MCP config | 99,846 |
| opencode base request | 9,255 |
agents/hub-build/SKILL.md alone is about 68 KB, roughly 17,000 tokens, so
skill choice and MCP namespace selection matter as much as model context.
The opencode runner configs declare limit.context 98304 for the q3
aliases and compaction: {auto, prune, reserved 10000} so a long session
compacts instead of overflowing the 98,304-token context.
Deploying homelab-apps changes¶
Komodo only auto-deploys the llama-swap stack on push when compose.yaml
changes. A change limited to models.yaml is not enough to trigger that
auto-deploy, but llama-swap hot-reloads its config on a 2 s poll, so a
models.yaml-only change does not need a container restart.
For a models.yaml-only q3 change:
- Merge or push the homelab-apps change.
- In Komodo, deploy the
llama-swapstack (Resource Sync will not pick up a models.yaml-only change on its own). - Smoke the path through LiteLLM using the
local-30balias before sending an Argus build lane through it.