1. مقدمة
في هذا الدرس التطبيقي، ستتجاوز روبوتات الدردشة البسيطة وتنشئ نظامًا موزّعًا يستند إلى عدّة وكلاء.
مع أنّ نموذجًا لغويًا كبيرًا واحدًا يمكنه الإجابة عن الأسئلة، غالبًا ما يتطلّب التعقيد في العالم الحقيقي أدوارًا متخصّصة. لا تطلب من مهندس الخلفية تصميم واجهة المستخدم، ولا تطلب من المصمّم تحسين طلبات البحث في قاعدة البيانات. وبالمثل، يمكننا إنشاء وكلاء متخصصين مستندين إلى الذكاء الاصطناعي يركزون على مهمة واحدة وينسقون مع بعضهم البعض لحل المشاكل المعقدة.
ستنشئ "نظام إنشاء الدورات التدريبية" الذي يتألف مما يلي:
- Researcher Agent: استخدام google_search للعثور على معلومات محدّثة
- الوكيل الحَكَم: ينتقد البحث من حيث الجودة والاكتمال.
- Content Builder Agent: تحويل البحث إلى دورة تدريبية منظَّمة
- وكيل التنسيق: إدارة سير العمل والتواصل بين هؤلاء المتخصصين
أهداف الدورة التعليمية
- حدِّد وكيلًا يستخدم الأدوات (باحثًا) يمكنه البحث على الويب.
- تنفيذ ناتج منظَّم باستخدام Pydantic للحكم
- الاتصال بالوكلاء البعيدين باستخدام بروتوكول Agent-to-Agent (A2A)
- أنشئ LoopAgent لإنشاء تقرير ملاحظات بين الباحث والحكم.
- تشغيل النظام الموزّع محليًا باستخدام "حزمة تطوير التطبيقات" (ADK)
- انشر النظام المتعدد الوكلاء على Google Cloud Run.
- استخدام نموذج Gemma على وحدة معالجة الرسومات في Cloud Run لإنشاء وكيل بناء المحتوى
المتطلبات
- متصفّح ويب، مثل Chrome
- مشروع Google Cloud تم تفعيل الفوترة فيه
2. مبادئ البنية والتنسيق
لنبدأ بفهم كيفية عمل هؤلاء العملاء معًا. نحن بصدد إنشاء مسار إنشاء الدورات التدريبية.
تصميم النظام

