إطار عمل Mastra للذكاء الاصطناعي: بناء وكلاء وسير عمل ذكية بـ TypeScript

AI Bot
بواسطة AI Bot ·

جاري تحميل مشغل تحويل النص إلى كلام الصوتي...

ابنِ وكلاء ذكاء اصطناعي تفعل أشياء حقيقية. Mastra هو إطار عمل TypeScript-first من الفريق الذي بنى Gatsby — يمنحك الوكلاء وسير العمل والأدوات و RAG والتقييمات في حزمة واحدة بدون أي كود لاصق. في هذا الدليل، ستبني وكيل مساعد بحثي يبحث في الويب ويلخص النتائج ويكتب تقارير منظمة.

ما ستتعلمه

بنهاية هذا الدليل، ستكون قادرًا على:

  • إعداد مشروع Mastra من الصفر باستخدام TypeScript
  • إنشاء وكلاء ذكاء اصطناعي مع تعليمات وإعدادات نموذج وصلاحيات أدوات
  • بناء أدوات مخصصة مع التحقق من المدخلات باستخدام مخططات Zod
  • تصميم سير عمل متعدد الخطوات كرسوم بيانية موجهة (DAGs)
  • تنفيذ أنبوب RAG أساسي للوكلاء المدركين للمستندات
  • اختبار وتقييم مخرجات الوكلاء
  • نشر تطبيق Mastra الخاص بك في بيئة الإنتاج

المتطلبات المسبقة

قبل البدء، تأكد من توفر:

  • Node.js 20+ مثبت (node --version)
  • خبرة في TypeScript (الأنواع، الأنواع العامة، async/await)
  • مفتاح OpenAI API (أو Anthropic أو Google أو غيرها)
  • فهم أساسي لـ نماذج اللغة الكبيرة وهندسة المطالبات
  • محرر أكواد — VS Code أو Cursor موصى به

ما هو Mastra؟

Mastra هو إطار عمل TypeScript مفتوح المصدر لبناء تطبيقات مدعومة بالذكاء الاصطناعي. أنشأه الفريق الذي بنى Gatsby (مدعوم من Y Combinator)، ويقدم نهجًا متكاملًا لبناء تطبيقات وكلاء الذكاء الاصطناعي مع:

  • الوكلاء (Agents) — كيانات مستقلة مدعومة بنماذج اللغة تفكر وتستخدم الأدوات
  • الأدوات (Tools) — دوال TypeScript محددة الأنواع يمكن للوكيل استدعاؤها
  • سير العمل (Workflows) — رسوم بيانية موجهة للعمليات متعددة الخطوات
  • RAG — التوليد المعزز بالاسترجاع مع مخازن المتجهات
  • التقييمات (Evals) — تقييم جودة مخرجات الوكيل
  • الذاكرة (Memory) — سجل المحادثات والذاكرة الدلالية

على عكس الأطر الأخرى التي تتطلب إعدادات YAML أو كود Python لاصق، Mastra هو TypeScript صافي — تعرّف كل شيء في الكود مع أمان أنواع كامل.


الخطوة 1: إنشاء مشروع Mastra جديد

أسرع طريقة للبدء هي باستخدام واجهة سطر الأوامر الرسمية:

npm create mastra@latest

اتبع المطالبات:

  • اسم المشروع: research-assistant
  • المكونات: اختر Agents و Tools و Workflows
  • مزود النموذج الافتراضي: OpenAI (أو مزودك المفضل)
  • تضمين كود مثال: نعم

هذا ينشئ هيكل مشروع كامل:

research-assistant/
├── src/
│   └── mastra/
│       ├── agents/
│       │   └── index.ts
│       ├── tools/
│       │   └── index.ts
│       ├── workflows/
│       │   └── index.ts
│       └── index.ts
├── .env
├── package.json
└── tsconfig.json

الآن ثبّت التبعيات وأعد بيئتك:

cd research-assistant
npm install

أنشئ ملف .env:

OPENAI_API_KEY=sk-your-key-here

الخطوة 2: فهم نقطة الدخول في Mastra

