Архітектура інтеграції Pi
Цей документ описує, як OpenClaw інтегрується з pi-coding-agent та пов’язаними з ним пакетами (pi-ai, pi-agent-core, pi-tui) для реалізації можливостей свого AI-агента.
Огляд
OpenClaw використовує SDK pi, щоб вбудувати AI-агента для програмування у свою архітектуру шлюзу повідомлень. Замість запуску pi як підпроцесу або використання режиму RPC, OpenClaw безпосередньо імпортує та створюєAgentSession через createAgentSession(). Цей вбудований підхід надає:
- Повний контроль над життєвим циклом сесії та обробкою подій
- Впровадження власних інструментів (повідомлення, sandbox, дії для конкретних каналів)
- Налаштування системного промпту для кожного каналу/контексту
- Збереження сесій із підтримкою розгалуження/ущільнення
- Ротацію профілів автентифікації для кількох облікових записів із резервним перемиканням
- Перемикання моделей незалежно від провайдера
Залежності пакетів
| Пакет | Призначення |
|---|---|
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_endauto_compaction_start/auto_compaction_end
4. Надсилання промпту
Після налаштування сесії надсилається промпт:images лише для цього ходу. Він не сканує повторно попередні ходи історії, щоб повторно впроваджувати payload-и зображень.
Архітектура інструментів
Конвеєр інструментів
- Базові інструменти:
codingToolsіз pi (read,bash,edit,write) - Власні заміни: OpenClaw замінює bash на
exec/process, налаштовуєread/edit/writeдля sandbox - Інструменти OpenClaw: повідомлення, browser, canvas, sessions, cron, gateway тощо
- Інструменти каналів: інструменти дій для Discord/Telegram/Slack/WhatsApp
- Фільтрація політиками: інструменти фільтруються за профілем, провайдером, агентом, групою, політиками sandbox
- Нормалізація схем: схеми очищуються з урахуванням особливостей Gemini/OpenAI
- Обгортання AbortSignal: інструменти обгортаються для підтримки сигналів переривання
Адаптер визначень інструментів
AgentTool із pi-agent-core має іншу сигнатуру execute, ніж ToolDefinition у pi-coding-agent. Адаптер у pi-tool-definition-adapter.ts з’єднує їх:
Стратегія поділу інструментів
splitSdkTools() передає всі інструменти через customTools:
Побудова системного промпту
Системний промпт будується вbuildAgentSystemPrompt() (system-prompt.ts). Він формує повний промпт із розділами, зокрема Tooling, Tool Call Style, Safety guardrails, довідка CLI OpenClaw, Skills, Docs, Workspace, Sandbox, Messaging, Reply Tags, Voice, Silent Replies, Heartbeats, Runtime metadata, а також Memory і Reactions, якщо вони ввімкнені, плюс необов’язкові файли контексту й додатковий вміст системного промпту. Для мінімального режиму промпту, який використовується субагентами, розділи обрізаються.
Промпт застосовується після створення сесії через applySystemPromptOverrideToSession():
Керування сесіями
Файли сесій
Сесії — це JSONL-файли з деревоподібною структурою (зв’язки id/parentId). За збереження відповідаєSessionManager із Pi:
guardSessionManager() для безпечної обробки результатів інструментів.
Кешування сесій
session-manager-cache.ts кешує екземпляри SessionManager, щоб уникнути повторного розбору файлу:
Обмеження історії
limitHistoryTurns() обрізає історію розмови залежно від типу каналу (DM чи група).
Ущільнення
Автоматичне ущільнення запускається при переповненні контексту. Типові сигнатури переповнення включають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() обробляє ручне
ущільнення:
Автентифікація та визначення моделі
Профілі автентифікації
OpenClaw підтримує сховище профілів автентифікації з кількома API-ключами на провайдера:Визначення моделі
Failover
FailoverError запускає резервне перемикання моделі, якщо це налаштовано:
Розширення Pi
OpenClaw завантажує власні розширення pi для спеціалізованої поведінки:Захист ущільнення
src/agents/pi-hooks/compaction-safeguard.ts додає захисні механізми для ущільнення, зокрема адаптивне бюджетування токенів, а також зведення про збої інструментів і файлові операції:
Обрізання контексту
src/agents/pi-hooks/context-pruning.ts реалізує обрізання контексту на основі TTL кешу:
Потокова передача та блокові відповіді
Поділ на блоки
EmbeddedBlockChunker керує потоковим перетворенням тексту на окремі блоки відповіді:
Видалення тегів thinking/final
Потоковий вивід обробляється для видалення блоків<think>/<thinking> і виділення вмісту <final>:
Директиви відповіді
Директиви відповіді, такі як[[media:url]], [[voice]], [[reply:id]], аналізуються та виділяються:
Обробка помилок
Класифікація помилок
pi-embedded-helpers.ts класифікує помилки для відповідної обробки:
Резервний рівень thinking
Якщо рівень thinking не підтримується, використовується резервний варіант:Інтеграція sandbox
Коли режим sandbox увімкнено, інструменти й шляхи обмежуються:Обробка для конкретних провайдерів
Anthropic
- Очищення магічного рядка відмови
- Валідація ходів для послідовних ролей
- Сувора валідація параметрів інструментів Pi на upstream-рівні
Google/Gemini
- Санітизація схем інструментів, якою володіє plugin
OpenAI
- Інструмент
apply_patchдля моделей Codex - Обробка зниження рівня thinking
Інтеграція TUI
OpenClaw також має локальний режим TUI, який безпосередньо використовує компоненти pi-tui:Ключові відмінності від Pi CLI
| Аспект | Pi CLI | Вбудований OpenClaw |
|---|---|---|
| Виклик | Команда pi / RPC | SDK через createAgentSession() |
| Інструменти | Стандартні інструменти для програмування | Власний набір інструментів OpenClaw |
| Системний промпт | AGENTS.md + промпти | Динамічний для кожного каналу/контексту |
| Зберігання сесій | ~/.pi/agent/sessions/ | ~/.openclaw/agents/<agentId>/sessions/ (або $OPENCLAW_STATE_DIR/agents/<agentId>/sessions/) |
| Auth | Окремі облікові дані | Кілька профілів із ротацією |
| Розширення | Завантажуються з диска | Програмно + шляхи на диску |
| Обробка подій | Рендеринг 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)