- Golden traces: docs/golden_traces/v1/, format protocol/request/context/result - trace_to_golden bin, golden_traces_v1_validate test - Makefile: make golden, make test-protocol - npm scripts: golden, test-protocol - CI: .github/workflows/protocol-check.yml - PROTOCOL_V1.md, PROTOCOL_V2_PLAN.md - Policy for updating golden traces in README Co-authored-by: Cursor <cursoragent@cursor.com>
4.7 KiB
4.7 KiB
Protocol v1 — контракт papa-yu
Краткий документ (1–2 страницы): что гарантируется, лимиты, логирование, PLAN→APPLY, strict/best-effort.
Версионирование
- schema_version: 1
- schema_hash: sha256 от
llm_response_schema.json(в trace) - При изменении контракта — увеличивать schema_version; v2 — новый документ.
Гарантии
- JSON: ответ LLM парсится; при неудаче — 1 repair-ретрай с подсказкой.
- Валидация: path (no
../, absolute,~), конфликты действий, content (no NUL, pseudo-binary). - UPDATE base: в APPLY каждый UPDATE_FILE — только для файлов, прочитанных в Plan.
- Protected paths:
.env,*.pem,*.key,id_rsa*,**/secrets/**— запрещены. - Apply: snapshot → apply → auto_check; при падении check — rollback.
Лимиты
| Область | Переменная | По умолчанию |
|---|---|---|
| path_len | — | 240 |
| actions | — | 200 |
| total_content_bytes | — | 5MB |
| context_files | PAPAYU_CONTEXT_MAX_FILES | 8 |
| file_chars | PAPAYU_CONTEXT_MAX_FILE_CHARS | 20000 |
| context_total | PAPAYU_CONTEXT_MAX_TOTAL_CHARS | 120000 |
Логирование
| Событие | Где |
|---|---|
| LLM_REQUEST_SENT | stderr (model, schema_version, provider, token_budget, input_chars) |
| LLM_RESPONSE_OK, LLM_RESPONSE_REPAIR | stderr |
| VALIDATION_FAILED | stderr (code, reason) |
| CONTEXT_CACHE_HIT, CONTEXT_CACHE_MISS | stderr (key) |
| CONTEXT_DIET_APPLIED | stderr (files, dropped, truncated, total_chars) |
| APPLY_SUCCESS, APPLY_ROLLBACK, PREVIEW_READY | stderr |
Trace (PAPAYU_TRACE=1): .papa-yu/traces/<trace_id>.json — config_snapshot, context_stats, cache_stats, validated_json, schema_version, schema_hash.
PLAN → APPLY
- Plan:
plan: <текст>или «исправь/почини» → LLM возвращаетactions: [],summary,context_requests. - Apply:
apply: <текст>или «ok»/«применяй» при сохранённом плане → LLM применяет план с тем же context. - NO_CHANGES: при пустом
actionsв APPLY —summaryобязан начинаться сNO_CHANGES:.
Strict / best-effort
- strict (PAPAYU_LLM_STRICT_JSON=1):
response_format: json_schemaв API; при ошибке schema — repair-ретрай. - best-effort: без response_format; извлечение из
json ...; при ошибке — repair-ретрай. - Capability detection: при 4xx/5xx с упоминанием response_format — retry без него.
Кеш контекста
read_file, search, logs, env кешируются в plan-цикле. Ключ Logs: {source, last_n} — разные last_n не пересекаются.
Контекст-диета
При превышении лимитов — урезание: search → logs → файлы низкого приоритета; FILE (read_file) — последними; для priority=0 гарантия минимум 4k chars.
Provider Compatibility
| Provider | Endpoint | response_format: json_schema |
strict |
OneOf (array/object) | Режим |
|---|---|---|---|---|---|
| OpenAI | /v1/chat/completions |
✅ | ✅ | ✅ | strict + local validate |
| OpenAI-compatible (часть) | разные | ⚠️ | ⚠️ | ⚠️ | best-effort + local validate + repair |
| Ollama | /api/chat |
❌ (часто) | ❌ | ⚠️ | best-effort + local validate + repair |
Поведенческие гарантии:
- Если
response_formatне поддержан провайдером → fallback и логLLM_RESPONSE_FORMAT_FALLBACK. - Локальная schema validation выполняется всегда (если schema compile ok).
- Repair-ретрай выполняется один раз при невалидном JSON.
- Если после repair невалидно → Err.
- Capability detection: при 4xx/5xx с упоминанием response_format/json_schema → retry без него.
Ускоряет диагностику: если Ollama/локальная модель «тупит» — выключи PAPAYU_LLM_STRICT_JSON или оставь пустым.