Move docs/coding-cli-setup.md to docs/coding-cli-setup/ with one file per CLI (claude-code, kimi-cli, opencode, qwen-code) plus a shared index.md for the gateway intro, tool-calling risk note, and summary table. Also fixes the qwen-code doc: context sizes are per-slot (LLAMA_CTX_SIZE / LLAMA_PARALLEL), not raw LLAMA_CTX_SIZE (same fix applied to OpenCode's limit.context); documents the fastModel classifier provider and its own context math; adds the omniroute-search MCP server (SearXNG web search) and Auto Mode permissions tuning that were missing from the original qwen-code section. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2.1 KiB
OpenCode CLI
Confirmed project: anomalyco/opencode (renamed from sst/opencode — don't confuse with the unrelated opencode-ai/opencode Go TUI). Docs: https://opencode.ai/docs/
Install:
curl -fsSL https://opencode.ai/install | bash
Config (opencode.json, project root or ~/.config/opencode/opencode.json):
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"aiproxy": {
"npm": "@ai-sdk/openai-compatible",
"name": "AI proxy (local)",
"options": {
"baseURL": "http://<ai-box>:${OMNIROUTE_PORT:-4000}/v1",
"apiKey": "<opencode-cli virtual key>"
},
"models": {
"qwen3.8-27b-local": {
"name": "Qwen3.8-27B",
"limit": { "context": 65536, "output": 8192 }
}
}
}
}
}
Set limit.context to the per-slot context this stack actually serves — LLAMA_CTX_SIZE / LLAMA_PARALLEL from .env (262144 / 2 = 131072 by default), not raw LLAMA_CTX_SIZE and not a value assumed from the model card: llama.cpp divides --ctx-size across concurrent slots, so each request only gets one slot's share. OpenCode uses this for its own context-management bookkeeping, not the server.
Select the model with aiproxy/qwen3.8-27b-local.
OpenCode-specific risks (on top of the shared Qwen3.8-27B tool-calling risk — see overview):
- Requires llama.cpp's
--jinjaflag (already set) — without it, OpenCode's unconditional tool-call scaffolding gets a 500. - anomalyco/opencode#20669 (closed as "not planned" — a live, unfixed risk): OpenCode's
bashtool crashes if the model omits the optionaldescriptionfield on a tool call; some local backends returnfinish_reason: tool_callswith an empty array, which can hang the agent loop instead of stopping cleanly. - Thinking-mode handling (
options.reasoningEffort) is undocumented for models that emit inline<think>tags rather than a native reasoning API field — expect no effect from that config on this model; untested.
Further reading: docs/research/opencode-cli-setup.md.