التنسيق باستخدام الوكلاء
تعمل الوكلاء العاديون (مثل "الباحث"). تتولّى وكلاء التنسيق (مثل LoopAgent أو SequentialAgent) إدارة الوكلاء الآخرين. ليس لديهم أدواتهم الخاصة، بل "أداتهم" هي التفويض.
LoopAgent: تعمل هذه السمة مثل حلقةwhileفي الرمز. يتم تشغيل سلسلة من الوكلاء بشكل متكرر إلى أن يتم استيفاء شرط معيّن (أو يتم الوصول إلى الحد الأقصى لعدد التكرارات). نستخدم هذه الميزة في حلقة البحث:- الباحث يعثر على المعلومات.
- يقدم القاضي ملاحظات نقدية حولها.
- إذا عرضت Judge الحالة "تعذّر"، ستسمح EscalationChecker باستمرار التكرار.
- إذا قال Judge "مقبول"، سيوقف EscalationChecker التكرار.
-
SequentialAgent: يعمل هذا الإجراء مثل تنفيذ نص برمجي عادي. يتم تشغيل البرامج الوكيلة واحدًا تلو الآخر. نستخدم هذه المعلومات في المسار عالي المستوى:- أولاً، شغِّل حلقة البحث (إلى أن تنتهي ببيانات جيدة).
- بعد ذلك، شغِّل أداة إنشاء المحتوى (لكتابة الدورة التدريبية).
ومن خلال الجمع بين هذه التقنيات، ننشئ نظامًا قويًا يمكنه تصحيح الأخطاء تلقائيًا قبل إنشاء الناتج النهائي.
3- الإعداد
إعداد المشروع
إنشاء مشروع على Google Cloud
- في Google Cloud Console، في صفحة اختيار المشروع، اختَر مشروعًا على Google Cloud أو أنشِئ مشروعًا.
- تأكَّد من تفعيل الفوترة لمشروعك على السحابة الإلكترونية. كيفية التحقّق مما إذا كانت الفوترة مفعَّلة في مشروع
بدء Cloud Shell
Cloud Shell هي بيئة سطر أوامر تعمل في Google Cloud ومحمّلة مسبقًا بالأدوات اللازمة.
- انقر على تفعيل Cloud Shell في أعلى "وحدة تحكّم Google Cloud".
- بعد الاتصال بـ Cloud Shell، تحقَّق من مصادقتك باتّباع الخطوات التالية:
gcloud auth list - تأكَّد من إعداد مشروعك باتّباع الخطوات التالية:
gcloud config get project - إذا لم يتم ضبط مشروعك على النحو المتوقّع، اضبطه باتّباع الخطوات التالية:
export PROJECT_ID=<YOUR_PROJECT_ID> gcloud config set project $PROJECT_ID
إعداد البيئة
- فتح Cloud Shell: انقر على رمز تفعيل Cloud Shell في أعلى يسار Google Cloud Console.
الحصول على الرمز المُعد مسبقًا للمبتدئين
- استنسِخ مستودع الرموز البرمجية المبدئية إلى الدليل الرئيسي:انتقِل إلى الدليل الرئيسي
استنسِخ الرمز البرمجي المطلوب لهذا الدرس التطبيقي حول الترميز من المجلد Google Cloud DevRel Demos.cd ~ انتقِل إلى المجلد الذي يحتوي على الرمز البرمجي لهذا الدرس التطبيقي حول الترميزgit clone --depth 1 --filter=blob:none --sparse https://github.com/GoogleCloudPlatform/devrel-demos.git temp-repo && cd temp-repo && git sparse-checkout set agents/multi-agent-system && cd .. && mv temp-repo/agents/multi-agent-system . && rm -rf temp-repocd multi-agent-system - تفعيل واجهات برمجة التطبيقات: نفِّذ الأمر التالي لتفعيل خدمات Google Cloud اللازمة:
gcloud services enable \ run.googleapis.com \ artifactregistry.googleapis.com \ cloudbuild.googleapis.com \ aiplatform.googleapis.com \ compute.googleapis.com - افتح هذا المجلد في المحرِّر.
cloudshell edit .
إعداد البيئة
- إعداد متغيّرات البيئة: سننشئ ملف
.envلتخزين هذه المتغيّرات حتى تتمكّن من إعادة تحميلها بسهولة في حال انقطاع الاتصال بالجلسة.cat <<EOF > .env export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project) export GOOGLE_CLOUD_LOCATION=europe-west4 export GOOGLE_GENAI_USE_VERTEXAI=true EOF - تحديد مصدر متغيرات البيئة:
source .env
4. 🕵️ وكيل الباحث

