إدارة الجلسات - دليل متعمق 🔬
استكشاف متعمق لكيفية عمل إدارة الجلسات والضغط في 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 Opus | 200K tokens | 160K tokens |
| GPT-4 Turbo | 128K tokens | 100K tokens |
| GPT-3.5 | 16K tokens | 12K 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 يدوياً عند الحاجة