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 fornire le sue capacità di agente AI.
Panoramica
OpenClaw usa l’SDK pi per incorporare un agente di coding AI nella propria architettura di 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 offre:
- 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 prompt di sistema per canale/contesto
- Persistenza della sessione con supporto per branching/compaction
- Rotazione multi-account dei profili di autenticazione con failover
- Cambio di 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 built-in |
pi-tui | Componenti UI terminale (usati nella modalità TUI locale di OpenClaw) |
Struttura dei file
src/agents/tools, ad esempio:
- i file del runtime delle azioni del plugin Discord
- il file del runtime delle azioni del plugin Slack
- il file del runtime delle azioni del plugin Telegram
- il file del 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(streaming di testo/thinking)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, viene inviato il prompt alla sessione:images solo per quel turno. Non riesegue la scansione dei turni più vecchi 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, sessions, cron, gateway, ecc.
- Strumenti del canale: strumenti di azione specifici per Discord/Telegram/Slack/WhatsApp
- Filtraggio tramite criterio: strumenti filtrati per profilo, provider, agente, gruppo, criteri sandbox
- Normalizzazione dello schema: schemi ripuliti per le particolarità di Gemini/OpenAI
- Wrapping AbortSignal: strumenti wrappati per rispettare gli abort signal
Adattatore della definizione degli strumenti
L’AgentTool di pi-agent-core ha una firma execute diversa da ToolDefinition di pi-coding-agent. L’adattatore in pi-tool-definition-adapter.ts fa da ponte:
Strategia di suddivisione degli strumenti
splitSdkTools() passa tutti gli strumenti tramite customTools:
Costruzione del prompt di sistema
Il prompt di sistema viene costruito inbuildAgentSystemPrompt() (system-prompt.ts). Assembla un prompt completo con sezioni che includono Tooling, Tool Call Style, guardrail di sicurezza, riferimento CLI di OpenClaw, Skills, documentazione, workspace, sandbox, messaggistica, Reply Tags, voce, risposte silenziose, heartbeat, metadati runtime, più Memory e Reactions quando abilitati, oltre a eventuali file di contesto e contenuto extra del prompt di sistema. Le sezioni vengono ridotte per la modalità prompt minimale 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).SessionManager 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 parsing ripetuti dei file:
Limitazione della cronologia
limitHistoryTurns() riduce la cronologia della conversazione in base al tipo di canale (DM vs gruppo).
Compattazione
La compattazione 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
compattazione manuale:
Autenticazione e risoluzione del modello
Profili di autenticazione
OpenClaw mantiene un archivio di profili auth con più API key per provider:Risoluzione del modello
Failover
FailoverError attiva il fallback del modello quando configurato:
Estensioni Pi
OpenClaw carica estensioni pi personalizzate per comportamenti specializzati:Compaction Safeguard
src/agents/pi-hooks/compaction-safeguard.ts aggiunge guardrail alla compattazione, inclusi budgeting adattivo dei token più riepiloghi dei fallimenti degli strumenti e delle operazioni sui file:
Context Pruning
src/agents/pi-hooks/context-pruning.ts implementa il pruning del contesto basato su cache-TTL:
Streaming e risposte a blocchi
Block Chunking
EmbeddedBlockChunker gestisce il testo in streaming trasformandolo in blocchi di risposta discreti:
Rimozione dei tag Thinking/Final
L’output in 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 usato un fallback:Integrazione della sandbox
Quando la modalità sandbox è abilitata, strumenti e percorsi vengono limitati:Gestione specifica per provider
Anthropic
- Rimozione della magic string di rifiuto
- Convalida del turno per ruoli consecutivi
- Compatibilità dei parametri Claude Code
Google/Gemini
- Sanitizzazione dello schema degli strumenti posseduti 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 principali rispetto alla CLI di Pi
| Aspetto | CLI di Pi | OpenClaw incorporato |
|---|---|---|
| Invocazione | comando pi / RPC | SDK tramite createAgentSession() |
| Strumenti | Strumenti di coding predefiniti | Suite di strumenti OpenClaw personalizzata |
| Prompt di sistema | AGENTS.md + prompt | Dinamico per canale/contesto |
| Archiviazione sessione | ~/.pi/agent/sessions/ | ~/.openclaw/agents/<agentId>/sessions/ (oppure $OPENCLAW_STATE_DIR/agents/<agentId>/sessions/) |
| Auth | Credenziale singola | Multi-profile con rotazione |
| Estensioni | Caricate da disco | Percorsi programmatici + su disco |
| Gestione eventi | Rendering TUI | Basata su callback (onBlockReply, ecc.) |
Considerazioni future
Aree di possibile rielaborazione:- Allineamento della firma degli strumenti: attualmente vengono adattate le firme tra pi-agent-core e pi-coding-agent
- Wrapping del session manager:
guardSessionManageraggiunge sicurezza ma aumenta la complessità - Caricamento delle estensioni: potrebbe usare più direttamente
ResourceLoaderdi pi - Complessità dell’handler di streaming:
subscribeEmbeddedPiSessionè diventato grande - Particolarità dei provider: molti percorsi di codice specifici per 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)