# Pointing a coding-agent CLI at this stack [← back to README](../../README.md) This stack routes through the [AI gateway](https://git.arthurerlich.de/haylan/LLM-Server/issues/9) (OmniRoute, see issue #31) rather than talking to llama.cpp directly — llama.cpp's own port is internal-only now (see `docker-compose.yml`). The gateway exposes: - **OpenAI-compatible**: `http://:${OMNIROUTE_PORT:-4000}/v1` - **Anthropic Messages API** (OmniRoute's own `/v1/messages` endpoint, translating to the OpenAI-compatible backend): `http://:${OMNIROUTE_PORT:-4000}` Both serve the same underlying model — `Qwen3.8-27B-UD-Q4_K_XL.gguf`, registered in the gateway (naming is yours to pick when adding the llama-cpp provider connection — these docs assume `qwen3.8-27b-local` for continuity) — behind whichever wire format the client speaks. `` is this machine's LAN address, or `proxy-ai.home` if your local DNS resolves that hostname directly to the box — see `docs/network-access.md`. If you're running a coding CLI from this machine itself, `localhost` works too. **Each CLI needs its own virtual key** — create one per docs/proxy-key-onboarding.md (omniroute's dashboard, `-` naming, e.g. `claude-code-cli`, `kimi-cli`, `opencode-cli`). No budget set by default. These are the machine's interactive/high-priority workloads per `docs/proxy-request-priority.md`. > **Read this before relying on it for real work.** Qwen3.8-27B's tool-calling has **documented, open llama.cpp upstream bugs** (parser fails on text before ``, tool calls emitted as inert XML inside thinking blocks — see `docs/research/qwen3.8-27b-tool-calling.md`). Every CLI below inherits this risk identically, regardless of wire format. Don't trust it for unattended multi-step agentic work until you've run the smoke test in [issue #5](https://git.arthurerlich.de/haylan/LLM-Server/issues/5) (and the proxy-specific smoke test in [issue #17](https://git.arthurerlich.de/haylan/LLM-Server/issues/17)). ## Per-CLI setup - [Claude Code CLI](claude-code.md) - [Kimi CLI](kimi-cli.md) - [OpenCode CLI](opencode.md) - [Qwen Code CLI](qwen-code.md) ## Summary | CLI | Wire format | Endpoint | Config | |---|---|---|---| | [Claude Code](claude-code.md) | Anthropic Messages | `http://:${OMNIROUTE_PORT:-4000}` | `ANTHROPIC_BASE_URL` env var | | [Kimi CLI](kimi-cli.md) | OpenAI Chat Completions | `http://:${OMNIROUTE_PORT:-4000}/v1` | `config.toml` provider block | | [OpenCode](opencode.md) | OpenAI Chat Completions | `http://:${OMNIROUTE_PORT:-4000}/v1` | `opencode.json` provider block | | [Qwen Code](qwen-code.md) | OpenAI Chat Completions (2 models: chat + `fastModel`) | `http://:${OMNIROUTE_PORT:-4000}/v1` | `~/.qwen/settings.json` `modelProviders.openai` | Further reading: `docs/research/qwen3.8-27b-tool-calling.md`, `docs/proxy-key-onboarding.md`, `docs/research/omniroute-account-semaphore-timeout.md` (a connection that can only handle a few concurrent requests — like `llama-server` or `qwen-classifier` — hits a hardcoded 30s reject once more requests queue up than its `maxConcurrent`, unless configured around it).