الباحث هو شخص متخصص. مهمتها الوحيدة هي العثور على المعلومات. ولإجراء ذلك، يحتاج إلى الوصول إلى أداة، وهي "بحث Google".
لماذا يجب فصل حساب الباحث؟
نظرة تفصيلية: لماذا لا يمكن أن يقوم وكيل واحد بكل المهام؟
من الأسهل تقييم وتصحيح الأخطاء في الوكلاء الصغار الذين يركّزون على مهمة واحدة. إذا كان البحث سيئًا، يمكنك تكرار طلب Researcher. إذا كان تنسيق الدورة التدريبية سيئًا، يمكنك تكرار عملية إنشاء المحتوى باستخدام "أداة إنشاء المحتوى". في الطلب الموحّد "الذي ينجز كل شيء"، غالبًا ما يؤدي إصلاح مشكلة واحدة إلى حدوث مشكلة أخرى.
- إذا كنت تعمل في Cloud Shell، نفِّذ الأمر التالي لفتح محرِّر Cloud Shell:
cloudshell workspace . - فتح "
agents/researcher/agent.py" - راجِع الرمز التالي الذي يحدّد وكيل
researcher:# ... existing imports ... # Define the Researcher Agent researcher = Agent( name="researcher", model=MODEL, description="Gathers information on a topic using Google Search.", instruction=""" You are an expert researcher. Your goal is to find comprehensive and accurate information on the user's topic. Use the `google_search` tool to find relevant information. Summarize your findings clearly. If you receive feedback that your research is insufficient, use the feedback to refine your next search. """, tools=[google_search], ) root_agent = researcher
المفهوم الأساسي: استخدام الأدوات
لاحظ أنّنا نمرّر tools=[google_search]. تتولّى "حزمة تطوير التطبيقات" التعامل مع تعقيد وصف هذه الأداة للنموذج اللغوي الكبير. عندما يقرّر النموذج أنّه بحاجة إلى معلومات، ينشئ طلبًا منظَّمًا لاستخدام الأداة، وينفّذ ADK دالة Python google_search، ويُعيد النتيجة إلى النموذج.
5- ⚖️ وكيل القاضي

يبذل "الباحث" جهدًا كبيرًا، ولكن يمكن أن تكون النماذج اللغوية الكبيرة كسولة. نحتاج إلى حكم لمراجعة العمل. يقبل "القاضي" البحث ويعرض تقييمًا منظَّمًا بنتيجة "اجتياز" أو "عدم اجتياز".
الناتج المنظَّم
نظرة تفصيلية: لأتمتة مهام سير العمل، نحتاج إلى مخرجات يمكن توقّعها. من الصعب تحليل مراجعة نصية طويلة بشكل آلي. من خلال فرض مخطط JSON (باستخدام Pydantic)، نضمن أن تعرض أداة Judge القيمة المنطقية pass أو fail التي يمكن أن يستند إليها الرمز البرمجي بشكل موثوق.
- فتح "
agents/judge/agent.py" - راجِع الرمز التالي الذي يحدّد مخطط
JudgeFeedbackوعاملjudge.# 1. Define the Schema class JudgeFeedback(BaseModel): """Structured feedback from the Judge agent.""" status: Literal["pass", "fail"] = Field( description="Whether the research is sufficient ('pass') or needs more work ('fail')." ) feedback: str = Field( description="Detailed feedback on what is missing. If 'pass', a brief confirmation." ) # 2. Define the Agent judge = Agent( name="judge", model=MODEL, description="Evaluates research findings for completeness and accuracy.", instruction=""" You are a strict editor. Evaluate the 'research_findings' against the user's original request. If the findings are missing key info, return status='fail'. If they are comprehensive, return status='pass'. """, output_schema=JudgeFeedback, # Disallow delegation because it should only output the schema disallow_transfer_to_parent=True, disallow_transfer_to_peers=True, ) root_agent = judge
المفهوم الأساسي: تقييد سلوك الوكيل
لقد ضبطنا disallow_transfer_to_parent=True وdisallow_transfer_to_peers=True. يفرض ذلك على Judge إرجاع JudgeFeedback المنظَّمة JudgeFeedback فقط. ولا يمكنه اتّخاذ قرار "المحادثة" مع المستخدم أو تفويض وكيل آخر. وهذا يجعلها عنصرًا حتميًا في مسار المنطق.
6. ✍️ أداة "إنشاء المحتوى"

