Technical reference

پاکیزگی رونوشت

Edit source

OpenClaw پیش از یک اجرا (ساخت زمینهٔ مدل)، اصلاحات مختص ارائه‌دهنده را روی رونوشت‌ها اعمال می‌کند. بیشتر این موارد، تنظیمات درون‌حافظه‌ای هستند که برای برآورده کردن الزامات سخت‌گیرانهٔ ارائه‌دهنده استفاده می‌شوند. یک گذر جداگانهٔ ترمیم فایل نشست نیز ممکن است پیش از بارگذاری نشست، JSONL ذخیره‌شده را بازنویسی کند، اما فقط برای خط‌های بدشکل یا نوبت‌های ماندگارشده‌ای که رکوردهای پایدار نامعتبر هستند. پاسخ‌های تحویل‌داده‌شدهٔ دستیار روی دیسک حفظ می‌شوند؛ حذف پیش‌پرکردن دستیار مختص ارائه‌دهنده فقط هنگام ساخت payloadهای خروجی انجام می‌شود. وقتی ترمیمی رخ می‌دهد، از فایل اصلی در کنار فایل نشست نسخهٔ پشتیبان گرفته می‌شود.

دامنه شامل این موارد است:

  • بیرون نگه داشتن زمینهٔ اعلان فقط-زمان‌اجرا از نوبت‌های رونوشت قابل مشاهده برای کاربر
  • پاک‌سازی شناسهٔ فراخوانی ابزار
  • اعتبارسنجی ورودی فراخوانی ابزار
  • ترمیم جفت‌سازی نتیجهٔ ابزار
  • اعتبارسنجی / ترتیب‌دهی نوبت‌ها
  • پاک‌سازی امضای اندیشه
  • پاک‌سازی امضای تفکر
  • پاک‌سازی payload تصویر
  • پاک‌سازی بلوک متن خالی پیش از بازپخش ارائه‌دهنده
  • برچسب‌گذاری منشأ ورودی کاربر (برای اعلان‌های مسیریابی‌شده بین نشست‌ها)
  • ترمیم نوبت خطای خالی دستیار برای بازپخش Bedrock Converse

اگر به جزئیات ذخیره‌سازی رونوشت نیاز دارید، ببینید:


قاعدهٔ سراسری: زمینهٔ زمان‌اجرا رونوشت کاربر نیست

زمینهٔ زمان‌اجرا/سیستم می‌تواند برای یک نوبت به اعلان مدل اضافه شود، اما محتوایی نیست که کاربر نهایی آن را نوشته باشد. OpenClaw یک بدنهٔ اعلان جداگانهٔ رو به رونوشت برای پاسخ‌های Gateway، پیگیری‌های صف‌شده، ACP، CLI، و اجراهای Pi توکار نگه می‌دارد. نوبت‌های کاربرِ قابل مشاهدهٔ ذخیره‌شده، به‌جای اعلان غنی‌شده با زمان‌اجرا، از همان بدنهٔ رونوشت استفاده می‌کنند.

برای نشست‌های قدیمی که wrapperهای زمان‌اجرا را از قبل ماندگار کرده‌اند، سطح‌های تاریخچهٔ Gateway پیش از بازگرداندن پیام‌ها به WebChat، TUI، کلاینت‌های REST یا SSE یک نمایش projected اعمال می‌کنند.


محل اجرای این منطق

تمام بهداشت رونوشت در runner توکار متمرکز شده است:

  • انتخاب سیاست: src/agents/transcript-policy.ts
  • اعمال پاک‌سازی/ترمیم: sanitizeSessionHistory در src/agents/pi-embedded-runner/replay-history.ts

سیاست از provider، modelApi و modelId استفاده می‌کند تا تصمیم بگیرد چه چیزی اعمال شود.

جدا از بهداشت رونوشت، فایل‌های نشست پیش از بارگذاری ترمیم می‌شوند (در صورت نیاز):

  • repairSessionFileIfNeeded در src/agents/session-file-repair.ts
  • فراخوانی‌شده از run/attempt.ts و compact.ts (runner توکار)

