المتطلبات
- Node.js 22.19 أو أحدث (
engines.nodeفيpackage.json؛ فالأداة المدمجةhttpتعتمد علىundici@8الذي يتطلب ذلك). - TypeScript اختيارية لكن يوصى بها، فالـ SDK تأتي بتعريفات أنواع كاملة.
تثبيت الحزمة
ai (وهي Vercel AI SDK: ^4.3.19 أو ^6.0.0 أو ^7.0.0) وzod (^3.25.76 || ^4.0.0) اعتماديتان نظيرتان (peer dependencies) مطلوبتان. الإصدار ai 5 غير مدعوم.
المخططات من أي من الإصدارين الرئيسيين لـ zod تعمل في كل موضع تقبل فيه الـ SDK مخططًا (defineTool({ input })، وoutput المنظَّم، وأدوات MCP)، ومنها مخططات zod 4 من zod/v4 حين يكون zod 3.25 مثبَّتًا، ومخططات zod 3 من zod/v3 على zod 4. ويمكن أن يكون input في defineTool مخططًا من مكتبة أخرى تتبع Standard Schema إذا كانت تكشف مخطط JSON Schema الخاص به (~standard.jsonSchema)؛ فالنموذج يحتاج إلى JSON Schema، ولذلك يُرفض مخطط Standard Schema الذي لا يوفّره (استخدم zod لتلك الأدوات). حزم المزوّدين الخاصة بـ ai 4 تعلن zod 3 اعتماديةً نظيرة، فقرِن zod 4 بـ ai 6 أو 7.
حزم المزوّدين
كل مزوّد LLM حقيقي يستند إلى اعتمادية نظيرة اختيارية، بالإصدار الرئيسي الذي يقترن بالإصدار الرئيسي لـai لديك. ثبّت الزوج من صف واحد:
مثلًا، على الإصدار الرئيسي الحالي من
ai:
ai 6/7 يحتاج إلى zod 4. الحزمة ollama-ai-provider-v2 (حزمة Ollama لـ ai 6 و7) تعلن zod ^4 اعتماديةً نظيرة. والـ SDK تقبل zod 4، فثبّتها مع zod 4، مثلًا npm install ai@^7.0.0 ollama-ai-provider-v2@^4.0.0 zod@^4.0.0. أما مع zod 3 فاستخدم ai@^4.3.19 مع ollama-ai-provider@^1.2.0 (وهو ما ينشئه lousho init --provider ollama).
تُحمَّل الحزم النظيرة عند الطلب: استيراد @lousho/build-ai-agent (أو أي من مداخلها الفرعية) لا يحمّل حزمة مزوّد أبدًا، فلا تحتاج إلى تثبيت غير ما تستخدمه منها. تُحمَّل حزمة كل مزوّد عند أول استدعاء يجريه ذلك المزوّد؛ وإذا كانت ناقصة، فشل ذلك الاستدعاء بخطأ MissingPeerDependencyError يحمل الأمر الدقيق الذي عليك تشغيله، بما يناسب الإصدار الرئيسي لـ ai المثبَّت لديك. مع ai 4:
الحزم النظيرة الاختيارية
هذه الحزم أيضًا اعتماديات نظيرة اختيارية. المشروع الذي لا يستخدم أبدًا العزل بـ Docker ولا MCP ولا التتبّع بـ OpenTelemetry ولا واجهات React أو Vue ولاlousho build ولا أسئلة lousho init لا يثبّت أيًّا منها:
كحزم المزوّدين، تُحمَّل كل واحدة منها عند أول استخدام، لا وقت الاستيراد أبدًا، والناقصة منها تُفشل ذلك الاستدعاء بخطأ
MissingPeerDependencyError يذكر الميزة والأمر الدقيق، مثلًا:
npm create lousho-agent الحزمة prompts بنفسه، فإنشاء هيكل المشروع به لا يحتاج إلى شيء إضافي. يسرد lousho doctor كل حزمة نظيرة اختيارية، وما تتيحه، وهل هي مثبَّتة (غياب dockerode خطأ فقط حين يستخدم ملف مواصفات الوكيل أداة معزولة).
تبقى undici وyaml اعتماديتين عاديتين. تحلّل yaml ملفات مواصفات الوكلاء وملفات agent.yaml والمهارات، وليس في Node محلّل YAML مدمج. أما undici فلا تحمّلها أداة http إلا حين يضبط الطلب validateSSL: false (إعداد TLS خاص بالطلب الواحد لا تستطيع fetch العامة التعبير عنه)؛ وكل طلب آخر يستخدم fetch العامة في بيئة التشغيل.
نقاط الدخول تتشارك الشيفرة (ESM وCJS)
مداخل الحزمة (. و./hooks و./tools و./mcp وغيرها) مبنية بتقسيم الشيفرة (code splitting): فهي تستورد قطعًا مشتركة من dist/، ولذلك يكون الصنف أو الكائن الوحيد (singleton) مثل HookRegistry أو SDKError أو globalToolRegistry هو الكائن نفسه أيًّا كان المدخل الذي تستورده منه، في ESM وفي CJS. لكن استيراد الحزمة بـ import في ESM وبـ require في CJS ضمن عملية واحدة يحمّل مع ذلك نسختين منفصلتين (خطر الحزمة المزدوجة في Node)، فالصنف من إحداهما لا يساوي === نظيره من الأخرى. الفحصان instanceof SDKError وinstanceof HookRegistry آمنان بين النسختين (فهما يفحصان علامة Symbol.for)؛ وللأصناف الأخرى، استخدم صيغة وحدات واحدة لكل عملية.
التثبيت من بناء محلي
لتجربة إيداع (commit) غير منشور، ابنِ الـ SDK وحزّمها من نسخة محلية من هذا المستودع، ثم ثبّت ملف tarball في مشروعك، وهي الطريقة نفسها التي يستخدمهاlousho init --sdk-path للمشاريع التي ينشئها. يُتحقق من ذلك في CI بواسطة npm run pack-smoke، الذي يثبّت ملف tarball المحزَّم في مشروع جديد ويحمّل كل نقطة دخول، في ESM وCJS:
node bin/lousho.js init ../my-agent --sdk-path ..
الأمر npm install github:LinuxDevil/agent-sdk لا يعمل: فالمجلد dist/ غير موجود في git وليس في المستودع خطوة بناء prepare، فيخلو التثبيت من نقاط الدخول.
إنشاء هيكل مشروع جديد
ينشئlousho init مشروعًا جاهزًا للتشغيل: package.json (بصيغة ESM، ويعتمد على هذه الـ SDK بنطاق إصدارات)، وtsconfig.json صارمًا، وsrc/agent.ts يستدعي createAgent({ model, instructions }) مع أداة نموذجية معرَّفة بـ defineTool()، واختبارًا يعمل دون اتصال src/agent.test.ts يستخدم mockModel، وملف .env.example يذكر اسم متغير مفتاح مزوّدك، و.gitignore وملف README. ثم يثبّت الاعتماديات ويشغّل git init.
create-lousho-agent (packages/create-lousho-agent) غلاف رقيق يشغّل lousho init بالوسائط نفسها.
واجهة سطر الأوامر lousho
تثبيت الحزمة يثبّت معها الأمر lousho: init وdoctor وdev وchat وacp وadd وmcp وeval وbuild وstudio. انظر واجهة سطر الأوامر لمعرفة ما يفعله كل أمر وخياراته. يحتاج البناء إلى tsup، وهو اعتمادية نظيرة اختيارية (انظر الجدول أعلاه): npm install --save-dev tsup.
استكشاف الأخطاء وإصلاحها: lousho doctor
شغّلnpx lousho doctor بعد التثبيت مباشرة. يطبع سطرًا لكل فحص مع حالة (ok أو warn أو FAIL)، وما وجده، ولكل ما ليس سليمًا الأمرَ الذي عليك تشغيله أو الإعداد الذي عليك تغييره:
- إصدار Node لديك مقابل
engines.nodeالخاص بالحزمة. - الحزمتان النظيرتان المطلوبتان
aiوzod: أنهما مثبَّتتان، وضمن نطاقpeerDependenciesالخاص بالـ SDK (يُحلّ من المجلد الحالي). - حزم المزوّدين الاختيارية (
@ai-sdk/openaiو@ai-sdk/anthropic، وollama-ai-providerعلىai4 أوollama-ai-provider-v2علىai6/7)، مع أمرnpm installلكل حزمة ناقصة. حزمة المزوّد التي لا تقترن بنسخةaiالمثبَّتة (مثلًاai7 مع@ai-sdk/openai1.x) يُنبَّه إليها مع الإصدار الذي ينبغي تثبيته بدلًا منها. - هل متغير مفتاح API لكل مزوّد مضبوط. لا يُطبع إلا اسم المتغير و
set/not set، ولا تُطبع القيمة أبدًا. ويعرض أيضًا أي مزوّد سيختارهcreateAgent()افتراضيًا في بيئتك. - مع مسار ملف مواصفات (
lousho doctor agent.yaml): يُتحقق من صحة ملف المواصفات مع مسارات الحقول لكل خطأ، وتُفحص حزمة مزوّده ومفتاحه (الناقص منهما يصبح إخفاقًا)، ويجب أن تكون أدواته فيtoolsأدوات مدمجة، ويجب أن يكون أي أمر فيmcpServersقابلًا للحل. - إمكانية الوصول إلى Ollama، فقط حين يستخدم ملف المواصفات Ollama أو يكون
OLLAMA_HOSTمضبوطًا. - توفّر Docker، وهو تحذير فقط حين يستخدم ملف المواصفات أداة معزولة.
1 إذا فشل أي فحص و0 في غير ذلك (التحذيرات لا تُفشل)، فيصلح شرطًا لاجتياز CI. أضف --json للحصول على مخرجات تقرؤها الآلة. لا تُستخدم الألوان إلا حين يكون stdout طرفية ويكون NO_COLOR غير مضبوط.
التالي: البدء السريع.