Documentation Index
Fetch the complete documentation index at: https://docs2.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
هذه الصفحة هي تصميم مرجع API المفصل للحزمة العامة
OpenClaw App SDK. وهي منفصلة عمدا عن
Plugin SDK.
@openclaw/sdk هي حزمة التطبيق/العميل الخارجية للتخاطب مع
Gateway. أما openclaw/plugin-sdk/* فهو عقد تأليف Plugin داخل العملية.
لا تستورد المسارات الفرعية لـ Plugin SDK من التطبيقات التي تحتاج فقط إلى تشغيل الوكلاء.
يجب بناء SDK التطبيقات العام في طبقتين:
- عميل Gateway منخفض المستوى ومولّد.
- غلاف عالي المستوى ومريح مع كائنات
OpenClaw وAgent وSession وRun
وTask وArtifact وApproval وEnvironment.
تصميم مساحات الأسماء
يجب أن تتبع مساحات الأسماء منخفضة المستوى موارد Gateway عن قرب:
oc.agents.list();
oc.agents.get("main");
oc.agents.create(...);
oc.agents.update(...);
oc.sessions.list();
oc.sessions.create(...);
oc.sessions.resolve(...);
oc.sessions.send(...);
oc.sessions.messages(...);
oc.sessions.fork(...);
oc.sessions.compact(...);
oc.sessions.abort(...);
oc.runs.create(...);
oc.runs.get(runId);
oc.runs.events(runId, { after });
oc.runs.wait(runId);
oc.runs.cancel(runId);
oc.tasks.list({ status: "running" });
oc.tasks.get(taskId);
oc.tasks.cancel(taskId, { reason });
oc.tasks.events(taskId, { after }); // future API
oc.models.list();
oc.models.status(); // Gateway models.authStatus
oc.tools.list();
oc.tools.invoke("tool-name", { sessionKey, idempotencyKey });
oc.artifacts.list({ runId });
oc.artifacts.get(artifactId, { runId });
oc.artifacts.download(artifactId, { runId });
oc.approvals.list();
oc.approvals.respond(approvalId, ...);
oc.environments.list();
oc.environments.create(...); // future API: current SDK throws unsupported
oc.environments.status(environmentId);
oc.environments.delete(environmentId); // future API: current SDK throws unsupported
يجب أن تعيد الأغلفة عالية المستوى كائنات تجعل التدفقات الشائعة مريحة:
const run = await agent.run(inputOrParams);
await run.cancel();
await run.wait();
for await (const event of run.events()) {
// normalized event stream
}
const artifacts = await run.artifacts.list();
const session = await run.session();
عقد الأحداث
يجب أن يكشف SDK العام أحداثا ذات إصدارات، قابلة لإعادة التشغيل، ومطبعة.
type OpenClawEvent = {
version: 1;
id: string;
ts: number;
type: OpenClawEventType;
runId?: string;
sessionId?: string;
sessionKey?: string;
taskId?: string;
agentId?: string;
data: unknown;
raw?: unknown;
};
id هو مؤشر إعادة تشغيل. يجب أن يتمكن المستهلكون من إعادة الاتصال باستخدام
events({ after: id }) وتلقي الأحداث الفائتة عندما تسمح مدة الاحتفاظ بذلك.
عائلات الأحداث المطبعة الموصى بها:
| الحدث | المعنى |
|---|
run.created | تم قبول التشغيل. |
run.queued | التشغيل ينتظر مسار جلسة أو وقت تشغيل أو بيئة. |
run.started | بدأ وقت التشغيل التنفيذ. |
run.completed | انتهى التشغيل بنجاح. |
run.failed | انتهى التشغيل بخطأ. |
run.cancelled | تم إلغاء التشغيل. |
run.timed_out | تجاوز التشغيل مهلته الزمنية. |
assistant.delta | فرق نص المساعد. |
assistant.message | رسالة مساعد كاملة أو بديل. |
thinking.delta | فرق الاستدلال أو الخطة، عندما تسمح السياسة بالكشف عنه. |
tool.call.started | بدأت استدعاءة الأداة. |
tool.call.delta | بثت استدعاءة الأداة تقدمها أو خرجا جزئيا. |
tool.call.completed | عادت استدعاءة الأداة بنجاح. |
tool.call.failed | فشلت استدعاءة الأداة. |
approval.requested | يحتاج تشغيل أو أداة إلى موافقة. |
approval.resolved | تم منح الموافقة أو رفضها أو انتهت صلاحيتها أو ألغيت. |
question.requested | يطلب وقت التشغيل إدخالا من المستخدم أو تطبيق المضيف. |
question.answered | قدم تطبيق المضيف إجابة. |
artifact.created | أصبح أثر جديد متاحا. |
artifact.updated | تغير أثر موجود. |
session.created | تم إنشاء الجلسة. |
session.updated | تغيرت بيانات الجلسة الوصفية. |
session.compacted | حدث Compaction للجلسة. |
task.updated | تغيرت حالة المهمة الخلفية. |
git.branch | رصد وقت التشغيل حالة الفرع أو غيرها. |
git.diff | أنتج وقت التشغيل فرقا أو غيره. |
git.pr | فتح وقت التشغيل طلب سحب أو حدثه أو ربطه. |
يجب أن تكون الحمولات الأصلية لوقت التشغيل متاحة عبر raw، لكن لا ينبغي أن تضطر التطبيقات
إلى تحليل raw من أجل واجهة المستخدم العادية.
عقد النتائج
يجب أن يعيد Run.wait() غلاف نتائج مستقرا:
type RunResult = {
runId: string;
status: "accepted" | "completed" | "failed" | "cancelled" | "timed_out";
sessionId?: string;
sessionKey?: string;
taskId?: string;
startedAt?: string | number;
endedAt?: string | number;
output?: {
text?: string;
messages?: SDKMessage[];
};
usage?: {
inputTokens?: number;
outputTokens?: number;
totalTokens?: number;
costUsd?: number;
};
artifacts?: ArtifactSummary[];
error?: SDKError;
};
يجب أن تكون النتيجة عادية ومستقرة. تحافظ قيم الطوابع الزمنية على شكل Gateway،
لذلك عادة ما تبلغ التشغيلات الحالية المدعومة بدورة الحياة عن أرقام بالميلي ثانية منذ الحقبة
بينما قد تظل المحولات تعرض سلاسل ISO. تنتمي واجهة المستخدم الغنية وآثار الأدوات
والتفاصيل الأصلية لوقت التشغيل إلى الأحداث والآثار.
accepted هي نتيجة انتظار غير نهائية: وتعني أن مهلة انتظار Gateway
انتهت قبل أن ينتج التشغيل نهاية دورة حياة أو خطأ. يجب ألا تعامل على أنها
timed_out؛ فـ timed_out مخصصة للتشغيل الذي تجاوز مهلة وقت التشغيل الخاصة به.
الموافقات والأسئلة
يجب أن تكون الموافقات كيانا من الدرجة الأولى لأن وكلاء البرمجة يعبرون باستمرار حدود السلامة.
run.onApproval(async (request) => {
if (request.kind === "tool" && request.toolName === "exec") {
return request.approveOnce({ reason: "CI command allowed by policy" });
}
return request.askUser();
});
يجب أن تحمل أحداث الموافقة:
- معرف الموافقة
- معرف التشغيل ومعرف الجلسة
- نوع الطلب
- ملخص الإجراء المطلوب
- اسم الأداة أو إجراء البيئة
- مستوى المخاطر
- القرارات المتاحة
- انتهاء الصلاحية
- ما إذا كان يمكن إعادة استخدام القرار
الأسئلة منفصلة عن الموافقات. يطلب السؤال معلومات من المستخدم أو تطبيق المضيف.
أما الموافقة فتطلب إذنا لتنفيذ إجراء.
تحتاج التطبيقات إلى فهم سطح الأدوات دون استيراد داخليات Plugin.
const tools = await run.toolSpace();
for (const tool of tools.list()) {
console.log(tool.name, tool.source, tool.requiresApproval);
}
يجب أن يكشف SDK:
- بيانات وصفية مطبعة للأدوات
- المصدر: OpenClaw أو MCP أو Plugin أو قناة أو وقت تشغيل أو تطبيق
- ملخص المخطط
- سياسة الموافقة
- توافق وقت التشغيل
- ما إذا كانت الأداة مخفية أو للقراءة فقط أو قادرة على الكتابة أو قادرة على المضيف
يجب أن يكون استدعاء الأدوات عبر SDK صريحا ومحدد النطاق. يجب أن تشغل معظم التطبيقات
الوكلاء، لا أن تستدعي أدوات عشوائية مباشرة.
نموذج الآثار
يجب أن تغطي الآثار أكثر من الملفات.
type ArtifactSummary = {
id: string;
runId?: string;
sessionId?: string;
type:
| "file"
| "patch"
| "diff"
| "log"
| "media"
| "screenshot"
| "trajectory"
| "pull_request"
| "workspace";
title?: string;
mimeType?: string;
sizeBytes?: number;
createdAt: string;
expiresAt?: string;
};
أمثلة شائعة:
- تعديلات الملفات والملفات المولدة
- حزم الرقع
- فروق VCS
- لقطات الشاشة ومخرجات الوسائط
- السجلات وحزم التتبع
- روابط طلبات السحب
- مسارات وقت التشغيل
- لقطات مساحات عمل البيئة المدارة
يجب أن يدعم الوصول إلى الآثار التنقيح والاحتفاظ وروابط التنزيل دون
افتراض أن كل أثر هو ملف محلي عادي.
نموذج الأمان
يجب أن يكون SDK التطبيق صريحا بشأن الصلاحية.
نطاقات الرموز الموصى بها:
| النطاق | يسمح بـ |
|---|
agent.read | سرد الوكلاء وفحصهم. |
agent.run | بدء التشغيلات. |
session.read | قراءة بيانات الجلسة الوصفية والرسائل. |
session.write | إنشاء الجلسات والإرسال إليها وتفريعها وضغطها وإجهاضها. |
task.read | قراءة حالة المهمة الخلفية. |
task.write | إلغاء سياسة إشعارات المهام أو تعديلها. |
approval.respond | الموافقة على الطلبات أو رفضها. |
tools.invoke | استدعاء الأدوات المكشوفة مباشرة. |
artifacts.read | سرد الآثار وتنزيلها. |
environment.write | إنشاء البيئات المدارة أو تدميرها. |
admin | عمليات إدارية. |
الإعدادات الافتراضية:
- لا يوجد تمرير للأسرار بشكل افتراضي
- لا يوجد تمرير غير مقيد لمتغيرات البيئة
- مراجع الأسرار بدلا من قيم الأسرار
- سياسة صريحة للصندوق الرملي والشبكة
- احتفاظ صريح بالبيئة البعيدة
- موافقات لتنفيذ المضيف ما لم تثبت السياسة خلاف ذلك
- تنقيح أحداث وقت التشغيل الخام قبل مغادرتها Gateway ما لم يكن لدى المستدعي
نطاق تشخيصي أقوى
مزود البيئة المدارة
يجب تنفيذ الوكلاء المدارين كمزودي بيئة.
type EnvironmentProvider = {
id: string;
capabilities: {
checkout?: boolean;
sandbox?: boolean;
networkPolicy?: boolean;
secrets?: boolean;
artifacts?: boolean;
logs?: boolean;
pullRequests?: boolean;
longRunning?: boolean;
};
};
لا يلزم أن يكون التنفيذ الأول خدمة SaaS مستضافة. يمكنه استهداف
مضيفي Node الحاليين أو مساحات عمل مؤقتة أو مشغلات بأسلوب CI أو بيئات بأسلوب Testbox.
العقد المهم هو:
- تحضير مساحة العمل
- ربط بيئة آمنة وأسرار آمنة
- بدء التشغيل
- بث الأحداث
- جمع الآثار
- التنظيف أو الاحتفاظ حسب السياسة
بمجرد أن يستقر ذلك، يمكن لخدمة سحابية مستضافة تنفيذ عقد المزود نفسه.
بنية الحزم
الحزم الموصى بها:
| الحزمة | الغرض |
|---|
@openclaw/sdk | SDK عام عالي المستوى وعميل Gateway منخفض المستوى مولد. |
@openclaw/sdk-react | خطافات React اختيارية للوحات المعلومات وبناة التطبيقات. |
@openclaw/sdk-testing | مساعدين للاختبار وخادم Gateway مزيف لتكاملات التطبيقات. |
يحتوي المستودع بالفعل على openclaw/plugin-sdk/* من أجل Plugins. أبق مساحة الاسم تلك
منفصلة لتجنب إرباك مؤلفي Plugin بمطوري التطبيقات.
استراتيجية العميل المولد
يجب إنشاء العميل منخفض المستوى من مخططات بروتوكول Gateway ذات الإصدارات،
ثم تغليفه بفئات مريحة مكتوبة يدويا.
الطبقات:
- مصدر الحقيقة لمخطط Gateway.
- عميل TypeScript منخفض المستوى مُولَّد.
- مُدقِّقات وقت التشغيل للمدخلات الخارجية وحمولات الأحداث.
- أغلفة عالية المستوى لـ
OpenClaw وAgent وSession وRun وTask وArtifact.
- أمثلة وصفات واختبارات تكامل.
الفوائد:
- يصبح انجراف البروتوكول مرئيًا
- يمكن للاختبارات مقارنة الأساليب المُولَّدة مع صادرات Gateway
- تظل App SDK مستقلة عن داخليات Plugin SDK
- يظل لدى المستهلكين منخفضي المستوى وصول كامل إلى البروتوكول
- يحصل المستهلكون عاليي المستوى على واجهة API المنتج الصغيرة
ذات صلة