Агент, который аккуратно предлагает diff в редакторе и ждёт твоего подтверждения, не обязан оставаться безопасным, когда тот же движок начинает принимать входящие сообщения из чата. Это две разные поверхности с разными правами, разными событиями и разными пользователями на входе. Одна удачная демонстрация в IDE не подтверждает вторую интеграцию.
Дальше - о том, почему безопасный diff в IDE не равен безопасному боту, как построить две изолированные канарейки и какие статусы готовности нельзя объединять. Если модель у тебя уже ходит через совместимый API - скажем, через provod.ai (российский OpenRouter), - принцип раздельной проверки работает и там: один base_url не отменяет разницу контуров.
Платите в рублях за Gemini API без наценки на токены через provod.ai
Почему безопасный diff в IDE не равен безопасному боту?
Допущение, с которым приходит большинство команд, звучит разумно: раз модель одна, то gemini агент в редакторе и он же в чате - это одна проверенная система. Отсюда соблазн прогнать демонстрацию в IDE, увидеть аккуратный diff и объявить готовыми обе интеграции.
Это допущение ломается на правах и событиях. В редакторе агент работает от твоего аккаунта и твоих IAM-ролей, показывает изменение и ждёт подтверждения. В боте тот же движок получает push-события извне, от неизвестных отправителей, и должен сам решать, какое действие исполнять. Пользовательский риск здесь другой по своей природе: не "я нажал не туда", а "мне прислали то, чего я не ждал".
Твёрдо установлено здесь ровно одно: платформа Google описывает эти два механизма раздельно. Что точки отказа расходятся именно из-за прав и событий - уже вывод, разумный, но вывод. А готовность конкретно твоей связки внешние факты не доказывают вообще: документация описывает механизм, а не твой прогон.
Отсюда вывод простой и неприятный: не считать две интеграции подтверждёнными одной демонстрацией. Непроверенная связка агента с инструментами способна сорвать рабочий процесс всей команды - и сорвать его тихо, в том канале, который ты не гонял.
Четыре условия, без которых IDE-контур молчит
Начнём с редактора, потому что там граница видна руками. Чтобы расширение Gemini Code Assist вообще ответило на запрос кода, по документации Google Cloud (доступ 18 июля 2026) в проекте Google Cloud должен быть включён Gemini for Google Cloud API (cloudaicompanion.googleapis.com), а у пользователя - сразу две роли, roles/cloudaicompanion.user и roles/serviceusage.serviceUsageConsumer, плюс назначенная лицензия Standard или Enterprise. Это не "включил и работает", а четыре независимых условия.
Отсюда и характер сбоев. Собственная документация Google по устранению неполадок (доступ 18 июля 2026) перечисляет четыре отдельно диагностируемых режима отказа доступа в IDE: нет действующей лицензии, отключён API, недостаточно прав IAM и не назначена лицензия. Каждый даёт свою ошибку, а не один общий "не получилось". Для канарейки это подарок: журнал IDE может писать не факт провала, а его причину.
Тут же полезно знать, что права на чат и на правку кода Google уже разводит на уровне модели. Роль roles/cloudaicompanion.admin перечисляет companions.generateChat и companions.generateCode как два отдельных разрешения, а не одно общее (документация IAM, доступ 18 июля 2026). То есть платформа сама считает "поговорить" и "поправить код" разными действиями - и это ещё до того, как ты дошёл до второй поверхности.
Практический минимум для IDE-канарейки:
- зафиксируй в журнале, какие роли и лицензия были активны в момент прогона;
- вызови одну модельную задачу, которая порождает diff, и проверь, что агент показывает изменение, а не применяет его молча;
- сохрани точный текст ошибки, если доступ не прошёл, - он укажет, какой из четырёх режимов сработал.

