Architektura integracji Pi
Ten dokument opisuje, jak OpenClaw integruje się z pi-coding-agent i powiązanymi z nim pakietami (pi-ai, pi-agent-core, pi-tui), aby zapewnić możliwości swojego agenta AI.
Przegląd
OpenClaw używa SDK pi do osadzenia agenta kodującego AI w swojej architekturze bramki wiadomości. Zamiast uruchamiać pi jako podproces lub używać trybu RPC, OpenClaw bezpośrednio importuje i tworzy instancjęAgentSession pi za pomocą createAgentSession(). To osadzone podejście zapewnia:
- Pełną kontrolę nad cyklem życia sesji i obsługą zdarzeń
- Niestandardowe wstrzykiwanie narzędzi (wiadomości, sandbox, działania specyficzne dla kanału)
- Dostosowanie promptu systemowego dla każdego kanału/kontekstu
- Trwałość sesji z obsługą rozgałęziania/kompaktowania
- Rotację profili uwierzytelniania wielu kont z mechanizmem failover
- Niezależne od dostawcy przełączanie modeli
Zależności pakietów
| Pakiet | Przeznaczenie |
|---|---|
pi-ai | Podstawowe abstrakcje LLM: Model, streamSimple, typy wiadomości, API dostawcó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 interfejsu użytkownika (używane w lokalnym trybie TUI OpenClaw) |
Struktura plików
src/agents/tools, na przykład:
- pliki środowiska uruchomieniowego działań wtyczki Discord
- plik środowiska uruchomieniowego działań wtyczki Slack
- plik środowiska uruchomieniowego działań wtyczki Telegram
- plik środowiska uruchomieniowego działań wtyczki 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(strumieniowy tekst/myślenie)tool_execution_start/tool_execution_update/tool_execution_endturn_start/turn_endagent_start/agent_endauto_compaction_start/auto_compaction_end
4. Promptowanie
Po konfiguracji sesja otrzymuje prompt:images tylko dla tej tury. Nie skanuje ponownie starszych tur historii, aby ponownie wstrzyknąć payloady 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/writedla sandboxa - Narzędzia OpenClaw: wiadomości, przeglądarka, canvas, sesje, cron, gateway itd.
- Narzędzia kanałów: narzędzia działań specyficzne dla Discord/Telegram/Slack/WhatsApp
- Filtrowanie polityk: narzędzia filtrowane według profilu, dostawcy, agenta, grupy i polityk sandboxa
- Normalizacja schematu: schematy czyszczone pod kątem specyfiki Gemini/OpenAI
- Opakowanie AbortSignal: narzędzia opakowane tak, by respektowały sygnały przerwania
Adapter definicji narzędzia
AgentTool z pi-agent-core ma inną sygnaturę execute niż ToolDefinition z pi-coding-agent. Adapter w pi-tool-definition-adapter.ts łączy te interfejsy:
Strategia podziału narzędzi
splitSdkTools() przekazuje wszystkie narzędzia przez customTools:
Konstrukcja promptu systemowego
Prompt systemowy jest budowany wbuildAgentSystemPrompt() (system-prompt.ts). Składa on pełny prompt z sekcjami obejmującymi Narzędzia, Styl wywołań narzędzi, Zabezpieczenia, referencję CLI OpenClaw, Skills, Dokumentację, Obszar roboczy, Sandbox, Wiadomości, Tagi odpowiedzi, Głos, Ciche odpowiedzi, Heartbeats, metadane środowiska uruchomieniowego, a także Pamięć i Reakcje, gdy są włączone, oraz opcjonalne pliki kontekstowe i dodatkową treść promptu systemowego. Sekcje są przycinane w minimalnym trybie promptu używanym przez podagentów.
Prompt jest stosowany po utworzeniu sesji przez applySystemPromptOverrideToSession():
Zarządzanie sesjami
Pliki sesji
Sesje to pliki JSONL o strukturze drzewa (powiązaniaid/parentId). Trwałością zarządza SessionManager 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 pliku:
Ograniczanie historii
limitHistoryTurns() przycina historię rozmowy w zależności od typu kanału (DM vs grupa).
Kompaktowanie
Automatyczne kompaktowanie 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. compactEmbeddedPiSessionDirect() obsługuje ręczne
kompaktowanie:
Uwierzytelnianie i rozwiązywanie modeli
Profile uwierzytelniania
OpenClaw utrzymuje magazyn profili uwierzytelniania z wieloma kluczami API dla każdego dostawcy:Rozwiązywanie modelu
Failover
FailoverError uruchamia awaryjne przełączenie modelu, gdy jest skonfigurowane:
Rozszerzenia Pi
OpenClaw ładuje niestandardowe rozszerzenia pi dla wyspecjalizowanych zachowań:Zabezpieczenie kompaktowania
src/agents/pi-hooks/compaction-safeguard.ts dodaje zabezpieczenia do kompaktowania, 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 TTL cache:
Strumieniowanie i odpowiedzi blokowe
Dzielenie bloków
EmbeddedBlockChunker zarządza strumieniowaniem tekstu do oddzielnych bloków odpowiedzi:
Usuwanie tagów thinking/final
Dane wyjściowe strumieniowania są przetwarzane w celu usunięcia bloków<think>/<thinking> i wyodrębnienia treś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 sandbox jest włączony, narzędzia i ścieżki są ograniczone:Obsługa specyficzna dla dostawcy
Anthropic
- Usuwanie magicznego ciągu odmowy
- Walidacja tur dla kolejnych ról
- Zgodność parametrów Claude Code
Google/Gemini
- Oczyszczanie schematu narzędzi należących do wtyczki
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 do kodowania | Niestandardowy zestaw narzędzi OpenClaw |
| Prompt systemowy | AGENTS.md + prompty | Dynamiczny dla każdego kanału/kontekstu |
| Przechowywanie sesji | ~/.pi/agent/sessions/ | ~/.openclaw/agents/<agentId>/sessions/ (lub $OPENCLAW_STATE_DIR/agents/<agentId>/sessions/) |
| Uwierzytelnianie | Pojedyncze poświadczenie | Wiele profili z rotacją |
| Rozszerzenia | Ładowane z dysku | Ścieżki programowe + dyskowe |
| Obsługa zdarzeń | Renderowanie TUI | Oparta 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 menedżera sesji:
guardSessionManagerzwiększa bezpieczeństwo, ale podnosi złożoność - Ładowanie rozszerzeń: można by bardziej bezpośrednio używać
ResourceLoaderz pi - Złożoność obsługi strumieniowania:
subscribeEmbeddedPiSessionznacznie się rozrósł - Specyfika dostawców: wiele ścieżek kodu zależnych od dostawcy, które pi mogłoby 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łączOPENCLAW_LIVE_TEST=1)