الانتقال إلى المحتوى الرئيسي

شاهد: بناء Agents و Flows في CrewAI باستخدام Coding Agent Skills

قم بتثبيت مهارات وكيل البرمجة الخاصة بنا (Claude Code، Codex، …) لتشغيل وكلاء البرمجة بسرعة مع CrewAI. يمكنك تثبيتها باستخدام npx skills add crewaiinc/skills
في هذا الدليل ستُنشئ Flow يحدد موضوع بحث، ويشغّل طاقمًا بوكيل واحد (باحث يستخدم البحث على الويب)، وينتهي بتقرير Markdown على القرص. يُعد Flow الطريقة الموصى بها لتنظيم التطبيقات الإنتاجية: يمتلك الحالة وترتيب التنفيذ، بينما الوكلاء ينفّذون العمل داخل خطوة الطاقم. إذا لم تُكمل تثبيت CrewAI بعد، اتبع دليل التثبيت أولًا.

المتطلبات الأساسية

  • بيئة Python وواجهة سطر أوامر CrewAI (راجع التثبيت)
  • نموذج لغوي مهيأ بالمفاتيح الصحيحة — راجع LLMs
  • مفتاح API من Serper.dev (SERPER_API_KEY) للبحث على الويب في هذا الدرس

ابنِ أول Flow لك

1

أنشئ مشروع Flow

من الطرفية، أنشئ مشروع Flow (اسم المجلد يستخدم شرطة سفلية، مثل latest_ai_flow):
crewai create flow latest-ai-flow
cd latest_ai_flow
يُنشئ ذلك تطبيق Flow ضمن src/latest_ai_flow/، بما في ذلك طاقمًا أوليًا في crews/content_crew/ ستستبدله بطاقم بحث بوكيل واحد في الخطوات التالية.
2

اضبط وكيلًا واحدًا في `agents.yaml`

استبدل محتوى src/latest_ai_flow/crews/content_crew/config/agents.yaml بباحث واحد. تُملأ المتغيرات مثل {topic} من crew.kickoff(inputs=...).
agents.yaml
# src/latest_ai_flow/crews/content_crew/config/agents.yaml
researcher:
  role: >
    باحث بيانات أول في {topic}
  goal: >
    اكتشاف أحدث التطورات في {topic}
  backstory: >
    أنت باحث مخضرم تكشف أحدث المستجدات في {topic}.
    تجد المعلومات الأكثر صلة وتعرضها بوضوح.
3

اضبط مهمة واحدة في `tasks.yaml`

tasks.yaml
# src/latest_ai_flow/crews/content_crew/config/tasks.yaml
research_task:
  description: >
    أجرِ بحثًا معمقًا عن {topic}. استخدم البحث على الويب للعثور على معلومات
    حديثة وموثوقة. السنة الحالية 2026.
  expected_output: >
    تقرير بصيغة Markdown بأقسام واضحة: الاتجاهات الرئيسية، أدوات أو شركات بارزة،
    والآثار. بين 800 و1200 كلمة تقريبًا. دون إحاطة المستند بأكمله بكتل كود.
  agent: researcher
  output_file: output/report.md
4

اربط صف الطاقم (`content_crew.py`)

اجعل الطاقم المُولَّد يشير إلى YAML وأرفق SerperDevTool بالباحث.
content_crew.py
# src/latest_ai_flow/crews/content_crew/content_crew.py
from typing import List

from crewai import Agent, Crew, Process, Task
from crewai.agents.agent_builder.base_agent import BaseAgent
from crewai.project import CrewBase, agent, crew, task
from crewai_tools import SerperDevTool


@CrewBase
class ResearchCrew:
  """طاقم بحث بوكيل واحد داخل Flow."""

  agents: List[BaseAgent]
  tasks: List[Task]

  agents_config = "config/agents.yaml"
  tasks_config = "config/tasks.yaml"

  @agent
  def researcher(self) -> Agent:
    return Agent(
      config=self.agents_config["researcher"],  # type: ignore[index]
      verbose=True,
      tools=[SerperDevTool()],
    )

  @task
  def research_task(self) -> Task:
    return Task(
      config=self.tasks_config["research_task"],  # type: ignore[index]
    )

  @crew
  def crew(self) -> Crew:
    return Crew(
      agents=self.agents,
      tasks=self.tasks,
      process=Process.sequential,
      verbose=True,
    )