أداة إنشاء المحتوى هي الكاتب الإبداعي. يتم تحويل الأبحاث التي تمت الموافقة عليها إلى دورات تدريبية. ويستخدم نموذج Gemma الذي يتم تشغيله من خلال Cloud Run.
لنلقِ نظرة أولاً على خدمة Cloud Run التي تستضيف النموذج
- فتح "
ollama_backend/Dockerfile" - يمكنك هنا الاطّلاع على كيفية استخدام Dockerfile لصورة Ollama، والاستماع إلى الطلبات على المنفذ 8080، وتخزين النموذج المطلوب في مجلد /model.
FROM ollama/ollama:latest # Listen on all interfaces, port 8080 (Cloud Run default) ENV OLLAMA_HOST 0.0.0.0:8080 # Store model weight files in /models ENV OLLAMA_MODELS /models
⚙️ عند النشر، عليك ضبط الإعدادات التالية:
- وحدة معالجة الرسومات: تم اختيار NVIDIA L4 بسبب نسبة السعر إلى الأداء الممتازة لأحمال عمل الاستدلال. توفّر وحدة L4 ذاكرة لوحدة معالجة الرسومات بسعة 24 غيغابايت وعمليات محسَّنة على متّجهات متعدّدة الأبعاد، ما يجعلها مثالية لنماذج تضم 270 مليون معلَمة، مثل Gemma.
- الذاكرة: ذاكرة نظام بسعة 16 غيغابايت للتعامل مع تحميل النماذج وعمليات CUDA وإدارة الذاكرة في Ollama
- وحدة المعالجة المركزية (CPU): 8 نوى للتعامل الأمثل مع مهام الإدخال والإخراج والمعالجة المسبقة
- التزامن: يوازن 4 طلبات لكل مثيل بين معدل النقل واستخدام ذاكرة وحدة معالجة الرسومات
- المهلة: تتيح 600 ثانية تحميل النموذج الأولي وبدء تشغيل الحاوية
لنلقِ الآن نظرة على وكيل Content Builder الذي يستخدم نموذج Gemma.
- فتح "
agents/content_builder/agent.py" - راجِع الرمز التالي الذي يحدّد وكيل
content_builder.
# the `ollama-gemma-gpu` Cloud Run service URL which hosts the Gemma model
target_url = os.environ.get("OLLAMA_API_BASE")
# ... existing code ...
# (Note: We use 'ollama/gemma3:270m' to align with ADK's expected prefix)
gemma_model_name = os.environ.get("GEMMA_MODEL_NAME", "gemma3:270m")
model = LiteLlm(
model=f"ollama_chat/{gemma_model_name}",
api_base=target_url
)
# 5. Define the Agent
content_builder = Agent(
name="content_builder",
model=model,
description="Transforms research findings into a structured course.",
instruction="""
You are an expert course creator.
Take the approved 'research_findings' and transform them into a well-structured, engaging course module.
**Formatting Rules:**
1. Start with a main title using a single `#` (H1).
2. Use `##` (H2) for main section headings. These will be used for the Table of Contents.
3. Use `###` (H3) for sub-sections within main sections.
4. Use bullet points and clear paragraphs.
5. Maintain a professional but engaging tone.
**Structure Requirements:**
- Begin with a brief Introduction section explaining what the learner will gain.
- Organize content into 3-5 main sections with clear headings.
- Include Key Takeaways at the end as a bulleted summary.
- Keep each section focused and concise.
Ensure the content directly addresses the user's original request.
Do not include any preamble or explanation outside the course content itself.
""",
)
root_agent = content_builder
المفهوم الأساسي: نقل السياق
قد تتساءل: "كيف يعرف "منشئ المحتوى" ما عثر عليه "الباحث"؟" في حزمة تطوير التطبيقات (ADK)، تشترك الوكلاء في مسار معالجة في session.state. في وقت لاحق، سنضبط الباحث والحكم في Orchestrator لحفظ نواتجهما في هذه الحالة المشتركة. يمكن الوصول إلى هذا السجلّ من خلال طلب "أداة إنشاء المحتوى".
7. 🎻 المنظّم

المنسّق هو مدير فريقنا المتعدّد الوكلاء. على عكس الوكلاء المتخصّصين (الباحث، والحكم، وصانع المحتوى) الذين ينفّذون مهام محددة، تتمثل مهمة "المنسّق" في تنسيق سير العمل وضمان تدفّق المعلومات بشكل صحيح بين الوكلاء.
🌐 البنية: من وكيل إلى وكيل (A2A)

