Arquitetura de integração do Pi
Este documento descreve como o OpenClaw se integra com pi-coding-agent e seus pacotes irmãos (pi-ai, pi-agent-core, pi-tui) para fornecer 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 em 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 via 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 de sistema por canal/contexto
- Persistência de sessão com suporte a ramificação/compactação
- Rotação de perfil de autenticação para múltiplas contas com failover
- Alternância de modelo independente de provider
Dependências de pacotes
| Pacote | Finalidade |
|---|---|
pi-ai | Abstrações centrais de LLM: Model, streamSimple, tipos de mensagem, APIs de provider |
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 Discord
- o arquivo de runtime de ação do plugin Slack
- o arquivo de runtime de ação do plugin Telegram
- o arquivo de runtime de ação do plugin WhatsApp
Fluxo principal de integração
1. Executar um agente incorporado
O principal ponto de entrada érunEmbeddedPiAgent() em pi-embedded-runner/run.ts:
2. Criação de sessão
Dentro derunEmbeddedAttempt() (chamado por runEmbeddedPiAgent()), o SDK do pi é usado:
3. Assinatura de eventos
subscribeEmbeddedPiSession() assina os eventos do 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. Prompt
Após a configuração, o prompt é enviado à sessão:images apenas para aquele turno. Ele não reanalisa turnos antigos 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
bashporexec/process, personalizaread/edit/writepara sandbox - Ferramentas 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 perfil, provider, agente, grupo e políticas de sandbox
- Normalização de schema: schemas limpos para peculiaridades do Gemini/OpenAI
- Encapsulamento de AbortSignal: ferramentas encapsuladas para respeitar sinais de abort
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 via customTools:
Construção do prompt de sistema
O prompt de sistema é criado embuildAgentSystemPrompt() (system-prompt.ts). Ele monta um prompt completo com seções que incluem Ferramentas, Estilo de chamada de ferramenta, Proteções de segurança, referência da 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 arquivos de contexto e conteúdo extra opcional de prompt de 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 (vinculação por id/parentId). OSessionManager do Pi trata a persistência:
guardSessionManager() para segurança no resultado de ferramentas.
Cache de sessão
session-manager-cache.ts armazena em cache instâncias de SessionManager para evitar análise repetida de arquivos:
Limitação de histórico
limitHistoryTurns() reduz o histórico de conversa com base no tipo de canal (DM vs grupo).
Compactação
A compactação automática é acionada quando há overflow de contexto. Assinaturas comuns de overflow 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() trata a
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 provider: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 comportamento especializado:Proteção de compactação
src/agents/pi-hooks/compaction-safeguard.ts adiciona proteções à compactação, incluindo orçamento adaptativo de tokens, além de 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 cache-TTL:
Streaming e respostas em bloco
Fragmentação em blocos
EmbeddedBlockChunker gerencia 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 de <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 erro
pi-embedded-helpers.ts classifica erros para tratamento adequado:
Fallback de nível de pensamento
Se um nível de pensamento não for suportado, é usado um fallback:Integração com sandbox
Quando o modo sandbox está habilitado, ferramentas e caminhos são restringidos:Tratamento específico por provider
Anthropic
- Limpeza de string mágica de recusa
- Validação de turno para papéis consecutivos
- Validação estrita upstream de parâmetros de ferramenta do Pi
Google/Gemini
- Sanitização de schema de ferramenta pertencente ao plugin
OpenAI
- ferramenta
apply_patchpara modelos Codex - tratamento de downgrade 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 de 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/) |
| Auth | Credencial única | Múltiplos perfis com rotação |
| Extensões | Carregadas do disco | Programáticas + caminhos em disco |
| Tratamento de eventos | Renderização TUI | Baseado em callback (onBlockReply etc.) |
Considerações futuras
Áreas para possível reformulação:- Alinhamento da assinatura de ferramenta: atualmente adaptando entre assinaturas de pi-agent-core e pi-coding-agent
- Encapsulamento de session manager:
guardSessionManageradiciona segurança, mas aumenta a complexidade - Carregamento de extensões: poderia usar o
ResourceLoaderdo pi mais diretamente - Complexidade do manipulador de streaming:
subscribeEmbeddedPiSessioncresceu bastante - Peculiaridades de provider: muitos caminhos de código específicos de provider que o pi talvez pudesse tratar
Testes
A cobertura de 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)