Fundamentals

موتور زمینه

یک موتور زمینه کنترل می‌کند که OpenClaw چگونه زمینهٔ مدل را برای هر اجرا می‌سازد: کدام پیام‌ها گنجانده شوند، تاریخچهٔ قدیمی‌تر چگونه خلاصه شود و زمینه در مرزهای زیرعامل چگونه مدیریت شود.

OpenClaw با یک موتور داخلی legacy عرضه می‌شود و به‌طور پیش‌فرض از آن استفاده می‌کند. تنها زمانی یک موتور Plugin را نصب و انتخاب کنید که به رفتار متفاوتی برای گردآوری، Compaction یا یادآوری میان‌نشستی نیاز دارید.

شروع سریع

  • بررسی موتور فعال

    bash
    openclaw doctor# یا پیکربندی را مستقیماً بررسی کنید:cat ~/.openclaw/openclaw.json | jq '.plugins.slots.contextEngine'
  • نصب یک موتور Plugin

    Pluginهای موتور زمینه مانند هر Plugin دیگر OpenClaw نصب می‌شوند.

    از npm

    bash
    openclaw plugins install @martian-engineering/lossless-claw

    از یک مسیر محلی

    bash
    openclaw plugins install -l ./my-context-engine
  • فعال‌سازی و انتخاب موتور

    json5
    // openclaw.json{  plugins: {    slots: {      contextEngine: "lossless-claw", // باید با شناسهٔ موتور ثبت‌شدهٔ Plugin مطابقت داشته باشد    },    entries: {      "lossless-claw": {        enabled: true,        // پیکربندی مختص Plugin در اینجا قرار می‌گیرد (به مستندات Plugin مراجعه کنید)      },    },  },}

    پس از نصب و پیکربندی، Gateway را راه‌اندازی مجدد کنید.

  • بازگشت به موتور قدیمی (اختیاری)

    contextEngine را روی "legacy" تنظیم کنید (یا کل کلید را حذف کنید — "legacy" مقدار پیش‌فرض است).

  • نحوهٔ کار

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

    1. دریافت

    هنگامی فراخوانی می‌شود که پیام جدیدی به نشست افزوده شود. موتور می‌تواند پیام را در مخزن دادهٔ خود ذخیره یا نمایه‌سازی کند.

    2. گردآوری

    پیش از هر اجرای مدل فراخوانی می‌شود. موتور مجموعه‌ای مرتب از پیام‌ها (و یک systemPromptAddition اختیاری) را برمی‌گرداند که در بودجهٔ توکن جا می‌گیرند.

    3. فشرده‌سازی

    هنگامی فراخوانی می‌شود که پنجرهٔ زمینه پر باشد یا کاربر /compact را اجرا کند. موتور تاریخچهٔ قدیمی‌تر را خلاصه می‌کند تا فضا آزاد شود.

    4. پس از نوبت

    پس از تکمیل اجرا فراخوانی می‌شود. موتور می‌تواند وضعیت را ماندگار کند، Compaction پس‌زمینه را راه‌اندازی کند یا نمایه‌ها را به‌روزرسانی کند.

    موتورها همچنین می‌توانند یک متد اختیاری maintain() برای نگه‌داری رونوشت (بازنویسی‌های ایمن از طریق runtimeContext.rewriteTranscriptEntries()) پس از راه‌اندازی اولیه، یک نوبت موفق یا Compaction پیاده‌سازی کنند. برای اجرای آن به‌عنوان کار معوق به‌جای مسدودکردن پاسخ، info.turnMaintenanceMode: "background" را تنظیم کنید.

    برای مهار Codex غیر ACP همراه، OpenClaw همین چرخهٔ عمر را با نگاشت زمینهٔ گردآوری‌شده به دستورالعمل‌های توسعه‌دهندهٔ Codex و پرامپت نوبت جاری اعمال می‌کند. Codex همچنان مالک تاریخچهٔ بومی رشته و فشرده‌ساز بومی خود است.

    چرخهٔ عمر زیرعامل (اختیاری)

    OpenClaw دو هوک اختیاری چرخهٔ عمر زیرعامل را فراخوانی می‌کند:

    prepareSubagentSpawnmethod

    پیش از آغاز اجرای فرزند، وضعیت زمینهٔ مشترک را آماده می‌کند. هوک کلیدهای نشست والد/فرزند، contextMode‏ (isolated یا fork)‏، شناسه‌ها/فایل‌های رونوشت موجود و TTL اختیاری را دریافت می‌کند. اگر یک دستگیرهٔ بازگردانی برگرداند، OpenClaw در صورتی آن را فراخوانی می‌کند که ایجاد پس از موفقیت آماده‌سازی شکست بخورد. ایجادهای بومی زیرعامل که lightContext را درخواست می‌کنند و به contextMode="isolated" تفکیک می‌شوند، عمداً از این هوک صرف‌نظر می‌کنند تا فرزند با زمینهٔ سبک راه‌اندازی اولیه و بدون وضعیت پیش از ایجادِ مدیریت‌شده توسط موتور زمینه آغاز شود.

    onSubagentEndedmethod

    هنگام تکمیل یا پاک‌سازی یک نشست زیرعامل، پاک‌سازی را انجام می‌دهد.

    افزودهٔ پرامپت سیستم

    متد assemble می‌تواند یک رشتهٔ systemPromptAddition برگرداند. OpenClaw آن را به ابتدای پرامپت سیستم اجرا اضافه می‌کند. این قابلیت به موتورها امکان می‌دهد بدون نیاز به فایل‌های ایستای فضای کاری، راهنمای یادآوری پویا، دستورالعمل‌های بازیابی یا نکته‌های آگاه از زمینه را تزریق کنند.

    موتور قدیمی

    موتور داخلی legacy رفتار اصلی OpenClaw را حفظ می‌کند:

    • دریافت: بدون عملیات (مدیر نشست ماندگاری پیام را مستقیماً مدیریت می‌کند).
    • گردآوری: عبور مستقیم (پایپ‌لاین موجود پاک‌سازی ← اعتبارسنجی ← محدودسازی در زمان اجرا، گردآوری زمینه را مدیریت می‌کند).
    • فشرده‌سازی: به Compaction خلاصه‌سازی داخلی واگذار می‌شود که یک خلاصهٔ واحد از پیام‌های قدیمی‌تر ایجاد می‌کند و پیام‌های اخیر را دست‌نخورده نگه می‌دارد.
    • پس از نوبت: بدون عملیات.

    موتور قدیمی ابزارها را ثبت نمی‌کند و systemPromptAddition ارائه نمی‌دهد.

    هنگامی که هیچ plugins.slots.contextEngine تنظیم نشده باشد (یا روی "legacy" تنظیم شده باشد)، این موتور به‌طور خودکار استفاده می‌شود.

    موتورهای Plugin

    یک Plugin می‌تواند با استفاده از API افزونه، یک موتور زمینه ثبت کند:

    ts
     export default function register(api) {  api.registerContextEngine("my-engine", (ctx) => ({    info: {      id: "my-engine",      name: "My Context Engine",      ownsCompaction: true,    },     async ingest({ sessionId, message, isHeartbeat }) {      // پیام را در مخزن دادهٔ خود ذخیره کنید      return { ingested: true };    },     async assemble({      sessionId,      sessionKey,      messages,      tokenBudget,      availableTools,      citationsMode,    }) {      // پیام‌هایی را برگردانید که در بودجه جا می‌گیرند      return {        messages: buildContext(messages, tokenBudget),        estimatedTokens: countTokens(messages),        systemPromptAddition: buildMemorySystemPromptAddition({          availableTools: availableTools ?? new Set(),          citationsMode,          agentSessionKey: sessionKey,        }),      };    },     async compact({ sessionId, force }) {      // زمینهٔ قدیمی‌تر را خلاصه کنید      return { ok: true, compacted: true };    },  }));}

    کارخانهٔ ctx شامل مقادیر اختیاری config، agentDir و workspaceDir است تا Pluginها بتوانند پیش از نخستین فراخوانی چرخهٔ عمر، وضعیت مختص عامل یا فضای کاری را مقداردهی اولیه کنند. پیش از یک فراخوانی غیرقدیمی assemble()، میزبان آماده‌سازی ثبت‌شدهٔ ناهمگام پرامپت حافظه را تکمیل می‌کند. تابع کمکی همگام buildMemorySystemPromptAddition(...) آن تصویر لحظه‌ای تغییرناپذیر اجرا را می‌خواند؛ زمینهٔ ابزار، استناد، عامل و نشست ارائه‌شده را بدون تغییر عبور دهید.

    سپس آن را در پیکربندی فعال کنید:

    json5
    {  plugins: {    slots: {      contextEngine: "my-engine",    },    entries: {      "my-engine": {        enabled: true,      },    },  },}

    رابط ContextEngine

    اعضای الزامی:

    عضو نوع هدف
    info ویژگی شناسه، نام و نسخهٔ موتور و اینکه آیا مالک Compaction است
    ingest(params) متد ذخیره‌کردن یک پیام
    assemble(params) متد ساخت زمینه برای اجرای مدل (AssembleResult را برمی‌گرداند)
    compact(params) متد خلاصه‌سازی/کاهش زمینه

    assemble یک AssembleResult با موارد زیر برمی‌گرداند:

    messagesMessage[]required

    پیام‌های مرتب‌شده‌ای که باید به مدل ارسال شوند.

    estimatedTokensnumberrequired

    برآورد موتور از مجموع توکن‌های زمینهٔ گردآوری‌شده. OpenClaw از این مقدار برای تصمیم‌های آستانهٔ Compaction و گزارش‌های عیب‌یابی استفاده می‌کند.

    systemPromptAdditionstring

    به ابتدای پرامپت سیستم افزوده می‌شود.

    promptAuthority"assembled" | "preassembly_may_overflow"

    مشخص می‌کند اجراکننده برای پیش‌بررسی‌های پیشگیرانهٔ سرریز از کدام برآورد توکن استفاده کند. مقدار پیش‌فرض "assembled" است؛ یعنی برای موتورهایی که مالک Compaction نیستند، فقط برآورد پرامپت گردآوری‌شده بررسی می‌شود. موتورهایی که ownsCompaction: true را تنظیم می‌کنند، پذیرش پرامپت خود را مدیریت می‌کنند؛ بنابراین OpenClaw به‌طور پیش‌فرض از پیش‌بررسی عمومی پیش از پرامپت صرف‌نظر می‌کند. تنها زمانی "preassembly_may_overflow" را تنظیم کنید که نمای گردآوری‌شدهٔ شما بتواند خطر سرریز در رونوشت زیربنایی را پنهان کند؛ در این صورت اجراکننده پیش‌بررسی عمومی را فعال نگه می‌دارد و هنگام تصمیم‌گیری دربارهٔ انجام پیشگیرانهٔ Compaction، بیشینهٔ برآورد گردآوری‌شده و برآورد تاریخچهٔ نشست پیش از گردآوری (بدون پنجره‌بندی) را در نظر می‌گیرد. در هر دو حالت، پیام‌هایی که برمی‌گردانید همچنان همان چیزی هستند که مدل می‌بیند — promptAuthority فقط بر پیش‌بررسی اثر می‌گذارد.

    contextProjectionContextEngineProjection

    چرخهٔ عمر نگاشت اختیاری برای میزبان‌هایی با رشته‌های ماندگار پشتیبان (برای مثال app-server مربوط به Codex). mode: "thread_bootstrap" همراه با یک epoch پایدار از میزبان می‌خواهد زمینهٔ گردآوری‌شده را در هر دوره یک‌بار تزریق کند و تا زمان تغییر دوره، رشتهٔ پشتیبان را دوباره استفاده کند، نه اینکه در هر نوبت دوباره نگاشت انجام دهد. برای نگاشت عادی در هر نوبت، این فیلد را حذف کنید.

    compact یک CompactResult برمی‌گرداند. هنگامی که Compaction هویت نشست فعال را تغییر می‌دهد، result.sessionTarget (یک ContextEngineSessionTarget نوع‌دار که هویت نشست و دامنهٔ مخزن را حمل می‌کند) نشست جانشینی را مشخص می‌کند که تلاش مجدد یا نوبت بعدی باید از آن استفاده کند؛ result.sessionId شناسهٔ جانشین را بازتاب می‌دهد.

    اعضای اختیاری:

    عضو نوع هدف
    bootstrap(params) متد مقداردهی اولیهٔ وضعیت موتور برای یک نشست. یک‌بار، هنگامی که موتور برای نخستین بار نشستی را می‌بیند، فراخوانی می‌شود (برای مثال، واردکردن تاریخچه).
    maintain(params) متد نگه‌داری رونوشت پس از راه‌اندازی اولیه، یک نوبت موفق یا Compaction. برای بازنویسی‌های ایمن از runtimeContext.rewriteTranscriptEntries() استفاده کنید.
    ingestBatch(params) متد دریافت دسته‌ای یک نوبت تکمیل‌شده. پس از تکمیل اجرا، با همهٔ پیام‌های آن نوبت به‌صورت یکجا فراخوانی می‌شود.
    afterTurn(params) متد کار چرخهٔ عمر پس از اجرا (ماندگارکردن وضعیت، راه‌اندازی Compaction پس‌زمینه).
    prepareSubagentSpawn(params) متد آماده‌سازی وضعیت مشترک برای نشست فرزند پیش از شروع آن.
    onSubagentEnded(params) متد پاک‌سازی پس از پایان یک زیرعامل.
    dispose() متد آزادسازی منابع. هنگام خاموش‌شدن Gateway یا بارگذاری مجدد Plugin فراخوانی می‌شود، نه برای هر نشست.

    تنظیمات زمان اجرا

    هوک‌های چرخهٔ عمر که درون OpenClaw اجرا می‌شوند، یک شیء اختیاری runtimeSettings دریافت می‌کنند. این یک سطح API داخلی نسخه‌بندی‌شده و فقط‌خواندنی برای تولیدکننده/مصرف‌کننده است: OpenClaw آن را برای موتور زمینهٔ انتخاب‌شده تولید می‌کند و موتور زمینه آن را درون هوک‌های چرخهٔ عمر مصرف می‌کند. این شیء مستقیماً به کاربران نمایش داده نمی‌شود و سطح گزارش‌دهی اختصاصی ایجاد نمی‌کند.

    • schemaVersion: در حال حاضر 1
    • runtime: میزبان OpenClaw، حالت زمان اجرا (normal، fallback، یا degraded) و شناسه‌های اختیاری چارچوب آزمون/زمان اجرا
    • contextEngineSelection: شناسه موتور زمینه انتخاب‌شده و منبع انتخاب
    • executionHost: شناسه و برچسب میزبان برای سطحی که هوک را فراخوانی می‌کند
    • model: مدل درخواست‌شده، مدل نهایی، ارائه‌دهنده و خانواده اختیاری مدل
    • limits: بودجه توکن پرامپت و حداکثر توکن‌های خروجی، در صورت مشخص‌بودن
    • diagnostics: کدهای دلیلِ بازگشت جایگزین بسته و تنزل عملکرد، در صورت مشخص‌بودن

    فیلدهایی که ممکن است نامشخص باشند به‌صورت null نمایش داده می‌شوند؛ فیلدهای تمایزدهنده‌ای مانند حالت زمان اجرا و منبع انتخاب همچنان غیرقابل‌تهی باقی می‌مانند. موتورهای قدیمی‌تر همچنان سازگارند: اگر یک موتور قدیمی سخت‌گیر runtimeSettings را به‌عنوان یک ویژگی ناشناخته رد کند، OpenClaw به‌جای قرنطینه‌کردن موتور، فراخوانی چرخه حیات را بدون آن دوباره امتحان می‌کند.

    الزامات میزبان

    موتورهای زمینه می‌توانند الزامات قابلیت میزبان را در info.hostRequirements اعلام کنند. OpenClaw پیش از آغاز عملیات این الزامات را بررسی می‌کند و هنگامی که زمان اجرای انتخاب‌شده نتواند آن‌ها را برآورده کند، با یک خطای توصیفی به‌شکل بسته متوقف می‌شود.

    برای اجرای عامل، وقتی موتور باید پرامپت واقعی مدل را از طریق assemble() کنترل کند، assemble-before-prompt را اعلام کنید:

    ts
    info: {  id: "my-context-engine",  name: "My Context Engine",  hostRequirements: {    "agent-run": {      requiredCapabilities: ["assemble-before-prompt"],      unsupportedMessage:        "از زمان اجرای بومی Codex یا زمان اجرای تعبیه‌شده OpenClaw استفاده کنید، یا موتور زمینه قدیمی را انتخاب کنید.",    },  },}

    اجرای عامل در Codex بومی و OpenClaw تعبیه‌شده، assemble-before-prompt را برآورده می‌کند. بک‌اندهای عمومی CLI چنین قابلیتی ندارند؛ بنابراین موتورهایی که به آن نیاز دارند، پیش از آغاز فرایند CLI رد می‌شوند.

    جداسازی خرابی

    OpenClaw موتور Plugin انتخاب‌شده را از مسیر اصلی پاسخ جدا می‌کند. اگر یک موتور غیرقدیمی وجود نداشته باشد، در اعتبارسنجی قرارداد ناموفق شود، هنگام ایجاد کارخانه استثنا پرتاب کند، یا از یک متد چرخه حیات استثنا پرتاب کند، OpenClaw آن موتور را برای فرایند فعلی Gateway قرنطینه می‌کند و کارهای موتور زمینه را به موتور داخلی legacy تنزل می‌دهد. خطا همراه با عملیات ناموفق ثبت می‌شود تا اپراتور بتواند بدون ساکت‌شدن عامل، Plugin را تعمیر، به‌روزرسانی یا غیرفعال کند.

    خرابی الزامات میزبان متفاوت است: وقتی موتوری اعلام کند که یک زمان اجرا قابلیت لازم را ندارد، OpenClaw پیش از آغاز اجرا به‌شکل بسته متوقف می‌شود. این کار از موتورهایی محافظت می‌کند که اجرای آن‌ها در میزبانی پشتیبانی‌نشده موجب خرابی وضعیت می‌شود.

    ownsCompaction

    ownsCompaction تعیین می‌کند که آیا فشرده‌سازی خودکار داخلیِ حین تلاش در زمان اجرای OpenClaw برای آن اجرا فعال بماند:

    ownsCompaction: true

    موتور مالک رفتار فشرده‌سازی است. OpenClaw فشرده‌سازی خودکار داخلی زمان اجرای OpenClaw و پیش‌بررسی عمومی سرریز پیش از پرامپت را برای آن اجرا غیرفعال می‌کند و پیاده‌سازی compact() موتور مسئول /compact، فشرده‌سازی بازیابی سرریز ارائه‌دهنده و هر فشرده‌سازی پیش‌دستانه‌ای است که می‌خواهد در afterTurn() انجام دهد. وقتی موتور از assemble() مقدار promptAuthority: "preassembly_may_overflow" را برگرداند، OpenClaw همچنان سازوکار محافظتی سرریز پیش از پرامپت را اجرا می‌کند.

    ownsCompaction: false or unset

    فشرده‌سازی خودکار داخلی زمان اجرای OpenClaw ممکن است همچنان هنگام اجرای پرامپت انجام شود، اما متد compact() موتور فعال همچنان برای /compact و بازیابی سرریز فراخوانی می‌شود.

    یعنی دو الگوی معتبر برای Plugin وجود دارد:

    حالت مالک

    الگوریتم فشرده‌سازی خود را پیاده‌سازی کنید و ownsCompaction: true را تنظیم کنید.

    حالت واگذاری

    ownsCompaction: false را تنظیم کنید و کاری کنید که compact() برای استفاده از رفتار فشرده‌سازی داخلی OpenClaw، delegateCompactionToRuntime(...) را از openclaw/plugin-sdk/core فراخوانی کند.

    یک compact() بدون عملیات برای یک موتور فعالِ غیرمالک ناامن است، زیرا مسیر عادی فشرده‌سازی /compact و بازیابی سرریز را برای جایگاه آن موتور غیرفعال می‌کند.

    مرجع پیکربندی

    json5
    {  plugins: {    slots: {      // موتور زمینه فعال را انتخاب کنید. پیش‌فرض: "legacy".      // برای استفاده از موتور Plugin، آن را روی شناسه Plugin تنظیم کنید.      contextEngine: "legacy",    },  },}

    ارتباط با فشرده‌سازی و حافظه

    Compaction

    Compaction یکی از مسئولیت‌های موتور زمینه است. موتور قدیمی کار را به خلاصه‌سازی داخلی OpenClaw واگذار می‌کند. موتورهای Plugin می‌توانند هر راهبرد فشرده‌سازی را پیاده‌سازی کنند (خلاصه‌های DAG، بازیابی برداری و غیره).

    Pluginهای حافظه

    Pluginهای حافظه (plugins.slots.memory) از موتورهای زمینه جدا هستند. Pluginهای حافظه جست‌وجو/بازیابی را فراهم می‌کنند؛ موتورهای زمینه آنچه مدل می‌بیند کنترل می‌کنند. آن‌ها می‌توانند با یکدیگر کار کنند؛ یک موتور زمینه ممکن است هنگام سرهم‌بندی از داده‌های Plugin حافظه استفاده کند. موتورهای Plugin که مسیر فعال پرامپت حافظه را می‌خواهند، باید از buildMemorySystemPromptAddition(...) در openclaw/plugin-sdk/core استفاده کنند؛ این تابع بخش‌های پرامپت حافظه آماده‌شده توسط میزبان را بدون افشای چیدمان Plugin حافظه به یک systemPromptAddition آماده برای افزودن به ابتدا تبدیل می‌کند.

    هرس نشست

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

    نکته‌ها

    • برای اطمینان از بارگذاری صحیح موتور خود، از openclaw doctor استفاده کنید.
    • هنگام تعویض موتور، نشست‌های موجود با تاریخچه فعلی خود ادامه می‌یابند. موتور جدید اجرای دفعات بعدی را بر عهده می‌گیرد.
    • خطاهای موتور ثبت می‌شوند و موتور Plugin انتخاب‌شده برای فرایند فعلی Gateway قرنطینه می‌شود. OpenClaw برای نوبت‌های کاربر به legacy بازمی‌گردد تا پاسخ‌ها بتوانند ادامه یابند، اما همچنان باید Plugin خراب را تعمیر، به‌روزرسانی، غیرفعال یا حذف نصب کنید.
    • برای توسعه، از openclaw plugins install -l ./my-engine استفاده کنید تا بدون کپی‌کردن، یک پوشه Plugin محلی را پیوند دهید.

    مرتبط

    Was this useful?
    On this page

    On this page