Терминальный агент ИИ на 9 провайдеров: как собрать мультимодельный чат в 5 строк кода
Работая строго по фактам из источника, формирую тело новости в формате how-to.

Если у вас ключи от нескольких LLM-провайдеров (большие языковые модели как сервис) и вы хотите использовать их в одном терминальном чате с общей историей, эта инструкция покажет, как устроена мультипровайдерная архитектура на примере открытого проекта execai.
Китайские LLM-провайдеры (Kimi, GLM) используют раздельный биллинг для подписки и оплаты за токены (единицы текста, которые модель обрабатывает за раз), и один и тот же API-ключ может работать на одном эндпоинте и возвращать ошибку на другом. Англоязычные гайды этого не покрывают, а вы рискуете потерять вечер на отладку «протухшего ключа», который на самом деле жив.
Разработчик открытого терминального ИИ-агента execai (написан на Go, работает как локальный инструмент в терминале в духе Claude Code) опубликовал на Хабре детальный разбор архитектуры, которая позволяет девяти провайдерам жить за одним интерфейсом из пяти строк кода. Суть: переключение между моделями на лету, общий контекст диалога и полная изоляция биллинга, ваш ключ ходит напрямую к провайдеру, без промежуточного бэкенда.
Что понадобится?
- Терминальный ИИ-агент execai (открытый код на Go, буфер терминального интерфейса на bubbletea)
- API-ключи хотя бы от двух провайдеров. Поддерживаются: Anthropic, OpenAI, Kimi Code, Kimi API (Moonshot Platform), Z.ai (GLM), Ollama (локально, бесплатно), Claude CLI, Codex CLI, собственный gateway execai
- Понимание двух «диалектов» API: OpenAI-совместимый и Anthropic-совместимый. Все девять провайдеров сводятся к этим двум форматам
- Время: настройка одного провайдера занимает несколько минут, основное время уходит на разбор биллинг-ловушек
Пошаговая инструкция: как подключить несколько провайдеров в один чат
1. Определите, к какому «диалекту» относится ваш провайдер.
По данным из источника, раскладка такая:
- OpenAI-совместимый (запрос
POST /v1/chat/completions, авторизация через Bearer-токен): OpenAI, Kimi API (Moonshot Platform), Ollama, gateway execai - Anthropic-совместимый (запрос
POST /v1/messages, авторизация через заголовкиx-api-keyиanthropic-version): Anthropic, Kimi Code, Z.ai Coding Plan
Это критически важный шаг. Ошибка здесь стоит часов отладки.
2. Реализуйте единый интерфейс StreamingLLM.
Весь зоопарк провайдеров прячется за контрактом из пяти строк:
type StreamingLLM interface {
Stream(ctx context.Context, messages []AIMessage,
tools []map[string]any, cb StreamCallbacks) (*StreamResult, error)
}
На вход подаётся история сообщений и JSON-схемы инструментов. На выход: текст ответа, список вызовов инструментов (tool calls) и причина остановки.
3. Настройте колбэки для интерфейса.
Три колбэка отвечают за отображение в терминале:
OnText: показывает текст по мере генерацииOnToolCall: сигнализирует, что модель вызвала инструмент (например, Bash)OnReasoning: отображает цепочку рассуждений у thinking-моделей (рассуждающих моделей, которые «думают вслух»)
Нюанс: DeepSeek, GLM и Kimi передают рассуждения в разных полях (reasoning, reasoning_content, thinking_delta). Все три нужно свести в один колбэк OnReasoning.
4. Напишите переключатель провайдеров.
Переключение источника сводится к пересозданию клиента:
m.cli = m.makeLLMClient()
Внутри makeLLMClient обычный switch по источнику. Для Kimi Code, например:
case subscriptions.SourceKimi:
base := active.BaseURL
if base == "" {
base = "https://api.kimi.com/coding"
}
return llm.NewAnthropicClient(base, active.APIKey,
m.current.ID, m.cfg.ThinkingBudget)
А для Kimi API (Moonshot Platform) другой клиент и другой эндпоинт:
case subscriptions.SourceKimiAPI:
base := active.BaseURL
if base == "" {
base = "https://api.moonshot.ai/v1"
}
return llm.NewGLMClient(base, active.APIKey, m.current.ID)
Итого на девять провайдеров хватает четырёх реализаций: клиент gateway, generic OpenAI-совместимый клиент, generic Anthropic-совместимый клиент и обёртки над локальными CLI.
5. Реализуйте SSE-парсер с аккумуляцией tool calls по индексам.
Модель отдаёт вызов инструмента не целиком, а «размазанным» по чанкам (порциям данных потока). В первом чанке приходит имя функции и начало аргументов, дальше только дельты. Склеивать нужно по индексу:
for _, tc := range ch.Delta.ToolCalls {
idx := tc.Index
existing, ok := toolByIdx[idx]
if !ok {
existing = &ToolCall{Index: idx, ID: tc.ID,
Type: tc.Type, Function: tc.Function}
toolByIdx[idx] = existing
} else {
existing.Function.Arguments += tc.Function.Arguments
}
}
6. Подключите динамические каталоги моделей.
Для OpenAI-совместимых провайдеров при подключении вызывайте GET /v1/models и стройте каталог из того, что реально доступно конкретному ключу. Это избавляет от захардкоженных списков, которые устаревают через неделю.
Пользователь вводит в терминале:
/source kimi ← переключились на Kimi K3
объясни этот код ← отвечает Kimi
/source zai ← переключились на GLM-5.2
продолжай ← GLM видит ВСЮ историю, включая ответы Kimi
Контекст не сбрасывается. Агентный цикл (инструменты Bash, Read, Edit, Grep, подтверждения опасных команд, лимиты итераций) работает одинаково поверх любого провайдера. Биллинг изолирован: ключ пользователя идёт напрямую к провайдеру, бэкенд execai в запросах не участвует.
Биллинг-ловушка Z.ai. Ключ Z.ai Coding Plan работает только через Anthropic-совместимый эндпоинт. Тот же ключ в OpenAI-совместимый /chat/completions возвращает 429 Insufficient balance. Подписка и оплата за токены у них биллятся раздельно, «баланс» на стороне pay-per-token нулевой. Выглядит как протухший ключ, но ключ рабочий.
Биллинг-ловушка Kimi. Kimi Code (kimi.com/code, подписка от $19 в месяц) и Moonshot Platform (platform.moonshot.ai, оплата за токены) это два разных продукта с разными ключами и разными эндпоинтами. Ключи взаимно не подходят. В execai их сделали двумя отдельными источниками (kimi и kimi-api), чтобы пользователь не гадал.
Неаккуратная склейка tool calls. Если не аккумулировать аргументы по индексу чанка, получите невалидный JSON, и инструмент «не парсится» через раз.
Разные поля для рассуждений. DeepSeek, GLM, Kimi и Anthropic передают цепочку мыслей в разных полях. Забудете одно из них, потеряете «мышление» модели без видимой ошибки.
Что делать с этим прямо сейчас?
Автору на Дзене. Терминальный агент ИИ с несколькими провайдерами позволяет сравнить, как разные модели справляются с вашим черновиком или кодом, не выходя из одного окна и не теряя контекст. Если вы уже пробовали Claude Code, execai даёт похожий опыт, но с выбором модели под задачу.
Разработчику и маркетологу. Архитектура «один интерфейс, много провайдеров» экономит на подписках: дорогую модель используете для сложных задач, дешёвую или бесплатную (Ollama локально) для рутины.
Предпринимателю в РФ и СНГ. Из провайдеров, доступных без VPN, стоит присмотреться к Kimi и GLM: оба поддерживают русский язык и стоят дешевле западных аналогов ($18 и $19 в месяц за подписку). Но учтите биллинг-ловушки, описанные выше. Из российских аналогов подобного терминального агента пока нет, ближайшее по духу, работа с YandexGPT или GigaChat через API, но там нет готового мультипровайдерного переключателя.
Разбор execai ценен не столько самим инструментом, сколько документацией реальных граблей с китайскими LLM-провайдерами. По моим наблюдениям, именно биллинг-ловушки Kimi и Z.ai, когда один ключ молча не работает на «неправильном» эндпоинте, съедают больше всего времени у разработчиков, которые привыкли к предсказуемому поведению OpenAI API. Если вы подключаете китайские модели к своему продукту, начните с проверки, какой именно «диалект» API принимает ваш тип подписки. Честная оговорка: execai на ранней стадии, документация пока скромная, а девять провайдеров означают девять точек отказа. Используйте для экспериментов, но для продакшн-пайплайна пока рановато.
Попробуйте нейросети для контента
Разбираем инструменты, которые реально работают для авторов Дзена и маркетологов в РФ
Смотреть инструментыГлавный вывод из этого разбора практический: прежде чем подключать нового провайдера, проверьте не модель и не цену, а то, какой тип биллинга привязан к вашему ключу и на каком эндпоинте он реально принимается. Один вечер на эту проверку сэкономит три вечера на отладку «необъяснимых 429-х».

Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».
Читайте также

Google открыла Gemini Robotics ER 2 по API: инженер-робототехник подключит её к своему роботу уже сегодня
Компания Google представила Gemini Robotics ER 2, модель «воплощённого рассуждения» (embodied reasoning) для робототехники, и сразу открыла к ней доступ через…

Nous Research подключила AI-агенты к Buzz на базе Nostr: без токенов, на своих ключах
Nous Research выпустила поддержку ИИ-агента Hermes для Buzz, открытого рабочего пространства от Block, где люди и ИИ-агенты (автономные программы, выполняющие…
GPT 5 Pro анонсирована, но цен и доступа для России пока нет
Компания OpenAI представила GPT-5 Pro, и пока это самое заметное обновление за последний год, однако конкретных данных о ценах, архитектуре и доступности…
Комментарии