Architektur der Pi-Integration
Dieses Dokument beschreibt, wie OpenClaw mit pi-coding-agent und den zugehörigen Paketen (pi-ai, pi-agent-core, pi-tui) integriert wird, um seine KI-Agent-Funktionen bereitzustellen.
Überblick
OpenClaw verwendet das pi SDK, um einen KI-Coding-Agenten in seine Messaging-Gateway-Architektur einzubetten. Anstatt pi als Unterprozess zu starten oder den RPC-Modus zu verwenden, importiert und instanziiert OpenClaw direkt dieAgentSession von pi über createAgentSession(). Dieser eingebettete Ansatz bietet:
- Volle Kontrolle über Sitzungslebenszyklus und Ereignisverarbeitung
- Benutzerdefinierte Tool-Injektion (Messaging, Sandbox, kanalspezifische Aktionen)
- Anpassung des System-Prompts pro Kanal/Kontext
- Sitzungspersistenz mit Unterstützung für Verzweigung/Kompaktierung
- Rotation von Auth-Profilen für mehrere Konten mit Failover
- Provider-agnostisches Modellwechseln
Paketabhängigkeiten
| Paket | Zweck |
|---|---|
pi-ai | Kernabstraktionen für LLMs: Model, streamSimple, Nachrichtentypen, Provider-APIs |
pi-agent-core | Agent-Schleife, Tool-Ausführung, AgentMessage-Typen |
pi-coding-agent | High-Level-SDK: createAgentSession, SessionManager, AuthStorage, ModelRegistry, integrierte Tools |
pi-tui | Terminal-UI-Komponenten (werden im lokalen TUI-Modus von OpenClaw verwendet) |
Dateistruktur
src/agents/tools, zum Beispiel:
- die Laufzeitdateien für Discord-Plugin-Aktionen
- die Laufzeitdatei für Slack-Plugin-Aktionen
- die Laufzeitdatei für Telegram-Plugin-Aktionen
- die Laufzeitdatei für WhatsApp-Plugin-Aktionen
Kernintegrationsablauf
1. Einen eingebetteten Agenten ausführen
Der Haupteinstiegspunkt istrunEmbeddedPiAgent() in pi-embedded-runner/run.ts:
2. Sitzungserstellung
Innerhalb vonrunEmbeddedAttempt() (aufgerufen von runEmbeddedPiAgent()) wird das pi SDK verwendet:
3. Ereignisabonnement
subscribeEmbeddedPiSession() abonniert die AgentSession-Ereignisse von pi:
message_start/message_end/message_update(gestreamter Text/Thinking)tool_execution_start/tool_execution_update/tool_execution_endturn_start/turn_endagent_start/agent_endauto_compaction_start/auto_compaction_end
4. Prompting
Nach der Einrichtung wird die Sitzung gepromptet:images. Ältere Verlaufszüge werden nicht erneut gescannt,
um Bild-Payloads erneut einzufügen.
Tool-Architektur
Tool-Pipeline
- Basistools: die
codingToolsvon pi (read, bash, edit, write) - Benutzerdefinierte Ersetzungen: OpenClaw ersetzt bash durch
exec/processund passt read/edit/write für die Sandbox an - OpenClaw-Tools: Messaging, Browser, Canvas, Sitzungen, Cron, Gateway usw.
- Kanal-Tools: Discord-/Telegram-/Slack-/WhatsApp-spezifische Aktionstools
- Richtlinienfilterung: Tools werden nach Profil-, Provider-, Agent-, Gruppen- und Sandbox-Richtlinien gefiltert
- Schema-Normalisierung: Schemata werden für Eigenheiten von Gemini/OpenAI bereinigt
- AbortSignal-Wrapper: Tools werden so umschlossen, dass sie Abort-Signale berücksichtigen
Adapter für Tool-Definitionen
DasAgentTool von pi-agent-core hat eine andere execute-Signatur als die ToolDefinition von pi-coding-agent. Der Adapter in pi-tool-definition-adapter.ts überbrückt dies:
Strategie zur Tool-Aufteilung
splitSdkTools() übergibt alle Tools über customTools:
Erstellung des System-Prompts
Der System-Prompt wird inbuildAgentSystemPrompt() (system-prompt.ts) erstellt. Er setzt einen vollständigen Prompt mit Abschnitten wie Tooling, Tool-Aufrufstil, Sicherheitsleitplanken, OpenClaw-CLI-Referenz, Skills, Dokumentation, Workspace, Sandbox, Messaging, Antwort-Tags, Sprache, stille Antworten, Heartbeats, Laufzeitmetadaten sowie bei Aktivierung Speicher und Reaktionen zusammen, zusätzlich zu optionalen Kontextdateien und weiterem Inhalt für den System-Prompt. Für den minimalen Prompt-Modus, der von Unteragenten verwendet wird, werden Abschnitte gekürzt.
Der Prompt wird nach der Sitzungserstellung über applySystemPromptOverrideToSession() angewendet:
Sitzungsverwaltung
Sitzungsdateien
Sitzungen sind JSONL-Dateien mit Baumstruktur (Verknüpfung über id/parentId). DerSessionManager von Pi übernimmt die Persistenz:
guardSessionManager() für die Sicherheit von Tool-Ergebnissen.
Sitzungs-Caching
session-manager-cache.ts cached SessionManager-Instanzen, um wiederholtes Parsen von Dateien zu vermeiden:
Verlaufsbegrenzung
limitHistoryTurns() kürzt den Gesprächsverlauf je nach Kanaltyp (DM vs. Gruppe).
Kompaktierung
Die automatische Kompaktierung wird bei Kontextüberlauf ausgelöst. Gängige Überlaufsignaturen umfassenrequest_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 und ollama error: context length exceeded. compactEmbeddedPiSessionDirect() verarbeitet die manuelle
Kompaktierung:
Authentifizierung und Modellauflösung
Auth-Profile
OpenClaw verwaltet einen Speicher für Auth-Profile mit mehreren API-Schlüsseln pro Provider:Modellauflösung
Failover
FailoverError löst einen Modell-Fallback aus, wenn er konfiguriert ist:
Pi-Erweiterungen
OpenClaw lädt benutzerdefinierte Pi-Erweiterungen für spezialisiertes Verhalten:Schutz bei Kompaktierung
src/agents/pi-hooks/compaction-safeguard.ts fügt Leitplanken für die Kompaktierung hinzu, einschließlich adaptiver Token-Budgetierung sowie Zusammenfassungen von Tool-Fehlern und Dateivorgängen:
Kontextbeschneidung
src/agents/pi-hooks/context-pruning.ts implementiert eine Cache-TTL-basierte Kontextbeschneidung:
Streaming und Blockantworten
Block-Chunking
EmbeddedBlockChunker verwaltet das Streaming von Text in diskrete Antwortblöcke:
Entfernen von Thinking-/Final-Tags
Die Streaming-Ausgabe wird verarbeitet, um<think>-/<thinking>-Blöcke zu entfernen und den Inhalt von <final> zu extrahieren:
Antwortdirektiven
Antwortdirektiven wie[[media:url]], [[voice]], [[reply:id]] werden geparst und extrahiert:
Fehlerbehandlung
Fehlerklassifizierung
pi-embedded-helpers.ts klassifiziert Fehler für eine passende Behandlung:
Thinking-Level-Fallback
Wenn ein Thinking-Level nicht unterstützt wird, wird ein Fallback verwendet:Sandbox-Integration
Wenn der Sandbox-Modus aktiviert ist, werden Tools und Pfade eingeschränkt:Provider-spezifische Behandlung
Anthropic
- Bereinigung des magischen Strings für Verweigerungen
- Zugvalidierung für aufeinanderfolgende Rollen
- Kompatibilität von Claude-Code-Parametern
Google/Gemini
- Plugin-eigene Tool-Schema-Bereinigung
OpenAI
apply_patch-Tool für Codex-Modelle- Behandlung der Herabstufung des Thinking-Levels
TUI-Integration
OpenClaw hat auch einen lokalen TUI-Modus, der pi-tui-Komponenten direkt verwendet:Wichtige Unterschiede zur Pi-CLI
| Aspekt | Pi-CLI | OpenClaw Embedded |
|---|---|---|
| Aufruf | pi-Befehl / RPC | SDK über createAgentSession() |
| Tools | Standard-Coding-Tools | Benutzerdefinierte OpenClaw-Tool-Suite |
| System-Prompt | AGENTS.md + Prompts | Dynamisch pro Kanal/Kontext |
| Sitzungsspeicher | ~/.pi/agent/sessions/ | ~/.openclaw/agents/<agentId>/sessions/ (oder $OPENCLAW_STATE_DIR/agents/<agentId>/sessions/) |
| Auth | Einzelne Anmeldedaten | Mehrere Profile mit Rotation |
| Erweiterungen | Von Datenträger geladen | Programmatisch + Datenträgerpfade |
| Ereignisverarbeitung | TUI-Rendering | Callback-basiert (onBlockReply usw.) |
Zukünftige Überlegungen
Bereiche für mögliche Überarbeitungen:- Abgleich der Tool-Signaturen: Derzeit Anpassung zwischen den Signaturen von pi-agent-core und pi-coding-agent
- Wrapping des Session-Managers:
guardSessionManagersorgt für Sicherheit, erhöht aber die Komplexität - Laden von Erweiterungen: Könnte den
ResourceLoadervon pi direkter verwenden - Komplexität des Streaming-Handlers:
subscribeEmbeddedPiSessionist umfangreich geworden - Provider-Eigenheiten: Viele provider-spezifische Codepfade, die pi möglicherweise selbst behandeln könnte
Tests
Die Abdeckung der Pi-Integration erstreckt sich über diese Suites: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(mitOPENCLAW_LIVE_TEST=1aktivieren)