zakkur-sdk 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +152 -0
- package/package.json +30 -0
- package/test-sdk.js +41 -0
- package/zakkur-sdk.js +149 -0
package/README.md
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
Zakkur AI Enterprise SDK 🚀
|
|
2
|
+
|
|
3
|
+
محرك تشغيل القرارات المؤسسية الذكي (Digital C-Suite)
|
|
4
|
+
|
|
5
|
+
مرحباً بك في الدليل التقني الرسمي لمكتبة زكور (Zakkur). تم تصميم هذا الـ SDK لتمكين المطورين من دمج طاقم تنفيذي رقمي متكامل (C-Suite) داخل تطبيقاتهم، مما يسمح بأتمتة القرارات الاستراتيجية، وتحليل البيانات المالية، وتنفيذ العمليات التقنية والقانونية عبر ذكاء اصطناعي متخصص.
|
|
6
|
+
|
|
7
|
+
🌟 المميزات الرئيسية
|
|
8
|
+
|
|
9
|
+
Digital Boardroom: استدعاء كافة أعضاء المجلس (12 وكيلاً) بطلب واحد لتحليل القضايا المعقدة.
|
|
10
|
+
|
|
11
|
+
Dynamic Agent Proxy: وصول ذكي للوكلاء (CEO, CFO, CTO...) بأسلوب برمجي حديث وأنيق.
|
|
12
|
+
|
|
13
|
+
RAG Integrated: ربط الوكلاء بقاعدة المعرفة المؤسسية (ملفات PDF و TXT) لاتخاذ قرارات بناءً على بياناتك الفعلية.
|
|
14
|
+
|
|
15
|
+
Ops Execution Engine: تحويل القرارات إلى خطوات تنفيذية (Action Items) قابلة للربط مع الأدوات الخارجية.
|
|
16
|
+
|
|
17
|
+
Enterprise Grade: دعم إعادة المحاولة تلقائياً (Retries)، إدارة المهلة الزمنية (Timeouts)، ومعالجة أخطاء تفصيلية.
|
|
18
|
+
|
|
19
|
+
📦 التثبيت
|
|
20
|
+
|
|
21
|
+
يتطلب الـ SDK بيئة عمل Node.js إصدار 18 أو أحدث.
|
|
22
|
+
|
|
23
|
+
npm install zakkur-sdk
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
🛠️ التهيئة (Initialization)
|
|
27
|
+
|
|
28
|
+
ابدأ بإنشاء كائن من الفئة Zakkur باستخدام مفتاح الوصول الخاص بمؤسستك.
|
|
29
|
+
|
|
30
|
+
const Zakkur = require('zakkur-sdk');
|
|
31
|
+
|
|
32
|
+
const sdk = new Zakkur({
|
|
33
|
+
apiKey: 'zk_live_xxxxxxxxxxxxxxxx', // احصل عليه من بوابة المطورين
|
|
34
|
+
baseUrl: '[https://api.zakkur.ai/api](https://api.zakkur.ai/api)', // رابط السيرفر الخاص بك
|
|
35
|
+
timeout: 30000, // مهلة الاستجابة (30 ثانية)
|
|
36
|
+
retries: 3 // عدد محاولات إعادة الطلب عند فشل الشبكة
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
🧠 دليل استخدام الوحدات
|
|
41
|
+
|
|
42
|
+
1. وحدة مجلس الإدارة (The Board)
|
|
43
|
+
|
|
44
|
+
تُستخدم لاتخاذ القرارات الكبرى التي تتطلب رؤية من تخصصات متعددة (مالية، تقنية، قانونية).
|
|
45
|
+
|
|
46
|
+
// استشارة كامل المجلس في قضية استراتيجية
|
|
47
|
+
const response = await sdk.board.consult("نخطط لتوسيع عملياتنا في السوق الخليجي بميزانية مليون دولار، ما هي المخاطر والجدوى؟");
|
|
48
|
+
|
|
49
|
+
console.log("القرار التنفيذي:", response.data.final_decision.decision);
|
|
50
|
+
console.log("خارطة الطريق:", response.data.final_decision.action_items);
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
2. وحدة الوكلاء الديناميكية (Dynamic Agents)
|
|
54
|
+
|
|
55
|
+
يمكنك التحدث مع أي مدير تنفيذي مباشرة. يتميز الـ SDK بدعم الاستدعاء عبر الخصائص (Proxy).
|
|
56
|
+
|
|
57
|
+
// استشارة المدير المالي (CFO)
|
|
58
|
+
const financialReport = await sdk.agents.cfo.consult("حلل التدفق النقدي المتوقع للربع القادم");
|
|
59
|
+
|
|
60
|
+
// طلب مهمة تنفيذية من المدير التقني (CTO)
|
|
61
|
+
const codeTask = await sdk.agents.cto.execute("اكتب سكربت بايثون لتنظيف بيانات العملاء");
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
3. وحدة الذاكرة والمعرفة (Knowledge Base)
|
|
65
|
+
|
|
66
|
+
تسمح لك بتغذية ذكاء زكور بملفاتك المؤسسية ليقرأها الوكلاء قبل الرد.
|
|
67
|
+
|
|
68
|
+
// رفع مستند جديد (عقد أو سياسة شركة)
|
|
69
|
+
const upload = await sdk.knowledge.upload(fileBuffer, 'Policy_2026.pdf');
|
|
70
|
+
|
|
71
|
+
// عرض قائمة المستندات المرفوعة
|
|
72
|
+
const docs = await sdk.knowledge.list();
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
🔒 إدارة الجلسات (Contextual Threading)
|
|
76
|
+
|
|
77
|
+
للحفاظ على سياق المحادثة وجعل الوكيل يتذكر ما قيل سابقاً، قم بتمرير الـ threadId.
|
|
78
|
+
|
|
79
|
+
let threadId = null;
|
|
80
|
+
|
|
81
|
+
// الطلب الأول
|
|
82
|
+
const step1 = await sdk.agents.ceo.consult("من هو منافسنا الرئيسي؟");
|
|
83
|
+
threadId = step1.threadId;
|
|
84
|
+
|
|
85
|
+
// الطلب الثاني (بنفس السياق)
|
|
86
|
+
const step2 = await sdk.agents.ceo.consult("وكيف نتفوق عليه؟", { threadId });
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
⚠️ معالجة الأخطاء (Error Handling)
|
|
90
|
+
|
|
91
|
+
يوفر الـ SDK كلاس خاص للأخطاء ZakkurError يعطيك تفاصيل دقيقة عن سبب الفشل.
|
|
92
|
+
|
|
93
|
+
try {
|
|
94
|
+
const result = await sdk.board.consult("...");
|
|
95
|
+
} catch (error) {
|
|
96
|
+
if (error.name === 'ZakkurError') {
|
|
97
|
+
console.error(`Status: ${error.status}`); // 403, 429, etc.
|
|
98
|
+
console.error(`Code: ${error.code}`); // AGENT_RESTRICTED, QUOTA_EXCEEDED
|
|
99
|
+
console.error(`Message: ${error.message}`);
|
|
100
|
+
} else {
|
|
101
|
+
console.error("خطأ غير متوقع في الشبكة");
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
🛡️ الصلاحيات والقيود
|
|
107
|
+
|
|
108
|
+
باقة Startup: توفر الوصول إلى (CEO, CFO, CTO) فقط وبحد استهلاك 1,000 طلب شهرياً.
|
|
109
|
+
|
|
110
|
+
باقة Enterprise: تفتح كامل أعضاء المجلس (12 وكيلاً) مع دعم الأتمتة المستقلة والذاكرة غير المحدودة.
|
|
111
|
+
|
|
112
|
+
الأمان: لا تقم أبداً بتضمين مفتاح الـ API في كود الواجهة الأمامية (Client-side)؛ استخدم الـ SDK دائماً في بيئة خلفية (Backend).
|
|
113
|
+
|
|
114
|
+
📜 مراجع الـ API السريعة
|
|
115
|
+
|
|
116
|
+
المسار البرمجي
|
|
117
|
+
|
|
118
|
+
الوصف
|
|
119
|
+
|
|
120
|
+
المعاملات الأساسية
|
|
121
|
+
|
|
122
|
+
sdk.board.consult(text)
|
|
123
|
+
|
|
124
|
+
قرار مجلس إدارة شامل
|
|
125
|
+
|
|
126
|
+
context
|
|
127
|
+
|
|
128
|
+
sdk.agents.[role].consult(text)
|
|
129
|
+
|
|
130
|
+
استشارة وكيل متخصص
|
|
131
|
+
|
|
132
|
+
prompt, options
|
|
133
|
+
|
|
134
|
+
sdk.agents.[role].execute(task)
|
|
135
|
+
|
|
136
|
+
طلب مخرج عملي
|
|
137
|
+
|
|
138
|
+
task, options
|
|
139
|
+
|
|
140
|
+
sdk.knowledge.upload(file)
|
|
141
|
+
|
|
142
|
+
رفع ملف للذاكرة
|
|
143
|
+
|
|
144
|
+
file, title
|
|
145
|
+
|
|
146
|
+
sdk.board.getHistory()
|
|
147
|
+
|
|
148
|
+
استرجاع السجل
|
|
149
|
+
|
|
150
|
+
لا يوجد
|
|
151
|
+
|
|
152
|
+
تم بناء هذا النظام لتمكين الأتمتة المؤسسية الذكية. لطلب الدعم التقني أو الوصول المخصص، تواصل مع فريق المطورين عبر admin@sopen.ai
|
package/package.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "zakkur-sdk",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "The official Enterprise AI SDK for Zakkur - Digital C-Suite and Decision Engine.",
|
|
5
|
+
"main": "zakkur-sdk.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
8
|
+
},
|
|
9
|
+
"keywords": [
|
|
10
|
+
"ai",
|
|
11
|
+
"enterprise",
|
|
12
|
+
"decision-engine",
|
|
13
|
+
"zakkur",
|
|
14
|
+
"sdk",
|
|
15
|
+
"executive-ai"
|
|
16
|
+
],
|
|
17
|
+
"author": "Zakkur Team",
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=18.0.0"
|
|
21
|
+
},
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "git+https://github.com/SopenAi/zakkur-sdk.git"
|
|
25
|
+
},
|
|
26
|
+
"bugs": {
|
|
27
|
+
"url": "https://github.com/SopenAi/zakkur-sdk.git"
|
|
28
|
+
},
|
|
29
|
+
"homepage": "https://zakkur.com"
|
|
30
|
+
}
|
package/test-sdk.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* سكربت تجريبي لاختبار عمل الـ SDK مع السيرفر
|
|
3
|
+
* تأكد من تشغيل السيرفر أولاً (node server.js)
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const Zakkur = require('./zakkur-sdk');
|
|
7
|
+
|
|
8
|
+
// استبدل المفتاح بمفتاح صالح من قاعدة البيانات الخاصة بك
|
|
9
|
+
const sdk = new Zakkur({
|
|
10
|
+
apiKey: 'zk_live_your_actual_key_here',
|
|
11
|
+
baseUrl: 'http://localhost:8080/api'
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
async function runTest() {
|
|
15
|
+
console.log("🚀 بدء اختبار نظام زكور...");
|
|
16
|
+
|
|
17
|
+
try {
|
|
18
|
+
// 1. اختبار استشارة المجلس
|
|
19
|
+
console.log("\n1. استشارة مجلس الإدارة...");
|
|
20
|
+
const boardRes = await sdk.board.consult("هل يجب أن ننتقل لاستخدام الحوسبة السحابية بالكامل؟");
|
|
21
|
+
console.log("✅ رد المجلس:", boardRes.data.final_decision.decision);
|
|
22
|
+
|
|
23
|
+
// 2. اختبار استشارة وكيل محدد (CFO)
|
|
24
|
+
console.log("\n2. استشارة المدير المالي (CFO)...");
|
|
25
|
+
const cfoRes = await sdk.agents.cfo.consult("ما هي مخاطر الاستثمار في العملات الرقمية للشركة؟");
|
|
26
|
+
console.log("✅ رد الـ CFO:", cfoRes.response);
|
|
27
|
+
|
|
28
|
+
// 3. اختبار جلب السجل
|
|
29
|
+
console.log("\n3. جلب سجل القرارات...");
|
|
30
|
+
const history = await sdk.board.getHistory();
|
|
31
|
+
console.log(`✅ تم استرجاع ${history.data.length} قرار سابق.`);
|
|
32
|
+
|
|
33
|
+
} catch (error) {
|
|
34
|
+
console.error("\n❌ فشل الاختبار:");
|
|
35
|
+
console.error(`الرسالة: ${error.message}`);
|
|
36
|
+
console.error(`الكود: ${error.code}`);
|
|
37
|
+
console.error(`الحالة: ${error.status}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
runTest();
|
package/zakkur-sdk.js
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
class ZakkurError extends Error {
|
|
2
|
+
constructor(message, status, code, details = null) {
|
|
3
|
+
super(message);
|
|
4
|
+
this.name = 'ZakkurError';
|
|
5
|
+
this.status = status;
|
|
6
|
+
this.code = code;
|
|
7
|
+
this.details = details;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
class Zakkur {
|
|
12
|
+
#apiKey;
|
|
13
|
+
#baseUrl;
|
|
14
|
+
#config;
|
|
15
|
+
|
|
16
|
+
constructor({
|
|
17
|
+
apiKey,
|
|
18
|
+
baseUrl = 'http://localhost:8080/api',
|
|
19
|
+
timeout = 30000,
|
|
20
|
+
retries = 3
|
|
21
|
+
}) {
|
|
22
|
+
if (!apiKey) throw new ZakkurError("API Key is missing", 400, 'AUTH_REQUIRED');
|
|
23
|
+
|
|
24
|
+
this.#apiKey = apiKey;
|
|
25
|
+
this.#baseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;
|
|
26
|
+
this.#config = { timeout, retries };
|
|
27
|
+
this.version = '3.0.2';
|
|
28
|
+
|
|
29
|
+
this.board = this.#initBoardModule();
|
|
30
|
+
this.agents = this.#initAgentsProxy();
|
|
31
|
+
this.knowledge = this.#initKnowledgeModule();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async #executeRequest(endpoint, method = 'GET', payload = null, isFileUpload = false) {
|
|
35
|
+
const url = `${this.#baseUrl}${endpoint}`;
|
|
36
|
+
const controller = new AbortController();
|
|
37
|
+
const timeoutId = setTimeout(() => controller.abort(), this.#config.timeout);
|
|
38
|
+
|
|
39
|
+
let headers = {
|
|
40
|
+
'x-api-key': this.#apiKey,
|
|
41
|
+
'X-SDK-Version': this.version,
|
|
42
|
+
'X-SDK-Client': typeof window !== 'undefined' ? 'Browser' : 'Node.js'
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
let body = null;
|
|
46
|
+
if (isFileUpload) {
|
|
47
|
+
body = payload;
|
|
48
|
+
} else if (payload) {
|
|
49
|
+
headers['Content-Type'] = 'application/json';
|
|
50
|
+
body = JSON.stringify(payload);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
let attempt = 0;
|
|
54
|
+
const maxAttempts = this.#config.retries;
|
|
55
|
+
|
|
56
|
+
while (attempt <= maxAttempts) {
|
|
57
|
+
try {
|
|
58
|
+
const response = await fetch(url, { method, headers, body, signal: controller.signal });
|
|
59
|
+
clearTimeout(timeoutId);
|
|
60
|
+
|
|
61
|
+
const contentType = response.headers.get("content-type");
|
|
62
|
+
let result;
|
|
63
|
+
|
|
64
|
+
// التحقق من أن الرد بصيغة JSON قبل المعالجة لضمان القوة والاستقرار
|
|
65
|
+
if (contentType && contentType.includes("application/json")) {
|
|
66
|
+
result = await response.json();
|
|
67
|
+
} else {
|
|
68
|
+
const text = await response.text();
|
|
69
|
+
throw new ZakkurError("Unexpected non-JSON response from server", response.status, 'INVALID_RESPONSE_FORMAT', { raw: text });
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (!response.ok) {
|
|
73
|
+
if ([429, 503].includes(response.status) && attempt < maxAttempts) {
|
|
74
|
+
attempt++;
|
|
75
|
+
const backoff = Math.pow(2, attempt) * 1000;
|
|
76
|
+
await new Promise(r => setTimeout(r, backoff));
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
throw new ZakkurError(
|
|
81
|
+
result.message || "Upstream server error",
|
|
82
|
+
response.status,
|
|
83
|
+
result.code || 'UPSTREAM_ERROR',
|
|
84
|
+
result.errors
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return result;
|
|
89
|
+
|
|
90
|
+
} catch (error) {
|
|
91
|
+
clearTimeout(timeoutId);
|
|
92
|
+
if (error.name === 'AbortError') throw new ZakkurError("Request Timeout", 408, 'TIMEOUT');
|
|
93
|
+
if (error instanceof ZakkurError) throw error;
|
|
94
|
+
|
|
95
|
+
if (attempt >= maxAttempts) throw new ZakkurError(error.message, 500, 'NET_ERROR');
|
|
96
|
+
|
|
97
|
+
attempt++;
|
|
98
|
+
await new Promise(r => setTimeout(r, 1000));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
#initBoardModule() {
|
|
104
|
+
return {
|
|
105
|
+
consult: (context) => this.#executeRequest('/decision', 'POST', { context }),
|
|
106
|
+
getHistory: () => this.#executeRequest('/history', 'GET')
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
#initAgentsProxy() {
|
|
111
|
+
const self = this;
|
|
112
|
+
return new Proxy({}, {
|
|
113
|
+
get(target, role) {
|
|
114
|
+
const agentRole = role.toLowerCase();
|
|
115
|
+
return {
|
|
116
|
+
consult: (userPrompt, options = {}) =>
|
|
117
|
+
self.#executeRequest(`/agent/${agentRole}/consult`, 'POST', {
|
|
118
|
+
prompt: userPrompt,
|
|
119
|
+
threadId: options.threadId
|
|
120
|
+
}),
|
|
121
|
+
execute: (task, options = {}) =>
|
|
122
|
+
self.#executeRequest(`/agent/${agentRole}/execute`, 'POST', {
|
|
123
|
+
prompt: task,
|
|
124
|
+
threadId: options.threadId
|
|
125
|
+
})
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
#initKnowledgeModule() {
|
|
132
|
+
return {
|
|
133
|
+
upload: (fileObject, title = null) => {
|
|
134
|
+
const formData = new FormData();
|
|
135
|
+
formData.append('file', fileObject);
|
|
136
|
+
if (title) formData.append('title', title);
|
|
137
|
+
return this.#executeRequest('/knowledge/upload', 'POST', formData, true);
|
|
138
|
+
},
|
|
139
|
+
list: () => this.#executeRequest('/knowledge', 'GET'),
|
|
140
|
+
delete: (docId) => this.#executeRequest(`/knowledge/${docId}`, 'DELETE')
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (typeof module !== 'undefined' && module.exports) {
|
|
146
|
+
module.exports = Zakkur;
|
|
147
|
+
} else {
|
|
148
|
+
window.Zakkur = Zakkur;
|
|
149
|
+
}
|