Fundamentals

موتور زمینه

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

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

شروع سریع

  • Check which engine is active

    openclaw doctor
    # or inspect config directly:
    cat ~/.openclaw/openclaw.json | jq '.plugins.slots.contextEngine'
    
  • Install a plugin engine

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

    From npm

    openclaw plugins install @martian-engineering/lossless-claw
    

    From a local path

    openclaw plugins install -l ./my-context-engine
    
  • Enable and select the engine

    // openclaw.json
    {
      plugins: {
        slots: {
          contextEngine: "lossless-claw", // must match the plugin's registered engine id
        },
        entries: {
          "lossless-claw": {
            enabled: true,
            // Plugin-specific config goes here (see the plugin's docs)
          },
        },
      },
    }
    

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

  • Switch back to legacy (optional)

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

  • نحوهٔ کار

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

    1. Ingest

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

    2. Assemble

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

    3. Compact

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

    4. After turn

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

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

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

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

    prepareSubagentSpawnmethod

    پیش از شروع اجرای فرزند، وضعیت زمینهٔ مشترک را آماده می‌کند. این هوک کلیدهای نشست والد/فرزند، contextMode (isolated یا fork)، شناسه‌ها/فایل‌های ترنسکریپت موجود، و TTL اختیاری را دریافت می‌کند. اگر یک هندل بازگشت برگرداند، OpenClaw زمانی آن را فراخوانی می‌کند که ایجاد زیرعامل پس از موفقیت آماده‌سازی شکست بخورد.

    onSubagentEndedmethod

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

    افزودنی پرامپت سیستم

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

    موتور legacy

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

    • دریافت: بدون عملیات (مدیر نشست ماندگاری پیام را مستقیماً مدیریت می‌کند).
    • مونتاژ: عبوری (خط لولهٔ موجود sanitize → validate → limit در runtime مونتاژ زمینه را مدیریت می‌کند).
    • Compact: به Compaction خلاصه‌سازی داخلی واگذار می‌کند، که یک خلاصهٔ واحد از پیام‌های قدیمی‌تر می‌سازد و پیام‌های اخیر را دست‌نخورده نگه می‌دارد.
    • پس از نوبت: بدون عملیات.

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

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

    موتورهای Plugin

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

    
    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 }) {
          // Store the message in your data store
          return { ingested: true };
        },
    
        async assemble({ sessionId, messages, tokenBudget, availableTools, citationsMode }) {
          // Return messages that fit the budget
          return {
            messages: buildContext(messages, tokenBudget),
            estimatedTokens: countTokens(messages),
            systemPromptAddition: buildMemorySystemPromptAddition({
              availableTools: availableTools ?? new Set(),
              citationsMode,
            }),
          };
        },
    
        async compact({ sessionId, force }) {
          // Summarize older context
          return { ok: true, compacted: true };
        },
      }));
    }
    

    factory با نام ctx شامل مقادیر اختیاری config، agentDir، و workspaceDir است تا Pluginها بتوانند پیش از اجرای نخستین هوک چرخهٔ عمر، وضعیت مربوط به هر عامل یا هر فضای کاری را مقداردهی اولیه کنند.

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

    {
      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"

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

    compact یک CompactResult برمی‌گرداند. وقتی Compaction ترنسکریپت فعال را می‌چرخاند، result.sessionId و result.sessionFile نشست جانشینی را مشخص می‌کنند که تلاش مجدد یا نوبت بعدی باید از آن استفاده کند.

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

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

    ownsCompaction

    ownsCompaction کنترل می‌کند که آیا Compaction خودکار درون‌تلاش داخلی Pi برای اجرا فعال بماند یا نه:

    ownsCompaction: true

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

    ownsCompaction: false or unset

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

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

    Owning mode

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

    Delegating mode

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

    یک compact() بدون عملیات برای یک موتور فعال غیرمالک ناایمن است، زیرا مسیر عادی Compaction برای /compact و بازیابی سرریز را برای آن slot موتور غیرفعال می‌کند.

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

    {
      plugins: {
        slots: {
          // Select the active context engine. Default: "legacy".
          // Set to a plugin id to use a plugin engine.
          contextEngine: "legacy",
        },
      },
    }
    

    ارتباط با Compaction و حافظه

    Compaction

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

    Pluginهای حافظه

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

    هرس نشست

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

    نکات

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

    مرتبط