chore(i18n): refresh uk translations
This commit is contained in:
parent
6ce65880f2
commit
4bf55a7f8a
200
docs/uk/pi.md
200
docs/uk/pi.md
@ -1,32 +1,32 @@
|
||||
---
|
||||
read_when:
|
||||
- Розуміння архітектури інтеграції Pi SDK в OpenClaw
|
||||
- Модифікація життєвого циклу сесій агента, інструментів або підключення провайдера для Pi
|
||||
summary: Архітектура вбудованої інтеграції Pi-агента в OpenClaw та життєвий цикл сесій
|
||||
- Розуміння дизайну інтеграції Pi SDK в OpenClaw
|
||||
- Зміна життєвого циклу сесій агента, інструментів або підключення провайдерів для Pi
|
||||
summary: Архітектура вбудованої інтеграції Pi-агента та життєвого циклу сесій в OpenClaw
|
||||
title: Архітектура інтеграції Pi
|
||||
x-i18n:
|
||||
generated_at: "2026-04-05T18:11:25Z"
|
||||
generated_at: "2026-04-05T19:39:41Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 596de5fbb1430008698079f211db200e02ca8485547550fd81571a459c4c83c7
|
||||
source_hash: 28594290b018b7cc2963d33dbb7cec6a0bd817ac486dafad59dd2ccabd482582
|
||||
source_path: pi.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Архітектура інтеграції Pi
|
||||
|
||||
У цьому документі описано, як OpenClaw інтегрується з [pi-coding-agent](https://github.com/badlogic/pi-mono/tree/main/packages/coding-agent) та пов’язаними пакетами (`pi-ai`, `pi-agent-core`, `pi-tui`) для реалізації можливостей свого AI-агента.
|
||||
Цей документ описує, як OpenClaw інтегрується з [pi-coding-agent](https://github.com/badlogic/pi-mono/tree/main/packages/coding-agent) та пов’язаними з ним пакетами (`pi-ai`, `pi-agent-core`, `pi-tui`) для реалізації можливостей свого AI-агента.
|
||||
|
||||
## Огляд
|
||||
|
||||
OpenClaw використовує Pi SDK, щоб вбудувати AI-агента для програмування у свою архітектуру шлюзу повідомлень. Замість запуску pi як підпроцесу або використання режиму RPC, OpenClaw безпосередньо імпортує та створює `AgentSession` через `createAgentSession()`. Цей вбудований підхід забезпечує:
|
||||
OpenClaw використовує SDK pi, щоб вбудувати AI-агента для програмування у свою архітектуру шлюзу повідомлень. Замість запуску pi як підпроцесу або використання режиму RPC, OpenClaw безпосередньо імпортує та створює `AgentSession` через `createAgentSession()`. Цей вбудований підхід надає:
|
||||
|
||||
- Повний контроль над життєвим циклом сесії та обробкою подій
|
||||
- Впровадження власних інструментів (повідомлення, sandbox, дії для конкретних каналів)
|
||||
- Налаштування системного prompt для кожного каналу/контексту
|
||||
- Налаштування системного промпту для кожного каналу/контексту
|
||||
- Збереження сесій із підтримкою розгалуження/ущільнення
|
||||
- Ротацію профілів автентифікації для кількох облікових записів із резервним перемиканням
|
||||
- Незалежне від провайдера перемикання моделей
|
||||
- Перемикання моделей незалежно від провайдера
|
||||
|
||||
## Залежності пакетів
|
||||
|
||||
@ -39,18 +39,18 @@ OpenClaw використовує Pi SDK, щоб вбудувати AI-аген
|
||||
}
|
||||
```
|
||||
|
||||
| Пакет | Призначення |
|
||||
| ---------------- | ----------------------------------------------------------------------------------------------------- |
|
||||
| `pi-ai` | Базові абстракції LLM: `Model`, `streamSimple`, типи повідомлень, API провайдерів |
|
||||
| `pi-agent-core` | Цикл агента, виконання інструментів, типи `AgentMessage` |
|
||||
| Пакет | Призначення |
|
||||
| ---------------- | ------------------------------------------------------------------------------------------------------- |
|
||||
| `pi-ai` | Базові абстракції LLM: `Model`, `streamSimple`, типи повідомлень, API провайдерів |
|
||||
| `pi-agent-core` | Цикл агента, виконання інструментів, типи `AgentMessage` |
|
||||
| `pi-coding-agent` | Високорівневий SDK: `createAgentSession`, `SessionManager`, `AuthStorage`, `ModelRegistry`, вбудовані інструменти |
|
||||
| `pi-tui` | Компоненти термінального UI (використовуються в локальному режимі TUI OpenClaw) |
|
||||
| `pi-tui` | Компоненти термінального UI (використовуються в локальному режимі TUI OpenClaw) |
|
||||
|
||||
## Структура файлів
|
||||
|
||||
```
|
||||
src/agents/
|
||||
├── pi-embedded-runner.ts # Повторно експортує з pi-embedded-runner/
|
||||
├── pi-embedded-runner.ts # Повторний експорт із pi-embedded-runner/
|
||||
├── pi-embedded-runner/
|
||||
│ ├── run.ts # Основна точка входу: runEmbeddedPiAgent()
|
||||
│ ├── run/
|
||||
@ -59,22 +59,22 @@ src/agents/
|
||||
│ │ ├── payloads.ts # Побудова payload-відповідей із результатів запуску
|
||||
│ │ ├── images.ts # Впровадження зображень для vision-моделі
|
||||
│ │ └── types.ts # EmbeddedRunAttemptResult
|
||||
│ ├── abort.ts # Визначення помилки переривання
|
||||
│ ├── cache-ttl.ts # Відстеження Cache TTL для обрізання контексту
|
||||
│ ├── abort.ts # Виявлення помилок переривання
|
||||
│ ├── cache-ttl.ts # Відстеження TTL кешу для обрізання контексту
|
||||
│ ├── compact.ts # Логіка ручного/автоматичного ущільнення
|
||||
│ ├── extensions.ts # Завантаження розширень pi для вбудованих запусків
|
||||
│ ├── extra-params.ts # Додаткові параметри потоку для конкретних провайдерів
|
||||
│ ├── google.ts # Виправлення порядку ходів для Google/Gemini
|
||||
│ ├── history.ts # Обмеження історії (DM проти груп)
|
||||
│ ├── lanes.ts # Смуги команд сесії/глобальні
|
||||
│ ├── history.ts # Обмеження історії (DM проти групи)
|
||||
│ ├── lanes.ts # Командні доріжки сесії/глобальні
|
||||
│ ├── logger.ts # Логер підсистеми
|
||||
│ ├── model.ts # Визначення моделі через ModelRegistry
|
||||
│ ├── runs.ts # Відстеження активних запусків, переривання, черга
|
||||
│ ├── sandbox-info.ts # Інформація про sandbox для системного prompt
|
||||
│ ├── sandbox-info.ts # Інформація про sandbox для системного промпту
|
||||
│ ├── session-manager-cache.ts # Кешування екземплярів SessionManager
|
||||
│ ├── session-manager-init.ts # Ініціалізація файлу сесії
|
||||
│ ├── system-prompt.ts # Побудовник системного prompt
|
||||
│ ├── tool-split.ts # Розділення інструментів на builtIn і custom
|
||||
│ ├── system-prompt.ts # Побудова системного промпту
|
||||
│ ├── tool-split.ts # Поділ інструментів на builtIn та custom
|
||||
│ ├── types.ts # EmbeddedPiAgentMeta, EmbeddedPiRunResult
|
||||
│ └── utils.ts # Відображення ThinkLevel, опис помилок
|
||||
├── pi-embedded-subscribe.ts # Підписка/диспетчеризація подій сесії
|
||||
@ -82,23 +82,23 @@ src/agents/
|
||||
├── pi-embedded-subscribe.handlers.ts # Фабрика обробників подій
|
||||
├── pi-embedded-subscribe.handlers.lifecycle.ts
|
||||
├── pi-embedded-subscribe.handlers.types.ts
|
||||
├── pi-embedded-block-chunker.ts # Розбиття потокових блоків відповіді на частини
|
||||
├── pi-embedded-messaging.ts # Відстеження надсилань інструмента повідомлень
|
||||
├── pi-embedded-block-chunker.ts # Поділ потокових відповідей на блоки
|
||||
├── pi-embedded-messaging.ts # Відстеження надісланих інструментом повідомлень
|
||||
├── pi-embedded-helpers.ts # Класифікація помилок, валідація ходів
|
||||
├── pi-embedded-helpers/ # Допоміжні модулі
|
||||
├── pi-embedded-utils.ts # Утиліти форматування
|
||||
├── pi-tools.ts # createOpenClawCodingTools()
|
||||
├── pi-tools.abort.ts # Обгортання AbortSignal для інструментів
|
||||
├── pi-tools.policy.ts # Політика allowlist/denylist для інструментів
|
||||
├── pi-tools.read.ts # Кастомізації інструмента читання
|
||||
├── pi-tools.read.ts # Кастомізації інструмента read
|
||||
├── pi-tools.schema.ts # Нормалізація схем інструментів
|
||||
├── pi-tools.types.ts # Псевдонім типу AnyAgentTool
|
||||
├── pi-tool-definition-adapter.ts # Адаптер AgentTool -> ToolDefinition
|
||||
├── pi-settings.ts # Перевизначення налаштувань
|
||||
├── pi-hooks/ # Користувацькі hooks pi
|
||||
│ ├── compaction-safeguard.ts # Розширення safeguard
|
||||
├── pi-hooks/ # Власні hooks для pi
|
||||
│ ├── compaction-safeguard.ts # Захисне розширення
|
||||
│ ├── compaction-safeguard-runtime.ts
|
||||
│ ├── context-pruning.ts # Розширення обрізання контексту на основі Cache-TTL
|
||||
│ ├── context-pruning.ts # Розширення обрізання контексту на основі TTL кешу
|
||||
│ └── context-pruning/
|
||||
├── model-auth.ts # Визначення профілю автентифікації
|
||||
├── auth-profiles.ts # Сховище профілів, cooldown, failover
|
||||
@ -109,20 +109,20 @@ src/agents/
|
||||
├── failover-error.ts # Клас FailoverError
|
||||
├── defaults.ts # DEFAULT_PROVIDER, DEFAULT_MODEL
|
||||
├── system-prompt.ts # buildAgentSystemPrompt()
|
||||
├── system-prompt-params.ts # Визначення параметрів системного prompt
|
||||
├── system-prompt-report.ts # Генерація налагоджувального звіту
|
||||
├── system-prompt-params.ts # Визначення параметрів системного промпту
|
||||
├── system-prompt-report.ts # Генерація звіту для налагодження
|
||||
├── tool-summaries.ts # Підсумки описів інструментів
|
||||
├── tool-policy.ts # Визначення політики інструментів
|
||||
├── transcript-policy.ts # Політика валідації транскрипту
|
||||
├── skills.ts # Знімок Skills/побудова prompt
|
||||
├── skills.ts # Побудова знімків/промптів Skills
|
||||
├── skills/ # Підсистема Skills
|
||||
├── sandbox.ts # Визначення контексту sandbox
|
||||
├── sandbox/ # Підсистема sandbox
|
||||
├── channel-tools.ts # Впровадження інструментів для конкретних каналів
|
||||
├── openclaw-tools.ts # Специфічні для OpenClaw інструменти
|
||||
├── openclaw-tools.ts # Інструменти, специфічні для OpenClaw
|
||||
├── bash-tools.ts # Інструменти exec/process
|
||||
├── apply-patch.ts # Інструмент apply_patch (OpenAI)
|
||||
├── tools/ # Окремі реалізації інструментів
|
||||
├── tools/ # Реалізації окремих інструментів
|
||||
│ ├── browser-tool.ts
|
||||
│ ├── canvas-tool.ts
|
||||
│ ├── cron-tool.ts
|
||||
@ -136,12 +136,12 @@ src/agents/
|
||||
└── ...
|
||||
```
|
||||
|
||||
Рантайми дій повідомлень для конкретних каналів тепер розміщені в каталогах розширень, якими володіють відповідні plugin, а не в `src/agents/tools`, наприклад:
|
||||
Середовища виконання дій із повідомленнями для конкретних каналів тепер розміщені в каталогах розширень, якими володіють plugins, а не в `src/agents/tools`, наприклад:
|
||||
|
||||
- файли рантайму дій plugin Discord
|
||||
- файл рантайму дій plugin Slack
|
||||
- файл рантайму дій plugin Telegram
|
||||
- файл рантайму дій plugin WhatsApp
|
||||
- файли середовища виконання дій plugin Discord
|
||||
- файл середовища виконання дій plugin Slack
|
||||
- файл середовища виконання дій plugin Telegram
|
||||
- файл середовища виконання дій plugin WhatsApp
|
||||
|
||||
## Основний потік інтеграції
|
||||
|
||||
@ -171,7 +171,7 @@ const result = await runEmbeddedPiAgent({
|
||||
|
||||
### 2. Створення сесії
|
||||
|
||||
Усередині `runEmbeddedAttempt()` (яка викликається з `runEmbeddedPiAgent()`) використовується Pi SDK:
|
||||
Усередині `runEmbeddedAttempt()` (яка викликається з `runEmbeddedPiAgent()`) використовується SDK pi:
|
||||
|
||||
```typescript
|
||||
import {
|
||||
@ -233,33 +233,33 @@ const subscription = subscribeEmbeddedPiSession({
|
||||
- `agent_start` / `agent_end`
|
||||
- `auto_compaction_start` / `auto_compaction_end`
|
||||
|
||||
### 4. Надсилання prompt
|
||||
### 4. Надсилання промпту
|
||||
|
||||
Після налаштування сесії їй надсилається prompt:
|
||||
Після налаштування сесії надсилається промпт:
|
||||
|
||||
```typescript
|
||||
await session.prompt(effectivePrompt, { images: imageResult.images });
|
||||
```
|
||||
|
||||
SDK обробляє повний цикл агента: надсилання до LLM, виконання викликів інструментів, потокову передачу відповідей.
|
||||
SDK обробляє весь цикл роботи агента: надсилання до LLM, виконання викликів інструментів, потокове передавання відповідей.
|
||||
|
||||
Впровадження зображень є локальним для prompt: OpenClaw завантажує посилання на зображення з поточного prompt і передає їх через `images` лише для цього ходу. Попередні ходи історії не скануються повторно для повторного впровадження payload зображень.
|
||||
Впровадження зображень є локальним для промпту: OpenClaw завантажує посилання на зображення з поточного промпту та передає їх через `images` лише для цього ходу. Він не сканує повторно попередні ходи історії, щоб повторно впроваджувати payload-и зображень.
|
||||
|
||||
## Архітектура інструментів
|
||||
|
||||
### Конвеєр інструментів
|
||||
|
||||
1. **Базові інструменти**: `codingTools` із pi (read, bash, edit, write)
|
||||
2. **Користувацькі заміни**: OpenClaw замінює bash на `exec`/`process`, налаштовує read/edit/write для sandbox
|
||||
1. **Базові інструменти**: `codingTools` із pi (`read`, `bash`, `edit`, `write`)
|
||||
2. **Власні заміни**: OpenClaw замінює bash на `exec`/`process`, налаштовує `read`/`edit`/`write` для sandbox
|
||||
3. **Інструменти OpenClaw**: повідомлення, browser, canvas, sessions, cron, gateway тощо
|
||||
4. **Інструменти каналів**: інструменти дій для Discord/Telegram/Slack/WhatsApp
|
||||
5. **Фільтрація політиками**: інструменти фільтруються за профілем, провайдером, агентом, групою, політиками sandbox
|
||||
6. **Нормалізація схем**: схеми очищуються для особливостей Gemini/OpenAI
|
||||
6. **Нормалізація схем**: схеми очищуються з урахуванням особливостей Gemini/OpenAI
|
||||
7. **Обгортання AbortSignal**: інструменти обгортаються для підтримки сигналів переривання
|
||||
|
||||
### Адаптер визначень інструментів
|
||||
|
||||
`AgentTool` у pi-agent-core має інший сигнатурний `execute`, ніж `ToolDefinition` у pi-coding-agent. Адаптер у `pi-tool-definition-adapter.ts` з’єднує їх:
|
||||
`AgentTool` із pi-agent-core має іншу сигнатуру `execute`, ніж `ToolDefinition` у pi-coding-agent. Адаптер у `pi-tool-definition-adapter.ts` з’єднує їх:
|
||||
|
||||
```typescript
|
||||
export function toToolDefinitions(tools: AnyAgentTool[]): ToolDefinition[] {
|
||||
@ -269,33 +269,33 @@ export function toToolDefinitions(tools: AnyAgentTool[]): ToolDefinition[] {
|
||||
description: tool.description ?? "",
|
||||
parameters: tool.parameters,
|
||||
execute: async (toolCallId, params, onUpdate, _ctx, signal) => {
|
||||
// Сигнатура pi-coding-agent відрізняється від pi-agent-core
|
||||
// pi-coding-agent signature differs from pi-agent-core
|
||||
return await tool.execute(toolCallId, params, signal, onUpdate);
|
||||
},
|
||||
}));
|
||||
}
|
||||
```
|
||||
|
||||
### Стратегія розділення інструментів
|
||||
### Стратегія поділу інструментів
|
||||
|
||||
`splitSdkTools()` передає всі інструменти через `customTools`:
|
||||
|
||||
```typescript
|
||||
export function splitSdkTools(options: { tools: AnyAgentTool[]; sandboxEnabled: boolean }) {
|
||||
return {
|
||||
builtInTools: [], // Порожньо. Ми перевизначаємо все
|
||||
builtInTools: [], // Empty. We override everything
|
||||
customTools: toToolDefinitions(options.tools),
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
Це гарантує, що фільтрація політиками в OpenClaw, інтеграція sandbox і розширений набір інструментів залишаються узгодженими для всіх провайдерів.
|
||||
Це забезпечує узгодженість фільтрації політиками, інтеграції sandbox і розширеного набору інструментів OpenClaw для всіх провайдерів.
|
||||
|
||||
## Побудова системного prompt
|
||||
## Побудова системного промпту
|
||||
|
||||
Системний prompt будується в `buildAgentSystemPrompt()` (`system-prompt.ts`). Він формує повний prompt із розділами, зокрема Tooling, Tool Call Style, Safety guardrails, довідка CLI OpenClaw, Skills, Docs, Workspace, Sandbox, Messaging, Reply Tags, Voice, Silent Replies, Heartbeats, Runtime metadata, а також Memory і Reactions, якщо вони ввімкнені, і додатково — optional context files та extra system prompt content. Для режиму мінімального prompt, який використовують субагенти, розділи обрізаються.
|
||||
Системний промпт будується в `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, якщо вони ввімкнені, плюс необов’язкові файли контексту й додатковий вміст системного промпту. Для мінімального режиму промпту, який використовується субагентами, розділи обрізаються.
|
||||
|
||||
Prompt застосовується після створення сесії через `applySystemPromptOverrideToSession()`:
|
||||
Промпт застосовується після створення сесії через `applySystemPromptOverrideToSession()`:
|
||||
|
||||
```typescript
|
||||
const systemPromptOverride = createSystemPromptOverride(appendPrompt);
|
||||
@ -306,17 +306,17 @@ applySystemPromptOverrideToSession(session, systemPromptOverride);
|
||||
|
||||
### Файли сесій
|
||||
|
||||
Сесії — це файли JSONL із деревоподібною структурою (зв’язки id/parentId). За збереження відповідає `SessionManager` у Pi:
|
||||
Сесії — це JSONL-файли з деревоподібною структурою (зв’язки id/parentId). За збереження відповідає `SessionManager` із Pi:
|
||||
|
||||
```typescript
|
||||
const sessionManager = SessionManager.open(params.sessionFile);
|
||||
```
|
||||
|
||||
OpenClaw обгортає це через `guardSessionManager()` для безпечної роботи з результатами інструментів.
|
||||
OpenClaw обгортає його за допомогою `guardSessionManager()` для безпечної обробки результатів інструментів.
|
||||
|
||||
### Кешування сесій
|
||||
|
||||
`session-manager-cache.ts` кешує екземпляри SessionManager, щоб уникати повторного розбору файлів:
|
||||
`session-manager-cache.ts` кешує екземпляри SessionManager, щоб уникнути повторного розбору файлу:
|
||||
|
||||
```typescript
|
||||
await prewarmSessionFile(params.sessionFile);
|
||||
@ -330,8 +330,8 @@ trackSessionManagerAccess(params.sessionFile);
|
||||
|
||||
### Ущільнення
|
||||
|
||||
Автоматичне ущільнення запускається при переповненні контексту. Поширені ознаки
|
||||
переповнення: `request_too_large`, `context length exceeded`, `input exceeds the
|
||||
Автоматичне ущільнення запускається при переповненні контексту. Типові сигнатури переповнення включають
|
||||
`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()` обробляє ручне
|
||||
@ -347,14 +347,14 @@ const compactResult = await compactEmbeddedPiSessionDirect({
|
||||
|
||||
### Профілі автентифікації
|
||||
|
||||
OpenClaw підтримує сховище профілів автентифікації з кількома API-ключами для кожного провайдера:
|
||||
OpenClaw підтримує сховище профілів автентифікації з кількома API-ключами на провайдера:
|
||||
|
||||
```typescript
|
||||
const authStore = ensureAuthProfileStore(agentDir, { allowKeychainPrompt: false });
|
||||
const profileOrder = resolveAuthProfileOrder({ cfg, store: authStore, provider, preferredProfile });
|
||||
```
|
||||
|
||||
Профілі ротуються після збоїв із відстеженням cooldown:
|
||||
Профілі обертаються при збоях із відстеженням cooldown:
|
||||
|
||||
```typescript
|
||||
await markAuthProfileFailure({ store, profileId, reason, cfg, agentDir });
|
||||
@ -373,13 +373,13 @@ const { model, error, authStorage, modelRegistry } = resolveModel(
|
||||
config,
|
||||
);
|
||||
|
||||
// Використовує ModelRegistry і AuthStorage з pi
|
||||
// Uses pi's ModelRegistry and AuthStorage
|
||||
authStorage.setRuntimeApiKey(model.provider, apiKeyInfo.apiKey);
|
||||
```
|
||||
|
||||
### Failover
|
||||
|
||||
`FailoverError` запускає резервне перемикання моделі, якщо його налаштовано:
|
||||
`FailoverError` запускає резервне перемикання моделі, якщо це налаштовано:
|
||||
|
||||
```typescript
|
||||
if (fallbackConfigured && isFailoverErrorMessage(errorText)) {
|
||||
@ -395,11 +395,11 @@ if (fallbackConfigured && isFailoverErrorMessage(errorText)) {
|
||||
|
||||
## Розширення Pi
|
||||
|
||||
OpenClaw завантажує користувацькі розширення pi для спеціалізованої поведінки:
|
||||
OpenClaw завантажує власні розширення pi для спеціалізованої поведінки:
|
||||
|
||||
### Захист ущільнення
|
||||
|
||||
`src/agents/pi-hooks/compaction-safeguard.ts` додає guardrails до ущільнення, зокрема адаптивне бюджетування токенів, а також підсумки помилок інструментів і файлових операцій:
|
||||
`src/agents/pi-hooks/compaction-safeguard.ts` додає захисні механізми для ущільнення, зокрема адаптивне бюджетування токенів, а також зведення про збої інструментів і файлові операції:
|
||||
|
||||
```typescript
|
||||
if (resolveCompactionMode(params.cfg) === "safeguard") {
|
||||
@ -410,7 +410,7 @@ if (resolveCompactionMode(params.cfg) === "safeguard") {
|
||||
|
||||
### Обрізання контексту
|
||||
|
||||
`src/agents/pi-hooks/context-pruning.ts` реалізує обрізання контексту на основі Cache-TTL:
|
||||
`src/agents/pi-hooks/context-pruning.ts` реалізує обрізання контексту на основі TTL кешу:
|
||||
|
||||
```typescript
|
||||
if (cfg?.agents?.defaults?.contextPruning?.mode === "cache-ttl") {
|
||||
@ -424,11 +424,11 @@ if (cfg?.agents?.defaults?.contextPruning?.mode === "cache-ttl") {
|
||||
}
|
||||
```
|
||||
|
||||
## Потокова передача та блоки відповідей
|
||||
## Потокова передача та блокові відповіді
|
||||
|
||||
### Розбиття блоків
|
||||
### Поділ на блоки
|
||||
|
||||
`EmbeddedBlockChunker` керує перетворенням потокового тексту на окремі блоки відповіді:
|
||||
`EmbeddedBlockChunker` керує потоковим перетворенням тексту на окремі блоки відповіді:
|
||||
|
||||
```typescript
|
||||
const blockChunker = blockChunking ? new EmbeddedBlockChunker(blockChunking) : null;
|
||||
@ -436,18 +436,18 @@ const blockChunker = blockChunking ? new EmbeddedBlockChunker(blockChunking) : n
|
||||
|
||||
### Видалення тегів thinking/final
|
||||
|
||||
Потоковий вивід обробляється для видалення блоків `<think>`/`<thinking>` та виділення вмісту `<final>`:
|
||||
Потоковий вивід обробляється для видалення блоків `<think>`/`<thinking>` і виділення вмісту `<final>`:
|
||||
|
||||
```typescript
|
||||
const stripBlockTags = (text: string, state: { thinking: boolean; final: boolean }) => {
|
||||
// Видалити вміст <think>...</think>
|
||||
// Якщо enforceFinalTag увімкнено, повертати лише вміст <final>...</final>
|
||||
// Strip <think>...</think> content
|
||||
// If enforceFinalTag, only return <final>...</final> content
|
||||
};
|
||||
```
|
||||
|
||||
### Директиви відповіді
|
||||
|
||||
Директиви відповіді, як-от `[[media:url]]`, `[[voice]]`, `[[reply:id]]`, розбираються та витягуються:
|
||||
Директиви відповіді, такі як `[[media:url]]`, `[[voice]]`, `[[reply:id]]`, аналізуються та виділяються:
|
||||
|
||||
```typescript
|
||||
const { text: cleanedText, mediaUrls, audioAsVoice, replyToId } = consumeReplyDirectives(chunk);
|
||||
@ -457,14 +457,14 @@ const { text: cleanedText, mediaUrls, audioAsVoice, replyToId } = consumeReplyDi
|
||||
|
||||
### Класифікація помилок
|
||||
|
||||
`pi-embedded-helpers.ts` класифікує помилки для належної обробки:
|
||||
`pi-embedded-helpers.ts` класифікує помилки для відповідної обробки:
|
||||
|
||||
```typescript
|
||||
isContextOverflowError(errorText) // Контекст надто великий
|
||||
isCompactionFailureError(errorText) // Не вдалося ущільнення
|
||||
isAuthAssistantError(lastAssistant) // Помилка автентифікації
|
||||
isRateLimitAssistantError(...) // Досягнуто ліміту швидкості
|
||||
isFailoverAssistantError(...) // Потрібне резервне перемикання
|
||||
isContextOverflowError(errorText) // Context too large
|
||||
isCompactionFailureError(errorText) // Compaction failed
|
||||
isAuthAssistantError(lastAssistant) // Auth failure
|
||||
isRateLimitAssistantError(...) // Rate limited
|
||||
isFailoverAssistantError(...) // Should failover
|
||||
classifyFailoverReason(errorText) // "auth" | "rate_limit" | "quota" | "timeout" | ...
|
||||
```
|
||||
|
||||
@ -495,23 +495,23 @@ const sandbox = await resolveSandboxContext({
|
||||
});
|
||||
|
||||
if (sandboxRoot) {
|
||||
// Використовувати sandboxed інструменти read/edit/write
|
||||
// Exec виконується в контейнері
|
||||
// Browser використовує URL мосту
|
||||
// Use sandboxed read/edit/write tools
|
||||
// Exec runs in container
|
||||
// Browser uses bridge URL
|
||||
}
|
||||
```
|
||||
|
||||
## Обробка, специфічна для провайдерів
|
||||
## Обробка для конкретних провайдерів
|
||||
|
||||
### Anthropic
|
||||
|
||||
- Очищення магічного рядка відмови
|
||||
- Валідація ходів для послідовних ролей
|
||||
- Сумісність параметрів Claude Code
|
||||
- Сувора валідація параметрів інструментів Pi на upstream-рівні
|
||||
|
||||
### Google/Gemini
|
||||
|
||||
- Санітизація схем інструментів, якою володіють plugin
|
||||
- Санітизація схем інструментів, якою володіє plugin
|
||||
|
||||
### OpenAI
|
||||
|
||||
@ -527,29 +527,29 @@ OpenClaw також має локальний режим TUI, який безп
|
||||
import { ... } from "@mariozechner/pi-tui";
|
||||
```
|
||||
|
||||
Це забезпечує інтерактивний термінальний інтерфейс, подібний до нативного режиму pi.
|
||||
Це забезпечує інтерактивний досвід роботи в терміналі, подібний до нативного режиму pi.
|
||||
|
||||
## Ключові відмінності від Pi CLI
|
||||
|
||||
| Аспект | Pi CLI | Вбудований OpenClaw |
|
||||
| --------------- | ----------------------- | ------------------------------------------------------------------------------------------------- |
|
||||
| Виклик | Команда `pi` / RPC | SDK через `createAgentSession()` |
|
||||
| Інструменти | Стандартні інструменти для програмування | Користувацький набір інструментів OpenClaw |
|
||||
| Системний prompt | AGENTS.md + prompts | Динамічний для кожного каналу/контексту |
|
||||
| Аспект | 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` тощо) |
|
||||
| Auth | Окремі облікові дані | Кілька профілів із ротацією |
|
||||
| Розширення | Завантажуються з диска | Програмно + шляхи на диску |
|
||||
| Обробка подій | Рендеринг TUI | На основі callback-ів (`onBlockReply` тощо) |
|
||||
|
||||
## Майбутні міркування
|
||||
|
||||
Області для потенційного перегляду:
|
||||
Напрями для потенційного доопрацювання:
|
||||
|
||||
1. **Узгодження сигнатур інструментів**: зараз виконується адаптація між сигнатурами pi-agent-core і pi-coding-agent
|
||||
1. **Узгодження сигнатур інструментів**: наразі виконується адаптація між сигнатурами pi-agent-core і pi-coding-agent
|
||||
2. **Обгортання менеджера сесій**: `guardSessionManager` додає безпеку, але підвищує складність
|
||||
3. **Завантаження розширень**: можна було б пряміше використовувати `ResourceLoader` з pi
|
||||
4. **Складність обробника потоків**: `subscribeEmbeddedPiSession` став занадто великим
|
||||
5. **Особливості провайдерів**: багато кодових шляхів, специфічних для провайдерів, які потенційно міг би обробляти pi
|
||||
3. **Завантаження розширень**: можна безпосередніше використовувати `ResourceLoader` із pi
|
||||
4. **Складність обробника потоків**: `subscribeEmbeddedPiSession` значно розрісся
|
||||
5. **Особливості провайдерів**: багато кодових шляхів для конкретних провайдерів, які pi потенційно міг би обробляти сам
|
||||
|
||||
## Тести
|
||||
|
||||
@ -567,7 +567,7 @@ import { ... } from "@mariozechner/pi-tui";
|
||||
- `src/agents/pi-settings.test.ts`
|
||||
- `src/agents/pi-hooks/**/*.test.ts`
|
||||
|
||||
Live/опційно:
|
||||
Живі/опціональні:
|
||||
|
||||
- `src/agents/pi-embedded-runner-extraparams.live.test.ts` (увімкніть `OPENCLAW_LIVE_TEST=1`)
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user