إدارة الجلسات - دليل متعمق 🔬

استكشاف متعمق لكيفية عمل إدارة الجلسات والضغط في OpenClaw.

📚 المواضيع المغطاة

  • هيكل تخزين الجلسات
  • دورة حياة الجلسة
  • الضغط التلقائي
  • إدارة السياق
  • تقنيات التحسين

هيكل الجلسة

موقع التخزين

~/.openclaw/
└── agents/
    └── main/
        └── sessions/
            ├── session-abc123/
            │   ├── session.json      # البيانات الوصفية
            │   ├── messages.jsonl    # سجل الرسائل
            │   └── compactions/      # سجلات الضغط
            └── session-xyz789/
                └── ...

ملف session.json

{
  "id": "session-abc123",
  "agentId": "main",
  "userId": "user@example.com",
  "channel": "whatsapp",
  "createdAt": "2024-03-15T10:00:00Z",
  "lastMessageAt": "2024-03-15T14:30:00Z",
  "messageCount": 42,
  "tokenCount": 8500,
  "model": "claude-3-opus",
  "compactionCount": 2,
  "metadata": {
    "topic": "code review",
    "language": "ar"
  }
}

ملف messages.jsonl

سجل JSONL (سطر واحد JSON لكل رسالة):

{"role":"user","content":"مرحباً","timestamp":"2024-03-15T10:00:00Z"}
{"role":"assistant","content":"مرحباً! كيف يمكنني مساعدتك؟","timestamp":"2024-03-15T10:00:05Z"}
{"role":"user","content":"ما هو OpenClaw؟","timestamp":"2024-03-15T10:01:00Z"}
{"role":"assistant","content":"OpenClaw هو...","timestamp":"2024-03-15T10:01:10Z"}

دورة حياة الجلسة

1. إنشاء الجلسة

عندما يرسل مستخدم أول رسالة:

  • إنشاء معرف جلسة فريد
  • إنشاء مجلد الجلسة
  • تهيئة session.json
  • إنشاء messages.jsonl

2. معالجة الرسائل

لكل رسالة جديدة:

  • إضافة إلى messages.jsonl
  • تحديث عداد الرسائل
  • حساب الـ tokens المستخدمة
  • تحديث lastMessageAt

3. فحص الضغط

بعد كل رسالة:

  • التحقق من حد الـ tokens
  • إذا تجاوز الحد، بدء الضغط
  • إنشاء ملخص للرسائل القديمة
  • استبدال الرسائل بالملخص

4. إغلاق الجلسة

عند عدم النشاط أو الإغلاق اليدوي:

  • حفظ الحالة النهائية
  • أرشفة السجلات
  • تحديث الإحصائيات

الضغط التلقائي

متى يحدث الضغط؟

يُشغّل الضغط عندما:

  • حد الـ Tokens: تجاوز 80% من حد السياق
  • عدد الرسائل: أكثر من 100 رسالة
  • يدوياً: عبر /compact

آلية الضغط

// مثال مبسط لعملية الضغط

async function compactSession(session) {
  // 1. جمع الرسائل القديمة
  const oldMessages = session.messages.slice(0, -20);
  const recentMessages = session.messages.slice(-20);

  // 2. إنشاء ملخص
  const summary = await summarizeMessages(oldMessages);

  // 3. بناء سياق جديد
  const newContext = [
    {
      role: 'system',
      content: `الملخص السابق: ${summary}`
    },
    ...recentMessages
  ];

  // 4. حفظ الضغط
  await saveCompaction(session.id, {
    timestamp: new Date(),
    originalTokens: countTokens(oldMessages),
    compressedTokens: countTokens(summary),
    messageCount: oldMessages.length
  });

  // 5. تحديث الجلسة
  session.messages = newContext;
  await saveSession(session);
}

💡 استراتيجية الضغط

  • الاحتفاظ: آخر 20 رسالة دائماً
  • الضغط: الرسائل الأقدم تُلخص
  • الحفاظ: المعلومات المهمة في الملخص
  • الكفاءة: تقليل الـ tokens بـ 70-80%

ملف سجل الضغط

// compactions/compaction-001.json
{
  "id": "compaction-001",
  "timestamp": "2024-03-15T12:00:00Z",
  "beforeTokens": 15000,
  "afterTokens": 3000,
  "messagesBefore": 80,
  "messagesAfter": 20,
  "compressionRatio": 0.2,
  "summary": "المستخدم سأل عن OpenClaw..."
}

إدارة السياق

بناء السياق

عند إرسال رسالة إلى النموذج، يتم بناء السياق:

// بناء سياق الطلب
const context = [
  // 1. System prompt
  {
    role: 'system',
    content: systemPrompt
  },
  
  // 2. Workspace files (AGENTS.md, SOUL.md, etc.)
  {
    role: 'system',
    content: workspaceContext
  },
  
  // 3. ملخصات الضغط
  ...compactionSummaries,
  
  // 4. رسائل حديثة
  ...recentMessages,
  
  // 5. الرسالة الحالية
  {
    role: 'user',
    content: currentMessage
  }
];

حدود السياق

النموذجContext Windowحد الضغط
Claude 3 Opus200K tokens160K tokens
GPT-4 Turbo128K tokens100K tokens
GPT-3.516K tokens12K tokens

التحسين والأداء

استراتيجيات التحسين

1. Lazy Loading

تحميل الرسائل عند الحاجة فقط:

// تحميل آخر N رسالة فقط
const recentMessages = await loadRecentMessages(
  sessionId, 
  limit: 20
);

2. Stream Writing

كتابة الرسائل بشكل تدفقي:

// إضافة رسالة جديدة بدون تحميل الكل
await appendMessage(sessionId, message);

3. Caching

تخزين مؤقت للبيانات المستخدمة كثيراً:

// cache session metadata
const metadata = cache.get(`session:${id}`) 
  || await loadMetadata(id);

مراقبة الأداء

# عرض إحصائيات الجلسات
openclaw sessions list --stats

# تحليل حجم جلسة
du -sh ~/.openclaw/agents/main/sessions/*

# عد عدد الرسائل
wc -l ~/.openclaw/agents/main/sessions/*/messages.jsonl

# عرض معلومات ضغط
cat session-abc123/compactions/*.json | jq .

الصيانة

تنظيف الجلسات القديمة

# حذف جلسات أقدم من 30 يوم
find ~/.openclaw/agents/main/sessions \
  -type d -mtime +30 \
  -exec rm -rf {} \;

# أو استخدم سكريبت
node ~/.openclaw/scripts/clean-old-sessions.js

أرشفة الجلسات

# أرشفة جلسات قديمة
tar -czf sessions-archive-$(date +%Y%m).tar.gz \
  ~/.openclaw/agents/main/sessions/session-*

# نقل إلى أرشيف
mv sessions-archive-*.tar.gz ~/openclaw-archives/

⚠️ تحذير

قبل حذف أو أرشفة الجلسات، تأكد من:

  • عمل نسخة احتياطية
  • عدم وجود جلسات نشطة
  • حفظ البيانات المهمة

الإعدادات المتقدمة

تكوين الضغط

// في openclaw.json
{
  "agents": {
    "defaults": {
      "contextPruning": {
        "enabled": true,
        "maxTokens": 100000,
        "keepRecentMessages": 20,
        "compressionRatio": 0.3,
        "autoCompact": true
      }
    }
  }
}

تعطيل الضغط التلقائي

{
  "agents": {
    "defaults": {
      "contextPruning": {
        "enabled": false  // تعطيل الضغط
      }
    }
  }
}

// استخدم /compact يدوياً عند الحاجة