Архітектура інтеграції Pi
Цей документ описує, як OpenClaw інтегрується з pi-coding-agent та його спорідненими пакетами (pi-ai, pi-agent-core, pi-tui) для забезпечення можливостей свого AI-агента.
Огляд
OpenClaw використовує SDK pi, щоб вбудувати AI-агента для програмування у свою архітектуру шлюзу повідомлень. Замість запуску pi як підпроцесу або використання режиму RPC, OpenClaw безпосередньо імпортує та створюєAgentSession через createAgentSession(). Цей вбудований підхід забезпечує:
- Повний контроль над життєвим циклом сесії та обробкою подій
- Впровадження власних інструментів (повідомлення, пісочниця, дії для конкретного каналу)
- Налаштування системного prompt для кожного каналу/контексту
- Збереження сесії з підтримкою гілкування/Compaction
- Ротацію профілів автентифікації для кількох облікових записів із резервним перемиканням
- Незалежне від провайдера перемикання моделей
Залежності пакетів
| Пакет | Призначення |
|---|---|
pi-ai | Базові абстракції LLM: Model, streamSimple, типи повідомлень, API провайдерів |
pi-agent-core | Цикл агента, виконання інструментів, типи AgentMessage |
pi-coding-agent | Високорівневий SDK: createAgentSession, SessionManager, AuthStorage, ModelRegistry, вбудовані інструменти |
pi-tui | Компоненти термінального UI (використовуються в локальному режимі TUI OpenClaw) |
Структура файлів
src/agents/tools, наприклад:
- файли середовища виконання дій plugin Discord
- файл середовища виконання дій plugin Slack
- файл середовища виконання дій plugin Telegram
- файл середовища виконання дій plugin WhatsApp
Основний потік інтеграції
1. Запуск вбудованого агента
Основна точка входу —runEmbeddedPiAgent() у pi-embedded-runner/run.ts:
2. Створення сесії
УсерединіrunEmbeddedAttempt() (яка викликається з runEmbeddedPiAgent()) використовується SDK pi:
3. Підписка на події
subscribeEmbeddedPiSession() підписується на події AgentSession у pi:
message_start/message_end/message_update(потоковий текст/міркування)tool_execution_start/tool_execution_update/tool_execution_endturn_start/turn_endagent_start/agent_endcompaction_start/compaction_end
4. Надсилання prompt
Після налаштування до сесії надсилається prompt:images лише для цього ходу. Він не сканує повторно старі ходи історії, щоб повторно впроваджувати корисні навантаження зображень.
Архітектура інструментів
Конвеєр інструментів
- Базові інструменти:
codingToolsіз pi (read,bash,edit,write) - Користувацькі заміни: OpenClaw замінює bash на
exec/process, налаштовуєread/edit/writeдля пісочниці - Інструменти OpenClaw: повідомлення, браузер, canvas, сесії, Cron, Gateway тощо
- Інструменти каналів: інструменти дій для Discord/Telegram/Slack/WhatsApp
- Фільтрація за політикою: інструменти фільтруються за профілем, провайдером, агентом, групою, політиками пісочниці
- Нормалізація схем: схеми очищуються з урахуванням особливостей Gemini/OpenAI
- Обгортання AbortSignal: інструменти обгортаються для підтримки сигналів переривання
Адаптер визначення інструментів
AgentTool у pi-agent-core має іншу сигнатуру execute, ніж ToolDefinition у pi-coding-agent. Адаптер у pi-tool-definition-adapter.ts з’єднує їх:
Стратегія поділу інструментів
splitSdkTools() передає всі інструменти через customTools:
Побудова системного prompt
Системний prompt будується вbuildAgentSystemPrompt() (system-prompt.ts). Він формує повний prompt із розділами, зокрема Tooling, Tool Call Style, запобіжниками безпеки, довідкою CLI OpenClaw, Skills, Docs, Workspace, Sandbox, Messaging, Reply Tags, Voice, Silent Replies, Heartbeats, метаданими runtime, а також Memory і Reactions, коли вони ввімкнені, і необов’язковими файлами контексту та додатковим вмістом системного prompt. Для мінімального режиму prompt, який використовується субагентами, розділи скорочуються.
Prompt застосовується після створення сесії через applySystemPromptOverrideToSession():
Керування сесіями
Файли сесій
Сесії — це JSONL-файли з деревоподібною структурою (зв’язування через id/parentId). Збереженням керуєSessionManager із Pi:
guardSessionManager() для безпечної обробки результатів інструментів.
Кешування сесій
session-manager-cache.ts кешує екземпляри SessionManager, щоб уникати повторного парсингу файлів:
Обмеження історії
limitHistoryTurns() обрізає історію розмови залежно від типу каналу (DM чи група).
Compaction
Автоматичний Compaction запускається при переповненні контексту. Поширені ознаки переповнення включають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 і ollama error: context length exceeded. compactEmbeddedPiSessionDirect() обробляє ручний
Compaction:
Автентифікація та визначення моделі
Профілі автентифікації
OpenClaw підтримує сховище профілів автентифікації з кількома API-ключами для кожного провайдера:Визначення моделі
Резервне перемикання
FailoverError запускає резервне перемикання моделі, якщо це налаштовано:
Розширення Pi
OpenClaw завантажує власні розширення Pi для спеціалізованої поведінки:Запобіжник Compaction
src/agents/pi-hooks/compaction-safeguard.ts додає запобіжники до Compaction, зокрема адаптивне бюджетування токенів, а також підсумки збоїв інструментів і файлових операцій:
Обрізання контексту
src/agents/pi-hooks/context-pruning.ts реалізує обрізання контексту на основі Cache TTL:
Потокова передача та блокові відповіді
Розбиття на блоки
EmbeddedBlockChunker керує потоковим текстом, перетворюючи його на окремі блоки відповіді:
Видалення тегів Thinking/Final
Потоковий вивід обробляється для видалення блоків<think>/<thinking> і витягування вмісту <final>:
Директиви відповіді
Директиви відповіді, такі як[[media:url]], [[voice]], [[reply:id]], розбираються та витягуються:
Обробка помилок
Класифікація помилок
pi-embedded-helpers.ts класифікує помилки для належної обробки:
Резервне повернення рівня thinking
Якщо рівень thinking не підтримується, використовується резервне значення:Інтеграція з пісочницею
Коли режим пісочниці ввімкнено, інструменти та шляхи обмежуються:Обробка для конкретних провайдерів
Anthropic
- Очищення магічного рядка відмови
- Валідація ходу для послідовних ролей
- Сувора валідація параметрів інструментів Pi на стороні upstream
Google/Gemini
- Санітизація схем інструментів у plugin-власника
OpenAI
- Інструмент
apply_patchдля моделей Codex - Обробка зниження рівня thinking
Інтеграція TUI
OpenClaw також має локальний режим TUI, який безпосередньо використовує компоненти pi-tui:Ключові відмінності від CLI Pi
| Аспект | CLI Pi | Вбудований OpenClaw |
|---|---|---|
| Виклик | команда pi / RPC | SDK через createAgentSession() |
| Інструменти | Стандартні інструменти для програмування | Власний набір інструментів OpenClaw |
| Системний prompt | AGENTS.md + prompts | Динамічний для кожного каналу/контексту |
| Зберігання сесій | ~/.pi/agent/sessions/ | ~/.openclaw/agents/<agentId>/sessions/ (або $OPENCLAW_STATE_DIR/agents/<agentId>/sessions/) |
| Автентифікація | Один обліковий запис | Кілька профілів із ротацією |
| Розширення | Завантажуються з диска | Програмно + шляхи на диску |
| Обробка подій | Рендеринг TUI | На основі callback (onBlockReply тощо) |
Майбутні міркування
Сфери для потенційного перегляду:- Узгодження сигнатур інструментів: зараз виконується адаптація між сигнатурами pi-agent-core і pi-coding-agent
- Обгортання менеджера сесій:
guardSessionManagerдодає безпеку, але підвищує складність - Завантаження розширень: можна було б більш безпосередньо використовувати
ResourceLoaderіз Pi - Складність обробника потоків:
subscribeEmbeddedPiSessionсуттєво розрісся - Особливості провайдерів: багато кодових шляхів для конкретних провайдерів, які Pi потенційно міг би обробляти сам
Тести
Покриття інтеграції Pi охоплює такі набори тестів: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(увімкнути черезOPENCLAW_LIVE_TEST=1)