Architektura integracji Pi
Ten dokument opisuje, jak OpenClaw integruje się z pi-coding-agent i jego siostrzanymi pakietami (pi-ai, pi-agent-core, pi-tui), aby obsługiwać możliwości swojego agenta AI.
Przegląd
OpenClaw używa SDK Pi do osadzenia agenta kodującego AI w swojej architekturze Gateway wiadomości. Zamiast uruchamiać Pi jako podproces lub używać trybu RPC, OpenClaw bezpośrednio importuje i tworzy instancjęAgentSession Pi przez createAgentSession(). To osadzone podejście zapewnia:
- Pełną kontrolę nad cyklem życia sesji i obsługą zdarzeń
- Wstrzykiwanie niestandardowych narzędzi (wiadomości, sandbox, akcje specyficzne dla kanału)
- Dostosowanie system promptu dla kanału/kontekstu
- Trwałość sesji z obsługą branching/Compaction
- Rotację profili uwierzytelniania wielokontowego z failover
- Niezależne od providera przełączanie modeli
Zależności pakietów
| Pakiet | Cel |
|---|---|
pi-ai | Podstawowe abstrakcje LLM: Model, streamSimple, typy wiadomości, API providerów |
pi-agent-core | Pętla agenta, wykonywanie narzędzi, typy AgentMessage |
pi-coding-agent | SDK wysokiego poziomu: createAgentSession, SessionManager, AuthStorage, ModelRegistry, wbudowane narzędzia |
pi-tui | Komponenty terminalowego UI (używane w lokalnym trybie TUI OpenClaw) |
Struktura plików
src/agents/tools, na przykład:
- pliki runtime akcji pluginu Discord
- plik runtime akcji pluginu Slack
- plik runtime akcji pluginu Telegram
- plik runtime akcji pluginu WhatsApp
Główny przepływ integracji
1. Uruchamianie osadzonego agenta
Głównym punktem wejścia jestrunEmbeddedPiAgent() w pi-embedded-runner/run.ts:
2. Tworzenie sesji
WewnątrzrunEmbeddedAttempt() (wywoływanego przez runEmbeddedPiAgent()) używane jest SDK Pi:
3. Subskrypcja zdarzeń
subscribeEmbeddedPiSession() subskrybuje zdarzenia AgentSession z Pi:
message_start/message_end/message_update(strumieniowanie tekstu/myślenia)tool_execution_start/tool_execution_update/tool_execution_endturn_start/turn_endagent_start/agent_endcompaction_start/compaction_end
4. Promptowanie
Po konfiguracji sesja otrzymuje prompt:images tylko dla tej tury. Nie skanuje ponownie starszych tur historii
w celu ponownego wstrzyknięcia payloadów obrazów.
Architektura narzędzi
Pipeline narzędzi
- Narzędzia bazowe:
codingToolsz Pi (read,bash,edit,write) - Niestandardowe zamienniki: OpenClaw zastępuje
bashprzezexec/process, dostosowujeread/edit/writepod sandbox - Narzędzia OpenClaw: wiadomości, browser, canvas, sesje, Cron, Gateway itd.
- Narzędzia kanałów: narzędzia akcji specyficzne dla Discord/Telegram/Slack/WhatsApp
- Filtrowanie polityk: narzędzia filtrowane według profilu, providera, agenta, grupy i polityk sandboxa
- Normalizacja schematu: schematy czyszczone pod kątem specyfiki Gemini/OpenAI
- Opakowywanie AbortSignal: narzędzia opakowywane tak, aby respektowały sygnały przerwania
Adapter definicji narzędzi
AgentTool z pi-agent-core ma inną sygnaturę execute niż ToolDefinition z pi-coding-agent. Adapter w pi-tool-definition-adapter.ts łączy te dwa światy:
Strategia podziału narzędzi
splitSdkTools() przekazuje wszystkie narzędzia przez customTools:
Budowanie system promptu
System prompt jest budowany wbuildAgentSystemPrompt() (system-prompt.ts). Składa on pełny prompt z sekcjami obejmującymi Tooling, Tool Call Style, zabezpieczenia Safety, referencję CLI OpenClaw, Skills, dokumentację, Workspace, Sandbox, Messaging, Reply Tags, Voice, Silent Replies, Heartbeat, metadane runtime, a także Memory i Reactions, gdy są włączone, plus opcjonalne pliki kontekstowe i dodatkową zawartość system promptu. Sekcje są przycinane dla minimalnego trybu promptu używanego przez subagentów.
Prompt jest stosowany po utworzeniu sesji przez applySystemPromptOverrideToSession():
Zarządzanie sesją
Pliki sesji
Sesje są plikami JSONL o strukturze drzewa (łączenie przez id/parentId). Trwałość obsługujeSessionManager z Pi:
guardSessionManager() dla bezpieczeństwa wyników narzędzi.
Cache sesji
session-manager-cache.ts przechowuje instancje SessionManager w cache, aby uniknąć wielokrotnego parsowania plików:
Ograniczanie historii
limitHistoryTurns() przycina historię konwersacji zależnie od typu kanału (wiadomości prywatne vs grupa).
Compaction
Automatyczny Compaction uruchamia się przy przepełnieniu kontekstu. Typowe sygnatury przepełnienia obejmująrequest_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 oraz ollama error: context length exceeded. Ręczny Compaction obsługuje compactEmbeddedPiSessionDirect():
Uwierzytelnianie i rozwiązywanie modeli
Profile uwierzytelniania
OpenClaw utrzymuje magazyn profili uwierzytelniania z wieloma kluczami API na providera:Rozwiązywanie modeli
Failover
FailoverError wyzwala fallback modelu, gdy jest skonfigurowany:
Rozszerzenia Pi
OpenClaw ładuje niestandardowe rozszerzenia Pi dla wyspecjalizowanego zachowania:Zabezpieczenie Compaction
src/agents/pi-hooks/compaction-safeguard.ts dodaje zabezpieczenia do Compaction, w tym adaptacyjne budżetowanie tokenów oraz podsumowania awarii narzędzi i operacji na plikach:
Przycinanie kontekstu
src/agents/pi-hooks/context-pruning.ts implementuje przycinanie kontekstu oparte na Cache-TTL:
Strumieniowanie i odpowiedzi blokowe
Dzielenie bloków na części
EmbeddedBlockChunker zarządza strumieniowaniem tekstu do oddzielnych bloków odpowiedzi:
Usuwanie tagów thinking/final
Wyjście strumieniowe jest przetwarzane w celu usunięcia bloków<think>/<thinking> i wyodrębnienia zawartości <final>:
Dyrektywy odpowiedzi
Dyrektywy odpowiedzi, takie jak[[media:url]], [[voice]], [[reply:id]], są parsowane i wyodrębniane:
Obsługa błędów
Klasyfikacja błędów
pi-embedded-helpers.ts klasyfikuje błędy do odpowiedniej obsługi:
Fallback poziomu myślenia
Jeśli poziom myślenia nie jest obsługiwany, następuje fallback:Integracja sandboxa
Gdy tryb sandboxa jest włączony, narzędzia i ścieżki są ograniczone:Obsługa specyficzna dla providera
Anthropic
- Usuwanie magicznego ciągu odmowy
- Walidacja tur dla kolejnych ról
- Ścisła walidacja parametrów narzędzi Pi po stronie upstream
Google/Gemini
- Sanitizacja schematu narzędzi należących do pluginów
OpenAI
- Narzędzie
apply_patchdla modeli Codex - Obsługa obniżenia poziomu myślenia
Integracja TUI
OpenClaw ma też lokalny tryb TUI, który bezpośrednio używa komponentów pi-tui:Kluczowe różnice względem Pi CLI
| Aspekt | Pi CLI | OpenClaw Embedded |
|---|---|---|
| Wywołanie | polecenie pi / RPC | SDK przez createAgentSession() |
| Narzędzia | Domyślne narzędzia kodujące | Niestandardowy zestaw narzędzi OpenClaw |
| System prompt | AGENTS.md + prompty | Dynamiczny per kanał/kontekst |
| Przechowywanie sesji | ~/.pi/agent/sessions/ | ~/.openclaw/agents/<agentId>/sessions/ (lub $OPENCLAW_STATE_DIR/agents/<agentId>/sessions/) |
| Auth | Jedno poświadczenie | Wiele profili z rotacją |
| Rozszerzenia | Ładowane z dysku | Ścieżki programowe + dyskowe |
| Obsługa zdarzeń | Renderowanie TUI | Oparte na callbackach (onBlockReply itd.) |
Przyszłe kwestie do rozważenia
Obszary potencjalnej przebudowy:- Dopasowanie sygnatur narzędzi: obecnie trwa adaptacja między sygnaturami pi-agent-core i pi-coding-agent
- Opakowanie session managera:
guardSessionManagerdodaje bezpieczeństwo, ale zwiększa złożoność - Ładowanie rozszerzeń: można by używać
ResourceLoaderz Pi bardziej bezpośrednio - Złożoność handlera strumieniowania:
subscribeEmbeddedPiSessionznacznie się rozrósł - Specyfika providerów: wiele ścieżek kodu specyficznych dla providerów, które Pi mógłby potencjalnie obsługiwać
Testy
Pokrycie integracji Pi obejmuje te zestawy: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(włącz przezOPENCLAW_LIVE_TEST=1)