Где живёт риск в CLI внутри редактора?
"IDE" - слово растяжимое. Это может быть расширение Gemini Code Assist, а может быть Gemini CLI, запущенный в терминале редактора; у них разные модели доверия, и путать их нельзя. Если твой gemini vscode - это CLI с MCP-серверами, а не расширение, граница смещается в другое место.
В Gemini CLI доверие настраивается на каждый сервер отдельно. По документации Gemini CLI (доступ 18 июля 2026) флаг trust: true для сервера отключает все диалоги подтверждения на каждый вызов инструмента этого сервера. А stdio-сервера показываются как "Connected" и получают право работать только тогда, когда текущая рабочая папка явно помечена доверенной через gemini trust; в недоверенной папке они висят "Disconnected". Это ровно тот рычаг, которым команда случайно снимает подтверждения и не замечает.
Вторая деталь того же документа касается секретов. Gemini CLI по умолчанию вырезает переменные окружения, похожие на секреты, по шаблонам вроде *TOKEN*, *SECRET*, *PASSWORD*, из окружения, передаваемого MCP-серверам. Переменная уходит серверу, только если ты явно перечислил её в блоке env этого сервера, - документация называет это обязательным шагом "информированного согласия" перед тем, как интеграция инструмента увидит учётные данные. Именно поэтому вопрос "какой у меня gemini cli api key и куда он утекает" - не риторический: ключ виден инструменту не автоматически, а по твоему явному списку.
Для канарейки это значит: журнал IDE-контура должен фиксировать не только роли, но и состояние доверия папки, флаги trust по каждому серверу и список проброшенных переменных. Без этого ты не отличишь "агент вёл себя безопасно" от "агенту просто нечего было трогать".
Как устроен бот-контур и почему он строже?
Теперь вторая поверхность. Бот - это не редактор, где рядом сидит автор. Это бэкенд, который принимает push-события. В Gemini API событийная система вебхуков определяет отдельные типы событий про взаимодействия: interaction.requires_action, interaction.completed, interaction.failed, interaction.cancelled - отдельно от batch.* и video.generated (документация Gemini API по вебхукам, доступ 18 июля 2026). Именно этим механизмом бот-интеграция получает уведомления о действиях агента и инструментов, вместо того чтобы опрашивать сервер.
Доставка вебхуков - "не менее одного раза". По той же документации Google повторяет неудачную доставку до 24 часов с экспоненциальной задержкой. Значит, принимающий бот обязан дедуплицировать события по заголовку webhook-id и отклонять полезную нагрузку со слишком старой отметкой времени, иначе он обработает одно и то же взаимодействие дважды. В IDE такой проблемы нет вовсе - там нет входящего потока, который кто-то ретраит сутки.
И проверка подписи не единая. Статические вебхуки уровня проекта используют симметричный секрет по спецификации Standard Webhooks, возвращаемый лишь один раз при создании; динамические вебхуки уровня запроса используют асимметричные JWT, проверяемые против опубликованного Google JWKS-эндпоинта. То есть настройка доверия на стороне бота - это не один одинаковый шаг, а два разных в зависимости от конфигурации.
Через оба контура работает один и тот же контракт функциональных вызовов, и он снимает последнюю иллюзию. Gemini никогда не исполняет функцию сам: модель возвращает только имя функции и аргументы, а документация прямо предписывает приложению "проверять вызовы функций до исполнения" и делать собственную обработку ошибок (документация Gemini API по function calling, доступ 18 июля 2026). Граница разрешения на действие лежит не в модели, а в коде, который стоит за каждой интеграцией отдельно: за расширением IDE - один, за бэкендом бота - другой.

Как развести проверку на две изолированные канарейки?
Метод простой по форме и упрямый по дисциплине: одна и та же модельная задача, две изолированные канарейки, два раздельных журнала. Не одна демонстрация, вывод которой натягивают на обе поверхности.
Шаги:
- Возьми одну задачу, где
gemini code agentдолжен предложить конкретное изменение файла. Одинаковая задача важна: разные риски должны проявиться не из-за разного задания, а из-за разного канала. - Прогони её в IDE-канарейке. В журнал IDE пиши: активные роли и лицензию, состояние доверия папки, флаги
trust, показал ли агент diff или применил его сам, точный текст ошибки при отказе. - Прогони ту же задачу в бот-канарейке: там тот же движок работает как
gemini coding agentза вебхуком, а не рядом с автором. В журнал бота пиши: тип пришедшего события, проверку подписи, факт дедупликации поwebhook-id, режим function calling и то, что бэкенд валидировал вызов до исполнения. - Сравни статусы отдельно. IDE-канарейка даёт статус готовности IDE. Бот-канарейка - статус готовности бота. Их нельзя складывать в один.
Режим вызова стоит выставлять под канал осознанно. Function calling управляется явной настройкой: AUTO (модель сама решает, звать функцию или ответить текстом, это значение по умолчанию), ANY (модель обязана вызвать функцию), NONE (вызовы запрещены) и превью-режим VALIDATED, который заставляет соблюдать схему (документация Gemini API по function calling, доступ 18 июля 2026). Для строгой бот-канарейки логично начать с более узкой позиции, а не наследовать одно поведение на оба контура.
Цена у этого решения есть, и стоит назвать её честно: раздельная проверка дольше. Альтернатива - перенести вывод одной демонстрации на обе интеграции - короче, но прячет именно то, что тебе нужно увидеть. Прогон стоит забраковать в двух случаях: результат IDE пытаются предъявить как доказательство для бота или отдельного журнала прав и событий вообще нет.
| Что оцениваешь | IDE-канарейка | Бот-канарейка |
|---|---|---|
| Кто инициирует | автор в редакторе | внешнее push-событие |
| Право на действие | IAM-роли, лицензия, gemini trust | подпись вебхука (секрет или JWT/JWKS) |
| Главный риск | молча применённый diff | повторно обработанное событие |
| Что писать в журнал | роли, доверие папки, текст ошибки | тип события, дедуп по webhook-id, режим вызова |
| Статус на выходе | готовность IDE | готовность бота |