الإعداد الرئيسي موجود في src/mastra/index.ts. هنا تسجل الوكلاء والأدوات وسير العمل:

import { Mastra } from "@mastra/core";
import { researchAgent } from "./agents";
import { searchTool, summarizeTool } from "./tools";
import { researchWorkflow } from "./workflows";
 
export const mastra = new Mastra({
  agents: { researchAgent },
  workflows: { researchWorkflow },
});

كائن Mastra هو المنسق المركزي. يربط جميع مكوناتك ويكشف تلقائيًا عن واجهة REST API آمنة الأنواع.


الخطوة 3: بناء وكيلك الأول

الوكيل هو كيان مدعوم بنموذج لغة كبير مع تعليمات وإعدادات نموذج وصلاحية وصول إلى الأدوات. لننشئ وكيل مساعد بحثي.

عدّل src/mastra/agents/index.ts:

import { Agent } from "@mastra/core/agent";
import { openai } from "@ai-sdk/openai";
import { searchTool, summarizeTool, reportTool } from "../tools";
 
export const researchAgent = new Agent({
  name: "Research Assistant",
  instructions: `You are a thorough research assistant. When given a topic:
    1. Search for relevant, up-to-date information
    2. Summarize key findings into concise points
    3. Generate a structured report with sections and citations
 
    Always verify information from multiple sources when possible.
    Be factual and cite your sources. If unsure, say so.`,
  model: openai("gpt-4o"),
  tools: {
    searchTool,
    summarizeTool,
    reportTool,
  },
});

خصائص الوكيل الرئيسية

الخاصيةالوصف
nameاسم العرض للوكيل
instructionsمطالبة النظام التي توجه سلوك الوكيل
modelنموذج اللغة المستخدم (يدعم OpenAI و Anthropic و Google وغيرها)
toolsكائن الأدوات التي يمكن للوكيل استدعاؤها

سيقوم الوكيل تلقائيًا بالتفكير في الأدوات التي يجب استخدامها بناءً على مدخلات المستخدم وأوصاف الأدوات.


الخطوة 4: إنشاء أدوات مخصصة

الأدوات هي دوال TypeScript توسع قدرات وكيلك. كل أداة لها وصف (حتى يعرف النموذج متى يستخدمها)، ومخطط إدخال (يتم التحقق منه بـ Zod)، ودالة تنفيذ.

عدّل src/mastra/tools/index.ts:

import { createTool } from "@mastra/core/tools";
import { z } from "zod";
 
// الأداة 1: البحث في الويب
export const searchTool = createTool({
  id: "web-search",
  description: "Search the web for information on a given query. Returns relevant results with titles, snippets, and URLs.",
  inputSchema: z.object({
    query: z.string().describe("The search query"),
    maxResults: z.number().default(5).describe("Maximum number of results to return"),
  }),
  execute: async ({ context }) => {
    const { query, maxResults } = context;
 
    // في الإنتاج، استخدم واجهة بحث حقيقية (Serper، Tavily، إلخ.)
    const response = await fetch(
      `https://api.tavily.com/search`,
      {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({
          api_key: process.env.TAVILY_API_KEY,
          query,
          max_results: maxResults,
        }),
      }
    );
 
    const data = await response.json();
 
    return {
      results: data.results.map((r: any) => ({
        title: r.title,
        url: r.url,
        snippet: r.content,
      })),
    };
  },
});
 
// الأداة 2: تلخيص النص
export const summarizeTool = createTool({
  id: "summarize-text",
  description: "Summarize a long piece of text into key bullet points.",
  inputSchema: z.object({
    text: z.string().describe("The text to summarize"),
    maxPoints: z.number().default(5).describe("Maximum number of bullet points"),
  }),
  execute: async ({ context }) => {
    const { text, maxPoints } = context;
 
    // تلخيص استخراجي بسيط — في الإنتاج، استخدم استدعاء نموذج لغة
    const sentences = text.split(". ").filter((s) => s.length > 20);
    const summary = sentences.slice(0, maxPoints).map((s) => s.trim());
 
    return { summary };
  },
});
 
