Внешние агенты (ACP)
Chimera может передать ход кодирования агенту, которого она не писала, — Claude Code, Gemini CLI или любому адаптеру, говорящему на Agent Client Protocol. Стенограмма, проверяющий, снимок и отмена остаются за Chimera; работу делает кто-то другой.
Зачем
Утверждение Chimera никогда не состояло в том, что её цикл — единственный хороший. Речь об управлении вокруг цикла: журнал заражения, область записи, копия до хода, вердикт после, чек, который говорит, что произошло на самом деле. Это применимо к любому исполнителю. Отказаться управлять исполнителем, которому вы и так доверяете, значило бы настаивать на менее интересной половине продукта.
Что гарантировано, а что нет
Прочитайте этот раздел до установки: именно он решает, подходит ли вам эта возможность.
ACP-агент объявляет, какие возможности клиента он будет использовать, а Chimera предлагает
fs/read_text_file и fs/write_text_file. Предложить — не значит обеспечить. Агенты, которыми
стоит управлять, имеют собственные файловые и терминальные инструменты: Claude Code пишет через
Claude Agent SDK и вовсе не обязан спрашивать нас первым.
Конкретно:
| Собственный цикл Chimera | Внешний агент | |
|---|---|---|
| Область записи отклоняет запись вне себя | Всегда | Только то, что идёт через нас |
| Оболочка работает в настроенной песочнице | Всегда | Агент выполняет по-своему |
| Журнал заражения взводит блокировку | Всегда | Только для инструментов, которые мы посредничаем |
| Снимок рабочей папки до хода | Да | Да |
| Отмена всего хода одним щелчком | Да | Да |
| Каждое выданное разрешение попадает в чек | — | Да |
Последние три строки — настоящая гарантия, и именно её обещает строка о положении дел на экране
«Код», когда выбран внешний агент. Она перестаёт говорить «редактирует внутри /project, не запускает
команд» — эта фраза описывает инструменты, которыми владеет Chimera, — и вместо этого сообщает, что
копия снята и ход можно отменить. Экран, сохранивший более сильную фразу, давал бы обещание, которое
ход не в состоянии сдержать.
Chimera также отклоняет терминальную возможность ACP. Терминал, размещённый у нас, стал бы вторым путём выполнения рядом с песочницей — без единого её правила.
Установка
Для агентов, которых Chimera знает, настраивать нечего:
npm i -g @agentclientprotocol/claude-agent-acp # Claude Code, нужен Node 22+
npm i -g @google/gemini-cli # Gemini CLI (режим ACP помечен как экспериментальный)
Затем проверьте, что эта машина действительно может запустить:
chimera doctor
external_agents сообщает по каждому available: true/false, а при false — строку, которая это
исправляет. Доступность определяется на машине, где работает sidecar, — а для упакованной настольной
сборки это машина, собранная CI, на которую никто не смотрел. То есть «оно должно быть там» не
является доказательством.
Настольное приложение показывает над полем ввода строку Кто выполняет с тем, что нашёл doctor.
Если ничего запускаемого не установлено, строка не появляется вовсе; «у вас этого ещё нет, вот как
получить» — это работа doctor.
Учётные данные
Каждый дочерний процесс, запускаемый Chimera, получает окружение без переменных API_KEY / TOKEN /
SECRET, чтобы команда оболочки не могла вывести ключ провайдера. ACP-агент — программа, вся работа
которой требует такого ключа, поэтому каждый агент объявляет нужные переменные поимённо, и только
они возвращаются:
- Claude Code:
ANTHROPIC_API_KEY,ANTHROPIC_AUTH_TOKEN,ANTHROPIC_BASE_URL,CLAUDE_CONFIG_DIR - Gemini CLI:
GEMINI_API_KEY,GOOGLE_API_KEY,GOOGLE_APPLICATION_CREDENTIALS
Передать окружение целиком было бы проще — и означало бы вручить каждому будущему адаптеру каждый ключ на машине.
Свой адаптер
Codex и другие добираются до ACP через сторонние адаптеры, которые этот проект не запускал. Вместо того чтобы перечислять непроверенную команду — это превратило бы «мы не проверяли» в «поддерживается» — укажите Chimera на тот, что есть у вас:
// POST /api/code/turn
{
"message": "почини падающий тест",
"provider": "custom",
"provider_command": "npx -y some-acp-adapter --flag"
}
Команда разбивается по правилам оболочки и запускается без оболочки, поэтому случайный конвейер —
это аргумент, а не вторая команда. В Windows аргумент с синтаксисом cmd.exe (& | < > ^ %),
попадающий в запускатель .cmd, отклоняется, а не экранируется: правила кавычек различаются от
запускателя к запускателю, и неверная догадка выполнит вашу машину вместо программы на ней.
Как это устроено
- Один дочерний процесс на разговор, а не на ход.
session/prompt— это одно сообщение внутри контекста, который держит агент; новый процесс каждый раз делал бы любой ход первым. - Одновременно живут не больше четырёх, а нетронутый в течение часа закрывается. Каждый — это процесс, удерживающий соединение с моделью.
- Процесс рождается в собственной группе и убивается деревом: агент-кодер — это запускатель, и убийство
только того процесса, который держим мы, оставило бы работающих исполнителей и занятую папку.
Сборщик в
atexitпокрывает случай выхода из приложения посреди хода. - Уведомления агента
session/updateпереводятся в те же события, которые выдаёт родной цикл, поэтому экрану не нужна вторая реализация. Фрагменты рассуждений отбрасываются, а не подмешиваются в ответ; блокdiffпревращается в унифицированный патч, который стенограмма и так отображает. - Числа, которыми владеет родной цикл и которые этот сообщить не может, —
steps,context_peak_tokens— приходят какnull, а не0. Ноль читался бы как «он ничего не сделал».
Ограничения
- Запросы разрешений получают
allow_onceи записываются в чек. Задерживать запрос, который агент вовсе не обязан был делать, — театр; честный вариант: выдать, записать и опереться на снимок, который покрывает и те записи, что никогда не спрашивали. - Слияние, роли, память и карта репозитория принадлежат собственному циклу Chimera. Внешний ход
сообщает
fused: falseи нулевое использование памяти, потому что ничего этого не происходило. - Режим ACP у Gemini помечен как экспериментальный, и его поведение может меняться между выпусками.