AI-агенты для программирования и harness

Направьте Claude Code, Codex CLI, OpenClaw, Cline, Cursor и ещё 25+ агентов для программирования на шлюз одинаковыми тремя шагами — с точной целью конфигурации и именами ключей для каждого.

Каждый AI-агент для программирования читает базовый URL и API-ключ откуда-то — из переменной окружения, файла конфигурации или панели настроек. На этой странице перечислено, откуда каждый harness берёт их, на каком протоколе он говорит и какой один подводный камень действительно сбивает людей с толку. Полные готовые конфигурации для копирования — в документации.

1

Направьте base_url на шлюз

По умолчанию https://your-gateway.gatellm.io — наличие /v1 зависит от SDK (в каждом примере указано точное значение).

2

Подставьте ключ доступа к шлюзу

Это не upstream-ключ sk-… — один и тот же ключ доступа подставляется в тот заголовок, который ожидает ваш SDK.

3

Используйте имя модели шлюза

То, которое вы задали в консоли, — а не официальное имя производителя.

Authorization: Bearer <key>
OpenAI · DashScope · универсально
Префикс Bearer без учёта регистра
x-api-key: <key>
Anthropic SDK
Authorization также принимается
x-goog-api-key: <key>
Gemini SDK
Authorization также принимается

Матрица совместимости harness

HarnessПротоколПоддержкаЦель конфигурацииИмена ключей / настройкиДокументация
Терминальные агенты
Claude CodeAnthropicНативноenv varsANTHROPIC_BASE_URL, ANTHROPIC_API_KEY, ANTHROPIC_MODELКонфигурация на GitHub ↗ · Документация
Codex CLIOpenAI ResponsesНативно~/.codex/config.tomlbase_url, env_key, wire_apiКонфигурация на GitHub ↗ · Документация
Gemini CLIGeminiНативноenv varsGOOGLE_GEMINI_BASE_URL, GEMINI_API_KEYКонфигурация на GitHub ↗ · Документация
OpenClawOpenAI / Anthropic-compatibleOpenAI-compatibleopenclaw.jsonmodels.providers.<id>.baseUrl, models.providers.<id>.apiKeyДокументация
opencodeOpenAI-compatibleOpenAI-compatibleopencode.jsonprovider.<id>.options.baseURLДокументация
CrushOpenAI / Anthropic-compatibleOpenAI-compatiblecrush.jsonproviders.<id>.base_url, providers.<id>.typeДокументация
Factory DroidOpenAI / Anthropic-compatibleOpenAI-compatible~/.factory/settings.jsoncustomModels[].baseUrl, customModels[].providerДокументация
GooseOpenAI-compatibleOpenAI-compatibleenv varsOPENAI_HOST, OPENAI_BASE_PATH, OPENAI_API_KEYДокументация
AiderOpenAI-compatible (LiteLLM)OpenAI-compatibleenv varsOPENAI_API_BASEДокументация
Qwen CodeOpenAI-compatibleOpenAI-compatibleenv varsOPENAI_BASE_URL, OPENAI_API_KEY, OPENAI_MODELДокументация
OpenHandsOpenAI-compatible (LiteLLM)OpenAI-compatible~/.openhands/settings.jsonbase_url, model openai/ prefixДокументация
Kimi Code CLIOpenAI / AnthropicOpenAI-compatibleconfig.tomlprovidersДокументация
PlandexOpenAI-compatibleOpenAI-compatiblecustom models JSONbaseUrlДокументация
SWE-agentOpenAI-compatible (LiteLLM)OpenAI-compatibleenv varsOPENAI_BASE_URLДокументация
Grok BuildOpenAI-compatibleOpenAI-compatibleconfig.tomlcustom modelsДокументация
Mistral VibeOpenAI-compatibleOpenAI-compatible~/.vibe/config.tomlprovidersДокументация
MiMo CodeOpenAI-compatibleOpenAI-compatible/connect custom providerbase URL, API keyДокументация
ForgeCodeOpenAI / AnthropicOpenAI-compatiblesetup wizardbase URLДокументация
CodebuffOpenAI-compatibleOpenAI-compatiblesettingsbase URL, API keyДокументация
IDE и расширения
ClineOpenAI-compatibleOpenAI-compatibleSettings → OpenAI CompatibleBase URL, API Key, Model IDДокументация
Roo CodeOpenAI-compatibleOpenAI-compatibleSettings → OpenAI CompatibleBase URL, API Key, Model IDДокументация
Kilo CodeOpenAI-compatibleOpenAI-compatibleSettings → OpenAI CompatibleBase URL, API Key, Model IDДокументация
ContinueOpenAI-compatibleOpenAI-compatibleconfig.yamlmodels[].apiBaseДокументация
ZedOpenAI-compatibleOpenAI-compatiblesettings.jsonlanguage_models.openai_compatible.<id>.api_urlДокументация
CursorOpenAIЧастичноSettings → Models → Override OpenAI Base URLOverride OpenAI Base URLДокументация
WindsurfOpenAI-compatibleOpenAI-compatibleSettings → Models → BYOK / customBase URL, API KeyДокументация
GitHub Copilot (BYOK)OpenAI-compatibleOpenAI-compatibleManage Models → OpenAI-compatibleBase URL, API KeyДокументация
Управляемые платформы
WarpOpenAI / Anthropic / Gemini (BYOK)ЧастичноSettings → BYOKBYOK API keysДокументация
Amazon Q Developer CLIMCPБез пользовательского endpointMCP server—Документация
Devin—Без пользовательского endpoint——Документация