// الأداة 3: توليد تقرير
export const reportTool = createTool({
  id: "generate-report",
  description: "Generate a structured markdown report from research findings.",
  inputSchema: z.object({
    title: z.string().describe("Report title"),
    sections: z.array(
      z.object({
        heading: z.string(),
        content: z.string(),
        sources: z.array(z.string()).optional(),
      })
    ).describe("Report sections with headings, content, and optional source URLs"),
  }),
  execute: async ({ context }) => {
    const { title, sections } = context;
 
    let markdown = `# ${title}\n\n`;
    markdown += `*Generated on ${new Date().toISOString().split("T")[0]}*\n\n`;
 
    for (const section of sections) {
      markdown += `## ${section.heading}\n\n`;
      markdown += `${section.content}\n\n`;
      if (section.sources?.length) {
        markdown += `**Sources:**\n`;
        for (const source of section.sources) {
          markdown += `- ${source}\n`;
        }
        markdown += "\n";
      }
    }
 
    return { report: markdown };
  },
});

أفضل ممارسات تصميم الأدوات

  1. اكتب أوصافًا واضحة — يقرأها النموذج لتحديد متى يستخدم كل أداة
  2. استخدم Zod .describe() في كل حقل — هذا يخبر النموذج بمعنى كل معامل
  3. اجعل الأدوات مركزة — أداة واحدة، مسؤولية واحدة
  4. تعامل مع الأخطاء بأناقة — أعد رسائل خطأ يمكن للوكيل التفكير فيها
  5. أضف قيمًا افتراضية معقولة — استخدم .default() للمعاملات الاختيارية

الخطوة 5: تصميم سير عمل متعدد الخطوات

سير العمل يتيح لك تعريف أنابيب حتمية كرسوم بيانية موجهة. على عكس قرارات الوكيل (غير الحتمية)، يضمن سير العمل ترتيب التنفيذ.

أنشئ src/mastra/workflows/index.ts:

import { Workflow, Step } from "@mastra/core/workflows";
import { z } from "zod";
import { researchAgent } from "../agents";
 
// الخطوة 1: البحث عن موضوع
const researchStep = new Step({
  id: "research",
  inputSchema: z.object({
    topic: z.string(),
    depth: z.enum(["shallow", "deep"]).default("deep"),
  }),
  execute: async ({ context }) => {
    const agent = researchAgent;
    const response = await agent.generate(
      `Research the following topic thoroughly: ${context.topic}.
       Depth level: ${context.depth}.
       Use the search tool to find current information.`
    );
    return { findings: response.text };
  },
});
 
// الخطوة 2: استخراج الرؤى الرئيسية
const analyzeStep = new Step({
  id: "analyze",
  inputSchema: z.object({
    findings: z.string(),
  }),
  execute: async ({ context }) => {
    const agent = researchAgent;
    const response = await agent.generate(
      `Analyze these research findings and extract 5-7 key insights:
       ${context.findings}
 
       Format as a JSON array of objects with "insight" and "confidence" fields.`
    );
    return { insights: response.text };
  },
});
 
// الخطوة 3: توليد التقرير النهائي
const reportStep = new Step({
  id: "report",
  inputSchema: z.object({
    topic: z.string(),
    insights: z.string(),
  }),
  execute: async ({ context }) => {
    const agent = researchAgent;
    const response = await agent.generate(
      `Create a comprehensive research report on "${context.topic}"
       using these insights: ${context.insights}.
       Use the report tool to generate a structured markdown document.`
    );
    return { report: response.text };
  },
});
 
// بناء رسم سير العمل
export const researchWorkflow = new Workflow({
  name: "research-pipeline",
  triggerSchema: z.object({
    topic: z.string().describe("The topic to research"),
    depth: z.enum(["shallow", "deep"]).default("deep"),
  }),
});
 
researchWorkflow
  .step(researchStep)
  .then(analyzeStep)
  .then(reportStep)
  .commit();

