Внутреннее устройство ACP
Адаптер ACP оборачивает синхронный AIAgent Hermes в асинхронный сервер JSON-RPC stdio.
Ключевые файлы: реализация
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()
-> загрузить ~/.hermes/.env
-> настроить stderr логирование
-> создать HermesACPAgent
-> acp.run_agent(agent, use_unstable_protocol=True)
Стандартный вывод зарезервирован для транспортировки ACP JSON-RPC. Человекочитаемые логи направляются в stderr.
Основные компоненты
HermesACPAgent
acp_adapter/server.py реализует протокол агента ACP.
Обязанности:
- учреждение / аутентификация
- Методы сессий: создать, загрузить, возобновить, разветвить, список, отменить.
- выполнение промптов
- переключение модели сессии
- привязка синхронных колбэков AIAgent к асинхронным уведомлениям ACP
Менеджер сеансов
acp_adapter/session.py отслеживает активетные сессии ACP.
каждая сессия хранит:
session_idагентквдмодельисторияcancel_event
Менеджер потокобезопасен и опор:
- создание
- получение
- удаление
- разветвление
- список
- очистку
- обновление cwd
Большинство событий
acp_adapter/events.py преобразует колбэки AIAgent в события session_update ACP.
Подключенные колбэки:
tool_progress_callbackthinking_callback(в настоящее время установленоNoneв мосте ACP — рассуждения передаются черезstep_callback)step_callback
Поскольку AIAgent работает в рабочем потоке, ввод-вывод ACP работает в событиях главного цикла, мост использует:
asyncio.run_coroutine_threadsafe(...)
Большинство разрешений
acp_adapter/permissions.py адаптирует запросы на подтверждение символов терминальных операций в запросах разрешений ACP.
Соответствие:
allow_once-> Гермесonceallow_always-> Гермесвсегда- варианты отклонений -> Гермес
отрицать
Тайм-ауты и сбои моста по умолчанию приводят к отказу.
Вспомогательные функции инструментов рисования
acp_adapter/tools.py содержит инструменты Hermes с инструментами типа ACP и формирует контент для редактора.
Примеры:
patch/write_file-> различия файловтерминал-> текст команды выполненияread_file/search_files-> текстовые превью- результаты большие -> учтенные текстовые блоки для пользовательского интерфейса безопасности
Жизненный цикл сессии
new_session(cwd)
-> создать SessionState
-> создать AIAgent(platform="acp", enabled_toolsets=["hermes-acp"])
-> привязать task_id/session_id к переопределению cwd
prompt(..., session_id)
-> извлечь текст из блоков контента ACP
-> сбросить событие отмены
-> установить колбэки + мост разрешений
-> запустить AIAgent в ThreadPoolExecutor
-> обновить историю сессии
-> отправить финальный фрагмент сообщения агента
Отмена
отмена (session_id):
- установить событие закрытия сессии
-вызывает
agent.interrupt(), если доступно - приводит к тому, что ответ на запрос возвращает
stop_reason="cancelled"
Разветвление
fork_session() глубоко копирует историю сообщений в новую активную сессию, сохраняя состояние разговора, при этом ответвление получает свой собственный идентификатор сессии и cwd.
Поведение провайдера/аутентификации
ACP не предоставляет собственную хранилищу аутентификации.
Вместо этого он использует рантайм-резольвер Гермес:
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— подкоманда CLIhermes acppyproject.toml— опциональная зависимость[acp]+ скриптhermes-acp