Как назвать модель шлюза

Некоторые harness фиксируют собственный ID модели и отправляют его дословно. Если ваша модель в шлюзе называется иначе, первый вызов вернёт 404. Два способа согласовать:

Claude Code
①

Назовите модель шлюза точно так, как её запрашивает harness, — без дополнительной конфигурации.

②

Или переопределите harness, чтобы он использовал имя вашей модели в шлюзе, через переменную окружения модели (например, ANTHROPIC_MODEL).

Подводные камни

Harness фиксирует свой ID модели

Claude Code отправляет настроенное по умолчанию значение (например, claude-opus-5 или claude-sonnet-5), а не имя в вашем шлюзе. Либо назовите модель шлюза точно так, как её запрашивает harness, либо задайте его переменную окружения модели (например, ANTHROPIC_MODEL) равной имени в шлюзе. Несовпадение → 404 model_not_found на первом сообщении.

Harness с протоколом Anthropic принимают корень, а не /v1

Базовый URL для клиентов в стиле Anthropic указывает на корень шлюза (без /v1) — клиент сам добавляет /v1/messages. Если добавить /v1, сегмент пути удвоится.

Пользовательским провайдерам Codex нужен wire_api="responses"

Codex CLI требует wire_api = "responses" для блока [model_providers.*]. Шлюз нативно реализует /v1/responses — направьте на него base_url и задайте env_key с ключом доступа к шлюзу.

Harness на базе LiteLLM ожидают префикс openai/ у модели

Aider, OpenHands и SWE-agent работают через LiteLLM: задайте OPENAI_API_BASE равным шлюзу и добавьте модели префикс openai/ (например, openai/gateway-model-name), чтобы LiteLLM маршрутизировал её как OpenAI-compatible endpoint.

По умолчанию используется OAuth подписки, а не ваш ключ

Codex, Gemini CLI и Qwen Code по умолчанию используют OAuth / вход по подписке производителя. Чтобы направить трафик через шлюз, нужно переключиться на аутентификацию по API-ключу (явно задать ключ и базовый URL) — иначе агент полностью обходит шлюз.

IDE выводят поддержку инструментов и зрения из ID модели

Cline / Roo / Kilo и другие определяют поддержку вызова инструментов и работы с изображениями по имени модели. Пользовательское имя шлюза может отключить вызов функций — если вызовы инструментов не работают, проверьте правила определения возможностей клиента или назовите модель так, чтобы она совпадала с известным семейством.

Долгий инференс добавляет :keep-alive и _gateway_warning

Во время долгого инференса upstream шлюз выдаёт строки-комментарии SSE :keep-alive (безвредны — пропускайте строки, начинающиеся с :), а при разрыве посреди потока вставляет поле _gateway_warning вместо ошибки, чтобы такие harness, как Claude Code, не прерывали весь диалог.

Автоматический режим Claude Code: решите, кто выносит вердикт о безопасности

В автоматическом режиме Claude Code ожидает вердикт со стороны сервера (поле safeguards в запросе) перед потенциально опасным действием. Если upstream — официальный Anthropic, вердикт формируется внутри того же запроса, и шлюз передаёт его без изменений. Если upstream — третья сторона, которая игнорирует это поле, вердикт выносит шлюз — и заводская настройка по умолчанию (allow_all) разрешает любое действие, что мягче, чем не вмешиваться вовсе. Верните маршрут upstream, записав "anthropic_server_safeguards": "upstream" в extra_config этого upstream; настройка в консоли доступна только администраторам.

# Every agent is one base_url + one access key away
export ANTHROPIC_BASE_URL="https://your-gateway.gatellm.io"   # Anthropic agents: root (no /v1)
export ANTHROPIC_API_KEY="<gateway access key>"

export OPENAI_API_BASE="https://your-gateway.gatellm.io/v1"   # OpenAI-compatible agents: /v1
export OPENAI_API_KEY="<gateway access key>"

# Codex CLI (~/.codex/config.toml) speaks the Responses protocol
# [model_providers.gatellm]
# base_url = "https://your-gateway.gatellm.io/v1"
# wire_api = "responses"

FAQ