Игорь Градов
Игорь Градов
6 мин
ai

Терминальный агент ИИ на 9 провайдеров: как собрать мультимодельный чат в 5 строк кода

Работая строго по фактам из источника, формирую тело новости в формате how-to.

Терминальный агент ИИ на 9 провайдеров: как собрать мультимодельный чат в 5 строк кода

Если у вас ключи от нескольких 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, но там нет готового мультипровайдерного переключателя.

Мнение редакции dzen.guru

Разбор execai ценен не столько самим инструментом, сколько документацией реальных граблей с китайскими LLM-провайдерами. По моим наблюдениям, именно биллинг-ловушки Kimi и Z.ai, когда один ключ молча не работает на «неправильном» эндпоинте, съедают больше всего времени у разработчиков, которые привыкли к предсказуемому поведению OpenAI API. Если вы подключаете китайские модели к своему продукту, начните с проверки, какой именно «диалект» API принимает ваш тип подписки. Честная оговорка: execai на ранней стадии, документация пока скромная, а девять провайдеров означают девять точек отказа. Используйте для экспериментов, но для продакшн-пайплайна пока рановато.

Попробуйте нейросети для контента

Разбираем инструменты, которые реально работают для авторов Дзена и маркетологов в РФ

Смотреть инструменты

Главный вывод из этого разбора практический: прежде чем подключать нового провайдера, проверьте не модель и не цену, а то, какой тип биллинга привязан к вашему ключу и на каком эндпоинте он реально принимается. Один вечер на эту проверку сэкономит три вечера на отладку «необъяснимых 429-х».

Поделиться:TelegramVK
Игорь Градов
Игорь Градов

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

Комментарии

Читайте также

Google открыла Gemini Robotics ER 2 по API: инженер-робототехник подключит её к своему роботу уже сегодня
ai

Google открыла Gemini Robotics ER 2 по API: инженер-робототехник подключит её к своему роботу уже сегодня

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

5 мин
Nous Research подключила AI-агенты к Buzz на базе Nostr: без токенов, на своих ключах
ai

Nous Research подключила AI-агенты к Buzz на базе Nostr: без токенов, на своих ключах

Nous Research выпустила поддержку ИИ-агента Hermes для Buzz, открытого рабочего пространства от Block, где люди и ИИ-агенты (автономные программы, выполняющие…

5 мин
ai

GPT 5 Pro анонсирована, но цен и доступа для России пока нет

Компания OpenAI представила GPT-5 Pro, и пока это самое заметное обновление за последний год, однако конкретных данных о ценах, архитектуре и доступности…

2 мин