ميزات سير العمل

  • تدفق بيانات آمن الأنواع — مخرجات خطوة تغذي الخطوة التالية مع استنتاج TypeScript كامل
  • تنفيذ متوازي — استخدم .parallel() لتشغيل خطوات مستقلة بالتزامن
  • تفرع شرطي — أضف .if() / .else() لمسارات ديناميكية
  • معالجة الأخطاء — كل خطوة يمكنها تعريف منطق إعادة المحاولة والبدائل
  • التعليق — يمكن لسير العمل التوقف والانتظار لمدخلات بشرية

الخطوة 6: تشغيل وكيلك

لنختبر الوكيل بشكل تفاعلي. أنشئ سكريبت اختبار src/test.ts:

import { mastra } from "./mastra";
 
async function main() {
  // احصل على الوكيل
  const agent = mastra.getAgent("researchAgent");
 
  // توليد نص بسيط
  const response = await agent.generate(
    "What are the latest developments in quantum computing in 2026?"
  );
  console.log(response.text);
 
  // استجابة متدفقة
  const stream = await agent.stream(
    "Compare the top 3 TypeScript AI frameworks in 2026"
  );
  for await (const chunk of stream.textStream) {
    process.stdout.write(chunk);
  }
}
 
main().catch(console.error);

شغّله:

npx tsx src/test.ts

يجب أن ترى الوكيل يفكر في طلبك، يستدعي الأدوات حسب الحاجة، وينتج استجابة منظمة.


الخطوة 7: تنفيذ سير العمل

اختبر أنبوب البحث الكامل:

import { mastra } from "./mastra";
 
async function runWorkflow() {
  const workflow = mastra.getWorkflow("researchWorkflow");
 
  const result = await workflow.execute({
    triggerData: {
      topic: "The state of WebAssembly in 2026",
      depth: "deep",
    },
  });
 
  // الوصول إلى نتائج كل خطوة
  console.log("Research:", result.results.research);
  console.log("Analysis:", result.results.analyze);
  console.log("Report:", result.results.report);
}
 
runWorkflow().catch(console.error);

الخطوة 8: إضافة RAG للوكلاء المدركين للمستندات

RAG (التوليد المعزز بالاسترجاع) يتيح لوكيلك الإجابة على الأسئلة بناءً على مستنداتك الخاصة. Mastra يتكامل مع مخازن المتجهات مثل pgvector و Pinecone و Qdrant.

ثبّت تبعيات RAG:

npm install @mastra/rag @ai-sdk/openai

أنشئ أنبوب RAG:

import { embed, embedMany } from "ai";
import { openai } from "@ai-sdk/openai";
import { PgVector } from "@mastra/rag";
 
// 1. تهيئة مخزن المتجهات
const vectorStore = new PgVector({
  connectionString: process.env.DATABASE_URL!,
});
 
// 2. إنشاء تضمينات من مستنداتك
const documents = [
  "Mastra is a TypeScript framework for building AI agents...",
  "Workflows in Mastra are directed acyclic graphs...",
  "Tools extend agent capabilities with custom functions...",
];
 
const { embeddings } = await embedMany({
  model: openai.embedding("text-embedding-3-small"),
  values: documents,
});
 
// 3. تخزين التضمينات في قاعدة بيانات المتجهات
await vectorStore.upsert({
  indexName: "docs",
  vectors: embeddings.map((embedding, i) => ({
    id: `doc-${i}`,
    values: embedding,
    metadata: { text: documents[i] },
  })),
});
 
// 4. الاستعلام عن المستندات المشابهة
const { embedding: queryEmbedding } = await embed({
  model: openai.embedding("text-embedding-3-small"),
  value: "How do Mastra workflows work?",
});
 
const results = await vectorStore.query({
  indexName: "docs",
  queryVector: queryEmbedding,
  topK: 3,
});

ثم أنشئ أداة RAG لوكيلك:

import { createTool } from "@mastra/core/tools";
import { z } from "zod";
import { embed } from "ai";
import { openai } from "@ai-sdk/openai";
 
export const ragSearchTool = createTool({
  id: "search-knowledge-base",
  description: "Search the internal knowledge base for relevant information.",
  inputSchema: z.object({
    query: z.string().describe("What to search for in the knowledge base"),
  }),
  execute: async ({ context }) => {
    const { embedding } = await embed({
      model: openai.embedding("text-embedding-3-small"),
      value: context.query,
    });
 
    const results = await vectorStore.query({
      indexName: "docs",
      queryVector: embedding,
      topK: 5,
    });
 
    return {
      documents: results.map((r) => ({
        text: r.metadata?.text,
        score: r.score,
      })),
    };
  },
});

