Arquitetura da integração do Pi
Este documento descreve como o OpenClaw se integra ao pi-coding-agent e seus pacotes irmãos (pi-ai, pi-agent-core, pi-tui) para oferecer seus recursos de agente de IA.
Visão geral
O OpenClaw usa o SDK do pi para incorporar um agente de codificação com IA à sua arquitetura de gateway de mensagens. Em vez de iniciar o pi como um subprocesso ou usar o modo RPC, o OpenClaw importa e instancia diretamente oAgentSession do pi por meio de createAgentSession(). Essa abordagem incorporada oferece:
- Controle total sobre o ciclo de vida da sessão e o tratamento de eventos
- Injeção de ferramentas personalizada (mensagens, sandbox, ações específicas de canal)
- Personalização do prompt do sistema por canal/contexto
- Persistência de sessão com suporte a ramificação/compactação
- Rotação de perfil de autenticação com várias contas e failover
- Troca de modelo independente de provedor
Dependências de pacotes
| Pacote | Finalidade |
|---|---|
pi-ai | Abstrações principais de LLM: Model, streamSimple, tipos de mensagem, APIs de provedor |
pi-agent-core | Loop do agente, execução de ferramentas, tipos AgentMessage |
pi-coding-agent | SDK de alto nível: createAgentSession, SessionManager, AuthStorage, ModelRegistry, ferramentas integradas |
pi-tui | Componentes de UI de terminal (usados no modo TUI local do OpenClaw) |
Estrutura de arquivos
src/agents/tools, por exemplo:
- os arquivos de runtime de ação do plugin do Discord
- o arquivo de runtime de ação do plugin do Slack
- o arquivo de runtime de ação do plugin do Telegram
- o arquivo de runtime de ação do plugin do WhatsApp
Fluxo principal de integração
1. Executar um agente incorporado
O ponto de entrada principal érunEmbeddedPiAgent() em pi-embedded-runner/run.ts:
2. Criação de sessão
Dentro derunEmbeddedAttempt() (chamado por runEmbeddedPiAgent()), o SDK do pi é usado:
3. Inscrição em eventos
subscribeEmbeddedPiSession() se inscreve nos eventos de AgentSession do pi:
message_start/message_end/message_update(texto/pensamento em streaming)tool_execution_start/tool_execution_update/tool_execution_endturn_start/turn_endagent_start/agent_endauto_compaction_start/auto_compaction_end
4. Envio do prompt
Após a configuração, o prompt é enviado para a sessão:images apenas para aquele turno. Ele não reescaneia turnos anteriores do histórico para reinjetar payloads de imagem.
Arquitetura de ferramentas
Pipeline de ferramentas
- Ferramentas base:
codingToolsdo pi (read, bash, edit, write) - Substituições personalizadas: o OpenClaw substitui bash por
exec/process, personaliza read/edit/write para sandbox - Ferramentas do OpenClaw: mensagens, browser, canvas, sessões, cron, gateway etc.
- Ferramentas de canal: ferramentas de ação específicas de Discord/Telegram/Slack/WhatsApp
- Filtragem por política: ferramentas filtradas por políticas de perfil, provedor, agente, grupo e sandbox
- Normalização de esquema: esquemas limpos para peculiaridades de Gemini/OpenAI
- Encapsulamento de AbortSignal: ferramentas encapsuladas para respeitar sinais de aborto
Adaptador de definição de ferramenta
OAgentTool de pi-agent-core tem uma assinatura execute diferente da ToolDefinition de pi-coding-agent. O adaptador em pi-tool-definition-adapter.ts faz essa ponte:
Estratégia de divisão de ferramentas
splitSdkTools() passa todas as ferramentas por customTools:
Construção do prompt do sistema
O prompt do sistema é construído embuildAgentSystemPrompt() (system-prompt.ts). Ele monta um prompt completo com seções incluindo Ferramentas, Estilo de chamada de ferramenta, Proteções de segurança, referência de CLI do OpenClaw, Skills, Documentação, Workspace, Sandbox, Mensagens, Tags de resposta, Voz, Respostas silenciosas, Heartbeats, Metadados de runtime, além de Memória e Reações quando habilitadas, e conteúdo opcional de arquivos de contexto e prompt adicional do sistema. As seções são reduzidas para o modo de prompt mínimo usado por subagentes.
O prompt é aplicado após a criação da sessão via applySystemPromptOverrideToSession():
Gerenciamento de sessão
Arquivos de sessão
As sessões são arquivos JSONL com estrutura em árvore (ligação por id/parentId). OSessionManager do Pi cuida da persistência:
guardSessionManager() para segurança nos resultados de ferramenta.
Cache de sessão
session-manager-cache.ts armazena em cache instâncias de SessionManager para evitar análise repetida de arquivo:
Limitação de histórico
limitHistoryTurns() reduz o histórico da conversa com base no tipo de canal (DM vs grupo).
Compactação
A compactação automática é acionada em caso de estouro de contexto. Assinaturas comuns de estouro incluemrequest_too_large, context length exceeded, input exceeds the maximum number of tokens, input token count exceeds the maximum number of input tokens, input is too long for the model e ollama error: context length exceeded. compactEmbeddedPiSessionDirect() cuida da
compactação manual:
Autenticação e resolução de modelo
Perfis de autenticação
O OpenClaw mantém um armazenamento de perfis de autenticação com várias chaves de API por provedor:Resolução de modelo
Failover
FailoverError aciona fallback de modelo quando configurado:
Extensões do Pi
O OpenClaw carrega extensões personalizadas do pi para comportamentos especializados:Proteção de compactação
src/agents/pi-hooks/compaction-safeguard.ts adiciona proteções à compactação, incluindo orçamento adaptativo de tokens e resumos de falha de ferramenta e operações de arquivo:
Poda de contexto
src/agents/pi-hooks/context-pruning.ts implementa poda de contexto baseada em TTL de cache:
Streaming e respostas em bloco
Fragmentação em blocos
EmbeddedBlockChunker gerencia o texto em streaming em blocos discretos de resposta:
Remoção de tags de pensamento/final
A saída em streaming é processada para remover blocos<think>/<thinking> e extrair conteúdo <final>:
Diretivas de resposta
Diretivas de resposta como[[media:url]], [[voice]], [[reply:id]] são analisadas e extraídas:
Tratamento de erros
Classificação de erros
pi-embedded-helpers.ts classifica erros para o tratamento adequado:
Fallback de nível de pensamento
Se um nível de pensamento não for suportado, ele recua para outro:Integração com sandbox
Quando o modo sandbox está habilitado, ferramentas e caminhos são restringidos:Tratamento específico por provedor
Anthropic
- Limpeza de string mágica de recusa
- Validação de turno para papéis consecutivos
- Compatibilidade de parâmetros do Claude Code
Google/Gemini
- Sanitização de esquema de ferramenta pertencente ao plugin
OpenAI
- Ferramenta
apply_patchpara modelos Codex - Tratamento de redução de nível de pensamento
Integração com TUI
O OpenClaw também tem um modo TUI local que usa componentes de pi-tui diretamente:Principais diferenças em relação à CLI do Pi
| Aspecto | CLI do Pi | OpenClaw incorporado |
|---|---|---|
| Invocação | comando pi / RPC | SDK via createAgentSession() |
| Ferramentas | Ferramentas padrão de codificação | Conjunto personalizado de ferramentas do OpenClaw |
| Prompt do sistema | AGENTS.md + prompts | Dinâmico por canal/contexto |
| Armazenamento de sessão | ~/.pi/agent/sessions/ | ~/.openclaw/agents/<agentId>/sessions/ (ou $OPENCLAW_STATE_DIR/agents/<agentId>/sessions/) |
| Autenticação | Credencial única | Vários perfis com rotação |
| Extensões | Carregadas do disco | Caminhos programáticos + de disco |
| Tratamento de eventos | Renderização TUI | Baseado em callback (onBlockReply etc.) |
Considerações futuras
Áreas para possível retrabalho:- Alinhamento de assinatura de ferramenta: atualmente há adaptação entre assinaturas de pi-agent-core e pi-coding-agent
- Encapsulamento de session manager:
guardSessionManageradiciona segurança, mas aumenta a complexidade - Carregamento de extensão: poderia usar o
ResourceLoaderdo pi mais diretamente - Complexidade do manipulador de streaming:
subscribeEmbeddedPiSessioncresceu bastante - Peculiaridades de provedor: muitos caminhos de código específicos de provedor que o pi potencialmente poderia tratar
Testes
A cobertura da integração do Pi abrange estas suítes:src/agents/pi-*.test.tssrc/agents/pi-auth-json.test.tssrc/agents/pi-embedded-*.test.tssrc/agents/pi-embedded-helpers*.test.tssrc/agents/pi-embedded-runner*.test.tssrc/agents/pi-embedded-runner/**/*.test.tssrc/agents/pi-embedded-subscribe*.test.tssrc/agents/pi-tools*.test.tssrc/agents/pi-tool-definition-adapter*.test.tssrc/agents/pi-settings.test.tssrc/agents/pi-hooks/**/*.test.ts
src/agents/pi-embedded-runner-extraparams.live.test.ts(habiliteOPENCLAW_LIVE_TEST=1)