Technical reference

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

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

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

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

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


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

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

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


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

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

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

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

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

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

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

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

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

پیاده‌سازی:

  • 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

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

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

  • message.provenance.kind = "inter_session"

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

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


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

OpenAI / OpenAI Codex

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

Gemma 4 سازگار با OpenAI

  • بلوک‌های historical assistant thinking/reasoning پیش از بازپخش حذف می‌شوند تا سرورهای محلی Gemma 4 سازگار با OpenAI محتوای reasoning نوبت‌های قبلی را دریافت نکنند.
  • ادامه‌های فراخوانی ابزار در همان نوبت فعلی، بلوک reasoning دستیار را تا زمانی که نتیجهٔ ابزار بازپخش شده باشد، متصل به فراخوانی ابزار نگه می‌دارند.

Google (Generative AI / Gemini CLI / Antigravity)

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

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

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

Amazon Bedrock (Converse API)

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

Mistral، از جمله تشخیص مبتنی بر model-id

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

OpenRouter Gemini

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

OpenRouter Anthropic

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

هر چیز دیگر

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

رفتار تاریخی، پیش از 2026.1.22

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

  • یک transcript-sanitize extension روی هر ساخت بافت اجرا می‌شد و می‌توانست:
    • جفت‌سازی tool use/result را ترمیم کند.
    • شناسه‌های فراخوانی ابزار را پاک‌سازی کند، از جمله یک حالت غیرسخت‌گیرانه که _/- را حفظ می‌کرد.
  • runner نیز پاک‌سازی مخصوص ارائه‌دهنده را انجام می‌داد، که باعث تکرار کار می‌شد.
  • جهش‌های اضافی خارج از policy ارائه‌دهنده رخ می‌داد، از جمله:
    • حذف تگ‌های <final> از متن دستیار پیش از ماندگارسازی.
    • حذف نوبت‌های خطای خالی دستیار.
    • کوتاه کردن محتوای دستیار پس از فراخوانی‌های ابزار.

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

مرتبط