Use a client other than Claude Code#
The engine speaks the OpenAI API as well as Anthropic’s, so anything that
lets you set a base URL works — aider, Continue, LibreChat, the openai and
anthropic SDKs, or ten lines of curl.
export OPENAI_BASE_URL=http://127.0.0.1:1919/v1
export OPENAI_API_KEY=local # unchecked, but most clients demand one
Use whatever GET /v1/models reports as the model name. There is no
authentication: any token is accepted, which is why the engine binds loopback
(see Reach the panel from another machine).
Why the client matters more than you would expect#
Every request carries the harness’s system prompt and tool definitions before any of your work, and that overhead is subtracted from the window on every turn. It is a floor, not a one-off cost.
Claude Code sends roughly 40k tokens of system prompt and tool schemas. A plain chat client sends a few hundred. That is not a small difference — it decides which models are usable at all:
model |
window |
with a ~40k harness |
with a ~2k harness |
|---|---|---|---|
Qwen3-8B |
32k |
cannot run |
~30k of working room |
gpt-oss-20b |
128k |
~88k |
~126k |
Qwen3.8-27B |
101k |
~61k |
~99k |
Qwen3.6-35B-A3B |
212k |
~172k |
~210k |
Qwen3-8B is the striking case. Its 32k window cannot hold Claude Code’s system
prompt at all, so the first message fails — yet the same model is perfectly
usable from a lighter client with 30k of room to work in. A model that “does
not work” may only be failing to fit its harness.
Measure your own client#
Do not trust the figures above for a client you actually use — measure it. The engine reports token counts on every response:
curl -s http://127.0.0.1:1919/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model":"MODEL","messages":[{"role":"user","content":"hi"}],"max_tokens":1}' \
| python3 -c 'import json,sys; print(json.load(sys.stdin)["usage"])'
Send hi through your harness and compare its prompt_tokens against that
baseline. The difference is what the harness costs you per turn, and it is the
number to plan context around.
For a prompt you have in a file, ask the engine directly without generating anything:
curl -s http://127.0.0.1:1919/tokenize \
-H 'Content-Type: application/json' \
-d "{\"content\": $(python3 -c 'import json,sys;print(json.dumps(open(sys.argv[1]).read()))' prompt.txt)}" \
| python3 -c 'import json,sys; print(len(json.load(sys.stdin)["tokens"]), "tokens")'
Pi#
Pi is a bring-your-own-key CLI coding agent that is provider-agnostic by design, which makes it the least awkward second harness to put beside Claude Code.
npm install -g --ignore-scripts @earendil-works/pi-coding-agent
Point it at the engine by adding a provider to ~/.pi/agent/models.json. Use
whatever GET /v1/models reports as the model id — that is the name you started
the model under:
{
"providers": {
"lllm3090": {
"baseUrl": "http://127.0.0.1:1919/v1",
"api": "openai-completions",
"apiKey": "local",
"models": [
{ "id": "Qwen3.8-27B" },
{ "id": "Qwen3.6-35B-A3B" }
]
}
}
}
Only id is required for a local model; the key is unchecked but most clients
insist on one. Add an entry per model you might start — the engine serves one at
a time, so the list is what you can switch between, not what runs at once.
Check Pi’s own models documentation if the config schema has moved; this file will drift and theirs will not.
opencode#
opencode works the same way and has a
fuller agentic feature set, at the cost of a larger configuration surface.
Both it and Pi write configuration to disk, which is worth knowing if you value
the property that lllm3090 claude has: it sets environment variables for a
single subprocess and leaves no trace, so a plain claude elsewhere still
reaches Anthropic on your normal account.
Neither tool offers that, so decide deliberately whether you want your default
opencode or pi invocation pointing at a local model or a hosted one.
Slots and concurrency#
A lighter client changes the slot arithmetic too. With a 40k floor, a 32k slot
is useless; with a 2k floor it is a working session. So a small-prompt harness
makes higher --parallel counts genuinely useful where an agent harness would
need every slot to be large — see Choose a context window and slot count.
Anthropic-protocol clients#
Anything speaking Anthropic’s API works against /v1/messages in the same way,
which is how Claude Code connects without a proxy. Streaming and tool calls are
both supported; see Use Claude Code against a local model.