На вход боту приходит не то, что ты тестировал
В редакторе запрос формулируешь ты. В боте - кто угодно, и приходит он ровно в том виде, в каком его набрали: с опечатками, транслитом и названием чужого клиента вместо твоего. Поэтому у бот-канарейки должен быть собственный вход - фиксированный набор дословных формулировок, на которых ты каждый прогон проверяешь нормализацию и маршрутизацию.
Причин две. Первая очевидная: бот не должен падать на кривом, но частом вводе. Вторая важнее. Половина формулировок ведёт не в твой контур, а в чужой - в веб-виджет, в стороннего агента, в клиент, которого ты вообще не поддерживаешь. Маршрутизировать всё в один сценарий - самый дешёвый способ получить уверенный неправильный ответ.
Опечатки и транслит в первой колонке намеренные: это входные значения, а не ошибки текста.
| Что приходит дословно | Куда маршрутизируем | Что должна поймать канарейка |
|---|---|---|
как подключить gemini к vs code, gemini в vscode, vscode gemini | сценарий IDE-расширения | ответ про роли и лицензию, а не про API-ключ |
бот gemini в телеграмме, gemini бот в телеграмме, gemini чат бот в телеграмме | сценарий вебхук-бота | ответ про подпись и дедуп, а не про редактор |
google gemini чат бот, чат бот google gemini | справка по чат-поверхности | не подсовывать инструкцию по правке кода |
gemini чат бот сайт | справка по веб-виджету | не путать с ботом в мессенджере |
pi coding agent gemini, как подключить gemini к hermes agent, как подключить гемини к джанитору (Janitor AI) | справка по стороннему клиенту | честное "это не наш контур" вместо выдуманной инструкции |
Последняя строка - самая неудобная и потому самая полезная: она показывает, сколько чужих клиентов люди зовут тем же словом "агент". ai agent gemini в терминале и gemini ai agent за вебхуком для пользователя - "тот же джемини", а для тебя это два контура с разными правами. Бот, который отвечает на оба одинаково, ошибается ровно там, где ошибка стоит дороже всего.
Чем это связано с выбором провайдера в РФ?
У российских команд к двум контурам добавляется третий слой - сам доступ к модели, и он тоже проверяется в каждой канарейке отдельно. Когда в команде звучит замена gemini, замена джемини или российский аналог gemini, речь почти никогда не про другую модель. Речь про то, как платить и ходить к той же модели из России без VPN и иностранной карты.
Здесь и уместен provod.ai - один OpenAI-совместимый эндпоинт, к которому подключаются и расширение IDE, и CLI, и бэкенд бота: обычно достаточно поменять base_url и ключ, не переписывая код клиента. Оплата при этом рублёвая, с единым балансом и документами для юрлица, а команда работает через общее пространство с общим ключом, по провайдерским ценам без наценки сверху.
И тут же ловушка, ради которой всё это написано: общий транспорт проверяется как отдельная канарейка в каждом канале. Один ключ и один base_url не означают, что IDE и бот подтверждены разом. Минимальная замена в клиенте выглядит так:
export OPENAI\_API\_KEY="sk-provod-..." export OPENAI\_BASE\_URL="https://api.provod.ai/v1"
Это меняет транспорт, но не отменяет разницу прав и событий на двух поверхностях. Канарейку всё равно гоняешь дважды.
Чего это не решает?
Две канарейки - не покрытие всех каналов и ролей. Они закрывают ровно одну пару "IDE плюс бот" на одной модельной задаче и не говорят ничего про третий клиент, про другую роль или про другого пользователя.
Внешние факты платформы - это факты о механизме, а не доказательство твоего прогона. Ни один из документов Google не подтверждает, что твоя конкретная связка агента с инструментами прошла проверку; первичного журнала до канареек не существует, и выдавать чужую документацию за свой результат нельзя.
Список ролей и лицензий у Gemini Code Assist стоит перепроверять перед запуском: вокруг июля 2026 Google активно сворачивал индивидуальный потребительский тариф в сторону продуктов Antigravity, поэтому точные имена ролей и путь индивидуального доступа могут снова сдвинуться. Событийный вебхук Gemini API - тоже сравнительно новый механизм; каталог событий и окно повторов проверяй по живой документации перед тем, как ссылаться на конкретные значения.
И отдельно про транспорт: общий эндпоинт не собирает интеграцию за тебя. Смена base_url снимает вопрос доступа и оплаты - но проверку прав в редакторе и проверку подписи на боте всё равно пишешь и гоняешь ты.

