Documentação oficial desta página · v0.20.6
ACP por dentro
O adaptador ACP embrulha o AIAgent síncrono do Hermes num servidor JSON-RPC assíncrono, por stdio.
Arquivos principais:
acp_adapter/entry.pyacp_adapter/server.pyacp_adapter/session.pyacp_adapter/events.pyacp_adapter/permissions.pyacp_adapter/tools.pyacp_adapter/auth.py
Fluxo de inicialização
hermes acp / hermes-acp / python -m acp_adapter
-> acp_adapter.entry.main()
-> trata --version / --check / --setup antes de subir o servidor
-> carrega ~/.hermes/.env
-> configura o log na saída de erro
-> constrói o HermesACPAgent
-> acp.run_agent(agent, use_unstable_protocol=True)
A saída padrão é reservada para o transporte JSON-RPC do ACP. Logs legíveis por pessoas vão para a saída de erro.
Componentes principais
HermesACPAgent
O acp_adapter/server.py implementa o protocolo de agente do ACP.
Responsabilidades:
- inicializar e autenticar
- métodos de sessão: nova, carregar, retomar, bifurcar, listar, cancelar
- executar prompts
- trocar o modelo da sessão
- ligar os retornos de chamada síncronos do AIAgent às notificações assíncronas do ACP
SessionManager
O acp_adapter/session.py acompanha as sessões ACP vivas.
Cada sessão guarda:
session_idagentcwdmodelhistorycancel_event
O gerenciador é seguro entre threads e suporta criar, obter, remover, bifurcar, listar, limpar e atualizar o diretório de trabalho.
Ponte de eventos
O acp_adapter/events.py converte os retornos de chamada do AIAgent em eventos session_update do
ACP.
Retornos de chamada ligados:
tool_progress_callbackthinking_callback(hoje definido comoNonena ponte do ACP — o raciocínio é repassado pelostep_callback)step_callback
Como o AIAgent roda numa thread de trabalho enquanto a entrada e saída do ACP vive no laço de
eventos principal, a ponte usa:
asyncio.run_coroutine_threadsafe(...)
Ponte de permissões
O acp_adapter/permissions.py adapta as aprovações de comando perigoso de terminal em pedidos de
permissão do ACP.
Mapeamento:
allow_once→oncedo Hermesallow_always→alwaysdo Hermes- opções de recusa →
denydo Hermes
Tempo esgotado e falha na ponte negam por padrão.
Auxiliares de renderização de ferramenta
O acp_adapter/tools.py mapeia as ferramentas do Hermes para os tipos de ferramenta do ACP e monta
o conteúdo que o editor mostra.
Exemplos:
patchewrite_file→ diffs de arquivoterminal→ o texto do comandoread_fileesearch_files→ prévias de texto- resultados grandes → blocos de texto cortados, por segurança da interface
Ciclo de vida da sessão
new_session(cwd)
-> cria o SessionState
-> cria AIAgent(platform="acp", enabled_toolsets=["hermes-acp"])
-> liga task_id e session_id à sobrescrita de cwd
prompt(..., session_id)
-> extrai o texto dos blocos de conteúdo do ACP
-> zera o evento de cancelamento
-> instala os retornos de chamada e a ponte de aprovação
-> roda o AIAgent num ThreadPoolExecutor
-> atualiza o histórico da sessão
-> emite o trecho final da mensagem do agente
Cancelamento
O cancel(session_id):
- marca o evento de cancelamento da sessão
- chama
agent.interrupt()quando disponível - faz a resposta do prompt voltar com
stop_reason="cancelled"
Bifurcação
O fork_session() copia em profundidade o histórico de mensagens para uma sessão viva nova,
preservando o estado da conversa e dando à bifurcação um identificador e um diretório de trabalho
próprios.
Provedor e autenticação
O ACP não implementa um armazenamento de autenticação próprio. Ele reaproveita o resolvedor de tempo de execução do Hermes:
acp_adapter/auth.pyhermes_cli/runtime_provider.py
Então o ACP anuncia e usa o provedor e as credenciais configurados no Hermes. Ele também sempre
anuncia um método de autenticação por terminal (hermes-setup, com o argumento --setup), para
clientes ACP de primeira execução abrirem a configuração interativa de modelo e provedor antes de
começar uma sessão normal.
Vínculo com o diretório de trabalho
Sessões ACP carregam o diretório de trabalho do editor. O gerenciador liga esse diretório ao identificador da sessão ACP, por sobrescritas de terminal e arquivo com escopo de tarefa, então as ferramentas de arquivo e de terminal operam em relação ao espaço de trabalho do editor.
Chamadas repetidas com o mesmo nome de ferramenta
A ponte de eventos acompanha os identificadores de ferramenta numa fila por nome, e não um identificador por nome. Isso importa para:
- chamadas paralelas com o mesmo nome
- chamadas repetidas com o mesmo nome num passo só
Sem as filas, os eventos de conclusão se ligariam à invocação errada.
Restauração do retorno de chamada de aprovação
O ACP instala temporariamente um retorno de chamada de aprovação na ferramenta de terminal enquanto o prompt executa, e restaura o anterior depois. Isso evita deixar manipuladores de aprovação específicos de uma sessão ACP instalados globalmente para sempre.
Limitações atuais
- As sessões ACP são gravadas no
~/.hermes/state.dbcompartilhado (SessionDB) e restauradas de forma transparente entre reinícios do processo; elas aparecem nosession_search - Blocos de prompt que não são texto são ignorados hoje na extração do texto da requisição
- A experiência varia conforme a implementação de cada cliente ACP
Arquivos relacionados
tests/acp/— a suíte de testes do ACPtoolsets.py— a definição do conjuntohermes-acphermes_cli/main.py— o subcomandohermes acppyproject.toml— a dependência opcional[acp]e o scripthermes-acp