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.

Ключевые файлы реализации:

Процесс загрузки

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.

Обязанности:

SessionManager

acp_adapter/session.py отслеживает сеансы ACP в реальном времени.

Каждая сессия сохраняет:

Менеджер является потокобезопасным и поддерживает:

Мост событий

acp_adapter/events.py преобразует обратные вызовы AIAgent в события ACP session_update.

Мостовые обратные вызовы:

Поскольку AIAgent работает в рабочем потоке, а ввод-вывод ACP находится в основном цикле событий, мост использует:

asyncio.run_coroutine_threadsafe(...)

Мост разрешений

acp_adapter/permissions.py адаптирует запросы на одобрение опасного терминала к запросам разрешений ACP.

Сопоставление:

Тайм-ауты и сбои мостов по умолчанию запрещены.

Помощники по рендерингу инструментов

acp_adapter/tools.py сопоставляет инструменты Hermes с типами инструментов ACP и создает контент, предназначенный для редактирования.

Примеры:

Жизненный цикл сеанса

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):

Разветвление

fork_session() глубоко копирует историю сообщений в новый сеанс в реальном времени, сохраняя состояние разговора, одновременно предоставляя ветвлению собственный идентификатор сеанса и cwd.

Поведение провайдера/аутентификации

ACP не реализует собственное хранилище аутентификации.

Вместо этого он повторно использует преобразователь времени выполнения Hermes:

Таким образом, ACP объявляет и использует настроенного в данный момент поставщика/учетные данные Hermes.

Привязка рабочего каталога

Сеансы ACP содержат редактор cwd.

Диспетчер сеансов привязывает этот cwd к идентификатору сеанса ACP посредством переопределений терминала/файла на уровне задачи, поэтому инструменты файлов и терминала работают относительно рабочей области редактора.

Дублирующиеся вызовы инструментов с тем же именем

Мост событий отслеживает идентификаторы инструментов в порядке FIFO для каждого имени инструмента, а не только один идентификатор для каждого имени. Это важно для:

Без очередей FIFO события завершения привязывались бы к неправильному вызову инструмента.

Восстановление обратного вызова подтверждения

ACP временно устанавливает обратный вызов утверждения на инструменте терминала во время выполнения запроса, а затем восстанавливает предыдущий обратный вызов. Это позволяет избежать того, чтобы обработчики утверждений, специфичные для сеанса ACP, были навсегда установлены глобально.

Текущие ограничения

Связанные файлы