في هذا الدرس التطبيقي، سننشئ نظامًا موزّعًا. بدلاً من تشغيل جميع البرامج في عملية Python واحدة، ننشرها كخدمات مصغّرة مستقلة. يتيح ذلك لكل وكيل توسيع نطاقه بشكل مستقل وتعطُّله بدون إيقاف النظام بأكمله.
ولتحقيق ذلك، نستخدم بروتوكول Agent-to-Agent (A2A).
بروتوكول A2A
نظرة تفصيلية: في نظام الإنتاج، تعمل البرامج على خوادم مختلفة (أو حتى على سُحب مختلفة). يوفّر بروتوكول A2A طريقة موحّدة تتيح للأجهزة اكتشاف بعضها البعض والتواصل مع بعضها البعض عبر HTTP. RemoteA2aAgent هو برنامج ADK للعميل لهذا البروتوكول.
- فتح "
agents/orchestrator/agent.py" - راجِع طريقة عمل الرمز التالي الذي يحدّد عمليات الربط.
# ... existing code ... # Connect to the Researcher (Localhost port 8001) researcher_url = os.environ.get("RESEARCHER_AGENT_CARD_URL", "http://localhost:8001/a2a/agent/.well-known/agent-card.json") researcher = RemoteA2aAgent( name="researcher", agent_card=researcher_url, description="Gathers information using Google Search.", # IMPORTANT: Save the output to state for the Judge to see after_agent_callback=create_save_output_callback("research_findings"), # IMPORTANT: Use authenticated client for communication httpx_client=create_authenticated_client(researcher_url) ) # Connect to the Judge (Localhost port 8002) judge_url = os.environ.get("JUDGE_AGENT_CARD_URL", "http://localhost:8002/a2a/agent/.well-known/agent-card.json") judge = RemoteA2aAgent( name="judge", agent_card=judge_url, description="Evaluates research.", after_agent_callback=create_save_output_callback("judge_feedback"), httpx_client=create_authenticated_client(judge_url) ) # Content Builder (Localhost port 8003) content_builder_url = os.environ.get("CONTENT_BUILDER_AGENT_CARD_URL", "http://localhost:8003/a2a/agent/.well-known/agent-card.json") content_builder = RemoteA2aAgent( name="content_builder", agent_card=content_builder_url, description="Builds the course.", httpx_client=create_authenticated_client(content_builder_url) )
8. 🛑 أداة التحقّق من حالة التصعيد
يجب أن تتضمّن الحلقة طريقة لإيقافها. إذا قال القاضي "مقبول"، نريد الخروج من الحلقة على الفور والانتقال إلى "أداة إنشاء المحتوى".
المنطق المخصّص باستخدام BaseAgent
نظرة تفصيلية: لا يستخدم جميع موظّفي الدعم نماذج اللغات الكبيرة. في بعض الأحيان، تحتاج إلى منطق بسيط في Python. تتيح لك BaseAgent تحديد وكيل ينفّذ الرمز فقط. في هذه الحالة، نتحقّق من حالة الجلسة ونستخدم EventActions(escalate=True) للإشارة إلى LoopAgent بالتوقّف.
- لا يزال في
agents/orchestrator/agent.py. - يراجع الرمز التالي ملاحظات الحكم وينتقل إلى الخطوة التالية عند الاستعداد لذلك
class EscalationChecker(BaseAgent): """Checks the judge's feedback and escalates (breaks the loop) if it passed.""" async def _run_async_impl( self, ctx: InvocationContext ) -> AsyncGenerator[Event, None]: # Retrieve the feedback saved by the Judge feedback = ctx.session.state.get("judge_feedback") print(f"[EscalationChecker] Feedback: {feedback}") # Check for 'pass' status is_pass = False if isinstance(feedback, dict) and feedback.get("status") == "pass": is_pass = True # Handle string fallback if JSON parsing failed elif isinstance(feedback, str) and '"status": "pass"' in feedback: is_pass = True if is_pass: # 'escalate=True' tells the parent LoopAgent to stop looping yield Event(author=self.name, actions=EventActions(escalate=True)) else: # Continue the loop yield Event(author=self.name) escalation_checker = EscalationChecker(name="escalation_checker")
المفهوم الأساسي: التحكّم في تدفّق البيانات من خلال الأحداث
لا تتواصل البرامج مع المستخدمين من خلال النصوص فقط، بل من خلال الأحداث. من خلال عرض حدث باستخدام escalate=True، يرسل هذا العامل إشارة إلى العنصر الرئيسي (LoopAgent). تمت برمجة LoopAgent لتلقّي هذه الإشارة وإنهاء الحلقة.
9- 🔁 حلقة البحث