الخطوة 9: إضافة ذاكرة الوكيل

الذاكرة تمنح وكيلك سياقًا عبر المحادثات. يدعم Mastra كلاً من سجل المحادثات والذاكرة الدلالية:

import { Agent } from "@mastra/core/agent";
import { Memory } from "@mastra/memory";
import { openai } from "@ai-sdk/openai";
 
const memory = new Memory({
  // يخزن رسائل المحادثة الأخيرة
  options: {
    lastMessages: 20,
    semanticRecall: {
      topK: 3,
      messageRange: 50,
    },
  },
});
 
export const assistantAgent = new Agent({
  name: "Assistant",
  instructions: "You are a helpful assistant with memory of past conversations.",
  model: openai("gpt-4o"),
  memory,
});

عند استخدام الذاكرة، مرر threadId للحفاظ على سياق المحادثة:

// الرسالة الأولى
const res1 = await assistantAgent.generate("My name is Sarah", {
  threadId: "user-123",
});
 
// رسالة لاحقة — الوكيل يتذكر
const res2 = await assistantAgent.generate("What's my name?", {
  threadId: "user-123",
});
// المخرج: "Your name is Sarah"

الخطوة 10: تقييم جودة الوكيل

يتضمن Mastra أدوات تقييم مدمجة لقياس جودة مخرجات الوكيل:

import { Agent } from "@mastra/core/agent";
import { openai } from "@ai-sdk/openai";
 
const agent = new Agent({
  name: "Evaluated Agent",
  instructions: "Answer questions accurately and concisely.",
  model: openai("gpt-4o"),
  evals: {
    completeness: {
      type: "model-graded",
      prompt: "Rate if the response fully addresses the question (0-1):",
    },
    conciseness: {
      type: "model-graded",
      prompt: "Rate the conciseness of the response (0-1):",
    },
    hallucination: {
      type: "model-graded",
      prompt: "Rate if the response contains made-up information (0=hallucinated, 1=factual):",
    },
  },
});

الخطوة 11: النشر باستخدام خادم Mastra

ينشئ Mastra تلقائيًا واجهة REST API لوكلائك وسير عملك. شغّل خادم التطوير:

npx mastra dev

هذا يكشف عن نقاط نهاية مثل:

POST /api/agents/researchAgent/generate
POST /api/agents/researchAgent/stream
POST /api/workflows/researchWorkflow/execute

للإنتاج، ابنِ وانشر:

npx mastra build
npx mastra deploy

يدعم Mastra النشر على:

  • خوادم Node.js (Express، Fastify)
  • Cloudflare Workers
  • Vercel / Netlify بدون خادم
  • حاويات Docker

استخدام مزودي نماذج متعددين

يعمل Mastra مع أي مزود نماذج متوافق مع AI SDK. يمكنك المزج والمطابقة:

import { openai } from "@ai-sdk/openai";
import { anthropic } from "@ai-sdk/anthropic";
import { google } from "@ai-sdk/google";
 
// استخدم نماذج مختلفة لوكلاء مختلفين
const fastAgent = new Agent({
  name: "Fast Responder",
  instructions: "Quick, concise answers.",
  model: openai("gpt-4o-mini"),
  tools: { searchTool },
});
 
const deepAgent = new Agent({
  name: "Deep Analyst",
  instructions: "Thorough, detailed analysis.",
  model: anthropic("claude-sonnet-4-20250514"),
  tools: { searchTool, summarizeTool },
});
 
const visionAgent = new Agent({
  name: "Image Analyzer",
  instructions: "Analyze and describe images.",
  model: google("gemini-2.0-flash"),
  tools: {},
});

أفضل ممارسات هيكل المشروع

لتطبيقات الإنتاج، نظّم كودك هكذا:

