sidebar_position: 2 title: "ACP Internals" description: "How the ACP adapter works: lifecycle, sessions, event bridge, approvals, and tool rendering" lang: ru
Внутренние устройства ACP
Адаптер ACP оборачивает синхронный AIAgent Hermes в асинхронный сервер stdio JSON-RPC.
Ключевые файлы реализации:
acp_adapter/entry.pyacp_adapter/server.pyacp_adapter/session.pyacp_adapter/events.pyacp_adapter/permissions.pyacp_adapter/tools.pyacp_adapter/auth.pyacp_registry/agent.json
Процесс загрузки
hermes acp / hermes-acp / python -m acp_adapter
-> acp_adapter.entry.main()
-> load ~/.hermes/.env
-> configure stderr logging
-> construct HermesACPAgent
-> acp.run_agent(agent, use_unstable_protocol=True)
Stdout зарезервирован для транспорта ACP JSON-RPC. Читаемые человеком журналы передаются в stderr.
Основные компоненты
HermesACPAgent
acp_adapter/server.py реализует протокол агента ACP.
Обязанности:
- инициализировать/аутентифицировать
- методы нового/загрузки/возобновления/вилки/списка/отмены сеанса
- оперативное исполнение
- переключение модели сеанса
- подключение синхронизации обратных вызовов AIAgent к асинхронным уведомлениям ACP.
SessionManager
acp_adapter/session.py отслеживает сеансы ACP в реальном времени.
Каждая сессия сохраняет:
session_idagentcwdmodelhistorycancel_event
Менеджер является потокобезопасным и поддерживает:
- создать
- получить
- удалить
- вилка
- список
- уборка
- обновления CWD
Мост событий
acp_adapter/events.py преобразует обратные вызовы AIAgent в события ACP session_update.
Мостовые обратные вызовы:
tool_progress_callbackthinking_callbackstep_callbackmessage_callback
Поскольку AIAgent работает в рабочем потоке, а ввод-вывод ACP находится в основном цикле событий, мост использует:
asyncio.run_coroutine_threadsafe(...)
Мост разрешений
acp_adapter/permissions.py адаптирует запросы на одобрение опасного терминала к запросам разрешений ACP.
Сопоставление:
allow_once-> Гермесonceallow_always-> Гермесalways- варианты отклонения -> Hermes
deny
Тайм-ауты и сбои мостов по умолчанию запрещены.
Помощники по рендерингу инструментов
acp_adapter/tools.py сопоставляет инструменты Hermes с типами инструментов ACP и создает контент, предназначенный для редактирования.
Примеры:
patch/write_file-> различия файловterminal-> текст команды оболочкиread_file/search_files-> предварительный просмотр текста- большие результаты -> усеченные текстовые блоки для безопасности пользовательского интерфейса.
Жизненный цикл сеанса
new_session(cwd)
-> create SessionState
-> create AIAgent(platform="acp", enabled_toolsets=["hermes-acp"])
-> bind task_id/session_id to cwd override
prompt(..., session_id)
-> extract text from ACP content blocks
-> reset cancel event
-> install callbacks + approval bridge
-> run AIAgent in ThreadPoolExecutor
-> update session history
-> emit final agent message chunk
Отмена
cancel(session_id):
- устанавливает событие отмены сеанса
- звонит
agent.interrupt(), когда доступен - заставляет быстрый ответ возвращать
stop_reason="cancelled"
Разветвление
fork_session() глубоко копирует историю сообщений в новый сеанс в реальном времени, сохраняя состояние разговора, одновременно предоставляя ветвлению собственный идентификатор сеанса и cwd.
Поведение провайдера/аутентификации
ACP не реализует собственное хранилище аутентификации.
Вместо этого он повторно использует преобразователь времени выполнения Hermes:
acp_adapter/auth.pyhermes_cli/runtime_provider.py
Таким образом, ACP объявляет и использует настроенного в данный момент поставщика/учетные данные Hermes.
Привязка рабочего каталога
Сеансы ACP содержат редактор cwd.
Диспетчер сеансов привязывает этот cwd к идентификатору сеанса ACP посредством переопределений терминала/файла на уровне задачи, поэтому инструменты файлов и терминала работают относительно рабочей области редактора.
Дублирующиеся вызовы инструментов с тем же именем
Мост событий отслеживает идентификаторы инструментов в порядке FIFO для каждого имени инструмента, а не только один идентификатор для каждого имени. Это важно для:
- параллельные одноимённые звонки
- повторные одноимённые звонки за один шаг
Без очередей FIFO события завершения привязывались бы к неправильному вызову инструмента.
Восстановление обратного вызова подтверждения
ACP временно устанавливает обратный вызов утверждения на инструменте терминала во время выполнения запроса, а затем восстанавливает предыдущий обратный вызов. Это позволяет избежать того, чтобы обработчики утверждений, специфичные для сеанса ACP, были навсегда установлены глобально.
Текущие ограничения
- Сеансы ACP сохраняются в общей папке
~/.hermes/state.db(SessionDB) и прозрачно восстанавливаются при перезапуске процесса; они появляются вsession_search - блоки нетекстовых подсказок в настоящее время игнорируются при извлечении текста запроса.
- пользовательский интерфейс для конкретного редактора зависит от реализации клиента ACP.
Связанные файлы
tests/acp/— набор тестов ACPtoolsets.py— определение набора инструментовhermes-acphermes_cli/main.py—hermes acpсубкоманда CLIpyproject.toml—[acp]необязательная зависимость + скриптhermes-acp