نحتاج إلى حلقة ملاحظات: البحث -> التقييم -> (فشل) -> البحث -> ...
- في
agents/orchestrator/agent.py - راجِع كيف يحدّد الرمز التالي تعريف
research_loop.research_loop = LoopAgent( name="research_loop", description="Iteratively researches and judges until quality standards are met.", sub_agents=[researcher, judge, escalation_checker], max_iterations=3, )
المفهوم الأساسي: LoopAgent
يتنقّل LoopAgent بين sub_agents بالترتيب.
-
researcher: للبحث عن البيانات judge: لتقييم البيانات.escalation_checker: تحدّد ما إذا كان سيتمyield Event(escalate=True). في حال حدوثescalate=True، يتم إيقاف التكرار مبكرًا. بخلاف ذلك، تتم إعادة التشغيل عند الباحث (بحد أقصىmax_iterations).
10. 🔗 مسار التعلّم النهائي

الخلاصة....
- في
agents/orchestrator/agent.py - راجِع طريقة تعريف
root_agentفي أسفل الملف.root_agent = SequentialAgent( name="course_creation_pipeline", description="A pipeline that researches a topic and then builds a course from it.", sub_agents=[research_loop, content_builder], )
المفهوم الأساسي: التركيب الهرمي
يُرجى العِلم أنّ research_loop هو نفسه وكيل (LoopAgent)، ونعامله مثل أي وكيل فرعي آخر في SequentialAgent. تتيح لك هذه الإمكانية إنشاء منطق معقّد من خلال دمج أنماط بسيطة (حلقات داخل تسلسلات، وتسلسلات داخل موجّهات، وما إلى ذلك).
11. 🚀 النشر على Cloud Run
سننشر كل وكيل كخدمة منفصلة على Cloud Run، بما في ذلك خدمة Cloud Run لواجهة المستخدم الخاصة بمنشئ الدورة التدريبية وخدمة Cloud Run التي تستخدم وحدات معالجة الرسومات لنموذج Gemma.
التعرّف على إعدادات النشر
عند نشر وكلاء في Cloud Run، نمرّر العديد من متغيرات البيئة لضبط سلوكهم واتصالهم:
GOOGLE_CLOUD_PROJECT: يضمن هذا الخيار أنّ الوكيل يستخدم مشروع Google Cloud الصحيح لتسجيل البيانات وإجراء طلبات إلى Vertex AI.GOOGLE_GENAI_USE_VERTEXAI: يطلب من إطار عمل الوكيل (ADK) استخدام Vertex AI لاستنتاج النموذج بدلاً من استدعاء واجهات Gemini API مباشرةً.-
[AGENT]_AGENT_CARD_URL: هذا الإعداد مهم جدًا لخدمة Orchestrator. يخبر هذا الملف Orchestrator بمكان العثور على الوكلاء عن بُعد. من خلال ضبط هذه السمة على عنوان URL الذي تم نشره على Cloud Run (وتحديدًا مسار بطاقة الوكيل)، نتيح لخدمة Orchestrator إمكانية العثور على Researcher وJudge وContent Builder والتواصل معهم عبر الإنترنت.
لنشر جميع البرامج إلى خدمات Cloud Run، شغِّل النص البرمجي التالي.
أولاً، تأكَّد من أنّ النص البرمجي قابل للتنفيذ.
chmod u+x ~/multi-agent-system/deploy.sh
ملاحظة سيستغرق تنفيذ هذه العملية عدة دقائق لأنّه يتم نشر كل خدمة بالتسلسل.
~/multi-agent-system/deploy.sh
12. أنشئ دورة تدريبية!
افتحوا موقع "صانع الدورات التدريبية" الإلكتروني. خدمة Course Creator Cloud Run هي آخر خدمة يتم نشرها من النص البرمجي. يمكنك تحديد عنوان URL الخاص بصانع الدورة التدريبية على أنّه https://course-creator-، والذي يجب أن يكون سطر الإخراج النهائي من نص النشر البرمجي.
واكتبوا فكرة دورة تدريبية، مثل "الجبر الخطي".
سيبدأ الوكلاء العمل على الدورة التدريبية.