5

عرّف Flow في `main.py`

اربط الطاقم بـ Flow: خطوة @start() تضبط الموضوع في الحالة، وخطوة @listen تشغّل الطاقم. يظل output_file للمهمة يكتب output/report.md.
main.py
# src/latest_ai_flow/main.py
from pydantic import BaseModel

from crewai.flow import Flow, listen, start

from latest_ai_flow.crews.content_crew.content_crew import ResearchCrew


class ResearchFlowState(BaseModel):
  topic: str = ""
  report: str = ""


class LatestAiFlow(Flow[ResearchFlowState]):
  @start()
  def prepare_topic(self, crewai_trigger_payload: dict | None = None):
    if crewai_trigger_payload:
      self.state.topic = crewai_trigger_payload.get("topic", "AI Agents")
    else:
      self.state.topic = "AI Agents"
    print(f"الموضوع: {self.state.topic}")

  @listen(prepare_topic)
  def run_research(self):
    result = ResearchCrew().crew().kickoff(inputs={"topic": self.state.topic})
    self.state.report = result.raw
    print("اكتمل طاقم البحث.")

  @listen(run_research)
  def summarize(self):
    print("مسار التقرير: output/report.md")


def kickoff():
  LatestAiFlow().kickoff()


def plot():
  LatestAiFlow().plot()


if __name__ == "__main__":
  kickoff()
إذا كان اسم الحزمة ليس latest_ai_flow، عدّل استيراد ResearchCrew ليطابق مسار الوحدة في مشروعك.
6

متغيرات البيئة

في جذر المشروع، ضبط .env:
  • SERPER_API_KEY — من Serper.dev
  • مفاتيح مزوّد النموذج حسب الحاجة — راجع إعداد LLM
7

التثبيت والتشغيل

crewai install
crewai run
يُنفّذ crewai run نقطة دخول Flow المعرّفة في المشروع (نفس أمر الطواقم؛ نوع المشروع "flow" في pyproject.toml).
8

تحقق من المخرجات

يجب أن ترى سجلات من Flow والطاقم. افتح output/report.md للتقرير المُولَّد (مقتطف):
# وكلاء الذكاء الاصطناعي في 2026: المشهد والاتجاهات

## ملخص تنفيذي


## أبرز الاتجاهات
- **استخدام الأدوات والتنسيق** — …
- **التبني المؤسسي** — …

## الآثار

سيكون الملف الفعلي أطول ويعكس نتائج بحث مباشرة.

كيف يترابط هذا

  1. Flow — يشغّل LatestAiFlow أولًا prepare_topic ثم run_research ثم summarize. الحالة (topic، report) على Flow.
  2. الطاقم — يشغّل ResearchCrew مهمة واحدة بوكيل واحد: الباحث يستخدم Serper للبحث على الويب ثم يكتب التقرير.
  3. المُخرَج — يكتب output_file للمهمة التقرير في output/report.md.
للتعمق في أنماط Flow (التوجيه، الاستمرارية، الإنسان في الحلقة)، راجع ابنِ أول Flow وFlows. للطواقم دون Flow، راجع Crews. لوكيل Agent واحد وkickoff() بلا مهام، راجع Agents.
أصبح لديك Flow كامل مع طاقم وكيل وتقرير محفوظ — قاعدة قوية لإضافة خطوات أو طواقم أو أدوات.

اتساق التسمية

يجب أن تطابق مفاتيح YAML (researcher، research_task) أسماء الدوال في صف @CrewBase. راجع Crews لنمط الديكورات الكامل.

النشر

ادفع Flow إلى CrewAI AMP بعد أن يعمل محليًا ويكون المشروع في مستودع GitHub. من جذر المشروع:
crewai login
غالبًا ما يستغرق النشر الأول حوالي دقيقة. المتطلبات الكاملة ومسار الواجهة الويب في النشر على AMP.

دليل النشر

النشر على AMP خطوة بخطوة (CLI ولوحة التحكم).

المجتمع

ناقش الأفكار وشارك مشاريعك وتواصل مع مطوري CrewAI.