أدوات الجلسات
الهدف: مجموعة أدوات صغيرة وصعبة الإساءة في الاستخدام تُمكّن الوكلاء من عرض الجلسات، وجلب السجل، والإرسال إلى جلسة أخرى.أسماء الأدوات
sessions_listsessions_historysessions_sendsessions_spawn
نموذج المفاتيح
- حاوية الدردشة المباشرة الرئيسية هي دائمًا المفتاح الحرفي
"main"(يُحلّ إلى المفتاح الرئيسي للوكيل الحالي). - تستخدم الدردشات الجماعية
agent:<agentId>:<channel>:group:<id>أوagent:<agentId>:<channel>:channel:<id>(مرّر المفتاح الكامل). - تستخدم مهام Cron المفتاح
cron:<job.id>. - تستخدم Hooks المفتاح
hook:<uuid>ما لم يُعيَّن صراحةً. - تستخدم جلسات العُقدة المفتاح
node-<nodeId>ما لم يُعيَّن صراحةً.
global وunknown محجوزتان ولا تُدرجان أبدًا. إذا كان session.scope = "global"، فنُسميه اسمًا مستعارًا إلى main لجميع الأدوات حتى لا يرى المستدعون global.
sessions_list
قائمة الجلسات كمجموعة من الصفوف المعلمات:- مرشح
kinds?: string[]: أي من"main" | "group" | "cron" | "hook" | "node" | "other" limit?: numberالحد الأقصى للصفوف (الافتراضي: افتراضي الخادم، مع التقليم مثلًا 200)activeMinutes?: numberالجلسات المحدَّثة خلال N دقيقة فقطmessageLimit?: number0 = بلا رسائل (الافتراضي 0)؛ >0 = تضمين آخر N رسائل
- يجلب
messageLimit > 0قيمةchat.historyلكل جلسة ويُضمِّن آخر N رسائل. - تُرشَّح نتائج الأدوات من مخرجات القائمة؛ استخدم
sessions_historyلرسائل الأدوات. - عند التشغيل داخل جلسة وكيل sandboxed، تُضبط أدوات الجلسات افتراضيًا على رؤية الجلسات المُنشأة فقط (انظر أدناه).
key: مفتاح الجلسة (string)kind:main | group | cron | hook | node | otherchannel:whatsapp | telegram | discord | signal | imessage | webchat | internal | unknowndisplayName(تسمية عرض المجموعة إن توفرت)updatedAt(مللي ثانية)sessionIdmodel،contextTokens،totalTokensthinkingLevel،verboseLevel،systemSent،abortedLastRunsendPolicy(تجاوز الجلسة إن كان مضبوطًا)lastChannel،lastTodeliveryContext({ channel, to, accountId }مُوحَّد عند التوفر)transcriptPath(مسار بأفضل جهد مشتق من دليل التخزين + sessionId)messages?(فقط عندماmessageLimit > 0)
sessions_history
جلب النص الكامل (Transcript) لجلسة واحدة. المعلمات:sessionKey(مطلوب؛ يقبل مفتاح الجلسة أوsessionIdمنsessions_list)limit?: numberالحد الأقصى للرسائل (يُقَلَّم من الخادم)includeTools?: boolean(الافتراضي false)
- يُرشِّح
includeTools=falseرسائلrole: "toolResult". - يُعيد مصفوفة الرسائل بصيغة النص الخام.
- عند تزويده بـ
sessionId، يقوم OpenClaw بحلّه إلى مفتاح الجلسة المقابل (خطأ عند فقدان المعرّفات).
sessions_send
إرسال رسالة إلى جلسة أخرى. المعلمات:sessionKey(مطلوب؛ يقبل مفتاح الجلسة أوsessionIdمنsessions_list)message(مطلوب)timeoutSeconds?: number(الافتراضي >0؛ 0 = إرسال دون انتظار)
timeoutSeconds = 0: إدراج في الطابور وإرجاع{ runId, status: "accepted" }.timeoutSeconds > 0: الانتظار حتى N ثوانٍ للاكتمال، ثم إرجاع{ runId, status: "ok", reply }.- إذا انتهت مهلة الانتظار:
{ runId, status: "timeout", error }. يستمر التشغيل؛ استدعِsessions_historyلاحقًا. - إذا فشل التشغيل:
{ runId, status: "error", error }. - تُعلَن عمليات التسليم بعد اكتمال التشغيل الأساسي وبأفضل جهد؛
status: "ok"لا يضمن تسليم الإعلان. - يتم الانتظار عبر
agent.waitفي Gateway (من جهة الخادم) بحيث لا تؤدي إعادة الاتصال إلى إسقاط الانتظار. - يُحقَن سياق رسالة وكيل-إلى-وكيل للتشغيل الأساسي.
- يتم حفظ الرسائل بين الجلسات مع
message.provenance.kind = "inter_session"حتى يتمكن قارئو السجل من تمييز تعليمات الوكيل المُوجَّهة عن مدخلات المستخدم الخارجية. - عند انتهاء الحلقة، يُجري OpenClaw خطوة الإعلان وكيل-إلى-وكيل (الوكيل الهدف فقط):
- تتناوب الجولة 2+ بين الوكيل الطالب والوكيل الهدف.
- الردّ بالضبط
REPLY_SKIPلإيقاف تبادل ping‑pong. - الحد الأقصى للأدوار هو
session.agentToAgent.maxPingPongTurns(0–5، الافتراضي 5).
- عند انتهاء الحلقة، يُجري OpenClaw خطوة الإعلان وكيل-إلى-وكيل (الوكيل الهدف فقط):
- الردّ بالضبط
ANNOUNCE_SKIPللبقاء صامتًا. - أي ردّ آخر يُرسَل إلى القناة الهدف.
- تتضمن خطوة الإعلان الطلب الأصلي + رد الجولة الأولى + أحدث ردّ ping‑pong.
- الردّ بالضبط
حقل القناة
- للمجموعات،
channelهي القناة المسجَّلة في مُدخل الجلسة. - للدردشات المباشرة،
channelتُعيَّن منlastChannel. - لـ cron/hook/node، تكون
channelهيinternal. - إذا كانت مفقودة، فإن
channelهيunknown.
الأمان / سياسة الإرسال
الحظر القائم على السياسة حسب نوع القناة/الدردشة (وليس حسب معرّف الجلسة).sendPolicy: "allow" | "deny"(غير مضبوط = يرث التهيئة)- قابل للضبط عبر
sessions.patchأو/send on|off|inheritللمالك فقط (رسالة مستقلة).
chat.send/agent(Gateway)- منطق تسليم الردّ التلقائي
sessions_spawn
إنشاء تشغيل لوكيل فرعي في جلسة معزولة والإعلان عن النتيجة إلى قناة دردشة الطالب. المعلمات:task(مطلوب)label?(اختياري؛ يُستخدم للسجلات/واجهة المستخدم)agentId?(اختياري؛ الإنشاء تحت معرّف وكيل آخر إذا كان مسموحًا)model?(اختياري؛ يتجاوز نموذج الوكيل الفرعي؛ القيم غير الصالحة تُحدث خطأ)runTimeoutSeconds?(الافتراضي 0؛ عند الضبط، يُجهِض تشغيل الوكيل الفرعي بعد N ثانية)cleanup?(delete|keep، الافتراضيkeep)
agents.list[].subagents.allowAgents: قائمة معرّفات الوكلاء المسموح بها عبرagentId(["*"]للسماح لأيٍّ كان). الافتراضي: وكيل الطالب فقط.
- استخدم
agents_listلاكتشاف معرّفات الوكلاء المسموح بها لـsessions_spawn.
- يبدأ جلسة
agent:<agentId>:subagent:<uuid>جديدة معdeliver: false. - الوكلاء الفرعيون افتراضيًا يمتلكون مجموعة الأدوات الكاملة باستثناء أدوات الجلسات (قابلة للتهيئة عبر
tools.subagents.tools). - لا يُسمح للوكلاء الفرعيين باستدعاء
sessions_spawn(لا إنشاء وكيل فرعي → وكيل فرعي). - دائمًا غير حاجب: يُعيد
{ status: "accepted", runId, childSessionKey }فورًا. - بعد الاكتمال، يُجري OpenClaw خطوة إعلان للوكيل الفرعي وينشر النتيجة إلى قناة دردشة الطالب.
- الردّ بالضبط
ANNOUNCE_SKIPأثناء خطوة الإعلان للبقاء صامتًا. - تُوحَّد ردود الإعلان إلى
Status/Result/Notes؛ ويأتيStatusمن نتيجة وقت التشغيل (وليس نص النموذج). - تُؤرشَف جلسات الوكيل الفرعي تلقائيًا بعد
agents.defaults.subagents.archiveAfterMinutes(الافتراضي: 60). - تتضمن ردود الإعلان سطر إحصاءات (المدة، الرموز، sessionKey/sessionId، مسار النص، وتكلفة اختيارية).
رؤية جلسات Sandbox
يمكن للجلسات sandboxed استخدام أدوات الجلسات، ولكنها افتراضيًا ترى فقط الجلسات التي أنشأتها عبرsessions_spawn.
التهيئة: