Открытый плагин для консольного AI-ассистента OpenCode (anomalyco/opencode), обеспечивающий бесшовную интеграцию, трансляцию протоколов и прямое подключение моделей из экосистемы GigaCode / GigaChat от Сбера.
Плагин решает проблемы несовместимости протоколов OpenAI и GigaChat, берет на себя управление сетевой безопасностью в российских TLS-сетях, поддерживает мультимедиа-вложения и упрощает настройку авторизации, сохраняя учетные данные прямо в файле конфигурации или переменных окружения.
-
Локальный транслятор протоколов (OpenAI
$\leftrightarrow$ GigaChat): На лету перехватывает и адаптирует запросы к API GigaChat, вырезая несовместимые параметры, автоматически преобразуя параметры рассуждений (reasoning_effort/thinking) и приводя схемы вызовов функций (MCP-инструментов) к строгому стандарту Сбера. Подробнее см. в Архитектуре плагина и Спецификации GigaChat API. -
Гибридный обход TLS (Встроенный CA-сертификат):
[!IMPORTANT] Работает из коробки! Плагин реализует гибридный подход к сетевой безопасности: он сканирует систему на наличие сертификатов Минцифры РФ (Russian National CA). В случае их отсутствия плагин автоматически использует встроенный в код PEM-бандл доверенных корневых и выпускающих сертификатов Минцифры во внутренном
https.Agentдля всех OAuth и API-запросов. Вам больше не нужно отключать проверку SSL (rejectUnauthorized: false) или вручную устанавливать сертификаты. -
Загрузка мультимедиа-вложений (Vision/Multimodal): Перехватывает base64-вложения (
image_urlв формате OpenAI), автоматически упаковывает их в Multipart Form Data и загружает на защищенные сервера Сбера через API/files. Полученныйfile_idвстраивается какattachmentв запрос перед отправкой в GigaChat. - Автоматическое обновление токенов OAuth: Плагин полностью инкапсулирует логику авторизации по протоколу OAuth 2.0. Он кэширует полученный JWT-токен и превентивно обновляет его за 5 минут до истечения 30-минутного лимита. Семафорные блокировки предотвращают параллельные холостые запросы обновления при высокой нагрузке.
-
Конфигурация без лишних файлов (Single Account): Не требует создания вспомогательных файлов учетных записей. Ключи авторизации и тарифные планы задаются непосредственно в глобальном файле
opencode.jsonв настройках провайдера или передаются через стандартные переменные окружения. -
Адаптация инструментов (1-Tool Constraint): Учитывает жесткое ограничение API GigaChat — поддержка запуска строго одной функции за запрос. Плагин оптимизирует массив
tools, позволяя OpenCode выполнять сложные многошаговые сценарии последовательно. - Предупреждения о размере запроса: Встроенный анализатор объема данных предупреждает пользователя, если размер сообщения превышает 400 КБ, предотвращая падение запросов из-за переполнения контекстного окна (128K токенов).
-
Скачайте последнюю версию скомпилированного плагина
gigachat-plugin.jsсо страницы GitHub Releases. -
Скопируйте скачанный файл в папку плагинов OpenCode:
mkdir -p "$HOME/.opencode/plugins" # Переместите загруженный файл gigachat-plugin.js в созданную папку cp path/to/downloaded/gigachat-plugin.js "$HOME/.opencode/plugins/gigachat-plugin.js"
-
Добавьте путь к файлу плагина в массив
pluginв вашем конфигурационном файле~/.config/opencode/opencode.json:{ "plugin": [ "./.opencode/plugins/gigachat-plugin.js" ] }
(Если вы хотите установить и скомпилировать локальную версию) Просто вставьте этот промпт в любой LLM-агент (Claude Code, OpenCode, Cursor и т.д.) в корне вашего проекта OpenCode:
Собери плагин opencode-gigachat-plugin и настроить его конфигурацию в ~/.config/opencode/opencode.json по инструкции из репозитория.
-
Клонирование и сборка плагина:
git clone https://github.com/Overman775/opencode-gigachat-plugin.git cd opencode-gigachat-plugin npm install npm run buildСкомпилированный JavaScript-файл плагина будет сохранен в
dist/index.js. -
Копирование в директорию плагинов OpenCode:
mkdir -p "$HOME/.opencode/plugins" cp dist/index.js "$HOME/.opencode/plugins/gigachat-plugin.js"
И укажите путь к нему в
opencode.json:{ "plugin": [ "./.opencode/plugins/gigachat-plugin.js" ] }
Добавьте эти модели в ваш opencode.json. Все модели поддерживают контекстное окно размером до 128 000 токенов.
| Идентификатор модели | Коммерческое имя | Поддержка Vision | Описание |
|---|---|---|---|
GigaChat |
GigaChat Classic (Text) | Нет | Классическая текстовая модель GigaChat. |
GigaChat-2 |
GigaChat 2 (Text) | Нет | Новое поколение быстрой текстовой модели. |
GigaChat-2-Lite |
GigaChat 2 Lite (Alias) | Нет | Альянс-совместимый алиас для модели GigaChat-2. |
GigaChat-Plus |
GigaChat Plus (Text) | Нет | Расширенная текстовая модель GigaChat. |
GigaChat-Pro |
GigaChat Pro (Multimodal) | Да | Мультимодальная модель GigaChat. |
GigaChat-2-Pro |
GigaChat 2 Pro (Multimodal) | Да | Новое поколение мультимодальной модели GigaChat 2. |
GigaChat-Max |
GigaChat Max (Multimodal) | Да | Флагманская модель GigaChat с поддержкой мультимодальности. |
GigaChat-2-Max |
GigaChat 2 Max (Reasoning) | Да | Флагманская модель GigaChat 2 с улучшенными рассуждениями. |
Поскольку официальный API GigaChat не поддерживает параметры reasoning_effort или thinking на уровне JSON-схемы запроса, плагин автоматически транслирует их в текстовые системные инструкции для модели, вырезая сами параметры из сетевого пакета во избежание ошибок:
- Параметр OpenAI
reasoning_effort(low,medium,high) или объектthinkingпреобразуются в соответствующий пошаговый системный промпт (Chain-of-Thought):-
high(илиbudget_tokens$>$ 1024 токенов)$\rightarrow$ добавляет в системный промпт требование детального анализа и глубоких рассуждений перед ответом. -
medium(илиbudget_tokens$\le$ 1024 токенов)$\rightarrow$ добавляет требование пошагового рассуждения. -
low$\rightarrow$ не добавляет дополнительных инструкций (обычный быстрый режим ответа).
-
Добавьте провайдера GigaChat (Sberbank) и зарегистрируйте локальный JS-файл плагина в глобальном конфигурационном файле OpenCode (обычно расположен по пути ~/.config/opencode/opencode.json):
{
"$schema": "https://opencode.ai/config.json",
"plugin": [
"./.opencode/plugins/gigachat-plugin.js"
],
"provider": {
"GigaChat (Sberbank)": {
"options": {
"baseURL": "https://api.gigachat.local/v1"
},
"models": {
"GigaChat": {
"name": "GigaChat Classic (Text)",
"limit": { "context": 32000, "output": 4096 },
"modalities": { "input": ["text"], "output": ["text"] }
},
"GigaChat-2": {
"name": "GigaChat 2 (Text)",
"limit": { "context": 128000, "output": 4096 },
"modalities": { "input": ["text"], "output": ["text"] }
},
"GigaChat-2-Lite": {
"name": "GigaChat 2 Lite (Alias)",
"limit": { "context": 128000, "output": 4096 },
"modalities": { "input": ["text"], "output": ["text"] }
},
"GigaChat-Plus": {
"name": "GigaChat Plus (Text)",
"limit": { "context": 128000, "output": 8192 },
"modalities": { "input": ["text"], "output": ["text"] }
},
"GigaChat-Pro": {
"name": "GigaChat Pro (Multimodal)",
"limit": { "context": 128000, "output": 8192 },
"modalities": { "input": ["text", "image"], "output": ["text"] }
},
"GigaChat-2-Pro": {
"name": "GigaChat 2 Pro (Multimodal)",
"limit": { "context": 128000, "output": 8192 },
"modalities": { "input": ["text", "image"], "output": ["text"] }
},
"GigaChat-Max": {
"name": "GigaChat Max (Multimodal)",
"limit": { "context": 128000, "output": 8192 },
"modalities": { "input": ["text", "image"], "output": ["text"] },
"variants": {
"low": { "reasoning_effort": "low" },
"medium": { "reasoning_effort": "medium" },
"high": { "reasoning_effort": "high" }
}
},
"GigaChat-2-Max": {
"name": "GigaChat 2 Max (Reasoning)",
"limit": { "context": 128000, "output": 8192 },
"modalities": { "input": ["text", "image"], "output": ["text"] },
"variants": {
"low": { "reasoning_effort": "low" },
"medium": { "reasoning_effort": "medium" },
"high": { "reasoning_effort": "high" }
}
}
}
}
}
}Note
Базовый URL https://api.gigachat.local/v1 является виртуальным адресом по умолчанию. Chat-запросы к нему транслируются в legacy-compatible endpoint https://gigachat.devices.sberbank.ru/api/v1/chat/completions, потому что текущий адаптер использует контракт messages/functions/function_call.
Плагин также поддерживает кастомные адреса корпоративных прокси-серверов (например, https://gigachat-proxy.company.ru/v1). Перехват включается только для известных host-ов или запросов с marker header, поэтому Bearer-токен не отправляется на сторонний URL, где api.gigachat.local просто встречается в path/query.
В связи с тем, что API GigaChat использует сертификаты Минцифры РФ, при подключении в Node.js может возникнуть ошибка CERT_SIGNATURE_FAILURE или unable to verify the first certificate. У вас есть два пути решения:
Для быстрого обхода проблем с сертификатами (особенно при работе за прокси/VPN) просто добавьте флаг "verifySSL": false в параметры провайдера внутри opencode.json:
"provider": {
"GigaChat (Sberbank)": {
"options": {
"baseURL": "https://api.gigachat.local/v1",
"credentials": "...",
"verifySSL": false
}
}
}(Альтернативно, вы можете запустить OpenCode с переменной окружения GIGACHAT_VERIFY_SSL="false")
Чтобы Node.js доверял полной цепочке сертификатов шлюза Сбера, скачайте и объедините корневой и выпускающий сертификаты Минцифры:
mkdir -p "$HOME/.config/opencode/certs"
curl -sSL -k -o "$HOME/.config/opencode/certs/root.crt" https://gu-st.ru/content/lending/russian_trusted_root_ca_pem.crt
curl -sSL -k -o "$HOME/.config/opencode/certs/sub.crt" https://gu-st.ru/content/lending/russian_trusted_sub_ca_pem.crt
cat "$HOME/.config/opencode/certs/root.crt" "$HOME/.config/opencode/certs/sub.crt" > "$HOME/.config/opencode/certs/russian_trusted_root_ca.pem"
rm "$HOME/.config/opencode/certs/root.crt" "$HOME/.config/opencode/certs/sub.crt"После этого плагин автоматически подхватит файл по пути по умолчанию (~/.config/opencode/certs/russian_trusted_root_ca.pem). При необходимости вы можете явно указать путь через переменную окружения GIGACHAT_CA_BUNDLE_FILE.
Вы можете настраивать поведение плагина с помощью следующих переменных окружения (в качестве резерва при отсутствии настроек в opencode.json):
| Переменная окружения | Обязательная | Значение по умолчанию | Описание |
|---|---|---|---|
GIGACHAT_CREDENTIALS |
Нет | Нет | Базовые учетные данные GigaChat (Base64 строка Client ID:Client Secret). |
GIGACHAT_SCOPE |
Нет | GIGACHAT_API_PERS |
Область авторизации API для ключа из переменной окружения (GIGACHAT_API_PERS / GIGACHAT_API_CORP / GIGACHAT_API_B2B). |
GIGACHAT_CA_BUNDLE_FILE |
Нет | ~/.config/opencode/certs/russian_trusted_root_ca.pem |
Путь к собственному PEM-файлу корневых сертификатов Минцифры РФ. |
GIGACHAT_VERIFY_SSL |
Нет | true |
Если установить в false, проверка TLS-сертификатов будет отключена (используйте только для отладки). |
- Причина: Ваша среда выполнения Node.js не доверяет шлюзу Сбера
ngw.devices.sberbank.ru, так как он подписан государственным CA. - Решение:
- Убедитесь, что вы не переопределили переменную
GIGACHAT_VERIFY_SSL="true"при отсутствии валидного файла сертификата. - По умолчанию плагин автоматически применяет встроенные сертификаты. Если вы получаете эту ошибку, проверьте, доступна ли папка
~/.config/opencode/certs/на чтение, или временно очистите переменнуюGIGACHAT_CA_BUNDLE_FILE, чтобы принудительно использовать встроенный PEM-бандл. - В крайнем случае, для корпоративных VPN-сетей с собственными прокси, установите
GIGACHAT_VERIFY_SSL="false".
- Убедитесь, что вы не переопределили переменную
- Причина: Ключ credentials не настроен ни в
opencode.json, ни в переменных окружения. - Решение:
- Проверьте правильность заполнения ключа
credentialsиscopeвopencode.jsonв секцииprovider.gigachat.options. - Убедитесь, что скоуп (
scope) соответствует типу вашего кабинета на портале Сбер Салют (например, физические лица используют толькоGIGACHAT_API_PERS). - Проверьте правильность экспорта переменных окружения
GIGACHAT_CREDENTIALSв вашей терминальной сессии.
- Проверьте правильность заполнения ключа
- Причина: Вы передаете слишком много кода или тяжелые файлы в контекст запроса. Лимит одного сетевого пакета GigaChat API составляет около 10 МБ.
- Решение:
- Обратите внимание на предупреждения плагина в консоли:
[GigaCode-Plugin] WARNING: Content size is large. - Исключите тяжелые бинарные файлы или папки с зависимостями (например,
node_modules,.git,dist) из контекста отправки с помощью файла.opencodeignore.
- Обратите внимание на предупреждения плагина в консоли:
- Статья-разбор эксперимента — личная история о том, как плагин появился, где OpenAI-like API оказался не plug-and-play и какие ограничения всплыли в agent workflow.
- Архитектура плагина — внутреннее устройство и жизненный цикл событий.
- Настройка конфигурации — подробные параметры настроек и файлов конфигурации.
- Варианты моделей и рассуждения — глубина мыслей и бюджетирование токенов.
- Решение проблем — руководство по устранению сетевых сбоев и ошибок авторизации.
- Спецификация API GigaChat — форматы обмена данными и API-эндпоинты Сбера.
Этот проект распространяется под свободной лицензией MIT. Подробности читайте в файле LICENSE.
- Этот проект является экспериментальной разработкой, созданной исключительно в рамках исследования и в качестве Proof of Concept (PoC). Дальнейшая поддержка или развитие проекта не планируются. Если вам крайне необходимо связаться по поводу исправлений или доработок проекта, пишите в Telegram (контакты автора можно найти в его профиле на GitHub).
- При проектировании трансляционного слоя и логики вызова функций (Function Calling) я во многом опирался на технические решения и код официальных клиентов из репозитория ai-forever/gigachat.
- Проект является независимым решением с открытым исходным кодом и не аффилирован со Сбербанком или командой разработки GigaChat.
- Названия "GigaChat", "GigaCode" и "Сбер" являются зарегистрированными товарными знаками ПАО Сбербанк.