OpenHands
Advanced switch, Custom Model as openai/<id>, base URL, key. One key for every model, pay as you go.
At the end you have OpenHands on https://api.uplinkswitch.com/v1 with one API key from the console and any model id on the list in the Custom Model field, Claude included. One key, every model, pay as you go, no subscription. Each request bills per token to the balance behind that key, and the live table below is what one OpenHands step costs on each model today.
What you need
Docker, an account on the console with credit on it, and one key created there. Create the key for OpenHands alone, so its requests sit apart from any other tool on the Usage page. Two values go into OpenHands: the base URL, https://api.uplinkswitch.com/v1 , and the key. Nothing is installed on the UplinkSwitch side.
Start OpenHands the way its local setup page does (read 2026-10-28), then open http://localhost:3000:
docker run -it --rm --pull=always \
-e AGENT_SERVER_IMAGE_REPOSITORY=ghcr.io/openhands/agent-server \
-e AGENT_SERVER_IMAGE_TAG=1.26.0-python \
-e LOG_ALL_EVENTS=true \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ~/.openhands:/.openhands \
-p 3000:3000 \
--add-host host.docker.internal:host-gateway \
--name openhands-app \
docker.openhands.dev/openhands/openhands:1.8The settings
Click the gear icon, pick the LLM tab, and turn on the Advanced switch at the top of the page. That reveals Custom Model and Base URL, which are hidden in the basic view. OpenHands' OpenAI proxy steps are the same three fields (read 2026-10-28).
Advanced: on
Custom Model: openai/claude-sonnet-5-5
Base URL: https://api.uplinkswitch.com/v1
API Key: sk-uplink-live-...- Custom Model:
openai/followed by the id. The prefix tells OpenHands to send the OpenAI chat completions format; the id after it is the one from the Models page. - Base URL:
https://api.uplinkswitch.com/v1, with/v1on the end. - API Key: your key from the console.
- Save Settings.
In the CLI, Ctrl+P then Settings opens the LLM settings. An Agent Canvas LLM profile takes them on its Advanced tab: the model as openai/<id>, the base URL and the key.
Which model to pick
Any chat id on the Models page. OpenHands needs tool calling for every file read, edit and command, and every chat model here has it, so no id on the list is a dead end. These six fit the agent:
openai/claude-sonnet-5-5
openai/claude-opus-5-5
openai/gpt-6.1-sol
openai/gemini-3.1-pro-preview
openai/deepseek-v4-pro-0813
openai/kimi-k3The Claude ids answer the OpenAI format as well as the Anthropic one, so openai/claude-sonnet-5-5 goes in the same field as openai/gpt-6.1-sol or openai/deepseek-v4-pro-0813. Input price decides the cost of a task, because OpenHands sends the conversation and every tool result back on each step; pick by the input column below. The uncensored coding builds work the same way, one id after openai/.
Price per token
One OpenHands step at 40,000 input tokens and 1,500 output tokens, which is a task that has read a few files and run a command or two. Nothing is counted at the cached rate.
| Model | Input / 1M | Output / 1M | Cached input / 1M | List input | Under list | One step, 40,000 in + 1,500 out |
|---|---|---|---|---|---|---|
| Claude Sonnet 5.5 | $1.20 | $3.00 | $0.075 | $2.00 | 40% on input | $0.0525 |
| Claude Opus 5.5 | $2.80 | $10.00 | $0.15 | $4.00 | 30% on input | $0.127 |
| GPT-6.1 Sol | $0.60 | $3.00 | $0.06 | $2.00 | 70% on input | $0.0285 |
| Gemini 3.1 Pro Preview | $1.20 | $7.20 | $0.12 | $2.00 | 40% on input | $0.0588 |
| DeepSeek V4 Pro 0813 | $0.792 | $1.188 | $0.0625 | $1.32 | 40% on input | $0.0335 |
| Kimi K3 | $0.90 | $4.50 | $0.12 | $3.00 | 70% on input | $0.0428 |
USD per million tokens, live from GET /v1/catalog. List: the developer’s own published price. The last column is the step above at this base URL, nothing at the cached rate.
Claude Sonnet 5.5 is $0.0525 for that step here, and a ten-step task is $0.525. Cached input bills at the cache-read rate in the table by itself; there is no switch to set. The Claude Code pricing post works a day and a month of agent steps at these rates.
Check it
From a shell, the same key should list the models:
curl https://api.uplinkswitch.com/v1/models -H "Authorization: Bearer sk-uplink-live-..."Then send one request the way OpenHands does. -i prints the headers: x-uplink-request-id names the request, and on a non-streamed answer x-uplink-charge is what it cost in USD.
curl -i https://api.uplinkswitch.com/v1/chat/completions \
-H "Authorization: Bearer sk-uplink-live-..." \
-H "content-type: application/json" \
-d '{"model": "claude-sonnet-5-5", "messages": [{"role": "user", "content": "Say ok."}]}'Then start a conversation in OpenHands. The request shows on the console Usage page within seconds, with its tokens and the same charge, filterable by key and model.
Errors you will see
401 invalid_api_key: the key is wrong or revoked. Copy it again from the console into the API Key field.402 insufficient_balance: the balance does not cover the request. Top up in the console; the conversation resumes on the next message.402 monthly_limit_reached: the key hit the monthly spend limit you set on it. Raise it in the console, or wait for the first of the month.404 model_not_found: the id afteropenai/is not on the Models page at this base URL. Copy it from there rather than typing it.403 scope_denied: the key carries a model allowlist and this id is not on it. Pick an allowed id or use a key without the limit.429 rate_limited: the key hit its requests-per-minute or concurrency limit. The response carriesretry-afterin seconds.- A connection error with no status: the Base URL is missing
/v1, or the model was typed without theopenai/prefix. Check both fields against the block above.
Good to know
- Settings persist in
~/.openhands, the volume the docker command mounts, so the model survives a restart. - OpenHands' configuration page lists
LLM_MODELandLLM_API_KEYas environment variables for the model and key (read 2026-10-28); the base URL is set in the Settings UI. - Custom Model takes one id at a time. To switch models, edit the field; Agent Canvas profiles let you keep several and pick per agent.
- Cached input bills at the cache-read price in the table; there is nothing to set.
- The same base URL and key go into Cline, OpenCode and Claude Code. One balance serves all of them; a key per tool keeps the spend apart.
Questions
Get a key in the console: prepaid credit, no subscription, 30-day price lock.