---
title: "Hermes Agent custom provider: uncensored model setup"
canonical: https://uncensoredllm.ai/guides/hermes-agent
generated: 2026-11-09T16:02:07.241Z
source: https://uncensoredllm.ai/guides/hermes-agent
base_url: https://api.uncensoredllm.ai/v1
---

# Hermes Agent with an uncensored model

One providers entry in ~/.hermes/config.yaml: api, key_env, transport chat_completions and the uncensored ids. The key in .env, /model to switch, the cost of an agent turn and the errors.

Steps checked November 6, 2026 · prices as of November 9, 2026

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](https://uncensoredllm.ai/guides/openclaw) and [OpenCode](https://uncensoredllm.ai/guides/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

1. Create a key in the [console](https://app.uncensoredllm.ai/console), one for Hermes alone so its requests sit apart on the usage page, and put it in the env file, one line:

```
# ~/.hermes/.env
UNCENSOREDLLM_API_KEY=sk-ullm-live-…
```

1. Add the provider to `config.yaml`. The ids under `models` are a starting list; any id on the [models page](https://uncensoredllm.ai/models) goes in the same mapping:

```
# ~/.hermes/config.yaml
model:
  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: {}
```

1. Run `hermes` and 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`:

```bash
hermes config set UNCENSOREDLLM_API_KEY sk-ullm-live-…
hermes config set providers.uncensoredllm.api https://api.uncensoredllm.ai/v1
hermes config set providers.uncensoredllm.key_env UNCENSOREDLLM_API_KEY
hermes config set providers.uncensoredllm.transport chat_completions
hermes config set model.provider custom:uncensoredllm
hermes config set model.default glm-5.3-uncensored
```

Switch 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 --global
```

## What each setting does

- api: https://api.uncensoredllm.ai/v1 the endpoint, with the /v1; base_url is accepted as an alias
- key_env: UNCENSOREDLLM_API_KEY the variable in .env that holds the whole sk-ullm- key
- transport: chat_completions the OpenAI chat format, which every build on the models page answers
- default_model: glm-5.3-uncensored the 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:uncensoredllm selects 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](https://uncensoredllm.ai/models/glm-5.3-uncensored) | $0.0093 | $0.28 |
| [GLM-5.3 Flash Uncensored](https://uncensoredllm.ai/models/glm-5.3-flash-uncensored) | $0.0035 | $0.11 |
| [DeepSeek V4.1 Flash Abliterated](https://uncensoredllm.ai/models/deepseek-v4.1-flash-abliterated) | $0.03 | $0.81 |
| [DeepSeek V4 Pro Uncensored](https://uncensoredllm.ai/models/deepseek-v4-pro-uncensored) | $0.03 | $0.93 |
| [GLM-5.3 Abliterated](https://uncensoredllm.ai/models/glm-5.3-abliterated) | $0.07 | $2.10 |
| [Kimi K3.1 Pro Uncensored](https://uncensoredllm.ai/models/kimi-k3.1-pro-uncensored) | $0.04 | $1.26 |

| Model | Build | Input $/M | Output $/M |
| --- | --- | --- | --- |
| [GLM-5.3 Uncensored](https://uncensoredllm.ai/models/glm-5.3-uncensored) glm-5.3-uncensored | Uncensored | $0.282 | $0.846 |
| [GLM-5.3 Flash Uncensored](https://uncensoredllm.ai/models/glm-5.3-flash-uncensored) glm-5.3-flash-uncensored | Uncensored | $0.1053 | $0.3685 |
| [DeepSeek V4.1 Flash Abliterated](https://uncensoredllm.ai/models/deepseek-v4.1-flash-abliterated) deepseek-v4.1-flash-abliterated | Abliterated | $0.8488 | $1.6975 |
| [DeepSeek V4 Pro Uncensored](https://uncensoredllm.ai/models/deepseek-v4-pro-uncensored) deepseek-v4-pro-uncensored | Uncensored | $0.97 | $1.94 |
| [GLM-5.3 Abliterated](https://uncensoredllm.ai/models/glm-5.3-abliterated) glm-5.3-abliterated | Abliterated | $2.1825 | $4.365 |
| [Kimi K3.1 Pro Uncensored](https://uncensoredllm.ai/models/kimi-k3.1-pro-uncensored) kimi-k3.1-pro-uncensored | Uncensored | $1.20 | $6.00 |

Prices per million tokens, read from the live catalog on 2026-11-09.

For coding specifically, [the uncensored coding AI guide](https://uncensoredllm.ai/guides/uncensored-coding-ai) 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:

```bash
hermes status
curl 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.

```bash
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/.env` for the line, confirm `key_env` names 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_reached` means the key hit the monthly spend limit you set on it.
- `404 model_not_found`: the id in `model.default` is not on the models page. Copy the id from the page and set it with `hermes config set model.default <id>`.
- `429 rate_limited`: the key hit its rate limit. The response carries `retry-after`.
- A `400` on the first run: Hermes’ own FAQ puts this down to a model name mismatch. Run `hermes config show` and compare `model.default` against the models page.
- Every custom endpoint is ignored: an old `custom_providers` key in `config.yaml` is no longer a YAML list. Move the entry to the `providers` mapping on this page, then run `hermes doctor`.

## Sources

Field names follow Hermes Agent’s [providers page](https://hermes-agent.nousresearch.com/docs/integrations/providers) and [configuration guide](https://hermes-agent.nousresearch.com/docs/user-guide/configuration), read 2026-11-06. Prices are from the live catalog at render.

## Questions

### Can Hermes Agent use a custom OpenAI-compatible API?

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.

### How do I change the model Hermes Agent uses?

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.

### Where does the API key go for Hermes Agent?

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.

### What does a Hermes Agent session cost?

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](https://uncensoredllm.ai/models) with its live price per million tokens. [Per-token pricing](https://uncensoredllm.ai/pricing) sets the whole catalog side by side, and the [family directory](https://uncensoredllm.ai/uncensored) groups the builds by base model.

[Get a key](https://app.uncensoredllm.ai/console) Prepaid from $10, no subscription.

## New models and price changes, once a month.

New uncensored builds with their prices, price moves, and what the daily model check found.
