Один localhost вместо зоопарка API: Qwen и OpenRouter в Claude Code и Codex

локальный gateway Qwen и OpenRouter отдают Chat Completions в духе OpenAI, а Claude Code и Codex ждут свои протоколы — поэтому «ещё один API-ключ» не решает задачу vibe coding с несколькими агентами. Разработчик codekingai описывает обходной путь: локальный CliGate держит инструменты на localhost, провайдеров подключает один раз, а перевод протоколов берёт на себя gateway.
Почему «OpenAI-compatible» не спасает coding tools
DashScope у Qwen и единый каталог OpenRouter выглядят простыми, пока не подключаешь реальные AI coding tools. Формулировка из поста точная: «OpenAI-compatible» не означает «compatible with everything I use».
Разные клиенты говорят на разных языках:
- Claude Code ожидает протокол Anthropic Messages;
- Codex — форму Responses;
- остальные часто тянут Chat Completions.
Боль не в очередном ключе, а в том, что каждый CLI хочет «владеть» провайдером: свой base URL, свой ключ, свои алиасы моделей. Для оркестрации агентов это быстро превращается в зоопарк конфигов — именно от этого автор уходит к единой точке на локальной машине.
CliGate как локальный control plane для агентов
Желаемая картина простая: инструменты продолжают смотреть на localhost; провайдеры добавляются один раз; имена моделей маппятся или проходят транзитом в одном месте; конвертация протоколов — за gateway.
CliGate в этом сценарии — локальный control plane для AI coding tools. На один локальный сервер могут смотреть:
- Claude Code;
- Codex CLI;
- Gemini CLI;
- OpenClaw;
- клиенты с OpenAI-compatible API.
Gateway владеет credentials, routing, logs и model mapping. В том же дашборде могут сосуществовать маршруты к OpenAI, Anthropic, Gemini, Azure OpenAI, DeepSeek, Vertex и локальным endpoint'ам. Qwen и OpenRouter подключаются не как очередная пачка разовых конфигов, а как provider presets.
Пресеты Qwen и OpenRouter в одном каталоге
Оба провайдера — OpenAI Chat-style (apiFormat: 'openai_chat'). Определение провайдера в CliGate — «в основном data».
Пресет Qwen:
{
"id": "qwen",
"apiFormat": "openai_chat",
"baseUrl": "https://dashscope.aliyuncs.com/compatible-mode/v1",
"models": ["qwen-max", "qwen-plus", "qwen-turbo", "qwq-32b"],
"tiers": { "standard": "qwen-plus", "fast": "qwen-turbo" }
}
Для OpenRouter — тот же подход, но с важным правилом: model id со слэшем / проходит как native model slug без ремапа. Примеры из поста: anthropic/claude-3.7-sonnet, openai/gpt-4o-mini, qwen/qwen-2.5-72b-instruct. OpenRouter здесь — каталог upstream-моделей, а не одно семейство с единым алиасом.
Мост протоколов: Claude Code и Codex
Qwen и OpenRouter отдают Chat Completions upstream. Gateway трактует их как chat-native upstreams и строит мост к tool-facing протоколам.
Claude Code: CliGate переводит Anthropic Messages → OpenAI Chat, шлёт запрос в Qwen или OpenRouter, переводит ответ обратно в Anthropic-style message. Автор утверждает, что tool calls и tool results сохраняются при переводе — в посте нет бенчмарка и цифр надёжности.
Codex: для этих провайдеров native Responses support отключён — gateway не притворяется, что у них есть endpoint /responses. Вместо этого используется существующий Responses-to-Chat fallback через Chat Completions.
Итог для агентного стека: Claude Code по-прежнему получает Anthropic-shaped API, Codex — свой входной путь, а выбор между Qwen tier fast / standard или конкретным slug на OpenRouter остаётся внутри CliGate. Ни один CLI не обязан знать, какой провайдер «выиграл» маршрут.
Запуск за три шага
Минимальный сценарий:
npx cligate@latest start
# Add a Qwen or OpenRouter key in API Keys
# Keep Claude Code and Codex pointed at localhost:8081
После старта маршрутизация живёт в gateway: Qwen на tier fast или standard, OpenRouter — когда нужен конкретный upstream slug. Инструменты не переписывают конфиги под каждый провайдер — они остаются на localhost:8081.
Решение о провайдере уходит из каждого инструмента в слой, который может inspect, route, price и log запрос — типичная схема для vibe coding с несколькими агентами и одним локальным control plane.
Что остаётся без ответа
В первоисточнике не раскрыты точные переменные окружения и флаги Claude Code и Codex — кроме указания смотреть на localhost:8081. Нет данных о лицензии, ToS и лимитах DashScope и OpenRouter при проксировании через локальный gateway. Сравнение с альтернативными gateway-решениями в посте не приводится; номер версии CliGate не зафиксирован — только дистрибутив cligate@latest.
Если tool-calling при двойном переводе протоколов критичен для вашего агента, имеет смысл проверить сценарий на своих задачах: заявление автора о сохранении tool calls не подкреплено регрессионными тестами в тексте.
Источники
- I Wired Qwen and OpenRouter Into Claude Code and Codex Without New Configs — codekingai, Dev.to, опубликовано 5 июня 2026; дата доступа: 5 июня 2026.