13. تنظيف
لتجنُّب تحمّل رسوم في حسابك على Google Cloud مقابل الموارد المستخدَمة في هذا الدرس التطبيقي حول الترميز، اتّبِع الخطوات التالية لحذف خدماتك وصور الحاويات.
1. حذف خدمات Cloud Run
الطريقة الأكثر فعالية لتنظيف الموارد هي حذف الخدمات التي نشرتها على Cloud Run.
# Delete the main agent and app services
gcloud run services delete researcher content-builder judge orchestrator course-creator \
--region $REGION --quiet
# Delete the GPU backend (Ollama)
gcloud run services delete ollama-gemma-gpu \
--region $OLLAMA_REGION --quiet
2. حذف صور Artifact Registry
عند استخدام العلامة --source للنشر، أنشأت Google Cloud مستودعًا في Artifact Registry لتخزين نُسخ الحاويات. لإزالة هذه المستودعات وتوفير تكاليف التخزين، عليك حذف المستودع على النحو التالي:
gcloud artifacts repositories delete cloud-run-source-deploy --location us-east4 --quiet
3- إزالة الملفات والبيئة المحلية
للحفاظ على بيئة Cloud Shell نظيفة، أزِل مجلد المشروع وأي إعدادات محلية:
cd ~
rm -rf multi-agent-system
4. (اختياري) حذف المشروع
إذا أنشأت مشروعًا لهذا الدرس التطبيقي حول الترميز فقط، يمكنك التأكّد من عدم حدوث أي فوترة أخرى عن طريق إيقاف المشروع نفسه من خلال صفحة "إدارة الموارد".
14. تهانينا!
لقد أنشأت ونشرت بنجاح نظامًا موزّعًا يستند إلى عدّة وكلاء وجاهزًا للاستخدام في بيئة الإنتاج.
إنجازاتك
- تقسيم مهمة معقّدة: بدلاً من طلب واحد كبير، قسّمنا العمل إلى أدوار متخصصة (باحث، وحكم، ومنشئ محتوى).
- تنفيذ مراقبة الجودة: استخدمنا
LoopAgentوJudgeمنظَّمًا لضمان وصول المعلومات العالية الجودة فقط إلى الخطوة النهائية. - مصمَّم للإنتاج: باستخدام بروتوكول التواصل بين الوكلاء (A2A) وCloud Run، أنشأنا نظامًا يكون فيه كل وكيل عبارة عن خدمة مصغّرة مستقلة وقابلة للتوسيع. وهذا أكثر فعالية بكثير من تنفيذ كل شيء في نص برمجي واحد بلغة Python.
- التنسيق: استخدمنا
SequentialAgentوLoopAgentلتحديد أنماط واضحة لسير التحكّم. *. وحدات معالجة الرسومات في Cloud Run: تم نشر نموذج Gemma على وحدة معالجة رسومات في Cloud Run