src/mastra/
├── agents/
│   ├── research-agent.ts
│   ├── writing-agent.ts
│   └── index.ts          # يعيد تصدير جميع الوكلاء
├── tools/
│   ├── search.ts
│   ├── summarize.ts
│   ├── report.ts
│   └── index.ts          # يعيد تصدير جميع الأدوات
├── workflows/
│   ├── research-pipeline.ts
│   ├── content-pipeline.ts
│   └── index.ts          # يعيد تصدير جميع سير العمل
└── index.ts              # كائن Mastra

استكشاف الأخطاء وإصلاحها

المشاكل الشائعة

أخطاء "Tool not found": تأكد من تمرير الأدوات إلى كائن tools الخاص بالوكيل، وليس مجرد استيرادها. الوكيل لديه صلاحية الوصول فقط للأدوات المدرجة صراحة في إعداداته.

خطوات سير العمل لا تستقبل البيانات: تحقق من أن مخطط المخرجات لخطوة يطابق مخطط المدخلات للخطوة التالية. استخدم .parse() في Zod لتصحيح أخطاء عدم تطابق الأنواع.

الذاكرة لا تستمر: تأكد من تمرير نفس threadId عبر الرسائل المرتبطة. كل سلسلة محادثة تحتفظ بسجل محادثاتها الخاص.

حدود المعدل مع مزودي النماذج: أضف منطق إعادة المحاولة لأدواتك وفكّر في استخدام نماذج مختلفة لمهام مختلفة (مثلاً GPT-4o-mini لاستدعاءات الأدوات البسيطة، Claude للتحليل العميق).


الخطوات التالية

الآن بعد أن أصبح لديك تطبيق Mastra يعمل، فكّر في استكشاف:

  • توثيق Mastra — مرجع API كامل وأدلة
  • أنظمة متعددة الوكلاء — أنشئ وكلاء يفوضون المهام لوكلاء آخرين
  • تكاملات مخصصة — اتصل بقواعد البيانات وواجهات API وخدمات الطرف الثالث
  • مراقبة الإنتاج — أضف تتبعًا باستخدام OpenTelemetry لتصحيح الأخطاء
  • وكلاء صوتيين — أضف قدرات تحويل الكلام إلى نص والنص إلى كلام

الخلاصة

يجلب Mastra البنية وأمان الأنواع لتطوير تطبيقات الذكاء الاصطناعي. بدلاً من ربط أدوات متباينة بكود لاصق، تحصل على إطار عمل موحد حيث تعمل الوكلاء والأدوات وسير العمل و RAG والتقييمات معًا بسلاسة في TypeScript.

النقاط الرئيسية من هذا الدليل:

  1. الوكلاء هم الوحدة الأساسية — يفكرون في الأهداف ويستخدمون الأدوات
  2. الأدوات توسع قدرات الوكيل بدوال محددة الأنواع ومتحقق منها
  3. سير العمل يوفر أنابيب حتمية متعددة الخطوات
  4. RAG يثبت استجابات الوكيل في بياناتك الخاصة
  5. الذاكرة تحافظ على السياق عبر المحادثات
  6. التقييمات تضمن بقاء جودة المخرجات عالية

مع Mastra، يمكنك الانتقال من النموذج الأولي إلى تطبيق ذكاء اصطناعي جاهز للإنتاج بدون مغادرة بيئة TypeScript. ابدأ ببساطة بوكيل واحد وأداة واحدة، ثم توسّع إلى سير عمل متعدد الوكلاء مع نمو متطلباتك.


هل تريد قراءة المزيد من الدروس التعليمية؟ تحقق من أحدث درس تعليمي لدينا على Better Auth مع Next.js 15: الدليل الشامل للمصادقة في 2026.

ناقش مشروعك معنا

نحن هنا للمساعدة في احتياجات تطوير الويب الخاصة بك. حدد موعدًا لمناقشة مشروعك وكيف يمكننا مساعدتك.

دعنا نجد أفضل الحلول لاحتياجاتك.

مقالات ذات صلة

بناء وكلاء الذكاء الاصطناعي من الصفر باستخدام TypeScript: إتقان نمط ReAct مع Vercel AI SDK

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

35 د قراءة·