قاعدهٔ سراسری: پاک‌سازی تصویر

payloadهای تصویر همیشه پاک‌سازی می‌شوند تا از رد شدن در سمت ارائه‌دهنده به‌دلیل محدودیت‌های اندازه جلوگیری شود (کوچک‌سازی/فشرده‌سازی دوبارهٔ تصویرهای base64 بیش‌ازحد بزرگ).

این کار همچنین به کنترل فشار توکن ناشی از تصویر برای مدل‌های دارای قابلیت بینایی کمک می‌کند. ابعاد بیشینهٔ کمتر عموما مصرف توکن را کاهش می‌دهد؛ ابعاد بیشتر جزئیات را حفظ می‌کند.

پیاده‌سازی:

  • sanitizeSessionMessagesImages در src/agents/pi-embedded-helpers/images.ts
  • sanitizeContentBlocksImages در src/agents/tool-images.ts
  • بیشینهٔ ضلع تصویر از طریق agents.defaults.imageMaxDimensionPx قابل پیکربندی است (پیش‌فرض: 1200).
  • هنگام پیمایش محتوای بازپخش توسط این گذر، بلوک‌های متن خالی حذف می‌شوند. نوبت‌های دستیار که خالی می‌شوند از نسخهٔ بازپخش حذف می‌شوند؛ نوبت‌های کاربر و نتیجهٔ ابزار که خالی می‌شوند، یک placeholder غیرخالی برای محتوای حذف‌شده دریافت می‌کنند.

قاعدهٔ سراسری: فراخوانی‌های بدشکل ابزار

بلوک‌های فراخوانی ابزار دستیار که هم input و هم arguments را ندارند، پیش از ساخت زمینهٔ مدل حذف می‌شوند. این کار از رد شدن توسط ارائه‌دهنده به‌دلیل فراخوانی‌های ابزار نیمه‌ماندگارشده جلوگیری می‌کند (برای مثال، پس از شکست به‌دلیل محدودیت نرخ).

پیاده‌سازی:

  • sanitizeToolCallInputs در src/agents/session-transcript-repair.ts
  • اعمال‌شده در sanitizeSessionHistory در src/agents/pi-embedded-runner/replay-history.ts

قاعدهٔ سراسری: منشأ ورودی بین‌نشستی

وقتی یک عامل از طریق sessions_send اعلانی را به نشست دیگری می‌فرستد (از جمله گام‌های پاسخ/اعلام عامل-به-عامل)، OpenClaw نوبت کاربر ایجادشده را با این مقدار ماندگار می‌کند:

  • message.provenance.kind = "inter_session"

OpenClaw همچنین پیش از متن اعلان مسیریابی‌شده، یک نشانگر هم‌نوبت [Inter-session message ... isUser=false] اضافه می‌کند تا فراخوانی فعال مدل بتواند خروجی نشست خارجی را از دستورهای کاربر نهایی خارجی تشخیص دهد. این نشانگر در صورت وجود، نشست مبدأ، کانال، و ابزار را شامل می‌شود. رونوشت همچنان برای سازگاری با ارائه‌دهنده از role: "user" استفاده می‌کند، اما هم متن قابل مشاهده و هم metadata منشأ، نوبت را به‌عنوان دادهٔ بین‌نشستی علامت‌گذاری می‌کنند.

هنگام بازسازی زمینه، OpenClaw همان نشانگر را روی نوبت‌های کاربر بین‌نشستی قدیمی‌ترِ ماندگارشده که فقط metadata منشأ دارند نیز اعمال می‌کند.


ماتریس ارائه‌دهنده (رفتار فعلی)

