سیشن مینجمنٹ اور کمپیکشن (تفصیلی جائزہ)¶
یہ دستاویز وضاحت کرتی ہے کہ OpenClaw سیشنز کو ابتدا سے انتہا تک کیسے منظم کرتا ہے:
- Session routing (ان باؤنڈ پیغامات کیسے
sessionKeyسے میپ ہوتے ہیں) - Session store (
sessions.json) اور یہ کیا ٹریک کرتا ہے - Transcript persistence (
*.jsonl) اور اس کی ساخت - Transcript hygiene (رنز سے پہلے فراہم کنندہ کے لحاظ سے درستگیاں)
- Context limits (کانٹیکسٹ ونڈو بمقابلہ ٹریک کیے گئے ٹوکنز)
- Compaction (دستی + خودکار کمپیکشن) اور پری-کمپیکشن کام کہاں جوڑا جائے
- Silent housekeeping (مثلاً میموری لکھائیاں جو صارف کو نظر آنے والی آؤٹ پٹ پیدا نہ کریں)
اگر آپ پہلے اعلیٰ سطحی جائزہ چاہتے ہیں تو یہاں سے شروع کریں:
بنیادی ماخذ: Gateway¶
OpenClaw کو ایک واحد Gateway process کے گرد ڈیزائن کیا گیا ہے جو سیشن اسٹیٹ کا مالک ہوتا ہے۔
- UIs (macOS ایپ، ویب Control UI، TUI) کو سیشن فہرستیں اور ٹوکن گنتیاں Gateway سے کوئری کرنی چاہئیں۔
- ریموٹ موڈ میں، سیشن فائلیں ریموٹ ہوسٹ پر ہوتی ہیں؛ “اپنی لوکل Mac فائلیں چیک کرنا” اس بات کی عکاسی نہیں کرے گا کہ Gateway کیا استعمال کر رہا ہے۔
پائیداری کی دو سطحیں¶
OpenClaw سیشنز کو دو سطحوں میں محفوظ کرتا ہے:
-
سیشن اسٹور (
sessions.json) - Key/value میپ:sessionKey -> SessionEntry- چھوٹا، قابلِ تغیر، ترمیم (یا اندراجات حذف) کے لیے محفوظ - سیشن میٹاڈیٹا ٹریک کرتا ہے (موجودہ سیشن آئی ڈی، آخری سرگرمی، ٹوگلز، ٹوکن کاؤنٹرز وغیرہ) -
Transcript (
<sessionId>.jsonl) - ضمیمہ-صرف ٹرانسکرپٹ جس میں درختی ساخت ہوتی ہے (اندراجات میںid+parentId) - اصل گفتگو + ٹول کالز + کمپیکشن خلاصے محفوظ کرتا ہے - آئندہ ٹرنز کے لیے ماڈل کانٹیکسٹ دوبارہ بنانے میں استعمال ہوتا ہے
On-disk locations¶
ہر ایجنٹ کے لیے، گیٹ وے ہوسٹ پر:
- Store:
~/.openclaw/agents/<agentId>/sessions/sessions.json - Transcripts:
~/.openclaw/agents/<agentId>/sessions/<sessionId>.jsonl - Telegram موضوعی سیشنز:
.../<sessionId>-topic-<threadId>.jsonl
OpenClaw ان کو src/config/sessions.ts کے ذریعے ریزولو کرتا ہے۔
Session keys (sessionKey)¶
ایک sessionKey اس بات کی شناخت کرتا ہے کہ آپ کس گفتگو کے بکٹ میں ہیں (روٹنگ + آئسولیشن)۔
عام پیٹرنز:
- مین/براہِ راست چیٹ (ہر ایجنٹ کے لیے):
agent:<agentId>:<mainKey>(ڈیفالٹmain) - گروپ:
agent:<agentId>:<channel>:group:<id> - روم/چینل (Discord/Slack):
agent:<agentId>:<channel>:channel:<id>یا...:room:<id> - Cron:
cron:<job.id> - Webhook:
hook:<uuid>(جب تک اوور رائیڈ نہ کیا جائے)
اصلی قواعد /concepts/session میں دستاویزی ہیں۔
Session ids (sessionId)¶
ہر sessionKey ایک موجودہ sessionId کی طرف اشارہ کرتا ہے (وہ ٹرانسکرپٹ فائل جو گفتگو کو جاری رکھتی ہے)۔
عمومی اصول:
- Reset (
/new,/reset) اسsessionKeyکے لیے نیاsessionIdبناتا ہے۔ - Daily reset (ڈیفالٹ گیٹ وے ہوسٹ کے مقامی وقت کے مطابق صبح 4:00 بجے) ری سیٹ باؤنڈری کے بعد آنے والے اگلے پیغام پر نیا
sessionIdبناتا ہے۔ - Idle expiry (
session.reset.idleMinutesor legacysession.idleMinutes) creates a newsessionIdwhen a message arrives after the idle window. When daily + idle are both configured, whichever expires first wins.
نفاذی تفصیل: یہ فیصلہ src/auto-reply/reply/session.ts میں initSessionState() کے اندر ہوتا ہے۔
Session store schema (sessions.json)¶
اسٹور کی ویلیو ٹائپ src/config/sessions.ts میں SessionEntry ہے۔
اہم فیلڈز (مکمل فہرست نہیں):
sessionId: موجودہ ٹرانسکرپٹ آئی ڈی (فائل نیم اسی سے اخذ ہوتا ہے جب تکsessionFileسیٹ نہ ہو)updatedAt: آخری سرگرمی کا ٹائم اسٹیمپsessionFile: اختیاری واضح ٹرانسکرپٹ پاتھ اوور رائیڈchatType:direct | group | room(UIs اور بھیجنے کی پالیسی میں مدد دیتا ہے)provider,subject,room,space,displayName: گروپ/چینل لیبلنگ کے لیے میٹاڈیٹا- Toggles:
thinkingLevel,verboseLevel,reasoningLevel,elevatedLevelsendPolicy(ہر سیشن کے لیے اوور رائیڈ)- Model selection:
providerOverride,modelOverride,authProfileOverride- Token counters (بہترین کوشش / فراہم کنندہ پر منحصر):
inputTokens,outputTokens,totalTokens,contextTokenscompactionCount: اس سیشن کی کے لیے خودکار کمپیکشن کتنی بار مکمل ہوئیmemoryFlushAt: آخری پری-کمپیکشن میموری فلش کا ٹائم اسٹیمپmemoryFlushCompactionCount: آخری فلش کے وقت کمپیکشن کاؤنٹ
اسٹور میں ترمیم محفوظ ہے، مگر اختیار Gateway کے پاس ہے: سیشنز کے چلنے کے دوران یہ اندراجات کو دوبارہ لکھ یا ریہائیڈریٹ کر سکتا ہے۔
Transcript structure (*.jsonl)¶
ٹرانسکرپٹس کو @mariozechner/pi-coding-agent کے SessionManager کے ذریعے منظم کیا جاتا ہے۔
فائل JSONL ہے:
- پہلی لائن: سیشن ہیڈر (
type: "session"، جس میںid,cwd,timestamp, اختیاریparentSessionشامل ہیں) - اس کے بعد: سیشن اندراجات جن میں
id+parentId(درخت)
نمایاں اندراجی اقسام:
message: صارف/اسسٹنٹ/ٹول رزلٹ پیغاماتcustom_message: ایکسٹینشن کے شامل کردہ پیغامات جو ماڈل کانٹیکسٹ میں داخل ہوتے ہیں (UI سے چھپائے جا سکتے ہیں)custom: ایکسٹینشن اسٹیٹ جو ماڈل کانٹیکسٹ میں داخل نہیں ہوتیcompaction: محفوظ شدہ کمپیکشن خلاصہ جس میںfirstKeptEntryIdاورtokensBeforebranch_summary: درختی برانچ پر نیویگیٹ کرتے وقت محفوظ شدہ خلاصہ
OpenClaw جان بوجھ کر ٹرانسکرپٹس کو “درست” نہیں کرتا؛ Gateway انہیں پڑھنے/لکھنے کے لیے SessionManager استعمال کرتا ہے۔
Context windows vs tracked tokens¶
دو مختلف تصورات اہم ہیں:
- Model context window: ہر ماڈل کے لیے سخت حد (وہ ٹوکنز جو ماڈل کو نظر آتے ہیں)
- Session store counters: گھومتی ہوئی شماریات جو
sessions.jsonمیں لکھی جاتی ہیں (/status اور ڈیش بورڈز کے لیے استعمال)
اگر آپ حدود ٹیون کر رہے ہیں:
- کانٹیکسٹ ونڈو ماڈل کیٹلاگ سے آتی ہے (اور کنفیگ کے ذریعے اوور رائیڈ کی جا سکتی ہے)۔
- اسٹور میں
contextTokensرن ٹائم تخمینہ/رپورٹنگ ویلیو ہے؛ اسے سخت ضمانت نہ سمجھیں۔
مزید کے لیے دیکھیں /token-use۔
Compaction: what it is¶
کمپیکشن پرانی گفتگو کو ٹرانسکرپٹ میں محفوظ شدہ compaction اندراج میں سمیٹ دیتی ہے اور حالیہ پیغامات کو برقرار رکھتی ہے۔
کمپیکشن کے بعد، آئندہ ٹرنز کو نظر آتا ہے:
- کمپیکشن خلاصہ
firstKeptEntryIdکے بعد کے پیغامات
Compaction is persistent (unlike session pruning). See /concepts/session-pruning.
When auto-compaction happens (Pi runtime)¶
ایمبیڈڈ Pi ایجنٹ میں، خودکار کمپیکشن دو صورتوں میں متحرک ہوتی ہے:
- Overflow recovery: ماڈل کانٹیکسٹ اوورفلو ایرر واپس کرتا ہے → کمپیکٹ → دوبارہ کوشش۔
- Threshold maintenance: کامیاب ٹرن کے بعد، جب:
contextTokens > contextWindow - reserveTokens
جہاں:
contextWindowماڈل کی کانٹیکسٹ ونڈو ہےreserveTokensپرامپٹس + اگلی ماڈل آؤٹ پٹ کے لیے محفوظ ہیڈ روم ہے
یہ Pi رن ٹائم کی معنویت ہے (OpenClaw ایونٹس استعمال کرتا ہے، مگر کمپیکشن کا وقت Pi طے کرتا ہے)۔
Compaction settings (reserveTokens, keepRecentTokens)¶
Pi کی کمپیکشن سیٹنگز Pi سیٹنگز میں ہوتی ہیں:
{
compaction: {
enabled: true,
reserveTokens: 16384,
keepRecentTokens: 20000,
},
}
OpenClaw ایمبیڈڈ رنز کے لیے سکیورٹی فلور بھی نافذ کرتا ہے:
- اگر
compaction.reserveTokens < reserveTokensFloorہو تو OpenClaw اسے بڑھا دیتا ہے۔ - ڈیفالٹ فلور
20000ٹوکنز ہے۔ - فلور کو غیر فعال کرنے کے لیے
agents.defaults.compaction.reserveTokensFloor: 0سیٹ کریں۔ - اگر یہ پہلے ہی زیادہ ہو تو OpenClaw اسے تبدیل نہیں کرتا۔
وجہ: کمپیکشن ناگزیر ہونے سے پہلے کثیر-ٹرن “ہاؤس کیپنگ” (جیسے میموری لکھائیاں) کے لیے کافی ہیڈ روم چھوڑنا۔
نفاذ: src/agents/pi-settings.ts میں ensurePiCompactionReserveTokens()
(src/agents/pi-embedded-runner.ts سے کال ہوتا ہے)۔
User-visible surfaces¶
آپ کمپیکشن اور سیشن اسٹیٹ کو یہاں سے دیکھ سکتے ہیں:
/status(کسی بھی چیٹ سیشن میں)openclaw status(CLI)openclaw sessions/sessions --json- Verbose موڈ:
🧹 Auto-compaction complete+ کمپیکشن کاؤنٹ
Silent housekeeping (NO_REPLY)¶
OpenClaw پس منظر کے کاموں کے لیے “خاموش” ٹرنز کی حمایت کرتا ہے جہاں صارف کو درمیانی آؤٹ پٹ نظر نہیں آنی چاہیے۔
رواج:
- اسسٹنٹ اپنی آؤٹ پٹ کا آغاز
NO_REPLYسے کرتا ہے تاکہ “صارف کو جواب نہ بھیجا جائے” کی نشاندہی ہو۔ - OpenClaw ڈیلیوری لیئر میں اسے ہٹا/دبا دیتا ہے۔
2026.1.10 کے بعد سے، OpenClaw ڈرافٹ/ٹائپنگ اسٹریمنگ کو بھی دبا دیتا ہے جب جزوی چنک NO_REPLY سے شروع ہو، تاکہ خاموش آپریشنز دورانِ ٹرن جزوی آؤٹ پٹ لیک نہ کریں۔
Pre-compaction “memory flush” (implemented)¶
مقصد: خودکار کمپیکشن ہونے سے پہلے ایک خاموش ایجنٹک ٹرن چلانا جو پائیدار
اسٹیٹ کو ڈسک پر لکھ دے (مثلاً ایجنٹ ورک اسپیس میں memory/YYYY-MM-DD.md) تاکہ کمپیکشن
اہم کانٹیکسٹ کو مٹا نہ سکے۔
OpenClaw پری-تھریش ہولڈ فلش طریقہ استعمال کرتا ہے:
- سیشن کانٹیکسٹ کے استعمال کی نگرانی کریں۔
- جب یہ “سافٹ تھریش ہولڈ” (Pi کی کمپیکشن تھریش ہولڈ سے کم) عبور کرے تو ایجنٹ کو ایک خاموش “ابھی میموری لکھیں” ہدایت چلائیں۔
NO_REPLYاستعمال کریں تاکہ صارف کو کچھ نظر نہ آئے۔
کنفیگ (agents.defaults.compaction.memoryFlush):
enabled(ڈیفالٹ:true)softThresholdTokens(ڈیفالٹ:4000)prompt(فلش ٹرن کے لیے صارف پیغام)systemPrompt(فلش ٹرن کے لیے شامل کیا جانے والا اضافی سسٹم پرامپٹ)
نوٹس:
- ڈیفالٹ پرامپٹ/سسٹم پرامپٹ میں ڈیلیوری دبانے کے لیے
NO_REPLYہنٹ شامل ہے۔ - فلش ہر کمپیکشن سائیکل میں ایک بار چلتا ہے (
sessions.jsonمیں ٹریک کیا جاتا ہے)۔ - فلش صرف ایمبیڈڈ Pi سیشنز کے لیے چلتا ہے (CLI بیک اینڈز اسے اسکیپ کرتے ہیں)۔
- جب سیشن ورک اسپیس ریڈ اونلی ہو (
workspaceAccess: "ro"یا"none") تو فلش اسکیپ ہو جاتا ہے۔ - ورک اسپیس فائل لے آؤٹ اور لکھنے کے پیٹرنز کے لیے Memory دیکھیں۔
Pi ایکسٹینشن API میں session_before_compact ہُک بھی فراہم کرتا ہے، مگر OpenClaw کی
فلش لاجک فی الحال Gateway سائیڈ پر رہتی ہے۔
Troubleshooting checklist¶
- Session key wrong? Start with /concepts/session and confirm the
sessionKeyin/status. - Store vs transcript mismatch? Confirm the Gateway host and the store path from
openclaw status. - Compaction spam? Check:
- ماڈل کانٹیکسٹ ونڈو (بہت چھوٹی)
- کمپیکشن سیٹنگز (ماڈل ونڈو کے لیے
reserveTokensبہت زیادہ ہو تو جلد کمپیکشن ہو سکتی ہے) - ٹول-رزلٹ پھولاؤ: سیشن پروننگ کو فعال/ٹیون کریں
- Silent turns leaking? Confirm the reply starts with
NO_REPLY(exact token) and you’re on a build that includes the streaming suppression fix.