Architecture d’intégration Pi
Ce document décrit comment OpenClaw s’intègre à pi-coding-agent et à ses packages frères (pi-ai, pi-agent-core, pi-tui) pour fournir ses capacités d’agent IA.
Vue d’ensemble
OpenClaw utilise le SDK pi pour intégrer un agent de codage IA dans son architecture de gateway de messagerie. Au lieu de lancer pi comme sous-processus ou d’utiliser le mode RPC, OpenClaw importe et instancie directementAgentSession de pi via createAgentSession(). Cette approche embarquée offre :
- Contrôle total du cycle de vie des sessions et de la gestion des événements
- Injection d’outils personnalisés (messagerie, sandbox, actions spécifiques au canal)
- Personnalisation du prompt système par canal/contexte
- Persistance des sessions avec prise en charge des branches/de la compaction
- Rotation des profils d’authentification multi-comptes avec basculement
- Changement de modèle indépendant du fournisseur
Dépendances de package
| Package | Rôle |
|---|---|
pi-ai | Abstractions LLM de base : Model, streamSimple, types de messages, API fournisseurs |
pi-agent-core | Boucle d’agent, exécution d’outils, types AgentMessage |
pi-coding-agent | SDK de haut niveau : createAgentSession, SessionManager, AuthStorage, ModelRegistry, outils intégrés |
pi-tui | Composants d’UI terminal (utilisés dans le mode TUI local d’OpenClaw) |
Structure des fichiers
src/agents/tools, par exemple :
- les fichiers de runtime d’action du plugin Discord
- le fichier de runtime d’action du plugin Slack
- le fichier de runtime d’action du plugin Telegram
- le fichier de runtime d’action du plugin WhatsApp
Flux d’intégration principal
1. Exécuter un agent embarqué
Le point d’entrée principal estrunEmbeddedPiAgent() dans pi-embedded-runner/run.ts :
2. Création de session
À l’intérieur derunEmbeddedAttempt() (appelé par runEmbeddedPiAgent()), le SDK pi est utilisé :
3. Abonnement aux événements
subscribeEmbeddedPiSession() s’abonne aux événements AgentSession de pi :
message_start/message_end/message_update(texte/réflexion en streaming)tool_execution_start/tool_execution_update/tool_execution_endturn_start/turn_endagent_start/agent_endauto_compaction_start/auto_compaction_end
4. Prompting
Après la configuration, la session reçoit un prompt :images pour ce tour uniquement. Il ne rescane pas les anciens tours d’historique
pour réinjecter des charges utiles d’image.
Architecture des outils
Pipeline d’outils
- Outils de base :
codingToolsde pi (read, bash, edit, write) - Remplacements personnalisés : OpenClaw remplace bash par
exec/process, personnalise read/edit/write pour la sandbox - Outils OpenClaw : messagerie, navigateur, canvas, sessions, cron, gateway, etc.
- Outils de canal : outils d’action spécifiques à Discord/Telegram/Slack/WhatsApp
- Filtrage de politique : outils filtrés par profil, fournisseur, agent, groupe, politiques sandbox
- Normalisation de schéma : schémas nettoyés pour les particularités Gemini/OpenAI
- Enrobage AbortSignal : outils enveloppés pour respecter les signaux d’abandon
Adaptateur Tool Definition
LeAgentTool de pi-agent-core a une signature execute différente de celle de ToolDefinition de pi-coding-agent. L’adaptateur dans pi-tool-definition-adapter.ts fait le pont :
Stratégie de séparation des outils
splitSdkTools() passe tous les outils via customTools :
Construction du prompt système
Le prompt système est construit dansbuildAgentSystemPrompt() (system-prompt.ts). Il assemble un prompt complet avec des sections incluant Outillage, Style d’appel d’outil, garde-fous de sécurité, référence CLI OpenClaw, Skills, Docs, Espace de travail, Sandbox, Messagerie, Balises de réponse, Voix, Réponses silencieuses, Heartbeats, métadonnées de runtime, plus Mémoire et Réactions lorsqu’elles sont activées, ainsi que des fichiers de contexte et du contenu de prompt système supplémentaire facultatifs. Les sections sont réduites pour le mode de prompt minimal utilisé par les sous-agents.
Le prompt est appliqué après la création de session via applySystemPromptOverrideToSession() :
Gestion des sessions
Fichiers de session
Les sessions sont des fichiers JSONL avec structure en arbre (liaison id/parentId). LeSessionManager de Pi gère la persistance :
guardSessionManager() pour la sécurité des résultats d’outils.
Mise en cache des sessions
session-manager-cache.ts met en cache les instances SessionManager pour éviter l’analyse répétée des fichiers :
Limitation de l’historique
limitHistoryTurns() réduit l’historique de conversation selon le type de canal (DM vs groupe).
Compaction
L’auto-compaction se déclenche lors d’un dépassement du contexte. Les signatures courantes de dépassement incluentrequest_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 et ollama error: context length exceeded. compactEmbeddedPiSessionDirect() gère la
compaction manuelle :
Authentification et résolution des modèles
Profils d’authentification
OpenClaw maintient un magasin de profils d’authentification avec plusieurs clés API par fournisseur :Résolution des modèles
Basculement
FailoverError déclenche une solution de repli de modèle lorsqu’elle est configurée :
Extensions Pi
OpenClaw charge des extensions pi personnalisées pour des comportements spécialisés :Garde-fou de compaction
src/agents/pi-hooks/compaction-safeguard.ts ajoute des garde-fous à la compaction, y compris une budgétisation adaptative des jetons ainsi que des résumés d’échecs d’outils et d’opérations sur fichiers :
Élagage du contexte
src/agents/pi-hooks/context-pruning.ts implémente un élagage du contexte basé sur le cache-TTL :
Streaming et réponses en blocs
Segmentation par blocs
EmbeddedBlockChunker gère le streaming du texte en blocs de réponse distincts :
Suppression des balises Thinking/Final
La sortie en streaming est traitée pour supprimer les blocs<think>/<thinking> et extraire le contenu <final> :
Directives de réponse
Les directives de réponse comme[[media:url]], [[voice]], [[reply:id]] sont analysées et extraites :
Gestion des erreurs
Classification des erreurs
pi-embedded-helpers.ts classe les erreurs pour un traitement approprié :
Solution de repli du niveau de réflexion
Si un niveau de réflexion n’est pas pris en charge, il revient à un autre :Intégration sandbox
Lorsque le mode sandbox est activé, les outils et chemins sont contraints :Gestion spécifique aux fournisseurs
Anthropic
- Nettoyage des chaînes magiques de refus
- Validation des tours pour les rôles consécutifs
- Compatibilité des paramètres Claude Code
Google/Gemini
- Assainissement du schéma d’outils appartenant au plugin
OpenAI
- Outil
apply_patchpour les modèles Codex - Gestion de la dégradation du niveau de réflexion
Intégration TUI
OpenClaw dispose aussi d’un mode TUI local qui utilise directement les composants pi-tui :Différences clés par rapport à Pi CLI
| Aspect | Pi CLI | OpenClaw embarqué |
|---|---|---|
| Invocation | commande pi / RPC | SDK via createAgentSession() |
| Outils | Outils de codage par défaut | Suite d’outils OpenClaw personnalisée |
| Prompt système | AGENTS.md + prompts | Dynamique par canal/contexte |
| Stockage des sessions | ~/.pi/agent/sessions/ | ~/.openclaw/agents/<agentId>/sessions/ (ou $OPENCLAW_STATE_DIR/agents/<agentId>/sessions/) |
| Authentification | Identifiant unique | Multi-profils avec rotation |
| Extensions | Chargées depuis le disque | Chemins programmatiques + disque |
| Gestion des événements | Rendu TUI | Basée sur callbacks (onBlockReply, etc.) |
Considérations futures
Zones possibles de refonte :- Alignement des signatures d’outils : adaptation actuelle entre les signatures pi-agent-core et pi-coding-agent
- Enrobage du gestionnaire de session :
guardSessionManagerajoute de la sécurité mais augmente la complexité - Chargement des extensions : pourrait utiliser plus directement
ResourceLoaderde pi - Complexité du gestionnaire de streaming :
subscribeEmbeddedPiSessionest devenu volumineux - Particularités des fournisseurs : nombreux chemins de code spécifiques aux fournisseurs que pi pourrait éventuellement gérer
Tests
La couverture de l’intégration Pi s’étend aux suites suivantes :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(activer avecOPENCLAW_LIVE_TEST=1)