Hermes Agent takes any OpenAI-compatible endpoint as a named entry under providers in ~/.hermes/config.yaml. One entry, and an uncensored build runs the agent with tool calls for files and shell commands, billed per token. The same ids work in OpenClaw and OpenCode.
Where the settings are
Settings live in ~/.hermes/config.yaml; secrets live in ~/.hermes/.env. Hermes reads CLI flags first, then config.yaml, then .env, then its defaults. A providers entry names its key variable with key_env, so the key never sits in config.yaml. Older guides show a custom_providers list; Hermes still reads it and hermes update migrates it, but new setups use the mapping below.
Steps
- Create a key in the console, one for Hermes alone so its requests sit apart on the usage page, and put it in the env file, one line:
# ~/.hermes/.envUNCENSOREDLLM_API_KEY=sk-ullm-live-…- Add the provider to
config.yaml. The ids undermodelsare a starting list; any id on the models page goes in the same mapping:
# ~/.hermes/config.yamlmodel: default: glm-5.3-uncensored provider: custom:uncensoredllm providers: uncensoredllm: api: https://api.uncensoredllm.ai/v1 key_env: UNCENSOREDLLM_API_KEY transport: chat_completions default_model: glm-5.3-uncensored models: glm-5.3-uncensored: {} glm-5.3-flash-uncensored: {} deepseek-v4.1-flash-abliterated: {} deepseek-v4-pro-uncensored: {} glm-5.3-abliterated: {} kimi-k3.1-pro-uncensored: {}- Run
hermesand send a message. The request shows on the console’s usage page within seconds, with its tokens and its charge.
The same block from the shell. Dotted paths go to config.yaml; the UPPER_SNAKE name goes to .env:
hermes config set UNCENSOREDLLM_API_KEY sk-ullm-live-…hermes config set providers.uncensoredllm.api https://api.uncensoredllm.ai/v1hermes config set providers.uncensoredllm.key_env UNCENSOREDLLM_API_KEYhermes config set providers.uncensoredllm.transport chat_completionshermes config set model.provider custom:uncensoredllmhermes config set model.default glm-5.3-uncensoredSwitch inside a session with /model; the change lasts for that session unless --global writes it back to config.yaml:
/model custom:uncensoredllm:glm-5.3-flash-uncensored/model custom:uncensoredllm:deepseek-v4.1-flash-abliterated --globalWhat each setting does
- api
- https://api.uncensoredllm.ai/v1the endpoint, with the /v1; base_url is accepted as an alias
- key_env
- UNCENSOREDLLM_API_KEYthe variable in .env that holds the whole sk-ullm- key
- transport
- chat_completionsthe OpenAI chat format, which every build on the models page answers
- default_model
- glm-5.3-uncensoredthe id this entry starts with
- models
- id: {}per-model settings keyed by id; context_length under an id overrides what Hermes detects
- model.provider
- custom:uncensoredllmselects the entry; model.default is the id Hermes starts with
Picking a model
Hermes needs tool calling for every file read, shell command and subagent, so before a long task on a new id send one short task and check that Hermes runs a tool. Input price decides the session cost, because Hermes sends the conversation and every tool result back on each turn. The cost column is one turn of 30,000 tokens in and 1,000 out at the catalog prices on 2026-11-09.
| Model | One turn | 30 turns |
|---|---|---|
| GLM-5.3 Uncensored | $0.0093 | $0.28 |
| GLM-5.3 Flash Uncensored | $0.0035 | $0.11 |
| DeepSeek V4.1 Flash Abliterated | $0.03 | $0.81 |
| DeepSeek V4 Pro Uncensored | $0.03 | $0.93 |
| GLM-5.3 Abliterated | $0.07 | $2.10 |
| Kimi K3.1 Pro Uncensored | $0.04 | $1.26 |
| GLM-5.3 Uncensored | Uncensored | $0.282 | $0.846 |
| GLM-5.3 Flash Uncensored | Uncensored | $0.1053 | $0.3685 |
| DeepSeek V4.1 Flash Abliterated | Abliterated | $0.8488 | $1.6975 |
| DeepSeek V4 Pro Uncensored | Uncensored | $0.97 | $1.94 |
| GLM-5.3 Abliterated | Abliterated | $2.1825 | $4.365 |
| Kimi K3.1 Pro Uncensored | Uncensored | $1.20 | $6.00 |
For coding specifically, the uncensored coding AI guide compares the code builds and costs a full coding day on each.
Check it
hermes status shows the model, the active provider and which providers have a credential, without printing key values. From the same shell, the key should list the models:
hermes statuscurl https://api.uncensoredllm.ai/v1/models -H "Authorization: Bearer $UNCENSOREDLLM_API_KEY"Then send one request the way Hermes 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.uncensoredllm.ai/v1/chat/completions \ -H "Authorization: Bearer $UNCENSOREDLLM_API_KEY" \ -H "Content-Type: application/json" \ -d '{"model": "glm-5.3-uncensored", "max_tokens": 16, "messages": [{"role": "user", "content": "Reply with the single word ok."}]}'Errors and fixes
401 invalid_api_key: the key is wrong, revoked or not reaching the request. Check~/.hermes/.envfor the line, confirmkey_envnames the same variable, and copy the key again from the console.402 insufficient_balance: the balance does not cover the request. Top up in the console.402 monthly_limit_reachedmeans the key hit the monthly spend limit you set on it.404 model_not_found: the id inmodel.defaultis not on the models page. Copy the id from the page and set it withhermes config set model.default <id>.429 rate_limited: the key hit its rate limit. The response carriesretry-after.- A
400on the first run: Hermes’ own FAQ puts this down to a model name mismatch. Runhermes config showand comparemodel.defaultagainst the models page. - Every custom endpoint is ignored: an old
custom_providerskey inconfig.yamlis no longer a YAML list. Move the entry to theprovidersmapping on this page, then runhermes doctor.
Sources
Field names follow Hermes Agent’s providers page and configuration guide, read 2026-11-06. Prices are from the live catalog at render.
Questions
Yes. Hermes Agent takes any OpenAI-compatible endpoint as a named entry under providers in ~/.hermes/config.yaml, with api, key_env and transport chat_completions. The block on this page points it at https://api.uncensoredllm.ai/v1, and every build on the models page then runs through it.
Set model.default to the model id and model.provider to custom:uncensoredllm, or run /model custom:uncensoredllm:<id> inside a session. Add --global to the /model command to write the choice back to config.yaml. Copy the id from the models page rather than typing it.
In ~/.hermes/.env, as UNCENSOREDLLM_API_KEY=... on one line. hermes config set with an UPPER_SNAKE name writes there too. The providers entry reads it through key_env, so the key never sits in config.yaml.
Per token at the model’s price, from your prepaid balance, with no subscription. The table above costs one agent-sized turn on each build at the live price; a session that repeats the same prefix bills the cached input tokens at the model’s cached rate.
Every model above is on the uncensored model list with its live price per million tokens. Per-token pricing sets the whole catalog side by side, and the family directory groups the builds by base model.