OpenAI / OpenAI Codex

  • فقط پاک‌سازی تصویر.
  • حذف امضاهای reasoning یتیم (آیتم‌های reasoning مستقل بدون بلوک محتوای بعدی) برای رونوشت‌های OpenAI Responses/Codex، و حذف reasoning قابل بازپخش OpenAI پس از تغییر مسیر مدل.
  • حفظ payloadهای آیتم reasoning مربوط به OpenAI Responses قابل بازپخش، از جمله آیتم‌های خلاصهٔ خالی رمزگذاری‌شده، تا بازپخش دستی/WebSocket وضعیت الزامی rs_* را در کنار آیتم‌های خروجی دستیار نگه دارد.
  • ChatGPT Codex Responses بومی، با بازپخش payloadهای reasoning/message/function مربوط به Responses قبلی بدون شناسه‌های آیتم قبلی و در عین حفظ prompt_cache_key نشست، از همترازی wire در Codex پیروی می‌کند.
  • بدون پاک‌سازی شناسهٔ فراخوانی ابزار.
  • ترمیم جفت‌سازی نتیجهٔ ابزار ممکن است خروجی‌های واقعیِ تطبیق‌یافته را جابه‌جا کند و برای فراخوانی‌های ابزار گمشده، خروجی‌های سبک Codex با وضعیت aborted بسازد.
  • بدون اعتبارسنجی یا بازترتیب‌دهی نوبت.
  • خروجی‌های ابزار گمشدهٔ خانوادهٔ OpenAI Responses به‌صورت aborted ساخته می‌شوند تا با نرمال‌سازی بازپخش Codex همخوان شوند.
  • بدون حذف امضای اندیشه.

OpenAI-compatible Chat Completions

  • بلوک‌های تاریخی thinking/reasoning دستیار پیش از بازپخش حذف می‌شوند تا سرورهای محلی و proxy-style سازگار با OpenAI فیلدهای reasoning مربوط به نوبت قبلی، مانند reasoning یا reasoning_content را دریافت نکنند.
  • ادامه‌های فراخوانی ابزار در همان نوبت فعلی، بلوک reasoning دستیار را تا زمانی که نتیجهٔ ابزار بازپخش شده باشد، متصل به فراخوانی ابزار نگه می‌دارند.
  • استثناهای تحت مالکیت ارائه‌دهنده می‌توانند زمانی که پروتکل wire آن‌ها به metadata بازپخش‌شدهٔ reasoning نیاز دارد، از این رفتار خارج شوند.

Google (Generative AI / Gemini CLI / Antigravity)

  • پاک‌سازی شناسهٔ فراخوانی ابزار: فقط نویسه‌های حرفی‌عددی سخت‌گیرانه.
  • ترمیم جفت‌سازی نتیجهٔ ابزار و نتایج ابزار ساختگی.
  • اعتبارسنجی نوبت (تناوب نوبت به سبک Gemini).
  • اصلاح ترتیب نوبت Google (اگر تاریخچه با دستیار شروع شود، یک bootstrap کوچک کاربر در ابتدا اضافه می‌شود).
  • Antigravity Claude: نرمال‌سازی امضاهای thinking؛ حذف بلوک‌های thinking بدون امضا.

Anthropic / Minimax (سازگار با Anthropic)

  • ترمیم جفت‌سازی نتیجهٔ ابزار و نتایج ابزار ساختگی.
  • اعتبارسنجی نوبت (ادغام نوبت‌های متوالی کاربر برای برآورده کردن تناوب سخت‌گیرانه).
  • نوبت‌های پیش‌پرکردن انتهایی دستیار از payloadهای خروجی Anthropic Messages حذف می‌شوند، زمانی که thinking فعال باشد، از جمله مسیرهای Cloudflare AI Gateway.
  • بلوک‌های thinking با امضاهای بازپخش گمشده، خالی، یا سفید پیش از تبدیل ارائه‌دهنده حذف می‌شوند. اگر این کار یک نوبت دستیار را خالی کند، OpenClaw شکل نوبت را با متن omitted-reasoning غیرخالی نگه می‌دارد.
  • نوبت‌های قدیمی‌تر فقط-thinking دستیار که باید حذف شوند، با متن omitted-reasoning غیرخالی جایگزین می‌شوند تا adapterهای ارائه‌دهنده نوبت بازپخش را حذف نکنند.

