Architettura dell’integrazione Pi
Questo documento descrive come OpenClaw si integra con pi-coding-agent e i suoi pacchetti correlati (pi-ai, pi-agent-core, pi-tui) per alimentare le proprie capacità di agente AI.
Panoramica
OpenClaw usa l’SDK pi per incorporare un agente di coding AI nella propria architettura gateway di messaggistica. Invece di avviare pi come sottoprocesso o usare la modalità RPC, OpenClaw importa e istanzia direttamenteAgentSession di pi tramite createAgentSession(). Questo approccio incorporato fornisce:
- Controllo completo sul ciclo di vita della sessione e sulla gestione degli eventi
- Iniezione di strumenti personalizzati (messaggistica, sandbox, azioni specifiche del canale)
- Personalizzazione del system prompt per canale/contesto
- Persistenza della sessione con supporto per branching/compaction
- Rotazione del profilo auth multi-account con failover
- Cambio modello indipendente dal provider
Dipendenze dei pacchetti
| Pacchetto | Scopo |
|---|---|
pi-ai | Astrazioni LLM di base: Model, streamSimple, tipi di messaggio, API provider |
pi-agent-core | Loop dell’agente, esecuzione degli strumenti, tipi AgentMessage |
pi-coding-agent | SDK di alto livello: createAgentSession, SessionManager, AuthStorage, ModelRegistry, strumenti integrati |
pi-tui | Componenti UI terminale (usati nella modalità TUI locale di OpenClaw) |
Struttura dei file
src/agents/tools, per esempio:
- i file runtime delle azioni del plugin Discord
- il file runtime delle azioni del plugin Slack
- il file runtime delle azioni del plugin Telegram
- il file runtime delle azioni del plugin WhatsApp
Flusso di integrazione principale
1. Esecuzione di un agente incorporato
Il punto di ingresso principale èrunEmbeddedPiAgent() in pi-embedded-runner/run.ts:
2. Creazione della sessione
All’interno dirunEmbeddedAttempt() (chiamato da runEmbeddedPiAgent()), viene usato l’SDK pi:
3. Sottoscrizione agli eventi
subscribeEmbeddedPiSession() si sottoscrive agli eventi AgentSession di pi:
message_start/message_end/message_update(testo/ragionamento in streaming)tool_execution_start/tool_execution_update/tool_execution_endturn_start/turn_endagent_start/agent_endauto_compaction_start/auto_compaction_end
4. Prompting
Dopo la configurazione, la sessione riceve il prompt:images solo per quel turno. Non riesegue la scansione dei turni precedenti della cronologia
per reiniettare i payload immagine.
Architettura degli strumenti
Pipeline degli strumenti
- Strumenti di base:
codingToolsdi pi (read, bash, edit, write) - Sostituzioni personalizzate: OpenClaw sostituisce bash con
exec/process, personalizza read/edit/write per la sandbox - Strumenti OpenClaw: messaggistica, browser, canvas, sessioni, cron, gateway, ecc.
- Strumenti del canale: strumenti di azione specifici per Discord/Telegram/Slack/WhatsApp
- Filtraggio tramite policy: strumenti filtrati per profilo, provider, agente, gruppo, policy sandbox
- Normalizzazione degli schemi: schemi ripuliti per le particolarità di Gemini/OpenAI
- Wrapping AbortSignal: strumenti incapsulati per rispettare i segnali di interruzione
Adapter delle definizioni degli strumenti
L’AgentTool di pi-agent-core ha una firma execute diversa da ToolDefinition di pi-coding-agent. L’adapter in pi-tool-definition-adapter.ts colma questa differenza:
Strategia di divisione degli strumenti
splitSdkTools() passa tutti gli strumenti tramite customTools:
Costruzione del system prompt
Il system prompt viene costruito inbuildAgentSystemPrompt() (system-prompt.ts). Assembla un prompt completo con sezioni che includono Tooling, Tool Call Style, Safety guardrails, riferimento CLI di OpenClaw, Skills, Docs, Workspace, Sandbox, Messaging, Reply Tags, Voice, Silent Replies, Heartbeats, metadati runtime, oltre a Memory e Reactions quando abilitati, e file di contesto facoltativi e contenuto extra del system prompt. Le sezioni vengono ridotte per la modalità prompt minima usata dai subagent.
Il prompt viene applicato dopo la creazione della sessione tramite applySystemPromptOverrideToSession():
Gestione della sessione
File di sessione
Le sessioni sono file JSONL con struttura ad albero (collegamento id/parentId). IlSessionManager di Pi gestisce la persistenza:
guardSessionManager() per la sicurezza dei risultati degli strumenti.
Caching della sessione
session-manager-cache.ts mette in cache le istanze SessionManager per evitare il parsing ripetuto dei file:
Limitazione della cronologia
limitHistoryTurns() riduce la cronologia della conversazione in base al tipo di canale (DM vs gruppo).
Compaction
La compaction automatica si attiva in caso di overflow del contesto. Le firme comuni di overflow includonorequest_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() gestisce la
compaction manuale:
Autenticazione e risoluzione del modello
Profili auth
OpenClaw mantiene uno store di profili auth con più chiavi API per provider:Risoluzione del modello
Failover
FailoverError attiva il fallback del modello quando configurato:
Estensioni Pi
OpenClaw carica estensioni pi personalizzate per comportamenti specializzati:Protezione compaction
src/agents/pi-hooks/compaction-safeguard.ts aggiunge guardrail alla compaction, inclusi budgeting adattivo dei token più riepiloghi di errori degli strumenti e operazioni sui file:
Pruning del contesto
src/agents/pi-hooks/context-pruning.ts implementa il pruning del contesto basato su cache-TTL:
Streaming e risposte a blocchi
Chunking a blocchi
EmbeddedBlockChunker gestisce lo streaming del testo in blocchi di risposta discreti:
Rimozione dei tag Thinking/Final
L’output streaming viene elaborato per rimuovere i blocchi<think>/<thinking> ed estrarre il contenuto <final>:
Direttive di risposta
Le direttive di risposta come[[media:url]], [[voice]], [[reply:id]] vengono analizzate ed estratte:
Gestione degli errori
Classificazione degli errori
pi-embedded-helpers.ts classifica gli errori per una gestione appropriata:
Fallback del livello di thinking
Se un livello di thinking non è supportato, viene eseguito un fallback:Integrazione sandbox
Quando la modalità sandbox è abilitata, strumenti e percorsi sono vincolati:Gestione specifica del provider
Anthropic
- Rimozione della stringa magica di rifiuto
- Validazione dei turni per ruoli consecutivi
- Validazione rigorosa upstream dei parametri degli strumenti di Pi
Google/Gemini
- Sanitizzazione dello schema degli strumenti gestita dal plugin
OpenAI
- Strumento
apply_patchper i modelli Codex - Gestione del downgrade del livello di thinking
Integrazione TUI
OpenClaw ha anche una modalità TUI locale che usa direttamente i componenti pi-tui:Differenze chiave rispetto alla CLI di Pi
| Aspetto | CLI di Pi | OpenClaw Embedded |
|---|---|---|
| Invocazione | comando pi / RPC | SDK tramite createAgentSession() |
| Strumenti | Strumenti di coding predefiniti | Suite di strumenti OpenClaw personalizzata |
| System prompt | AGENTS.md + prompt | Dinamico per canale/contesto |
| Archiviazione sessione | ~/.pi/agent/sessions/ | ~/.openclaw/agents/<agentId>/sessions/ (o $OPENCLAW_STATE_DIR/agents/<agentId>/sessions/) |
| Auth | Credenziale singola | Multi-profilo con rotazione |
| Estensioni | Caricate da disco | Programmatiche + percorsi su disco |
| Gestione eventi | Rendering TUI | Basata su callback (onBlockReply, ecc.) |
Considerazioni future
Aree per possibili rielaborazioni:- Allineamento della firma degli strumenti: al momento c’è un adattamento tra le firme di pi-agent-core e pi-coding-agent
- Wrapping del session manager:
guardSessionManageraggiunge sicurezza ma aumenta la complessità - Caricamento delle estensioni: potrebbe usare
ResourceLoaderdi pi più direttamente - Complessità del gestore streaming:
subscribeEmbeddedPiSessionè cresciuto molto - Particolarità dei provider: molti percorsi di codice specifici del provider che pi potrebbe potenzialmente gestire
Test
La copertura dell’integrazione Pi si estende a queste suite: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(abilitaOPENCLAW_LIVE_TEST=1)