---
title: Codex CLI
description: Провайдер в config.toml, ключ из переменной окружения — и Codex CLI работает через шлюз, не меняя ни одной вашей привычки.
keywords: codex cli, config.toml, model_provider, base_url, env_key, CODEX_HOME
group: integrations
---

## Быстро {#quick keywords="config.toml, провайдер, ключ"}

Codex CLI — OpenAI-совместимый клиент, поэтому base URL у него заканчивается на `/v1`.

Добавьте в конфигурацию провайдера и выберите его. Ключ в файл не кладите — Codex читает его из переменной окружения, имя которой вы называете сами.

:::code-group
```toml title=config.toml
# ~/.codex/config.toml
model = "<model>"
model_provider = "kumo"

[model_providers.kumo]
name = "Kumo"
base_url = "https://api.kumorouter.com/v1"
env_key = "KUMO_API_KEY"
wire_api = "responses"
```
```bash title=Оболочка
# ~/.zshrc — ключ живёт здесь, а не в config.toml
export KUMO_API_KEY="kumo_sk_..."

codex
```
:::

## Где живёт конфигурация {#config keywords="~/.codex, CODEX_HOME, wire_api"}

Файл — `~/.codex/config.toml`. Если его нет, создайте. Если задана переменная окружения `CODEX_HOME`, конфигурация лежит там, а не в домашнем каталоге.

Провайдеров в файле может быть несколько. Блок `[model_providers.kumo]` **добавляется** к тому, что уже есть; `model_provider = "kumo"` только выбирает, кто из них используется по умолчанию.

- `base_url` — адрес шлюза, `https://api.kumorouter.com/v1`, вместе с `/v1`.
- `env_key` — имя переменной окружения, из которой Codex возьмёт ключ. Не сам ключ.
- `wire_api` — форма запроса; `responses` означает протокол Responses, единственный, который допускает актуальный справочник Codex CLI.
- `model` — идентификатор из каталога, `<model>` в примере выше.

Имена ключей в разных выпусках отличаются. Если ваш выпуск называет их иначе, следуйте документации установленного выпуска — смысл полей тот же.

:::note
Более старые выпуски Codex принимали и `wire_api = "chat"`. Ориентируйтесь на справочник установленного у вас выпуска: если он всё ещё называет `chat`, шлюз ответит и на нём — оба протокола у Kumo живые.
:::

## Проверка {#verify keywords="проверка, curl, codex exec"}

```bash title=Проверка
# 1. Шлюз отвечает и ключ жив
curl https://api.kumorouter.com/v1/responses \
  -H "Authorization: Bearer $KUMO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "<model>",
    "max_output_tokens": 64,
    "input": [
      {
        "type": "message",
        "role": "user",
        "content": [{ "type": "input_text", "text": "reply with OK" }]
      }
    ]
  }'

# 2. Клиент ходит туда же — в новом терминале, в пустом каталоге
codex exec --skip-git-repo-check "reply with OK"
```

Второй шаг делайте в пустом каталоге: так Codex нечего читать и нечего править, и вы проверяете только подключение. Флаг `--skip-git-repo-check` нужен здесь именно поэтому: вне Git-репозитория Codex останавливается со словами `Not inside a trusted directory and --skip-git-repo-check was not specified` и до шлюза не доходит. Либо оставьте флаг, либо запустите проверку из Git-репозитория, которому вы доверяете.

## Если не работает {#troubleshooting keywords="401, 404, переменная окружения, модель"}

- **401** — ключ не дошёл. Переменная, названная в `env_key`, не экспортирована в той оболочке, из которой вы запускаете Codex; или ключ отозван.
- **404** — адрес. В `base_url` нет `/v1` или, наоборот, есть лишний сегмент пути.
- **Модель не найдена** — идентификатор не из каталога. Спросите список у шлюза по адресу `https://api.kumorouter.com/v1/models`.
- **Работает старый провайдер** — `model_provider` не переключён либо перекрыт профилем или флагом командной строки.

> [Как называется модель →](/ru/models) [Все статусы шлюза →](/ru/errors)

:::cards
- [Claude Code](/ru/claude-code) — то же самое на протоколе Anthropic.
- [Другие инструменты](/ru/other-tools) — Aider, Zed, OpenClaw.
- [Все рецепты](/ru/integrations) — обзор и промпт для агента.
:::