Amazon Bedrock (Converse API)

  • نوبت‌های خطای stream خالی دستیار پیش از بازپخش به یک بلوک متن fallback غیرخالی ترمیم می‌شوند. Bedrock Converse پیام‌های دستیار با content: [] را رد می‌کند، بنابراین نوبت‌های دستیار ماندگارشده با stopReason: "error" و محتوای خالی نیز پیش از بارگذاری روی دیسک ترمیم می‌شوند.
  • نوبت‌های خطای stream دستیار که فقط شامل بلوک‌های متن سفید هستند، به‌جای بازپخش یک بلوک سفید نامعتبر، از نسخهٔ بازپخش درون‌حافظه‌ای حذف می‌شوند.
  • بلوک‌های thinking متعلق به Claude با امضاهای بازپخش گمشده، خالی، یا سفید پیش از بازپخش Converse حذف می‌شوند. اگر این کار یک نوبت دستیار را خالی کند، OpenClaw شکل نوبت را با متن omitted-reasoning غیرخالی نگه می‌دارد.
  • نوبت‌های قدیمی‌تر فقط-thinking دستیار که باید حذف شوند، با متن omitted-reasoning غیرخالی جایگزین می‌شوند تا بازپخش Converse شکل سخت‌گیرانهٔ نوبت را نگه دارد.
  • بازپخش، نوبت‌های دستیار آینهٔ تحویل OpenClaw و تزریق‌شده توسط Gateway را فیلتر می‌کند.
  • پاک‌سازی تصویر از طریق قاعدهٔ سراسری اعمال می‌شود.

Mistral (از جمله تشخیص بر اساس شناسهٔ مدل)

  • پاک‌سازی شناسهٔ فراخوانی ابزار: strict9 (حروف‌عددی با طول ۹).

OpenRouter Gemini

  • پاک‌سازی امضای اندیشه: حذف مقدارهای غیر-base64 برای thought_signature (base64 نگه داشته می‌شود).

OpenRouter Anthropic

  • نوبت‌های پیش‌پرکردن انتهایی دستیار از payloadهای مدل Anthropic سازگار با OpenAI و تأییدشدهٔ OpenRouter حذف می‌شوند، زمانی که reasoning فعال باشد، مطابق با رفتار بازپخش مستقیم Anthropic و Cloudflare Anthropic.

همهٔ موارد دیگر

  • فقط پاک‌سازی تصویر.

رفتار تاریخی (پیش از 2026.1.22)

پیش از انتشار 2026.1.22، OpenClaw چندین لایه بهداشت رونوشت اعمال می‌کرد:

  • یک افزونهٔ transcript-sanitize روی هر ساخت زمینه اجرا می‌شد و می‌توانست:
    • جفت‌سازی استفاده/نتیجهٔ ابزار را ترمیم کند.
    • شناسه‌های فراخوانی ابزار را پاک‌سازی کند (از جمله یک حالت غیرسخت‌گیرانه که _/- را حفظ می‌کرد).
  • runner همچنین پاک‌سازی مختص ارائه‌دهنده انجام می‌داد که کار را تکرار می‌کرد.
  • جهش‌های اضافی بیرون از سیاست ارائه‌دهنده رخ می‌دادند، از جمله:
    • حذف tagهای <final> از متن دستیار پیش از ماندگارسازی.
    • حذف نوبت‌های خطای خالی دستیار.
    • کوتاه‌سازی محتوای دستیار پس از فراخوانی‌های ابزار.

این پیچیدگی باعث رگرسیون‌های بین‌ارائه‌دهنده‌ای شد (به‌ویژه جفت‌سازی call_id|fc_id در openai-responses). پاک‌سازی 2026.1.22 افزونه را حذف کرد، منطق را در runner متمرکز کرد، و OpenAI را فراتر از پاک‌سازی تصویر بدون‌دستکاری کرد.

مرتبط

Was this useful?