Короткий FAQ
Можно ли считать агент gemini в редакторе доказательством для чат-поверхности? Нет. Это разные права и разные события; статус IDE не переносится на бот.
Достаточно ли одного gemini cli api key, чтобы инструменты увидели секреты? Нет. Gemini CLI по умолчанию вырезает секретоподобные переменные и пробрасывает их серверу только по явному списку в env.
Почему бот обязан дедуплицировать события? Потому что доставка вебхуков "не менее одного раза" с повторами до 24 часов; без дедупа по webhook-id одно взаимодействие обработается дважды (документация Gemini API, доступ 18 июля 2026).
Модель сама исполняет функции? Нет. Она возвращает только имя и аргументы; проверять и исполнять вызов обязано приложение за каждой интеграцией.
Что даёт превью-режим VALIDATED? Он заставляет соблюдать схему вызова; полезен для строгой бот-канарейки, но название помечено как превью и может измениться.

provod.ai — сократите интеграционный зоопарк вокруг AI
Один совместимый API заменяет отдельную обвязку каждого вендора: разработчики быстрее добавляют AI-функции, а продуктовая команда свободнее выбирает модель под качество, скорость и задачу.
В одном каталоге — актуальные модели для текста и медиа: GPT от OpenAI, Claude от Anthropic, Gemini от Google, Grok от xAI, DeepSeek, Qwen, GLM, Kimi и MiniMax; для изображений — Nano Banana 2 Pro и GPT Image; для видео — последние версии Seedance, Kling, Veo и Google Omni. Также доступны модели для reasoning, поиска, документов, эмбеддингов, музыки и аудио.
За удобство роутинга нет отдельной ценовой надбавки: стоимость остаётся 1:1 с официальной ценой поставщика, а расчёты собираются на одном рублёвом балансе.
Упростите AI-архитектуру продукта: форма регистрации · цены на модели · защита данных по 152-ФЗ · главная provod.ai
Источники
- Google Cloud, настройка Gemini Code Assist, доступ 18.07.2026: https://docs.cloud.google.com/gemini/docs/codeassist/set-up-gemini
- Google Cloud, устранение неполадок Code Assist, доступ 18.07.2026: https://docs.cloud.google.com/gemini/docs/support/troubleshoot-code-assist
- Gemini CLI, MCP-серверы и доверие, доступ 18.07.2026: https://geminicli.com/docs/tools/mcp-server/
- Google AI for Developers, вебхуки Gemini API, доступ 18.07.2026: https://ai.google.dev/gemini-api/docs/webhooks
- Google AI for Developers, function calling, доступ 18.07.2026: https://ai.google.dev/gemini-api/docs/function-calling
- Google Cloud, роли и разрешения cloudaicompanion, доступ 18.07.2026: https://docs.cloud.google.com/iam/docs/roles-permissions/cloudaicompanion
- Продуктовые факты provod.ai, авторизованный editorial-контекст владельца продукта, 19.07.2026.
