بناء وكلاء ذكاء اصطناعي جاهزين للإنتاج باستخدام Claude Agent SDK و TypeScript

Anthropic لم تبنِ Claude فقط — بل بنت البنية التحتية التي تمكّن أي مطور من إنشاء وكلاء بنفس قدرات Claude Code. تمنحك Claude Agent SDK نفس حلقة الوكيل والأدوات وإدارة السياق التي تشغّل Claude Code، متاحة كمكتبة برمجية بلغة TypeScript (و Python).
في هذا الدرس، ستنتقل من الصفر إلى وكيل ذكاء اصطناعي جاهز للإنتاج يمكنه قراءة الملفات، وتنفيذ الأوامر، واستدعاء أدوات مخصصة، وتنسيق وكلاء فرعيين — كل ذلك بلغة TypeScript.
لماذا Claude Agent SDK؟ على عكس أُطُر LLM العامة، تمنحك Agent SDK حلقة وكيل Claude Code المُختبرة جاهزة للاستخدام. لا حاجة لتنفيذ منطق إعادة المحاولة، أو إدارة السياق، أو تنفيذ الأدوات — كل ذلك مدمج. أنت تركز على ما يفعله وكيلك، وليس كيف يعمل.
ما ستتعلمه
بنهاية هذا الدرس، ستكون قادراً على:
- إعداد مشروع TypeScript مع Claude Agent SDK
- تشغيل حلقة وكيل مستقل باستخدام دالة
query - استخدام الأدوات المدمجة (Bash و Read و Write و Edit و Glob و Grep) دون الحاجة لتنفيذها بنفسك
- إنشاء أدوات MCP مخصصة وربطها بوكيلك
- تكوين أوضاع الصلاحيات للتنفيذ المستقل الآمن
- بناء وكلاء فرعيين لتنسيق الوكلاء المتعددين
- معالجة الرسائل المتدفقة واستخراج النتائج
- نشر الوكلاء مع معالجة الأخطاء وضوابط الميزانية
المتطلبات الأساسية
قبل البدء، تأكد من توفر:
- Node.js 20+ مثبت (
node --version) - معرفة بـ TypeScript 5.2+ (المكررات غير المتزامنة،
await using) - مفتاح Anthropic API (احصل عليه من console.anthropic.com)
- Claude Code CLI مثبت (
npm install -g @anthropic-ai/claude-code) - محرر كود — VS Code أو Cursor موصى به
مهم: تعمل Claude Agent SDK تحت غطاء Claude Code. تحتاج أن يكون Claude Code CLI مثبتاً ومصادقاً قبل استخدام SDK. شغّل claude في الطرفية للتحقق من أنه يعمل.
كيف تعمل Agent SDK
مكتبات LLM التقليدية تمنحك استدعاء API واحد: مُدخَل ونص مُخرَج. أما Agent SDK فتمنحك حلقة وكيل كاملة — نفس الحلقة التي تشغّل Claude Code:
موجّهك ← حلقة الوكيل ← Claude يفكر في المهمة
↓
Claude يستدعي أداة (Read, Bash, Edit, إلخ)
↓
الأداة تُنفَّذ وتعيد النتيجة
↓
Claude يفكر في النتيجة
↓
Claude يستدعي أداة أخرى (أو يستجيب)
↓
... تستمر الحلقة حتى اكتمال المهمة ...
↓
النتيجة النهائية تُعاد إليك
الفكرة الجوهرية: أنت لا تُنفّذ الحلقة. SDK تتعامل مع تنفيذ الأدوات، وإدارة السياق، وميزانيات الرموز، واستعادة الأخطاء. أنت تقدم الموجّه والإعدادات فقط.
البنية المعمارية
┌──────────────────────────────────────────┐
│ تطبيقك │
│ │
│ query({ prompt, options }) ──────┐ │
│ ▼ │
│ ┌────────────────────────────────────┐ │
│ │ حلقة وكيل Claude │ │
│ │ │ │
│ │ ┌──────────┐ ┌───────────────┐ │ │
│ │ │ الأدوات │ │ أدوات MCP │ │ │
│ │ │ المدمجة │ │ المخصصة │ │ │
│ │ │ │ │ │ │ │
│ │ │ - Bash │ │ - واجهاتك │ │ │
│ │ │ - Read │ │ - قواعد │ │ │
│ │ │ - Write │ │ البيانات │ │ │
│ │ │ - Edit │ │ - الخدمات │ │ │
│ │ │ - Glob │ │ - أي شيء │ │ │
│ │ │ - Grep │ │ │ │ │
│ │ └──────────┘ └───────────────┘ │ │
│ │ │ │
│ │ ┌──────────────┐ │ │
│ │ │ الوكلاء │ │ │
│ │ │ الفرعيون │ │ │
│ │ └──────────────┘ │ │
│ └────────────────────────────────────┘ │
│ │
│ async for (message) ← تدفق ◄─────────│
└──────────────────────────────────────────┘
الخطوة 1: إعداد المشروع
أنشئ مشروع TypeScript جديد وثبّت SDK:
mkdir claude-agent-project && cd claude-agent-project
npm init -y
npm install @anthropic-ai/claude-agent-sdk
npm install -D typescript @types/node tsxهيّئ TypeScript:
npx tsc --init --target ES2022 --module NodeNext --moduleResolution NodeNext --outDir distحدّث ملف package.json لتمكين وحدات ES:
{
"type": "module",
"scripts": {
"start": "tsx src/index.ts",
"build": "tsc"
}
}أنشئ هيكل المشروع:
mkdir srcالخطوة 2: وكيلك الأول
أنشئ ملف src/index.ts — وكيل بسيط يسرد ويحلل الملفات في مجلد:
import { query } from "@anthropic-ai/claude-agent-sdk";
async function main() {
console.log("جاري تشغيل الوكيل...\n");
for await (const message of query({
prompt: "ما هي الملفات الموجودة في هذا المجلد؟ أعطني ملخصاً لهيكل المشروع.",
options: {
allowedTools: ["Bash", "Glob", "Read"],
maxTurns: 10,
},
})) {
// معالجة أنواع الرسائل المختلفة
if ("result" in message) {
console.log("\n--- نتيجة الوكيل ---");
console.log(message.result);
}
}
}
main().catch(console.error);شغّله:
npx tsx src/index.tsهذا كل شيء. سيقوم الوكيل بـ:
- استقبال موجّهك
- تحديد أنه يحتاج لسرد الملفات (يستدعي
GlobأوBash) - قراءة النتائج
- ربما قراءة ملفات محددة لمزيد من السياق
- إعادة ملخص منظم
أنت لم تُنفّذ قراءة الملفات، أو مطابقة الأنماط، أو تنفيذ أوامر الصدفة — SDK توفر كل ذلك.
الخطوة 3: فهم أنواع الرسائل
دالة query تعيد مكرراً غير متزامن من الرسائل. لنبنِ معالج رسائل أكثر متانة:
import { query } from "@anthropic-ai/claude-agent-sdk";
async function main() {
for await (const message of query({
prompt: "ابحث عن جميع ملفات TypeScript واحسب إجمالي عدد سطور الكود.",
options: {
allowedTools: ["Bash", "Glob", "Read"],
maxTurns: 15,
},
})) {
switch (message.type) {
case "assistant":
// نص استجابة أو تفكير Claude
const textBlocks = message.message.content
.filter((block: { type: string }) => block.type === "text")
.map((block: { type: string; text: string }) => block.text);
if (textBlocks.length > 0) {
console.log("[Claude]", textBlocks.join(""));
}
break;
case "tool_use":
// Claude يستدعي أداة
console.log(`[استدعاء أداة] ${message.name}(${JSON.stringify(message.input).slice(0, 100)}...)`);
break;
case "tool_result":
// نتيجة تنفيذ الأداة
console.log(`[نتيجة الأداة] ${message.content?.slice(0, 200)}...`);
break;
case "result":
if (message.subtype === "success") {
console.log("\n✓ أكمل الوكيل بنجاح");
console.log(message.result);
} else {
console.error("\n✗ فشل الوكيل:", message.error);
}
break;
}
}
}
main().catch(console.error);أنواع الرسائل الرئيسية
| النوع | الوصف |
|---|---|
assistant | نص استجابة أو تفكير Claude |
tool_use | Claude يطلب استدعاء أداة |
tool_result | نتيجة تنفيذ أداة |
result | النتيجة النهائية (نجاح أو خطأ) |
الخطوة 4: الأدوات المدمجة
تأتي Agent SDK مع نفس الأدوات التي تشغّل Claude Code. لا حاجة لتنفيذها — فقط اسمح بها:
| الأداة | ما تفعله |
|---|---|
Bash | تنفيذ أوامر الصدفة |
Read | قراءة محتويات الملفات |
Write | إنشاء أو استبدال الملفات |
Edit | إجراء تعديلات مستهدفة على الملفات |
Glob | البحث عن الملفات حسب النمط |
Grep | البحث في محتويات الملفات باستخدام التعبيرات النمطية |
Task | تشغيل وكيل فرعي للعمل المتوازي |
WebFetch | جلب ومعالجة محتوى الويب |
WebSearch | البحث في الويب |
إليك وكيلاً يستخدم عدة أدوات مدمجة لإعادة هيكلة الكود:
import { query } from "@anthropic-ai/claude-agent-sdk";
async function refactorAgent(targetFile: string, instruction: string) {
for await (const message of query({
prompt: `أعد هيكلة الملف ${targetFile}: ${instruction}`,
options: {
allowedTools: ["Read", "Edit", "Glob", "Grep"],
permissionMode: "acceptEdits", // الموافقة التلقائية على تغييرات الملفات
maxTurns: 20,
},
})) {
if ("result" in message) {
return message.result;
}
}
}
// الاستخدام
const result = await refactorAgent(
"src/utils.ts",
"استخرج جميع الدوال المساعدة إلى وحدات منفصلة حسب مجالها"
);
console.log(result);أوضاع الصلاحيات
خيار permissionMode يتحكم فيما يمكن لـ Claude فعله دون استئذان:
| الوضع | السلوك |
|---|---|
"default" | يسأل قبل أي استخدام للأدوات |
"acceptEdits" | يوافق تلقائياً على قراءة وتعديل الملفات |
"bypassPermissions" | يوافق تلقائياً على كل شيء (استخدم بحذر) |
نصيحة أمنية: في الإنتاج، ابدأ بـ "default" أو "acceptEdits". لا تستخدم "bypassPermissions" إلا في بيئات معزولة حيث لا يمكن للوكيل التسبب بأضرار.
الخطوة 5: أدوات MCP المخصصة
القوة الحقيقية تأتي من ربط أدواتك الخاصة. تدعم Agent SDK خوادم MCP (بروتوكول سياق النموذج) — نفس المعيار المستخدم في Claude Desktop و Cursor.
إنشاء خادم MCP داخلي
يمكنك تعريف الأدوات مباشرة في كود TypeScript باستخدام createSdkMcpServer:
import { query } from "@anthropic-ai/claude-agent-sdk";
import { createSdkMcpServer, tool } from "@anthropic-ai/claude-agent-sdk/mcp";
// تعريف أدوات مخصصة
const analyticsServer = createSdkMcpServer({
name: "analytics",
version: "1.0.0",
tools: [
tool(
"get_page_views",
"الحصول على تحليلات مشاهدات الصفحات لمسار URL ونطاق زمني محدد",
{
type: "object",
properties: {
path: { type: "string", description: "مسار URL (مثل /blog/my-post)" },
startDate: { type: "string", description: "تاريخ البداية (YYYY-MM-DD)" },
endDate: { type: "string", description: "تاريخ النهاية (YYYY-MM-DD)" },
},
required: ["path", "startDate", "endDate"],
},
async ({ path, startDate, endDate }) => {
// استدعاء API التحليلات الفعلي هنا
const response = await fetch(
`https://api.analytics.example.com/views?path=${path}&start=${startDate}&end=${endDate}`
);
const data = await response.json();
return JSON.stringify(data);
}
),
tool(
"get_top_pages",
"الحصول على أكثر N صفحة زيارة",
{
type: "object",
properties: {
limit: { type: "number", description: "عدد الصفحات المطلوبة" },
period: { type: "string", enum: ["day", "week", "month"], description: "الفترة الزمنية" },
},
required: ["limit", "period"],
},
async ({ limit, period }) => {
const response = await fetch(
`https://api.analytics.example.com/top?limit=${limit}&period=${period}`
);
const data = await response.json();
return JSON.stringify(data);
}
),
],
});
// الاستخدام مع إدخال التدفق (مطلوب لخوادم MCP)
async function* generateMessages() {
yield {
type: "user" as const,
message: {
role: "user" as const,
content: "ما هي أكثر 10 صفحات زيارة هذا الشهر؟ ثم حلل اتجاه الصفحة الأولى خلال آخر 30 يوماً.",
},
};
}
for await (const message of query({
prompt: generateMessages(),
options: {
mcpServers: {
analytics: analyticsServer,
},
allowedTools: [
"mcp__analytics__get_page_views",
"mcp__analytics__get_top_pages",
],
maxTurns: 10,
},
})) {
if ("result" in message) {
console.log(message.result);
}
}الاتصال بخوادم MCP خارجية
يمكنك أيضاً الاتصال بأي خادم MCP موجود — مثل خادم قاعدة بيانات أو GitHub أو خدماتك الداخلية:
import { query } from "@anthropic-ai/claude-agent-sdk";
for await (const message of query({
prompt: "اسرد المشاكل المفتوحة المصنفة كـ 'bug' ولخّص الأكثر أهمية.",
options: {
mcpServers: {
github: {
command: "npx",
args: ["-y", "@modelcontextprotocol/server-github"],
env: {
GITHUB_TOKEN: process.env.GITHUB_TOKEN!,
},
},
},
allowedTools: ["mcp__github__*"], // حرف بدل: السماح بجميع أدوات GitHub
maxTurns: 15,
},
})) {
if ("result" in message) {
console.log(message.result);
}
}نقل SSE و HTTP
لخوادم MCP البعيدة، استخدم نقل SSE أو HTTP:
options: {
mcpServers: {
"remote-api": {
type: "sse",
url: "https://mcp.example.com/sse",
headers: {
Authorization: `Bearer ${process.env.API_TOKEN}`,
},
},
},
}الخطوة 6: موجّهات النظام وسلوك الوكيل
خصّص شخصية وكيلك وقيوده وخبرته في المجال:
import { query } from "@anthropic-ai/claude-agent-sdk";
const CODE_REVIEW_PROMPT = `أنت مراجع كود خبير متخصص في TypeScript و React.
عملية المراجعة:
1. اقرأ الملفات المعدّلة
2. تحقق من الأخطاء ومشاكل الأمان والأداء
3. تحقق من صحة واكتمال أنواع TypeScript
4. تأكد من أفضل ممارسات React (قواعد hooks، خصائص key، استخدام memo)
5. قدّم مراجعة منظمة بمستويات خطورة
تنسيق المخرجات:
- 🔴 حرج: يجب إصلاحه قبل الدمج
- 🟡 تحذير: يجب إصلاحه لكنه غير مانع
- 🟢 اقتراح: تحسينات مستحسنة
كن محدداً. أشر إلى أرقام الأسطر. اقترح إصلاحات مع كود.`;
async function reviewCode(diffOrPath: string) {
for await (const message of query({
prompt: `راجع هذا الكود:\n\n${diffOrPath}`,
options: {
systemPrompt: CODE_REVIEW_PROMPT,
allowedTools: ["Read", "Glob", "Grep"],
maxTurns: 25,
},
})) {
if ("result" in message) {
return message.result;
}
}
}الخطوة 7: الوكلاء الفرعيون لتنسيق الوكلاء المتعددين
للمهام المعقدة، يمكنك تعريف وكلاء فرعيين متخصصين يمكن للوكيل الرئيسي تفويض العمل إليهم:
import { query } from "@anthropic-ai/claude-agent-sdk";
for await (const message of query({
prompt: "حلل تغطية الاختبارات في هذا المشروع، ثم اكتب اختبارات لأي دوال غير مغطاة في src/utils/.",
options: {
allowedTools: ["Read", "Write", "Edit", "Bash", "Glob", "Grep", "Task"],
agents: {
"test-analyzer": {
description: "يحلل تغطية الاختبارات ويحدد مسارات الكود غير المختبرة",
tools: ["Bash", "Read", "Glob", "Grep"],
prompt: "أنت محلل تغطية اختبارات. شغّل أدوات التغطية، وحلل التقارير، وحدد الدوال غير المختبرة.",
model: "haiku", // استخدم نموذجاً أسرع للتحليل
},
"test-writer": {
description: "يكتب اختبارات وحدة شاملة لدوال TypeScript",
tools: ["Read", "Write", "Edit", "Glob"],
prompt: "أنت مهندس اختبارات. اكتب اختبارات وحدة شاملة باستخدام Vitest مع محاكاة صحيحة وتغطية الحالات الطرفية.",
model: "sonnet",
},
},
maxTurns: 30,
},
})) {
if ("result" in message) {
console.log(message.result);
}
}كيف تعمل الوكلاء الفرعيون
عندما تعرّف agents في الخيارات، يحصل الوكيل الرئيسي على وصول لأداة Task. يمكنه تشغيل وكلاء فرعيين بالاسم وتمرير موجّه لهم. كل وكيل فرعي:
- يعمل في سياقه الخاص مع مجموعة أدواته الخاصة
- يمكنه استخدام نموذج مختلف (وفّر التكاليف بـ
haikuللمهام البسيطة) - يعيد النتائج للوكيل الرئيسي لتجميعها
هذا النمط مفيد لـ:
- فرّق وانتصر: قسّم التحليل والتنفيذ
- تحسين التكلفة: استخدم نماذج أرخص للمهام الفرعية البسيطة
- العمل المتوازي: يمكن لعدة وكلاء فرعيين العمل بالتزامن
- فصل الاهتمامات: كل وكيل لديه خبرة مركّزة
الخطوة 8: ضوابط الميزانية والأمان
الوكلاء في الإنتاج يحتاجون حواجز أمان. SDK توفر عدة خيارات:
import { query } from "@anthropic-ai/claude-agent-sdk";
for await (const message of query({
prompt: "حوّل جميع ملفات JavaScript إلى TypeScript مع أنواع صحيحة.",
options: {
allowedTools: ["Read", "Write", "Edit", "Glob", "Grep", "Bash"],
// حدود الدورات
maxTurns: 50, // أقصى عدد من استدعاءات الأدوات قبل التوقف
// ضوابط التكلفة
maxBudgetUsd: 2.0, // توقف إذا تجاوزت التكلفة $2.00
// اختيار النموذج
model: "claude-sonnet-4-5-20250929", // استخدم نموذجاً محدداً
// قيود الأدوات
disallowedTools: ["WebSearch", "WebFetch"], // حظر أدوات محددة
// مجلد العمل
cwd: "/path/to/project",
// متغيرات البيئة المتاحة لأداة Bash
env: {
NODE_ENV: "development",
DATABASE_URL: process.env.DATABASE_URL!,
},
// وضع الصلاحيات
permissionMode: "acceptEdits",
},
})) {
// معالجة الرسائل
}دالة canUseTool المُخصَّصة
للتحكم الدقيق، نفّذ معالج صلاحيات مخصص:
import { query } from "@anthropic-ai/claude-agent-sdk";
for await (const message of query({
prompt: "نظّف وحسّن قاعدة الكود.",
options: {
allowedTools: ["Read", "Write", "Edit", "Bash", "Glob", "Grep"],
canUseTool: async (toolName, input) => {
// حظر أوامر bash التدميرية
if (toolName === "Bash") {
const command = (input as { command: string }).command;
const dangerous = ["rm -rf", "DROP TABLE", "git push --force"];
if (dangerous.some((d) => command.includes(d))) {
return { allowed: false, reason: "الأوامر التدميرية غير مسموح بها" };
}
}
// حظر الكتابة على الملفات الحساسة
if (toolName === "Write" || toolName === "Edit") {
const filePath = (input as { file_path: string }).file_path;
const protected_paths = [".env", "package-lock.json", "prisma/schema.prisma"];
if (protected_paths.some((p) => filePath.includes(p))) {
return { allowed: false, reason: `لا يمكن تعديل ملف محمي: ${filePath}` };
}
}
return { allowed: true };
},
},
})) {
if ("result" in message) {
console.log(message.result);
}
}الخطوة 9: بناء مشروع كامل — بوت مراجعة الكود بالذكاء الاصطناعي
لنجمع كل شيء معاً ونبني بوت مراجعة كود عملي يحلل تغييرات git ويقدم ملاحظات منظمة:
// src/review-bot.ts
import { query } from "@anthropic-ai/claude-agent-sdk";
interface ReviewResult {
summary: string;
issues: Array<{
severity: "critical" | "warning" | "suggestion";
file: string;
line?: number;
message: string;
suggestion?: string;
}>;
score: number;
}
const REVIEW_SYSTEM_PROMPT = `أنت خبير في مراجعة الكود. حلل تغييرات git وقدّم ملاحظات منظمة.
القواعد:
- ركز على الأخطاء والثغرات الأمنية ومشاكل الأداء
- تحقق من أمان أنواع TypeScript
- تحقق من شمولية معالجة الأخطاء
- ابحث عن حالات السباق المحتملة في الكود غير المتزامن
- اقترح تحسينات فقط عندما تقدم قيمة واضحة
أنهِ مراجعتك دائماً بكتلة JSON بهذا التنسيق بالضبط:
\`\`\`json
{
"summary": "ملخص في فقرة واحدة",
"issues": [
{
"severity": "critical|warning|suggestion",
"file": "path/to/file.ts",
"line": 42,
"message": "وصف المشكلة",
"suggestion": "كيفية الإصلاح"
}
],
"score": 85
}
\`\`\`
النتيجة: 0-100 حيث 100 كود مثالي.`;
async function reviewPullRequest(baseBranch: string = "main"): Promise<ReviewResult | null> {
let result: string | null = null;
for await (const message of query({
prompt: `راجع تغييرات git الحالية مقابل فرع ${baseBranch}.
اقرأ الملفات المعدّلة للسياق الكامل، ثم قدّم مراجعة كود منظمة.`,
options: {
systemPrompt: REVIEW_SYSTEM_PROMPT,
allowedTools: ["Bash", "Read", "Glob", "Grep"],
maxTurns: 30,
maxBudgetUsd: 1.0,
permissionMode: "acceptEdits",
},
})) {
if ("result" in message && message.subtype === "success") {
result = message.result;
}
}
if (!result) return null;
// استخراج JSON من النتيجة
const jsonMatch = result.match(/```json\n([\s\S]*?)\n```/);
if (jsonMatch) {
return JSON.parse(jsonMatch[1]) as ReviewResult;
}
return null;
}
// تشغيل المراجعة
async function main() {
console.log("جاري بدء مراجعة الكود...\n");
const review = await reviewPullRequest();
if (review) {
console.log(`\nنتيجة المراجعة: ${review.score}/100`);
console.log(`الملخص: ${review.summary}\n`);
for (const issue of review.issues) {
const icon =
issue.severity === "critical" ? "🔴" :
issue.severity === "warning" ? "🟡" : "🟢";
console.log(`${icon} [${issue.file}${issue.line ? `:${issue.line}` : ""}] ${issue.message}`);
if (issue.suggestion) {
console.log(` الإصلاح: ${issue.suggestion}`);
}
}
}
}
main().catch(console.error);شغّله على فرعك الحالي:
npx tsx src/review-bot.tsالخطوة 10: جلسات V2 (إصدار تجريبي)
تتضمن Agent SDK أيضاً واجهة v2 تجريبية مع إدارة جلسات صريحة، مفيدة للمحادثات متعددة الأدوار:
import { unstable_v2_createSession } from "@anthropic-ai/claude-agent-sdk";
async function interactiveSession() {
await using session = unstable_v2_createSession({
model: "claude-sonnet-4-5-20250929",
});
// الدور الأول
await session.send("مرحباً! في أي مشروع TypeScript أنا؟");
for await (const msg of session.stream()) {
if (msg.type === "assistant") {
const text = msg.message.content
.filter((block: { type: string }) => block.type === "text")
.map((block: { type: string; text: string }) => block.text)
.join("");
console.log(text);
}
}
// الدور الثاني — الجلسة تتذكر السياق
await session.send("الآن اسرد الاعتمادات الرئيسية من package.json");
for await (const msg of session.stream()) {
if (msg.type === "assistant") {
const text = msg.message.content
.filter((block: { type: string }) => block.type === "text")
.map((block: { type: string; text: string }) => block.text)
.join("");
console.log(text);
}
}
}
interactiveSession().catch(console.error);ملاحظة: واجهة جلسات v2 في مرحلة تجريبية (unstable_v2_createSession). قد تتغير الواجهة في إصدارات مستقبلية. للاستخدام في الإنتاج، دالة query هي الواجهة المستقرة.
اختبار وكيلك
أنشئ اختباراً بسيطاً للتحقق من عمل وكيلك:
// src/test-agent.ts
import { query } from "@anthropic-ai/claude-agent-sdk";
async function testAgent() {
const tests = [
{
name: "سرد الملفات الأساسي",
prompt: "اسرد الملفات في المجلد الحالي",
tools: ["Glob"],
expectResult: true,
},
{
name: "تحليل الكود",
prompt: "اقرأ package.json وأخبرني باسم المشروع",
tools: ["Read"],
expectResult: true,
},
];
for (const test of tests) {
console.log(`\nاختبار: ${test.name}`);
let gotResult = false;
for await (const message of query({
prompt: test.prompt,
options: {
allowedTools: test.tools,
maxTurns: 5,
},
})) {
if ("result" in message) {
gotResult = true;
console.log(` ✓ النتيجة: ${message.result.slice(0, 100)}...`);
}
}
if (gotResult === test.expectResult) {
console.log(` ✓ نجح`);
} else {
console.log(` ✗ فشل`);
}
}
}
testAgent().catch(console.error);استكشاف الأخطاء وإصلاحها
"Claude Code CLI not found"
تتطلب Agent SDK تثبيت Claude Code عالمياً:
npm install -g @anthropic-ai/claude-code
claude --version # التحقق من التثبيتأخطاء "Permission denied"
إذا لم يستطع الوكيل تنفيذ الأدوات، تحقق من permissionMode و allowedTools:
// تأكد من أن الأدوات التي تحتاجها في القائمة المسموحة
options: {
allowedTools: ["Bash", "Read", "Write", "Edit", "Glob", "Grep"],
permissionMode: "acceptEdits",
}الوكيل يعمل لفترة طويلة
عيّن maxTurns و maxBudgetUsd لمنع التنفيذ الخارج عن السيطرة:
options: {
maxTurns: 20, // توقف بعد 20 استدعاء أداة
maxBudgetUsd: 0.50, // توقف إذا تجاوزت التكلفة $0.50
}فشل اتصال خادم MCP
لخوادم stdio، تأكد من وجود الأمر وعمله بشكل مستقل:
# اختبر خادم MCP مباشرة
npx -y @modelcontextprotocol/server-githubلخوادم SSE، تحقق من أن الرابط قابل للوصول وأن ترويسات CORS صحيحة.
الخطوات التالية
الآن بعد أن أصبحت قادراً على بناء وكلاء مع Claude Agent SDK، إليك بعض الأفكار لاستكشافها:
- بناء وكيل CI/CD يراجع طلبات الدمج ويشغّل الاختبارات وينشر النتائج على GitHub
- إنشاء وكيل توثيق يقرأ قاعدة الكود ويولّد وثائق API
- بناء وكيل ترحيل يحوّل JavaScript إلى TypeScript مع أنواع صحيحة
- الربط بخوادم MCP الخاصة بك — اربط قواعد البيانات وواجهات API والأدوات الداخلية
- استكشاف واجهة جلسات v2 لبناء تطبيقات محادثة تفاعلية
دروس ذات صلة
- بناء أول خادم MCP باستخدام TypeScript — أنشئ الأدوات التي سيستخدمها وكلاؤك
- بناء وكلاء ذكاء اصطناعي بنمط ReAct — افهم حلقة الوكيل على مستوى أعمق
- بناء أنظمة وكلاء ذكاء اصطناعي متعددة مع n8n — تنسيق بصري للوكلاء المتعددين
الخلاصة
تزيل Claude Agent SDK الأجزاء الأصعب من بناء وكلاء الذكاء الاصطناعي — إدارة الحلقة، وتنفيذ الأدوات، ومعالجة السياق، واستعادة الأخطاء. ما كان يتطلب مئات السطور من الكود المخصص أصبح الآن استدعاء query واحد مع الإعدادات الصحيحة.
تعلمت كيف:
- تُعدّ مشروع TypeScript مع Agent SDK
- تُشغّل الوكلاء باستخدام دالة
queryمع الأدوات المدمجة - تُنشئ أدوات مخصصة باستخدام خوادم MCP
- تُكوّن الصلاحيات للتنفيذ المستقل الآمن
- تبني وكلاء فرعيين لتنسيق الوكلاء المتعددين
- تُضيف حواجز أمان مع حدود الميزانية ومعالجات الصلاحيات المخصصة
- تبني مشروعاً عملياً — بوت مراجعة كود بالذكاء الاصطناعي
التحول من "بناء أغلفة LLM" إلى "برمجة وكلاء مستقلين" هو الاتجاه المُحدِّد للمطورين في 2026. مع Claude Agent SDK، أنت الآن مجهز لبناء وكلاء لا تكتفي بالإجابة على الأسئلة — بل تُنجز العمل.
ناقش مشروعك معنا
نحن هنا للمساعدة في احتياجات تطوير الويب الخاصة بك. حدد موعدًا لمناقشة مشروعك وكيف يمكننا مساعدتك.
دعنا نجد أفضل الحلول لاحتياجاتك.
مقالات ذات صلة

بناء وكلاء الذكاء الاصطناعي من الصفر باستخدام TypeScript: إتقان نمط ReAct مع Vercel AI SDK
تعلّم كيفية بناء وكلاء الذكاء الاصطناعي من الأساس باستخدام TypeScript. يغطي هذا الدليل التعليمي نمط ReAct، واستدعاء الأدوات، والاستدلال متعدد الخطوات، وحلقات الوكلاء الجاهزة للإنتاج مع Vercel AI SDK.

بناء أول خادم MCP باستخدام TypeScript: الأدوات والموارد والقوالب
تعلم كيف تبني خادم MCP جاهزاً للإنتاج من الصفر باستخدام TypeScript. هذا الدرس العملي يغطي الأدوات والموارد والقوالب ونقل البيانات عبر stdio والربط مع Claude Desktop و Cursor.

محول MCP لووردبريس: اجعل موقعك جاهزا لوكلاء الذكاء الاصطناعي
تعلم كيفية تثبيت وتكوين محول MCP لووردبريس لجعل موقعك متاحا لوكلاء الذكاء الاصطناعي في Cursor وClaude Desktop وأدوات MCP الأخرى. دليل شامل خطوة بخطوة مع أمثلة عملية.