Инженерный эксперимент по подключению GigaChat к coding agent OpenCode показал, что декларируемая совместимость с OpenAI API быстро заканчивается при переходе от простого чата к агентному режиму. Автор задачи — проверить, насколько российские модели (GigaChat и GigaCode) готовы к работе с инструментами, стримингом и историей диалога в реальной среде разработки. Для эксперимента был выбран OpenCode — open-source инструмент, который не просто отвечает на запросы, а работает с файлами, запускает инструменты и хранит контекст.

Первоначальная надежда была на то, что если API GigaChat похож на OpenAI, то достаточно сменить baseURL и ключ. Для простого chat completion это сработало быстро. Однако как только автор начал подключать агентные механики — tool calling, streaming, function calls — выяснилось, что форматы запросов различаются. OpenCode использует современный OpenAI-формат с tools и tool_calls, а GigaChat в legacy-режиме ожидает functions и function_call. Автор столкнулся с необходимостью преобразовывать структуры: аргументы функций в OpenAI — строка, в GigaChat — объект; результаты функций должны быть валидной JSON-строкой; system-сообщение должно быть единственным и первым; изображения нужно загружать через отдельный /files endpoint; а состояние function calls (functions_state_id) нельзя терять в середине цикла.

Постепенно плагин превратился из простого провайдера в протокольный переводчик. Автор начинал с cURL, чтобы проверить живучесть API, затем перешёл к TypeScript-плагину. В процессе выяснилось, что даже при одинаковом намерении (выполнить код) разные модели требуют разной обвязки. Эксперимент не ставил целью создать коммерческий продукт — это исследовательская работа, показавшая, что для полноценного агентного сценария российским моделям требуется не просто «OpenAI-совместимость», а слой адаптации. Пока этот слой ложится на плечи разработчика, но в перспективе унификация протоколов могла бы упростить интеграцию.

Основные сложности — tool calling, streaming, обработка function calls и загрузка изображений через отдельный endpoint.