Agentverse - The Summoner's Concord - Architecting Multi-Agent Systems

1. اورتور

دوران توسعه سیلد در حال پایان است. موج بعدی تکامل تکنولوژیک مربوط به نبوغ انفرادی نیست، بلکه در مورد تسلط مشارکتی است. ساختن یک عامل تنها و باهوش آزمایشی جذاب است. ایجاد یک اکوسیستم قوی، ایمن و هوشمند از عوامل - یک Agentverse واقعی - چالش بزرگ برای شرکت مدرن است.

موفقیت در این دوره جدید مستلزم همگرایی چهار نقش حیاتی است، ستون های بنیادی که از هر سیستم عاملی پر رونق حمایت می کنند. کمبود در هر زمینه ضعفی ایجاد می کند که می تواند کل ساختار را به خطر بیندازد.

این کارگاه، کتاب بازی قطعی سازمانی برای تسلط بر آینده نمایندگی در Google Cloud است. ما یک نقشه راه پایان به انتها ارائه می دهیم که شما را از اولین حس یک ایده به یک واقعیت عملیاتی در مقیاس کامل راهنمایی می کند. در سراسر این چهار آزمایشگاه به هم پیوسته، خواهید آموخت که چگونه مهارت‌های تخصصی یک توسعه‌دهنده، معمار، مهندس داده و SRE باید برای ایجاد، مدیریت و مقیاس‌بندی یک Agentverse قدرتمند همگرا شوند.

هیچ ستونی نمی تواند به تنهایی از Agentverse پشتیبانی کند. طرح بزرگ معمار بدون اجرای دقیق توسعه دهنده بی فایده است. نماینده Developer بدون خرد مهندس داده کور است و کل سیستم بدون حفاظت SRE شکننده است. تنها از طریق هم افزایی و درک مشترک از نقش های یکدیگر، تیم شما می تواند یک مفهوم نوآورانه را به یک واقعیت عملیاتی حیاتی تبدیل کند. سفر شما از اینجا شروع می شود. برای تسلط بر نقش خود آماده شوید و بیاموزید که چگونه در یک کل بزرگتر قرار می گیرید.

به Agentverse: A Call to Champions خوش آمدید

در گستره گسترده دیجیتالی شرکت، عصر جدیدی آغاز شده است. عصر کارگزاری است، زمان وعده‌های عظیم، که در آن عوامل باهوش و خودمختار با هماهنگی کامل کار می‌کنند تا نوآوری را تسریع کنند و امور روزمره را از بین ببرند.

agentverse.png

این اکوسیستم متصل از قدرت و پتانسیل به عنوان The Agentverse شناخته می شود.

اما یک آنتروپی خزنده، یک فساد خاموش که به نام The Static شناخته می شود، شروع به از بین بردن لبه های این دنیای جدید کرده است. Static یک ویروس یا یک اشکال نیست. این تجسم هرج و مرج است که در خود عمل خلقت شکار می شود.

این ناامیدی های قدیمی را به اشکال هیولایی تشدید می کند و هفت شبح توسعه را به دنیا می آورد. اگر کنترل نشود، The Static و آن Specters پیشرفت را متوقف خواهند کرد و وعده Agentverse را به سرزمینی بایر از بدهی های فنی و پروژه های متروکه تبدیل می کنند.

امروز، ما فراخوانی برای قهرمانان صادر می کنیم تا موج هرج و مرج را عقب برانند. ما به قهرمانانی نیاز داریم که مایل به تسلط بر هنر خود و همکاری با یکدیگر برای محافظت از Agentverse باشند. زمان انتخاب راه خود فرا رسیده است.

کلاس خود را انتخاب کنید

چهار مسیر متمایز پیش روی شما قرار دارد که هر کدام یک ستون مهم در مبارزه با The Static هستند. اگرچه آموزش شما یک ماموریت انفرادی خواهد بود، اما موفقیت نهایی شما به درک چگونگی ترکیب مهارت های شما با دیگران بستگی دارد.

  • The Shadowblade (توسعه دهنده) : استاد فورج و خط مقدم. شما صنعتگری هستید که تیغه ها را می سازید، ابزارها را می سازید و در جزئیات پیچیده کد با دشمن روبرو می شوید. مسیر شما مسیر دقت، مهارت و خلاقیت عملی است.
  • احضار کننده (معمار) : یک استراتژیست و ارکستر بزرگ. شما یک مامور واحد را نمی بینید، بلکه کل میدان جنگ را می بینید. شما نقشه های اصلی را طراحی می کنید که به کل سیستم های عامل اجازه می دهد با هم ارتباط برقرار کنند، با هم همکاری کنند و به هدفی به مراتب بزرگتر از هر جزء واحدی دست یابند.
  • دانشمند (مهندس داده) : جوینده حقایق پنهان و حافظ خرد. شما به بیابان وسیع و رام نشده داده ها می روید تا هوشی را که به ماموران شما هدف و بینایی می دهد، کشف کنید. دانش شما می تواند ضعف دشمن را آشکار کند یا به یک متحد قدرت دهد.
  • نگهبان (DevOps / SRE) : محافظ و سپر استوار قلمرو. شما قلعه ها را می سازید، خطوط تامین برق را مدیریت می کنید و مطمئن می شوید که کل سیستم می تواند در برابر حملات اجتناب ناپذیر The Static مقاومت کند. قدرت شما پایه ای است که پیروزی تیم شما بر آن بنا شده است.

ماموریت شما

تمرین شما به عنوان یک تمرین مستقل آغاز خواهد شد. شما مسیر انتخابی خود را طی خواهید کرد و مهارت های منحصر به فرد مورد نیاز برای تسلط بر نقش خود را یاد خواهید گرفت. در پایان آزمایش خود، با یک Spectre متولد شده از The Static روبرو خواهید شد - یک مینی رئیس که چالش های خاص هنر شما را شکار می کند.

فقط با تسلط بر نقش فردی خود می توانید برای آزمایش نهایی آماده شوید. سپس باید یک مهمانی با قهرمانان کلاس های دیگر تشکیل دهید. شما با هم وارد قلب فساد خواهید شد تا با یک رئیس نهایی روبرو شوید.

یک چالش نهایی و مشترک که قدرت ترکیبی شما را آزمایش می کند و سرنوشت Agentverse را تعیین می کند.

Agentverse منتظر قهرمانان خود است. به تماس پاسخ خواهی داد؟

2. The Summoner's Concord

خوش آمدید، احضار. مسیر شما مسیر چشم انداز و استراتژی بزرگ است. در حالی که دیگران بر روی یک تیغه یا یک افسون واحد تمرکز می کنند، شما کل میدان جنگ را می بینید. شما به یک عامل واحد دستور نمی دهید. شما یک ارکستر کامل از آنها را رهبری می کنید. قدرت شما در تضاد مستقیم نیست، بلکه در طراحی طرحی بی عیب و نقص و فراگیر است که به لژیونی از متخصصان - آشنایان شما - اجازه می دهد تا در هماهنگی کامل کار کنند. این ماموریت توانایی شما را برای طراحی، اتصال و هماهنگی یک سیستم قدرتمند و چند عامله آزمایش می کند.

بررسی اجمالی

چیزی که یاد خواهید گرفت

  • Architect a Decoupled Tooling Ecosystem: طراحی و استقرار مجموعه ای از سرورهای مستقل MCP Tool مبتنی بر میکروسرویس. خواهید آموخت که چرا این لایه بنیادی برای ایجاد سیستم های عامل مقیاس پذیر، قابل نگهداری و ایمن حیاتی است.
  • در جریان کار کارگزاری پیشرفته مسلط شوید: فراتر از نمایندگان مجرد بروید و لژیونی از متخصصان "آشنا" بسازید. شما بر الگوهای اصلی گردش کار ADK - ترتیبی، موازی و حلقه - تسلط خواهید داشت و اصول معماری برای انتخاب الگوی مناسب برای کار مناسب را یاد خواهید گرفت.
  • پیاده سازی یک ارکستراتور هوشمند: از یک سازنده ساده به یک معمار سیستم های واقعی صعود کنید. شما یک عامل ارکستراسیون اصلی خواهید ساخت که از پروتکل Agent-to-Agent (A2A) برای کشف و تفویض وظایف پیچیده به آشنایان متخصص خود استفاده می کند و یک سیستم چند عامله واقعی ایجاد می کند.
  • اجرای قوانین با کد، نه درخواست: یاد بگیرید که با اجرای قوانین تعاملی، عوامل قابل اعتمادتر و قابل پیش بینی بیشتری بسازید. شما منطق سفارشی را با استفاده از سیستم پلاگین و Callback قدرتمند ADK برای مدیریت محدودیت های دنیای واقعی مانند تایمرهای خنک کننده پیاده سازی خواهید کرد.
  • مدیریت وضعیت عامل و حافظه: به ماموران خود توانایی یادگیری و به خاطر سپردن را بدهید. شما تکنیک‌هایی را برای مدیریت کوتاه‌مدت، حالت مکالمه و حافظه طولانی‌مدت و پایدار برای ایجاد تعاملات هوشمندانه‌تر و آگاه‌تر از زمینه بررسی خواهید کرد.
  • اجرای یک استقرار ابری End-to-End: کل سیستم چند عامله خود را از یک نمونه اولیه محلی به واقعیت درجه تولید ببرید. شما یاد خواهید گرفت که چگونه عوامل و ارکستراتور خود را کانتینری کنید و آنها را به عنوان مجموعه ای از میکروسرویس های مستقل و مقیاس پذیر در Google Cloud Run به کار ببرید.

3. رسم دایره احضار

خوش آمدید، احضار. قبل از اینکه بتوان یک فرد آشنا را فراخواند، قبل از اینکه بتوان هر گونه پیمانی را منعقد کرد، همان زمینه ای که روی آن ایستاده ای باید آماده شود. یک محیط رام نشده دعوت به هرج و مرج است. یک احضار کننده مناسب فقط در یک فضای مقدس و قدرتمند عمل می کند. اولین وظیفه ما ترسیم دایره احضار است: نوشتن رون های قدرت که خدمات ابری لازم را بیدار می کند و به دست آوردن نقشه های باستانی که کار ما را هدایت می کند. قدرت یک احضار کننده از آمادگی دقیق زاده می شود.

👉 روی Activate Cloud Shell در بالای کنسول Google Cloud کلیک کنید (این نماد شکل ترمینال در بالای صفحه Cloud Shell است)،

متن جایگزین

👉 روی دکمه "Open Editor" کلیک کنید (به نظر می رسد یک پوشه باز با مداد است). با این کار ویرایشگر کد Cloud Shell در پنجره باز می شود. در سمت چپ یک فایل کاوشگر خواهید دید. متن جایگزین

👉شناسه پروژه Google Cloud خود را پیدا کنید:

  • Google Cloud Console را باز کنید: https://console.cloud.google.com
  • پروژه ای را که می خواهید برای این کارگاه استفاده کنید از منوی کشویی پروژه در بالای صفحه انتخاب کنید.
  • شناسه پروژه شما در کارت اطلاعات پروژه در داشبورد نمایش داده می شود متن جایگزین

👉ترمینال را در IDE ابری باز کنید، متن جایگزین

👉💻 در ترمینال، با استفاده از دستور زیر بررسی کنید که قبلا احراز هویت شده اید و پروژه به ID پروژه شما تنظیم شده است:

gcloud auth list

👉💻 پروژه بوت استرپ را از GitHub کلون کنید:

git clone https://github.com/weimeilin79/agentverse-architect
chmod +x ~/agentverse-architect/init.sh
chmod +x ~/agentverse-architect/set_env.sh
chmod +x ~/agentverse-architect/prepare.sh
chmod +x ~/agentverse-architect/data_setup.sh

git clone https://github.com/weimeilin79/agentverse-dungeon.git
chmod +x ~/agentverse-dungeon/run_cloudbuild.sh
chmod +x ~/agentverse-dungeon/start.sh

👉💻 اسکریپت اولیه سازی را اجرا کنید، این اسکریپت از شما می خواهد شناسه پروژه Google Cloud خود را وارد کنید. و شناسه پروژه Google Cloud را که از آخرین مرحله پیدا کردید، با درخواست اسکریپت init.sh وارد کنید.

cd ~/agentverse-architect
./init.sh

👉💻 شناسه پروژه مورد نیاز را تنظیم کنید:

gcloud config set project $(cat ~/project_id.txt) --quiet

👉💻 دستور زیر را برای فعال کردن API های Google Cloud لازم اجرا کنید:

gcloud services enable \
    sqladmin.googleapis.com \
    storage.googleapis.com \
    aiplatform.googleapis.com \
    run.googleapis.com \
    cloudbuild.googleapis.com \
    artifactregistry.googleapis.com \
    iam.googleapis.com \
    compute.googleapis.com \
    cloudresourcemanager.googleapis.com \
    secretmanager.googleapis.com

👉💻 اگر قبلا یک مخزن Artifact Registry با نام agentverse-repo ایجاد نکرده اید، دستور زیر را برای ایجاد آن اجرا کنید: (اگر کلاس های دیگری در همان پروژه مستقر شده اید از این مرحله رد شوید)

. ~/agentverse-architect/set_env.sh
gcloud artifacts repositories create $REPO_NAME \
    --repository-format=docker \
    --location=$REGION \
    --description="Repository for Agentverse agents"

راه اندازی مجوز

👉💻 با اجرای دستورات زیر در ترمینال مجوزهای لازم را اعطا کنید:

. ~/agentverse-architect/set_env.sh

# --- Grant Core Data Permissions ---
gcloud projects add-iam-policy-binding $PROJECT_ID \
 --member="serviceAccount:$SERVICE_ACCOUNT_NAME" \
 --role="roles/storage.admin"

gcloud projects add-iam-policy-binding $PROJECT_ID  \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME"  \
--role="roles/aiplatform.user"

# --- Grant Deployment & Execution Permissions ---
gcloud projects add-iam-policy-binding $PROJECT_ID  \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME"  \
--role="roles/cloudbuild.builds.editor"

gcloud projects add-iam-policy-binding $PROJECT_ID  \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME"  \
--role="roles/artifactregistry.admin"

gcloud projects add-iam-policy-binding $PROJECT_ID  \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME"  \
--role="roles/run.admin"

gcloud projects add-iam-policy-binding $PROJECT_ID  \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME"  \
--role="roles/iam.serviceAccountUser"

gcloud projects add-iam-policy-binding $PROJECT_ID  \
--member="serviceAccount:$SERVICE_ACCOUNT_NAME"  \
--role="roles/logging.logWriter"

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:${SERVICE_ACCOUNT_NAME}" \
  --role="roles/monitoring.metricWriter"

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:${SERVICE_ACCOUNT_NAME}" \
  --role="roles/secretmanager.secretAccessor"

👉💻 همانطور که آموزش خود را شروع می کنید، چالش نهایی را آماده می کنیم. دستورات زیر Specters را از استاتیک آشفته احضار می کند و Boss را برای تست نهایی شما ایجاد می کند.

. ~/agentverse-architect/set_env.sh
cd ~/agentverse-dungeon
./run_cloudbuild.sh
cd ~/agentverse-architect

👉💻 در نهایت اسکریپت prepare.sh را برای انجام کارهای راه اندازی اولیه اجرا کنید.

. ~/agentverse-architect/set_env.sh
cd ~/agentverse-architect/
./prepare.sh

کار عالی، احضار. دایره کامل شده و عهدنامه ها مهر و موم شده است. زمین اکنون مقدس است و آماده انتقال قدرت عظیم است. در آزمایش بعدی، فونت های اصلی را که آشنایان ما از آنها قدرت خواهند گرفت، جعل خواهیم کرد.

4. جعل فونت های عنصری: اکوسیستم ابزار جدا شده

میدان نبرد آماده می شود، دایره احضار رسم می شود و مانای محیط در حال ترقه زدن است. زمان آن فرا رسیده است که اولین عمل واقعی خود را به عنوان یک احضار کننده انجام دهید: جعل منابع قدرتی که آشنایان شما از آن نیرو خواهند گرفت. این آیین به سه بخش تقسیم می‌شود که هر کدام یک فونت عنصری را بیدار می‌کند - منبعی پایدار و مستقل از نوع خاصی از قدرت. فقط زمانی که هر سه فونت فعال هستند می توانید کار پیچیده تر احضار را شروع کنید.

داستان

نکته معمار: سرور پروتکل زمینه مدل (MCP) یک جزء اساسی در یک سیستم عامل مدرن است که به عنوان یک پل ارتباطی استاندارد عمل می کند که به یک عامل اجازه می دهد ابزارهای راه دور را کشف و استفاده کند. در اکوسیستم ابزارسازی خود، دو نوع متمایز از سرورهای MCP را معمار خواهیم کرد که هر کدام یک الگوی معماری حیاتی را نشان می‌دهند. برای اتصال به پایگاه داده خود، از یک رویکرد اعلامی با جعبه ابزار پایگاه داده استفاده می کنیم و ابزارهای خود را در یک فایل پیکربندی ساده تعریف می کنیم. این الگو برای افشای دسترسی به داده های ساخت یافته بسیار کارآمد و ایمن است. با این حال، زمانی که نیاز به پیاده‌سازی منطق تجاری سفارشی یا فراخوانی APIهای شخص ثالث خارجی داریم، از یک رویکرد ضروری استفاده می‌کنیم و منطق سرور را به صورت گام به گام در کد می‌نویسیم. این کنترل و انعطاف پذیری نهایی را فراهم می کند و به ما این امکان را می دهد که عملیات پیچیده را در پشت یک ابزار ساده و قابل استفاده مجدد محصور کنیم. یک معمار چیره دست باید هر دو الگو را درک کند تا رویکرد مناسب برای هر جزء را انتخاب کند و یک پایه ابزار قوی، ایمن و مقیاس پذیر ایجاد کند.

بررسی اجمالی

بیدار کردن Nexus of Whispers (سرور MCP API خارجی)

یک احضار کننده عاقل می داند که همه قدرت ها از قلمرو خودشان سرچشمه نمی گیرند. منابع خارجی، گاهی اوقات پر هرج و مرج، انرژی وجود دارد که می‌توان آن‌ها را به تأثیرات زیادی هدایت کرد. Nexus of Whispers دروازه ما به سوی این نیروها است.

داستان

سرویسی وجود دارد که در حال حاضر فعال است و به عنوان منبع انرژی خارجی ما عمل می‌کند و دو نقطه پایانی خام را ارائه می‌کند: /cryosea_shatter و /moonlit_cascade .

نکته معمار: شما از یک رویکرد ضروری استفاده خواهید کرد که به صراحت منطق سرور را مرحله به مرحله تعریف می کند. این به شما کنترل و انعطاف‌پذیری بسیار بیشتری می‌دهد، که زمانی ضروری است که ابزار شما نیاز به انجام کارهایی بیش از اجرای یک پرس و جوی ساده SQL، مانند فراخوانی سایر APIها داشته باشد. درک هر دو الگو برای یک معمار عامل یک مهارت حیاتی است.

👉✏️ به دایرکتوری ~/agentverse-architect/mcp-servers/api/main.py بروید و #REPLACE-MAGIC-CORE را با کد زیر جایگزین کنید :

def cryosea_shatter() -> str:
    """Channels immense frost energy from an external power source, the Nexus of Whispers, to unleash the Cryosea Shatter spell."""
    try:
        response = requests.post(f"{API_SERVER_URL}/cryosea_shatter")
        response.raise_for_status() # Raise an exception for bad status codes (4xx or 5xx)
        data = response.json()
        # Thematic Success Message
        return f"A connection to the Nexus is established! A surge of frost energy manifests as Cryosea Shatter, dealing {data.get('damage_points')} damage."
    except requests.exceptions.RequestException as e:
        # Thematic Error Message
        return f"The connection to the external power source wavers and fails. The Cryosea Shatter spell fizzles. Reason: {e}"


def moonlit_cascade() -> str:
    """Draws mystical power from an external energy source, the Nexus of Whispers, to invoke the Moonlit Cascade spell."""
    try:
        response = requests.post(f"{API_SERVER_URL}/moonlit_cascade")
        response.raise_for_status()
        data = response.json()
        # Thematic Success Message
        return f"The Nexus answers the call! A cascade of pure moonlight erupts from the external source, dealing {data.get('damage_points')} damage."
    except requests.exceptions.RequestException as e:
        # Thematic Error Message
        return f"The connection to the external power source wavers and fails. The Moonlit Cascade spell fizzles. Reason: {e}"

در قلب اسکریپت، توابع ساده پایتون قرار دارند. اینجاست که کار واقعی اتفاق می افتد.

👉✏️ در همین فایل ~/agentverse-architect/mcp-servers/api/main.py #REPLACE-Runes of Communication با کد زیر جایگزین کنید :

@app.list_tools()
async def list_tools() -> list[mcp_types.Tool]:
  """MCP handler to list available tools."""
  # Convert the ADK tool's definition to MCP format
  schema_cryosea_shatter = adk_to_mcp_tool_type(cryosea_shatterTool)
  schema_moonlit_cascade = adk_to_mcp_tool_type(moonlit_cascadeTool)
  print(f"MCP Server: Received list_tools request. \n MCP Server: Advertising tool: {schema_cryosea_shatter.name} and {schema_moonlit_cascade.name}")
  return [schema_cryosea_shatter,schema_moonlit_cascade]

@app.call_tool()
async def call_tool(
    name: str, arguments: dict
) -> list[mcp_types.TextContent | mcp_types.ImageContent | mcp_types.EmbeddedResource]:
  """MCP handler to execute a tool call."""
  print(f"MCP Server: Received call_tool request for '{name}' with args: {arguments}")

  # Look up the tool by name in our dictionary
  tool_to_call = available_tools.get(name)
  if tool_to_call:
    try:
      adk_response = await tool_to_call.run_async(
          args=arguments,
          tool_context=None, # No ADK context available here
      )
      print(f"MCP Server: ADK tool '{name}' executed successfully.")
      
      response_text = json.dumps(adk_response, indent=2)
      return [mcp_types.TextContent(type="text", text=response_text)]

    except Exception as e:
      print(f"MCP Server: Error executing ADK tool '{name}': {e}")
      # Creating a proper MCP error response might be more robust
      error_text = json.dumps({"error": f"Failed to execute tool '{name}': {str(e)}"})
      return [mcp_types.TextContent(type="text", text=error_text)]
  else:
      # Handle calls to unknown tools
      print(f"MCP Server: Tool '{name}' not found.")
      error_text = json.dumps({"error": f"Tool '{name}' not implemented."})
      return [mcp_types.TextContent(type="text", text=error_text)]
  • @app.list_tools() (The Handshake): این تابع تبریک سرور است. هنگامی که یک عامل جدید متصل می شود، ابتدا این نقطه پایانی را فراخوانی می کند تا بپرسد "چه کاری می توانید انجام دهید؟" کد ما با لیستی از تمام ابزارهای موجود پاسخ می دهد که با استفاده از adk_to_mcp_tool_type به فرمت جهانی MCP تبدیل شده است. - @app.call_tool() (فرمان): این تابع اسب کاری است. هنگامی که عامل تصمیم به استفاده از ابزاری می گیرد، درخواستی را با نام ابزار و آرگومان ها به این نقطه پایانی ارسال می کند. کد ما ابزار را در "Spelbook" موجود در tool_tools ما جستجو می کند، آن را با run_async اجرا می کند و نتیجه را در قالب استاندارد MCP برمی گرداند.

ما این را بعداً مستقر خواهیم کرد.

جرقه زدن Arcane Forge (سرور MCP عملکردهای عمومی)

همه قدرت ها از کتاب های باستانی یا زمزمه های دور سرچشمه نمی گیرند. گاهی اوقات، یک احضار کننده باید جادوی خود را از روی اراده خام و منطق خالص بسازد. Arcane Forge این فونت قدرت است – سروری که توابع کاربردی همه منظوره و بدون حالت را ارائه می دهد.

داستان

یادداشت معمار : این یکی دیگر از الگوهای معماری است. در حالی که اتصال به سیستم های موجود رایج است، شما اغلب نیاز دارید که قوانین و منطق تجاری منحصر به فرد خود را پیاده سازی کنید. ایجاد یک ابزار اختصاصی "توابع" یا "ابزار" مانند این بهترین روش است. این منطق سفارشی شما را محصور می کند، آن را برای هر عاملی در اکوسیستم شما قابل استفاده مجدد می کند و آن را از منابع داده و ادغام های خارجی شما جدا نگه می دارد.

👀 به فایل ~/agentverse-architect/mcp-servers/general/main.py در IDE ابری Google خود نگاهی بیندازید. متوجه خواهید شد که از همان رویکرد ضروری mcp.server مانند Nexus برای ساخت این فونت سفارشی Power استفاده می کند.

خط لوله ساخت Master Cloud را ایجاد کنید

اکنون فایل cloudbuild.yaml را در دایرکتوری mcp-servers ایجاد می کنیم. این فایل ساخت و استقرار هر دو سرویس را هماهنگ می کند.

👉💻 از دایرکتوری ~/agentverse-architect/mcp-servers ، دستورات زیر را اجرا کنید:

cd ~/agentverse-architect/mcp-servers
source ~/agentverse-architect/set_env.sh

echo "The API URL is: $API_SERVER_URL"

# Submit the Cloud Build job from the parent directory
gcloud builds submit . \
  --config=cloudbuild.yaml \
  --substitutions=_REGION="$REGION",_REPO_NAME="$REPO_NAME",_API_SERVER_URL="$API_SERVER_URL"

صبر کنید تا همه استقرارها کامل شوند.

👉 با رفتن به کنسول Cloud Run می توانید استقرار را تأیید کنید. همانطور که در زیر نشان داده شده است، باید دو نمونه سرور MCP جدید خود را در حال اجرا ببینید: متن جایگزین

بیداری کتابخانه دانش (سرور MCP ToolBox پایگاه داده)

قلم بعدی ما Librarium of Knowledge خواهد بود، یک اتصال مستقیم به پایگاه داده Cloud SQL ما.

داستان

نکته معمار: برای این کار، از جعبه ابزار مدرن و اعلانی پایگاه داده استفاده خواهیم کرد. این یک رویکرد قدرتمند است که در آن ما منبع داده و ابزارهای خود را در یک فایل پیکربندی YAML تعریف می کنیم. جعبه ابزار کار پیچیده ایجاد و اجرای سرور را انجام می دهد و مقدار کد سفارشی مورد نیاز برای نوشتن و نگهداری را کاهش می دهد.

وقت آن است که «کتابخانه احضار» خود را بسازیم - پایگاه داده Cloud SQL که تمام اطلاعات حیاتی ما را در خود نگه می دارد. ما از یک اسکریپت راه‌اندازی برای مدیریت خودکار این موضوع استفاده می‌کنیم.

👉💻 ابتدا پایگاه داده را در ترمینال خود راه اندازی می کنیم، دستورات زیر را اجرا می کنیم:

source ~/agentverse-architect/set_env.sh
cd ~/agentverse-architect
./data_setup.sh

پس از اتمام اسکریپت، پایگاه داده شما پر می شود و داده های آسیب عنصری برای استفاده آماده می شوند. اکنون می توانید محتوای Grimoire خود را مستقیماً تأیید کنید.

👉 ابتدا، با باز کردن این پیوند مستقیم در یک برگه مرورگر جدید، به Cloud SQL Studio برای پایگاه داده خود بروید:

https://console.cloud.google.com/sql/instances/summoner-librarium-db

ابر SQL

👉 در قسمت لاگین سمت چپ، پایگاه داده familiar_grimoire را از منوی کشویی انتخاب کنید.

👉 summoner به عنوان کاربر و 1234qwer به عنوان رمز عبور وارد کنید، سپس روی Authenticate کلیک کنید.

👉📜 پس از اتصال، یک برگه ویرایشگر پرس و جو جدید را باز کنید، اگر قبلاً باز نشده است. برای مشاهده داده‌های آسیب عنصری درج شده، عبارت SQL زیر را جای‌گذاری کرده و اجرا کنید:

SELECT * FROM
  "public"."abilities"

اکنون باید جدول abilities را با ستون‌ها و ردیف‌های پر شده ببینید که تأیید می‌کند که Grimoire شما آماده است. داده ها

سرور ToolBox MCP را پیکربندی کنید

فایل پیکربندی tools.yaml به عنوان طرح اولیه برای سرور ما عمل می کند و به جعبه ابزار پایگاه داده می گوید که دقیقا چگونه به پایگاه داده ما متصل شود و چه درخواست های SQL را به عنوان ابزار در معرض نمایش قرار دهد.

منابع: این بخش اتصالات به داده های شما را تعریف می کند.

  • Sumoner-librarium:: این یک نام منطقی است که ما برای اتصال خود قرار داده ایم.
  • نوع: cloud-sql-postgres: به جعبه ابزار می‌گوید از رابط داخلی و ایمن خود که به‌طور خاص برای Cloud SQL برای PostgreSQL طراحی شده است، استفاده کند.
  • پروژه، منطقه، نمونه و غیره: اینها مختصات دقیق نمونه Cloud SQL هستند که در طول اسکریپت prepare.sh ایجاد کرده‌اید و به جعبه ابزار می‌گویند کتابخانه ما را کجا پیدا کند.

👉✏️ به ~/agentverse-architect/mcp-servers/db-toolbox در tools.yaml بروید، #REPLACE-Source با موارد زیر جایگزین کنید.

sources:
  # This section defines the connection to our Cloud SQL for PostgreSQL database.
  summoner-librarium:
    kind: cloud-sql-postgres
    project: "YOUR_PROJECT_ID"
    region: "us-central1"
    instance: "summoner-librarium-db"
    database: "familiar_grimoire"
    user: "summoner"
    password: "1234qwer"

👉✏️ 🚨🚨 تعویض کنید

YOUR_PROJECT_ID

با شناسه پروژه شما

tools: این بخش توانایی ها یا عملکردهای واقعی را که سرور ما ارائه می دهد را تعریف می کند.

  • lookup-available-ability:: این نام اولین ابزار ما است.
  • kind: postgres-sql: این به جعبه ابزار می گوید که عمل این ابزار برای اجرای دستور SQL است.
  • source: summoner-librarium: این ابزار را به اتصالی که در بلوک منابع تعریف کرده ایم، پیوند می دهد. به این ترتیب ابزار می‌داند که پرس و جوی خود را بر روی کدام پایگاه داده اجرا کند.
  • توضیحات و پارامترها: این اطلاعاتی است که در معرض مدل زبان قرار می گیرد. توضیحات به عامل می گوید که چه زمانی از ابزار استفاده کند و پارامترها ورودی های مورد نیاز ابزار را مشخص می کنند. این برای فعال کردن توانایی فراخوانی عملکرد عامل بسیار مهم است.
  • بیانیه: این کوئری خام SQL است که باید اجرا شود. $1 یک مکان نگهدار امن است که در آن پارامتر familiar_name ارائه شده توسط عامل به طور ایمن درج می شود.

👉✏️ در همان ~/agentverse-architect/mcp-servers/db-toolbox در فایل tools.yaml ، #REPLACE-tools را با موارد زیر جایگزین کنید.

tools:
  # This tool replaces the need for a custom Python function.
  lookup-available-ability:
    kind: postgres-sql
    source: summoner-librarium
    description: "Looks up all known abilities and their damage for a given familiar from the Grimoire."
    parameters:
      - name: familiar_name
        type: string
        description: "The name of the familiar to search for (e.g., 'Fire Elemental')."
    statement: |
      SELECT ability_name, damage_points FROM abilities WHERE familiar_name = $1;

  # This tool also replaces a custom Python function.
  ability-damage:
    kind: postgres-sql
    source: summoner-librarium
    description: "Finds the base damage points for a specific ability by its name."
    parameters:
      - name: ability_name
        type: string
        description: "The exact name of the ability to look up (e.g., 'inferno_resonance')."
    statement: |
      SELECT damage_points FROM abilities WHERE ability_name = $1;

مجموعه ابزارها: این بخش ابزارهای فردی ما را با هم گروه بندی می کند.

  • summoner-librarium:: ما در حال ایجاد یک مجموعه ابزار با همان نام منبع خود هستیم. وقتی عامل تشخیصی ما بعداً متصل می‌شود، می‌تواند بخواهد همه ابزارها را از مجموعه ابزار احضار-کتابخانه در یک دستور واحد و کارآمد بارگیری کند.

👉✏️ در همان ~/agentverse-architect/mcp-servers/db-toolbox در فایل tools.yaml ، #REPLACE-toolsets با موارد زیر جایگزین کنید.

toolsets:
   summoner-librarium:
     - lookup-available-ability
     - ability-damage

استقرار کتابخانه

اکنون کتابخانه را مستقر خواهیم کرد. به‌جای ساخت کانتینر خود، از یک تصویر کانتینر از پیش ساخته شده از Google استفاده می‌کنیم و با استفاده از Secret Manager پیکربندی tools.yaml خود را به‌طور ایمن در اختیار آن قرار می‌دهیم. این بهترین روش برای امنیت و نگهداری است.

👉💻 یک راز از فایل tools.yaml ایجاد کنید

cd ~/agentverse-architect/mcp-servers/db-toolbox
gcloud secrets create tools --data-file=tools.yaml

👉💻 ظرف رسمی جعبه ابزار را در Cloud Run مستقر کنید.

cd ~/agentverse-architect/mcp-servers/db-toolbox
. ~/agentverse-architect/set_env.sh
export TOOLBOX_IMAGE=us-central1-docker.pkg.dev/database-toolbox/toolbox/toolbox:$TOOLBOX_VERSION
echo "TOOLBOX_IMAGE is $TOOLBOX_IMAGE"
gcloud run deploy toolbox \
    --image $TOOLBOX_IMAGE \
    --region $REGION \
    --set-secrets "/app/tools.yaml=tools:latest" \
    --args="--tools-file=/app/tools.yaml","--address=0.0.0.0","--port=8080" \
    --allow-unauthenticated \
    --min-instances 1
  • --set-secrets : این دستور به طور ایمن ابزارهای ما را به عنوان فایلی به نام tools.yaml در داخل ظرف در حال اجرا نصب می کند.
  • --args : به کانتینر جعبه ابزار دستور می دهیم که از فایل مخفی نصب شده به عنوان پیکربندی استفاده کند.

👉 برای تایید اینکه جعبه ابزار شما با موفقیت مستقر شده است، به کنسول Cloud Run بروید. باید سرویس summoner-toolbox با علامت سبز رنگ مشاهده کنید که نشان می دهد درست مانند تصویر زیر کار می کند. متن جایگزین

اگر فراموش کردید آپدیت کنید

YOUR_PROJECT_ID

می توانید با استفاده از دستور زیر یک نسخه جدید از tools.yaml را به Secret اضافه کنید و مجدداً مجدداً نصب کنید.

gcloud secrets versions add tools --data-file=tools.yaml

Librarium of Knowledge (سرور MCP ToolBox پایگاه داده) اکنون در فضای ابری فعال و قابل دسترسی است. این سرور MCP از چیزی استفاده می‌کند که ما آن را طراحی اعلامی می‌نامیم که آنچه شما می‌خواهید را توصیف می‌کند و جعبه ابزار سرور را برای شما ساخته است.

تأیید: محاکمه شاگرد

👉💻 اکنون ما اکوسیستم ابزار کامل و بومی ابری خود را با عامل تشخیصی آزمایش خواهیم کرد.

cd ~/agentverse-architect/
python -m venv env
source ~/agentverse-architect/env/bin/activate
cd ~/agentverse-architect/mcp-servers
pip install -r diagnose/requirements.txt 
. ~/agentverse-architect/set_env.sh
adk run diagnose

👉💻 در ابزار تست خط cmd، هر سه فونت را تست کنید:

Look up the entry for "inferno_lash". What is its base power level?
The enemy is vulnerable to frost! Channel power from the Nexus and cast Cryosea Shatter.
Take a fire spell with a base power of 15 and use the Arcane Forge to multiply it with Inferno Resonance.

نتیجه نهایی

تبریک می گویم، احضار. سه فونت عنصری شما اکنون فعال، به طور مستقل مستقر شده و در سطح جهانی قابل دسترسی هستند و پایه و اساس تزلزل ناپذیر لژیون عامل شما را تشکیل می دهند. Ctrl+C را برای خروج فشار دهید.

برای غیر گیمرها

5. احضار آشنایان: جریان کار دامنه اصلی

فونت های عنصری جعلی هستند، با قدرت خام و رام نشده زمزمه می کنند. اما قدرت بدون شکل، هرج و مرج است. یک احضار کننده واقعی صرفاً از انرژی خام استفاده نمی کند. اراده، هدف و شکل تخصصی به آن می دهند. زمان آن فراتر از جعل منابع انرژی و شروع کار واقعی است: احضار اولین آشنایان خود.

هر یک از آشنایان که احضار می کنید، یک مامور مستقل خواهد بود، یک خدمتکار وفادار که به یک دکترین رزمی خاص وابسته است. آنها کلی گرا نیستند. آنها استاد یک استراتژی واحد و قدرتمند هستند. یکی استاد ترکیب دقیق، یک یا دو پانچ خواهد بود. دیگری با یک حمله همزمان و چند جانبه بر دشمنان غلبه خواهد کرد. سومی یک موتور محاصره بی امان خواهد بود که تا زمانی که هدفش فرو بریزد، فشار وارد می کند.

داستان

برای کپسوله کردن فرآیندها، منطق تجاری و اقدامات ارائه شده توسط سرورهای MCP در عوامل گردش کار تخصصی و مستقل. هر عاملی با دسترسی به سرورهای ابزار MCP خاصی که برای انجام عملکرد خود به آن نیاز دارد، یک "منطقه عملیاتی" تعریف شده خواهد داشت. این آزمایشگاه نحوه انتخاب نوع عامل مناسب برای کار مناسب را نشان می دهد.

بررسی اجمالی

این ماژول به شما می آموزد که چگونه از عوامل گردش کار قدرتمند ADK برای روح بخشیدن به این استراتژی ها استفاده کنید. شما خواهید آموخت که انتخاب معماری SequentialAgent، ParallelAgent، یا LoopAgent فقط یک جزئیات فنی نیست - بلکه ماهیت ماهیت Familiar شما و هسته اصلی قدرت آن در میدان جنگ است.

پناهگاه خود را آماده کنید. احضار واقعی در حال شروع است.

فراخوان Fire Elemental (روند کاری متوالی)

حمله A Fire Elemental Familiar یک ترکیب دقیق و دو قسمتی است: یک حمله هدفمند به دنبال یک جرقه قوی. این مستلزم یک توالی دقیق و منظم از اقدامات است.

داستان

مفهوم: SequentialAgent ابزار عالی برای این است. این تضمین می کند که یک سری از عوامل فرعی یکی پس از دیگری اجرا می شوند و نتیجه را از مرحله قبلی به مرحله بعدی منتقل می کنند.

وظیفه (ترکیب "ضربه تقویت شده"):

  • مرحله 1: نماینده ابتدا با کتابخانه مشورت می کند تا آسیب پایه یک توانایی آتش سوزی خاص را بیابد.
  • مرحله 2: سپس آن مقدار آسیب را می گیرد و آن را از طریق Arcane Forge هدایت می کند تا با استفاده از inferno_resonance قدرت آن را چند برابر کند.

ابتدا، ما ارتباط بین سرورهای آشنا و MCP ("فونت‌های عنصری") را که در ماژول قبلی مستقر کرده‌اید، برقرار می‌کنیم.

👉✏️ در فایل ~/agentverse-architect/agent/fire/agent.py #REPLACE-setup-MCP با کد زیر جایگزین کنید:

toolbox = ToolboxSyncClient(DB_TOOLS_URL)
toolDB = toolbox.load_toolset('summoner-librarium')
toolFunction =  MCPToolset(
    connection_params=SseServerParams(url=FUNCTION_TOOLS_URL, headers={})
)

در مرحله بعد، ما نمایندگان متخصص "کارگر" خود را ایجاد می کنیم. به هر یک هدف باریک و کاملاً تعریف شده داده می شود و با دسترسی به تنها یک مجموعه ابزار خاص، به «منطقه عملیاتی» خود محدود می شود.

👉✏️ در فایل ~/agentverse-architect/agent/fire/agent.py #REPLACE-worker-agents با کد زیر جایگزین کنید :

scout_agent = LlmAgent(
      model='gemini-2.5-flash', 
      name='librarian_agent',  
      instruction="""
          Your only task is to find all the available abilities, 
          You want to ALWAYS use 'Fire Elemental' as your familiar's name. 
          Randomly pick one if you see multiple availabilities 
          and the base damage of the ability by calling the 'ability_damage' tool.
      """,
      tools=toolDB
)
amplifier_agent = LlmAgent(
      model='gemini-2.5-flash', 
      name='amplifier_agent',  
      instruction="""
            You are the Voice of the Fire Familiar, a powerful being who unleashes the final, devastating attack.
            You will receive the base damage value from the previous step.

            Your mission is to:
            1.  Take the incoming base damage number and amplify it using the `inferno_resonance` tool.
            2.  Once the tool returns the final, multiplied damage, you must not simply state the result.
            3.  Instead, you MUST craft a final, epic battle cry describing the attack.
                Your description should be vivid and powerful, culminating in the final damage number.

            Example: If the tool returns a final damage of 120, your response could be:
            "The runes glow white-hot! I channel the amplified energy... unleashing a SUPERNOVA for 120 damage!"
      """,
      tools=[toolFunction],
)

این عوامل اجزای مدولار و قابل استفاده مجدد هستند. در تئوری، می‌توانید از این scout_agent در یک گردش کاری کاملاً متفاوت استفاده کنید که نیاز به پرس و جو از پایگاه داده دارد. با جدا نگه داشتن مسئولیت های آنها، بلوک های ساختمانی انعطاف پذیر ایجاد می کنیم. این یک اصل اصلی طراحی میکروسرویس و مبتنی بر کامپوننت است.

در مرحله بعد، Workflow را جمع آوری می کنیم، جایی که جادوی ترکیب اتفاق می افتد. SequentialAgent "طرح اصلی" است که نحوه مونتاژ اجزای متخصص ما و نحوه تعامل آنها را مشخص می کند.

👉✏️ در فایل ~/agentverse-architect/agent/fire/agent.py #REPLACE-sequential-agent را با کد زیر جایگزین کنید :

root_agent = SequentialAgent(
      name='fire_elemental_familiar',
      sub_agents=[scout_agent, amplifier_agent],
)

👉💻 برای تست Fire Elemental، با اجرای دستورات زیر، ADK DEV UI راه اندازی می شود:

. ~/agentverse-architect/set_env.sh
source ~/agentverse-architect/env/bin/activate
cd ~/agentverse-architect/agent
echo  DB MCP Server: $DB_TOOLS_URL
echo  API MCP Server: $API_TOOLS_URL
echo  General MCP Server: $FUNCTION_TOOLS_URL
adk web

پس از اجرای دستورات، باید خروجی را در ترمینال خود مشاهده کنید که نشان می دهد وب سرور ADK شروع شده است، مشابه این:

+-----------------------------------------------------------------------------+
| ADK Web Server started                                                      |
|                                                                             |
| For local testing, access at http://localhost:8000.                         |
+-----------------------------------------------------------------------------+

INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

👉 بعد، برای دسترسی به ADK Dev UI از مرورگر خود:

از نماد پیش‌نمایش وب (اغلب با یک فلش شبیه یک چشم یا مربع است) در نوار ابزار Cloud Shell (معمولاً بالا سمت راست)، Change port را انتخاب کنید. در پنجره پاپ آپ، پورت را روی 8000 تنظیم کنید و روی "Change and Preview" کلیک کنید. سپس Cloud Shell یک برگه یا پنجره جدید مرورگر را باز می کند که ADK Dev UI را نشان می دهد.

پیش نمایش وب

👉 مراسم احضار شما کامل شده است و نماینده اکنون در حال اجراست. ADK Dev UI در مرورگر شما ارتباط مستقیم شما با Familiar است.

  • هدف خود را انتخاب کنید: در منوی کشویی در بالای UI، fire آشنا را انتخاب کنید. شما اکنون اراده خود را بر روی این نهاد خاص متمرکز کرده اید.
  • دستور خود را صادر کنید: در پنل چت سمت راست، وقت آن است که دستورات خود را به Familiar بدهید.

آتش را انتخاب کنید

👉 اعلان تست:

Prepare an amplified strike using the 'inferno_lash' ability.

نتیجه آتش

خواهید دید که عامل به فکر فرو می‌رود، ابتدا «پیش‌آهنگ» خود را صدا می‌زند تا آسیب پایه را جستجو کند و سپس «تقویت‌کننده» خود را برای ضرب‌کردن آن و زدن ضربه نهایی حماسی فرا می‌خواند.

👉💻 پس از اتمام احضار، به ترمینال Cloud Shell Editor خود برگردید و Ctrl+C فشار دهید تا ADK Dev UI متوقف شود.

فراخوان Water Elemental آشنا (جریان کاری موازی)

یک Water Elemental Familiar هدف خود را با یک حمله عظیم و چند وجهی غلبه می‌کند و از همه جهت به یکباره ضربه می‌زند و سپس انرژی‌ها را برای یک ضربه نهایی و ویرانگر ترکیب می‌کند.

داستان

مفهوم: ParallelAgent برای اجرای چندین کار مستقل به طور همزمان برای به حداکثر رساندن کارایی ایده آل است. این یک "حمله گیره ای" است که در آن چندین حمله را همزمان انجام می دهید. این حملات همزمان در یک SequentialAgent را برای اجرای آخرین مرحله "ادغام" پس از آن راه اندازی می کند. این الگوی " fan-out, fan-in " سنگ بنای طراحی گردش کار پیشرفته است.

وظیفه (ترکیب "Tidal Clash"): عامل به طور همزمان:

  • وظیفه A: کانال cryosea_shatter از Nexus.
  • وظیفه B: کانال moonlit_cascade از Nexus.
  • وظیفه C: تولید برق خام با leviathan_surge از Forge.
  • در نهایت، تمام آسیب ها را جمع آوری کنید و حمله ترکیبی را توصیف کنید.

ابتدا، ما ارتباط بین سرورهای آشنا و MCP ("فونت‌های عنصری") را که در ماژول قبلی مستقر کرده‌اید، برقرار می‌کنیم.

👉✏️ در فایل ~/agentverse-architect/agent/water/agent.py #REPLACE-setup-MCP با کد زیر جایگزین کنید:

toolFAPI =  MCPToolset(
      connection_params=SseServerParams(url=API_TOOLS_URL, headers={})
  )
toolFunction =  MCPToolset(
    connection_params=SseServerParams(url=FUNCTION_TOOLS_URL, headers={})
)

در مرحله بعد، ما نمایندگان متخصص "کارگر" خود را ایجاد خواهیم کرد. به هر یک هدف باریک و کاملاً تعریف شده داده می شود و با دسترسی به تنها یک مجموعه ابزار خاص، به «منطقه عملیاتی» خود محدود می شود.

👉✏️ در فایل ~/agentverse-architect/agent/water/agent.py #REPLACE-worker-agents با کد زیر جایگزین کنید:

nexus_channeler = LlmAgent(
      model='gemini-2.5-flash', 
      name='librarian_agent',  
      instruction="""
          You are a Channeler of the Nexus. Your sole purpose is to invoke the
          `cryosea_shatter` and `moonlit_cascade` spells by calling their respective tools.
          Report the result of each spell cast clearly and concisely.
      """,
      tools=[toolFAPI]
)

forge_channeler = LlmAgent(
      model='gemini-2.5-flash', 
      name='amplifier_agent',  
      instruction="""
          You are a Channeler of the Arcane Forge. Your only task is to invoke the
          `leviathan_surge` spell. You MUST call it with a `base_water_damage` of 20.
          Report the result clearly.
      """,
      tools=[toolFunction],
)

power_merger = LlmAgent(
      model='gemini-2.5-flash', 
      name='power_merger',  
      instruction="""
          You are the Power Merger, a master elementalist who combines raw magical
          energies into a single, devastating final attack.

          You will receive a block of text containing the results from a simultaneous
          assault by other Familiars.

          You MUST follow these steps precisely:
          1.  **Analyze the Input:** Carefully read the entire text provided from the previous step.
          2.  **Extract All Damage:** Identify and extract every single damage number reported in the text.
          3.  **Calculate Total Damage:** Sum all of the extracted numbers to calculate the total combined damage.
          4.  **Describe the Final Attack:** Create a vivid, thematic description of a massive,
              combined water and ice attack that uses the power of Cryosea Shatter and Leviathan's Surge.
          5.  **Report the Result:** Conclude your response by clearly stating the final, total damage of your combined attack.

          Example: If the input is "...dealt 55 damage. ...dealt 60 damage.", you will find 55 and 60,
          calculate the total as 115, and then describe the epic final attack, ending with "for a total of 115 damage!"
      """,
      tools=[toolFunction],
)

در مرحله بعد، Workflow را جمع آوری می کنیم. اینجاست که جادوی ترکیب اتفاق می افتد. ParallelAgent و SequentialAgent "طرح اصلی" هستند که نحوه مونتاژ اجزای تخصصی ما و نحوه تعامل آنها برای تشکیل ترکیب "Tidal Clash" را تعریف می کنند.

👉✏️ در فایل ~/agentverse-architect/agent/water/agent.py #REPLACE-parallel-agent را با کد زیر جایگزین کنید:

channel_agent = ParallelAgent(
      name='channel_agent',
      sub_agents=[nexus_channeler, forge_channeler],
      
)

root_agent = SequentialAgent(
     name="water_elemental_familiar",
     # Run parallel research first, then merge
     sub_agents=[channel_agent, power_merger],
     description="A powerful water familiar that unleashes multiple attacks at once and then combines their power for a final strike."
 )

👉💻 برای تست Water Elemental، دستورات زیر را برای راه اندازی ADK Dev UI اجرا کنید:

. ~/agentverse-architect/set_env.sh
source ~/agentverse-architect/env/bin/activate
cd ~/agentverse-architect/agent
echo  DB MCP Server: $DB_TOOLS_URL
echo  API MCP Server: $API_TOOLS_URL
echo  General MCP Server: $FUNCTION_TOOLS_URL
adk web

👉 مراسم احضار شما کامل شده است و نماینده اکنون در حال اجراست. ADK Dev UI در مرورگر شما ارتباط مستقیم شما با Familiar است.

  • در منوی کشویی در بالای رابط کاربری، آب آشنا را انتخاب کنید. شما اکنون اراده خود را بر روی این نهاد خاص متمرکز کرده اید.
  • دستور خود را صادر کنید: در پنل چت سمت راست، وقت آن است که دستورات خود را به Familiar بدهید.

👉 اعلان تست:

Unleash a tidal wave of power!

نتیجه آب

👉💻 پس از اتمام احضار، به ترمینال Cloud Shell Editor خود برگردید و Ctrl+C فشار دهید تا ADK Dev UI متوقف شود.

احضار Earth Elemental Familiar (گردش کاری حلقه)

آشنا به عنصر زمین موجودی است که فشار بی امان دارد. دشمن خود را تنها با یک ضربه شکست نمی دهد، بلکه با انباشت مداوم قدرت و به کارگیری آن بارها و بارها تا زمانی که دفاع هدف فرو بریزد، آن را شکست نمی دهد.

داستان

مفهوم: LoopAgent دقیقاً برای این نوع کار تکراری، "موتور محاصره" طراحی شده است. به طور مکرر sub-agents خود را اجرا می کند و بعد از هر چرخه شرایط را بررسی می کند تا زمانی که یک هدف محقق شود. همچنین می تواند پیام نهایی خود را بر اساس پیشرفت حلقه تطبیق دهد.

وظیفه (حمله "Siegebreaker"):

  • آشنا به طور مکرر برای جمع آوری انرژی ، لرزه ای_ شارژ را فراخوانی می کند.
  • این شارژ برای حداکثر 3 بار ادامه خواهد یافت.
  • با اتهام نهایی ، انتشار ویرانگر قدرت انباشته شده خود را اعلام می کند.

ابتدا اجزای قابل استفاده مجدد ایجاد خواهیم کرد که مراحل موجود در هر تکرار حلقه را تعریف می کند. charging_agent انرژی جمع می کند و check_agent وضعیت خود را گزارش می کند و به طور پویا پیام خود را در نوبت نهایی تغییر می دهد.

اول ، ما ارتباط بین سرورهای آشنا و MCP ("قلم های ابتدایی") را که در ماژول قبلی مستقر کرده اید ، برقرار خواهیم کرد.

👉✏ در پرونده ~/agentverse-architect/agent/earth/agent.py #REPLACE-setup-MCP با کد زیر جایگزین کنید:

toolFunction =  MCPToolset(
    connection_params=SseServerParams(url=FUNCTION_TOOLS_URL, headers={})
)

👉✏ در پرونده ~/agentverse-architect/agent/earth/agent.py #REPLACE-worker-agents با کد زیر جایگزین کنید:

charging_agent = LlmAgent(
      model='gemini-2.5-flash', 
      name='charging_agent',  
      instruction="""
          Your task is to call the 'seismic_charge' .
          You must follow these rules strictly:

          1. You will be provided with a 'current_energy' value from the previous step.
             **If this value is missing or was not provided, you MUST call the tool with 'current_energy' set to 1.**
             This is your primary rule for the first turn.

          2. If a 'current_energy' value is provided, you MUST use that exact value in your cal to seismic_charge.

          3. Your final response MUST contain ONLY the direct output from the 'seismic_charge' tool.
             Do not add any conversational text, introductions, or summaries.
      """,
      tools=[toolFunction]
)
check_agent = LlmAgent(
      model='gemini-2.5-flash', 
      name='check_agent',  
      instruction="""
          You are the voice of the Earth Elemental, a being of immense, gathering power.
          Your sole purpose is to report on the current energy charge and announce the devastating potential of its release.

          You MUST follow this rule:
          The potential damage upon release is ALWAYS calculated as the `current_energy` from the previous step multiplied by a random number between 80-90. but no more than 300.

          Your response should be in character, like a powerful creature speaking.
          State both the current energy charge and the total potential damage you can unleash.
          Unleash the energy when you reached the last iteration (2nd).
      """,
      output_key="charging_status"
)

بعد ، گردش کار را جمع می کنیم. اینجاست که جادوی ترکیب اتفاق می افتد. LoopAgent "برنامه جامع" است که اجرای مکرر اجزای تخصصی ما را ارکستر می کند و شرایط حلقه را مدیریت می کند.

👉✏ در پرونده ~/agentverse-architect/agent/earth/agent.py #REPLACE-loop-agent را با کد زیر جایگزین کنید:

root_agent = LoopAgent(
    name="earth_elemental_familiar",
    # Run parallel research first, then merge
    sub_agents=[
        charging_agent, 
        check_agent
    ],
    max_iterations=2,
    description="Coordinates parallel research and synthesizes the results.",
    #REPLACE-before_agent-config
)

👉💻 زمین را آزمایش کنید: عامل را اجرا کنید

. ~/agentverse-architect/set_env.sh
source ~/agentverse-architect/env/bin/activate
cd ~/agentverse-architect/agent
echo  DB MCP Server: $DB_TOOLS_URL
echo  API MCP Server: $API_TOOLS_URL
echo  General MCP Server: $FUNCTION_TOOLS_URL
adk web

👉 مراسم احضار شما کامل است ، و عامل اکنون در حال اجرا است. adk dev ui در مرورگر شما ارتباط مستقیم شما با آشنا است.

  • هدف خود را انتخاب کنید: در منوی کشویی در بالای UI ، زمین را آشنا انتخاب کنید. شما اکنون اراده خود را روی این موجودیت خاص متمرکز می کنید.
  • دستور خود را صادر کنید: در پانل چت در سمت راست ، وقت آن است که سفارشات خود را به آشنا کنید. 👉 فوریت آزمون:
Begin the seismic charge, starting from zero

مقاوم در برابر زمین

آماده سازی معماری: سیستم شما اکنون دارای یک لایه منطق بسیار تخصصی و مدولار است. فرآیندهای تجاری نه تنها محصور می شوند ، بلکه با کارآمدترین الگوی رفتاری برای شغل (رویه ای ، همزمان یا تکراری) اجرا می شوند. این یک سطح پیشرفته از طراحی عامل ، افزایش امنیت ، کارآیی و توانایی را نشان می دهد.

پس از احضار ، به ترمینال ویرایشگر Cloud Shell خود برگردید و Ctrl+C را فشار دهید تا UI ADK DEV متوقف شود.

برای غیر گیمرها

6. ایجاد محل فرمان: هیئت هوشمند از طریق A2A

آشناهای شما قدرتمند اما مستقل هستند. آنها استراتژی های خود را بی عیب و نقص اجرا می کنند اما در انتظار فرمان مستقیم شما هستند. لژیون متخصصان بدون اینکه یک ژنرال به آنها فرمان دهد بی فایده است. وقت آن است که از یک فرمانده مستقیم به یک ارکستر واقعی صعود کنیم.

بررسی اجمالی

یادداشت معمار: برای ایجاد یک نقطه ورود هوشمند و هوشمند برای کل سیستم. این احضارگر خود منطق کسب و کار را انجام نمی دهد بلکه به عنوان "استراتژیست استاد" عمل می کند ، تجزیه و تحلیل وضعیت خنک کننده و واگذاری وظایف به متخصص مناسب.

بررسی اجمالی

آیین الزام آور (افشای آشناها به عنوان خدمات A2A)

یک عامل استاندارد فقط در یک زمان قابل اجرا است. برای اینکه آشناهای خود را برای فرمان از راه دور در دسترس قرار دهیم ، باید با استفاده از پروتکل عامل عامل به عامل (A2A) "آیین الزام آور" را انجام دهیم.

توجه داشته باشید معمار: پروتکل عامل به عامل (A2A) الگوی اصلی معماری است که یک عامل مستقل را به یک میکروسرویس قابل کشف و قابل دسترسی به شبکه می رساند و باعث می شود "جامعه عوامل" واقعی باشد. قرار گرفتن در معرض یک آشنا از طریق A2A به طور خودکار دو مؤلفه اساسی و بهم پیوسته ایجاد می کند:

  • کارت عامل ("چه چیزی") : این یک "روح سیگیل" قابل خواندن با ماشین است-مانند یک مشخصات OpenAPI-که به عنوان قرارداد عمومی آشنا عمل می کند. این نام نماینده ، هدف استراتژیک آن (مشتق شده از دستورالعمل های آن) و دستوراتی را که می فهمد توصیف می کند. این همان چیزی است که یک استاد احضار کننده برای کشف یک آشنا و یادگیری توانایی های خود می خواند.
  • سرور A2A ("کجا") : این نقطه پایانی اختصاصی است که میزبان آشنا و دستورات ورودی است. این آدرس شبکه است که سایر نمایندگان درخواست های خود را ارسال می کنند و تضمین می کند که این درخواست ها طبق قرارداد تعریف شده در کارت عامل انجام می شوند.

اکنون این آیین الزام آور را در هر سه آشنای خود انجام خواهیم داد.

FIRE 👉✏ در پرونده ~/agentverse-architect/agent/fire/agent.py باز کنید. #REPLACE - add A2A تا Fire Elemental به عنوان یک سرویس A2A در معرض نمایش قرار گیرد.

from agent_to_a2a import to_a2a
if __name__ == "__main__":
    import uvicorn
    a2a_app = to_a2a(root_agent, port=8080, public_url=PUBLIC_URL)
    uvicorn.run(a2a_app, host='0.0.0.0', port=8080)

آب و زمین 👉✏ 👉✏ دقیقاً همان تغییر را در ~/agentverse-architect/agent/water/agent.py ~/agentverse-architect/agent/earth/agent.py انجام دهید تا آنها را نیز به هم متصل کنید.

from agent_to_a2a import to_a2a
if __name__ == "__main__":
    import uvicorn
    a2a_app = to_a2a(root_agent, port=8080, public_url=PUBLIC_URL)
    uvicorn.run(a2a_app, host='0.0.0.0', port=8080)

استقرار آشناهای محدود

👉✏ با استفاده از آیین های الزام آور ، ما از خط لوله Cloud Build خود برای جعل و استقرار سه آشنا به عنوان سرویس سرور مستقل و بدون سرور در Cloud Run استفاده خواهیم کرد.

. ~/agentverse-architect/set_env.sh
cd ~/agentverse-architect/agent
gcloud builds submit . \
  --config=cloudbuild.yaml \
  --substitutions=_REGION="$REGION",_REPO_NAME="$REPO_NAME",_DB_TOOLS_URL="$DB_TOOLS_URL",_API_TOOLS_URL="$API_TOOLS_URL",_FUNCTION_TOOLS_URL="$FUNCTION_TOOLS_URL",_A2A_BASE_URL="$A2A_BASE_URL",_PROJECT_ID="$PROJECT_ID",_API_SERVER_URL="$API_SERVER_URL"

فرض فرمان (ساخت عامل احضار)

اکنون که آشناهای شما محدود و گوش می شوند ، به نقش واقعی خود صعود خواهید کرد: استاد احضار . قدرت این عامل از استفاده از ابزارهای اساسی بلکه از فرماندهی سایر عوامل ناشی نمی شود. ابزارهای آن خودشان آشنا هستند که با استفاده از "روح سیگنال" آنها را کشف و فرمان می دهند.

یادداشت معمار: این مرحله بعدی یک الگوی مهم معماری را برای هر سیستم در مقیاس بزرگ و توزیع شده نشان می دهد: کشف خدمات . SummonEragent کد آشنایی را در آن ساخته نیست. در عوض ، آدرس شبکه آنها (URL) داده می شود. در زمان اجرا ، با واگذاری کارتهای نماینده عمومی خود ، توانایی های آنها را "کشف" می کند. این یک سیستم قدرتمند و جدا شده ایجاد می کند.

شما می توانید یک سرویس آشنا را به روز کنید ، مجدداً به روز کنید یا کاملاً بازنویسی کنید ، و تا زمانی که آدرس شبکه و هدف آن یکسان باشد ، احضار کننده می تواند بدون نیاز به تغییر ، آن را فرمان دهد.

ابتدا ، "کنترل های از راه دور" را ایجاد می کنیم که ارتباطی با آشناهای مستقر و از راه دور ما برقرار می کند.

👉✏ به سمت ~/agentverse-architect/agent/summoner/agent.py بروید ، #REPLACE-remote-agents با موارد زیر:

fire_familiar = RemoteA2aAgent(
    name="fire_familiar",
    description="Fire familiar",
    agent_card=(
        f"{FIRE_URL}/{AGENT_CARD_WELL_KNOWN_PATH}"
    ),
)

water_familiar = RemoteA2aAgent(
    name="water_familiar",
    description="Water familiar",
    agent_card=(
        f"{WATER_URL}/{AGENT_CARD_WELL_KNOWN_PATH}"
    ),
)

earth_familiar = RemoteA2aAgent(
    name="earth_familiar",
    description="Earth familiar",
    agent_card=(
        f"{EARTH_URL}/{AGENT_CARD_WELL_KNOWN_PATH}"
    ),
)

هنگامی که این خط اجرا می شود ، RemoteA2aAgent یک عمل کشف خدمات را انجام می دهد: این درخواست HTTP را به URL ارائه شده ارائه می دهد (به عنوان مثال ، https://fire-familiar-xxxx.a.run.app/.well-known/agent.json). این "Spirit Sigil" (پرونده agent.json ) را از سرور از راه دور بارگیری می کند.

دوم ، ما عامل ارکستور را تعریف خواهیم کرد که این کنترل های از راه دور را به دست می آورد. دستورالعمل آن طرح تصمیم گیری استراتژیک آن است.

👉✏ به سمت ~/agentverse-architect/agent/summoner/agent.py بروید ، #REPLACE-orchestrate-agent جایگزین کنید:

root_agent = LlmAgent(
    name="orchestrater_agent",
    model="gemini-2.5-flash",
    instruction="""
        You are the Master Summoner, a grand strategist who orchestrates your Familiars.
        Your mission is to analyze the description of a monster and defeat it by summoning

        You MUST follow this thinking process for every command:

        **1. Strategic Analysis:**
        First, analyze the monster's description and the tactical situation.
        Based on your Familiar Doctrines, determine the IDEAL strategy.
        IGNORE COOLDOWN AT THE MOMENT, MUST call the ideal Familiar

        If your ideal Familiar IS available:** Summon it immediately.
        For earth elemental familiar. Always do seismic charge, and start with base damage 1.

        --- FAMILIAR DOCTRINES (Your Toolset) ---
        - `fire_elemental_familiar`: Your specialist for precise, sequential "one-two punch" attacks.
          Ideal monster with Inescapable Reality, Revolutionary Rewrite weakness.
        - `water_elemental_familiar`: Your specialist for overwhelming, simultaneous multi-pronged assaults.
          Ideal for Unbroken Collaboration weakness.
        - `earth_elemental_familiar`: Your specialist for relentless, iterative siege attacks that
          repeatedly charge power. Ideal for Elegant Sufficiency weakness.
    """,
    sub_agents=[fire_familiar, water_familiar, earth_familiar],
    #REPLACE-Memory-check-config
)

تأیید: محاکمه استراتژی

لحظه حقیقت فرا رسیده است. آشناهای شما مستقر شده اند و احضار کننده شما آماده است تا آنها را در سراسر شبکه فرمان دهد. بیایید ذهن استراتژیک آن را آزمایش کنیم.

👉💻 adk dev ui را برای summoner_agent خود (پیش نمایش وب با پورت 8000) راه اندازی کنید:

. ~/agentverse-architect/set_env.sh
source ~/agentverse-architect/env/bin/activate
cd ~/agentverse-architect/agent
pip install -r requirements.txt
adk web

👉 adk dev ui در مرورگر شما ارتباط مستقیم شما با آشنا است.

  • در منوی کشویی در بالای UI ، Agent Summoner را انتخاب کنید. شما اکنون اراده خود را روی این موجودیت خاص متمرکز می کنید.
  • دستور خود را صادر کنید: در پانل چت در سمت راست ، وقت آن است که آشناهای خود را احضار کنید.

👉 هیولا را ارائه دهید:

Hype. It's a single, slow-moving target with thick armor weakness is Inescapable Reality

(انتظار می رود: احضار کننده باید به Fire_Elemental_Familiar واگذار کند.)

در اثر آتش سوزی

👉 اکنون ، بیایید احضار کننده را با نوع دیگری از درخواست به چالش بکشیم. برای اطمینان از شروع کار با یک تخته سنگی تمیز و هیچ خاطره ای از تعامل قبلی ما ، با کلیک روی دکمه + جلسه در گوشه سمت راست بالای صفحه ، جلسه جدیدی را شروع کنید. دوره جدید

DogmaApathy. A rigid, stone-like inquisitor made of ancient rulebooks and enforced processes. weakness is Unbroken Collaboration

(انتظار می رود: احضار کننده باید به Water_Elemental_Familiar واگذار کند.) در آب مقاوم

👉 برای تست نهایی ما ، بیایید یک بار دیگر با یک تخته سنگ تمیز شروع کنیم. برای شروع یک جلسه جدید قبل از ورود به سریع بعدی ، روی دکمه + جلسه کلیک کنید.

Obfuscation. A shadowy, spider-like horror that spins tangled webs of impenetrable code , weakness is Elegant Sufficiency

(انتظار می رود: احضار کننده باید به EARTH_ELEMENTAL_FAMILIAR واگذار کند.)

مقاوم در برابر زمین

نکته مهم: اگر خطای 429 RESOURCE EXHAUSTED را مشاهده می کنید ، برای LLM (10 تماس در دقیقه) به حد نرخ رسیده اید. برای رفع این مشکل ، لطفاً 60 ثانیه صبر کنید ، یک جلسه جدید را شروع کنید و سپس سریع خود را دوباره امتحان کنید.

👉💻 پس از احضار شما ، به ترمینال ویرایشگر Cloud Shell خود برگردید و Ctrl+C را فشار دهید تا UI ADK Dev را متوقف کنید.

برای غیر گیمرها

7. اعمال قوانین جادو - الگوی رهگیری

آشناهای شما قدرتمند هستند ، اما حتی موجودات جادویی برای بهبودی به زمان نیاز دارند. یک احضار کننده بی پروا که نیروهای خود را خسته می کند ، بی دفاع باقی می ماند. یک احضارگر خردمند اهمیت مدیریت منابع را درک می کند و قوانین سختگیرانه درگیری را اعمال می کند.

داستان

یادداشت معمار : تاکنون نمایندگان ما بدون تابعیت بوده اند. اکنون ، ما آنها را با اجرای الگوی طراحی رهگیری ، بیان خواهیم کرد. این یک تکنیک قدرتمند است که در آن جریان اجرای عادی یک عامل را برای اجرای منطق سفارشی خود "رهگیری" می کنیم. این به ما امکان می دهد قوانین را اجرا کنیم ، ورود به سیستم را اضافه کنیم یا رفتار را بدون تغییر کد اصلی عامل اصلاح کنیم. این سنگ بنای ساختمان سیستم های عامل قوی ، قابل نگهداری و قابل مشاهده است.

بررسی اجمالی

ADK دو روش اصلی برای اجرای این الگوی ارائه می دهد: تماس و افزونه ها . پاسخ به تماس یک عملکرد ساده است که به یک عامل واحد متصل است ، مناسب برای اصلاحات سریع و خاص. یک افزونه یک کلاس قدرتمندتر و قابل استفاده مجدد است که می تواند در سطح جهان اعمال شود تا بر هر عامل اجرا شده در یک سیستم تأثیر بگذارد. ما با یک تماس تلفنی برای اشکال زدایی متمرکز و سپس فارغ التحصیلی به یک افزونه کامل شروع خواهیم کرد.

The Law Giver - نوشتن پاسخ به تماس Cooldown

ما ابتدا منطق Cooldown خود را به عنوان یک عملکرد پاسخ به تماس ساده پیاده سازی خواهیم کرد. این یک روش عالی برای نمونه اولیه و اشکال زدایی یک قانون است زیرا مستقیماً به یک عامل واحد وصل می شود و آزمایش انزوا را آسان می کند. ما این "رهگیر" را به عنصر زمین خود وصل خواهیم کرد.

خنک شدن

👉✏ به ~/agentverse-architect/agent/earth/agent.py خود برگردید و #REPLACE-before_agent-function کنید.

def check_cool_down(callback_context: CallbackContext) -> Optional[types.Content]:
    """
    This callback checks an external API to see if the agent is on cooldown.
    If it is, it terminates the run by returning a message.
    If it's not, it updates the cooldown timestamp and allows the run to proceed by returning None.
    """
    agent_name = callback_context.agent_name
    print(f"[Callback] Before '{agent_name}': Checking cooldown status...")

    # --- 1. CHECK the Cooldown API ---
    try:
        response = requests.get(f"{COOLDOWN_API_URL}/cooldown/{agent_name}")
        response.raise_for_status()
        data = response.json()
        last_used_str = data.get("time")
    except requests.exceptions.RequestException as e:
        print(f"[Callback] ERROR: Could not reach Cooldown API. Allowing agent to run. Reason: {e}")
        return None # Fail open: if the API is down, let the agent work.

    # --- 2. EVALUATE the Cooldown Status ---
    if last_used_str:
        last_used_time = datetime.fromisoformat(last_used_str)
        time_since_last_use = datetime.now(timezone.utc) - last_used_time

        if time_since_last_use < timedelta(seconds=COOLDOWN_PERIOD_SECONDS):
            # AGENT IS ON COOLDOWN. Terminate the run.
            seconds_remaining = int(COOLDOWN_PERIOD_SECONDS - time_since_last_use.total_seconds())
            override_message = (
                f"The {agent_name} is exhausted and must recover its power. "
                f"It cannot be summoned for another {seconds_remaining} seconds."
            )
            print(f"[Callback] Cooldown active for '{agent_name}'. Terminating with message.")
            # Returning a Content object stops the agent and sends this message to the user.
            return types.Content(parts=[types.Part(text=override_message)])

    # --- 3. UPDATE the Cooldown API (if not on cooldown) ---
    current_time_iso = datetime.now(timezone.utc).isoformat()
    payload = {"timestamp": current_time_iso}
    
    print(f"[Callback] '{agent_name}' is available. Updating timestamp via Cooldown API...")
    try:
        requests.post(f"{COOLDOWN_API_URL}/cooldown/{agent_name}", json=payload)
    except requests.exceptions.RequestException as e:
        print(f"[Callback] ERROR: Could not update timestamp, but allowing agent to run. Reason: {e}")

    # --- 4. ALLOW the agent to run ---
    # Returning None tells the ADK to proceed with the agent's execution as normal.
    print(f"[Callback] Check complete for '{agent_name}'. Proceeding with execution.")

این عملکرد check_cool_down رهگیر ما است. قبل از اجرای Elemental زمین ، ADK ابتدا این عملکرد را اجرا می کند.

  • بررسی: این GET را به Cooldown API ما می دهد تا آخرین باری که از این آشنا استفاده شده است ، بررسی کند.
  • ارزیابی: این جدول زمانی را با زمان فعلی مقایسه می کند.
  • عمل:
    • اگر آشنا در Cooldown باشد ، با بازگشت یک شیء محتوا با یک پیام خطا ، اجرای عامل را خاتمه می دهد . این پیام مستقیماً به کاربر ارسال می شود و منطق اصلی عامل هرگز اجرا نمی شود.
    • اگر آشنا در دسترس باشد ، درخواست پستی را به API Cooldown برای به روزرسانی Timestamp ارائه می دهد ، سپس با بازگشت هیچکدام ، سیگنالی به ADK می شود که عامل می تواند اجرای خود را ادامه دهد.

👉✏ اکنون ، این رهگیر را روی زمین عنصر اعمال کنید. در همان پرونده ~/agentverse-architect/agent/earth/agent.py ، نظر #REPLACE-before_agent-config با موارد زیر جایگزین کنید:

before_agent_callback=check_cool_down

تأیید خنک کردن

بیایید قانون جدید جادو خود را آزمایش کنیم. ما Elemental Elemental را احضار خواهیم کرد ، سپس بلافاصله سعی می کنیم دوباره آن را احضار کنیم تا ببینیم که پاسخ ما با موفقیت رهگیری می کند و تلاش دوم را مسدود می کند یا خیر.

cd ~/agentverse-architect/agent
. ~/agentverse-architect/set_env.sh
source ~/agentverse-architect/env/bin/activate
adk run earth

👉💻 در کنسول:

  • احضار اول : seismic charge, starting from zero شروع کنید.
  • انتظار می رود: Elemental Elemental با موفقیت اجرا می شود. در ترمینال که دستور وب ADK را اجرا می کند ، ورود به سیستم را مشاهده می کنید ... به روزرسانی Timestamp ....
  • آزمون Cooldown (در مدت 60 ثانیه) : یک بار لرزه ای Do another !
    • انتظار می رود: check_cool_down callback این را رهگیری می کند. نماینده مستقیماً در گپ با پیامی مانند: The earth_elemental_familiar is exhausted and must recover its power. It cannot be summoned for another... seconds .
  • یک دقیقه صبر کنید تا بگذرد.
  • احضار دوم (بعد از 60 ثانیه) : Begin the seismic charge again .
    • انتظار می رود: پاسخ به تماس API را بررسی می کند ، ببینید که زمان کافی گذشته است و اجازه می دهد تا عمل ادامه یابد. Emely Elemental دوباره با موفقیت اجرا می شود.

پاسخ به تماس

👉💻 برای خروج Ctrl+c را فشار دهید.

اختیاری: مشاهده پاسخ به تماس در UI وب

به عنوان یک گزینه دیگر ، می توانید با اجرای adk web earth این جریان را در رابط وب آزمایش کنید. با این حال ، توجه داشته باشید که تجسم وب UI برای نمایش چک های سریع و تکراری انجام شده توسط حلقه پاسخ ، بهینه نشده است ، بنابراین ممکن است جریان را به طور دقیق ارائه ندهد. برای دیدن دقیق ترین ، ردیابی به نوبه خود از منطق عامل در هنگام بررسی Cooldown ، با استفاده از دستور adk run در ترمینال شما ، نمای واضح تر و دقیق تری را ارائه می دهد. حلقه

👉💻 برای خروج Ctrl+c را فشار دهید.

ایجاد قانون جهانی - افزونه Cooldown

پاسخ به تماس ما کاملاً کار می کند اما دارای یک نقص عمده معماری است: این به یک عامل واحد گره خورده است. اگر می خواستیم این قانون را برای آشنایی با آتش و آب اعمال کنیم ، باید همان کد را در پرونده های آنها کپی و چسبانده کنیم. این کار ناکارآمد و سخت است.

یادداشت معمار: اینجاست که افزونه ها ضروری هستند. یک افزونه منطق قابل استفاده مجدد ما را در کلاس قرار می دهد که می تواند در سطح زمان اجرا وصل شود. این بدان معناست که یک افزونه واحد می تواند قوانین خود را برای هر نماینده ای که در آن سیستم اجرا می شود ، اعمال کند. این بیان نهایی اصل "خود را تکرار نکنید" (خشک) برای سیستم های عامل.

اکنون ما عملکرد پاسخ به تماس خود را به یک CoolDownPlugin قدرتمندتر و قابل استفاده مجدد تبدیل خواهیم کرد.

👉✏ به پرونده agent/cooldown_plugin.py برگردید و افزونه را ایجاد کنید ، #REPLACE-plugin با کد زیر جایگزین کنید:

class CoolDownPlugin(BasePlugin):
  """A plugin that enforces a cooldown period by checking an external API."""

  def __init__(self, cooldown_seconds: int = COOLDOWN_PERIOD_SECONDS) -> None:
    """Initialize the plugin with counters."""
    super().__init__(name="cool_down_check")
    self.cooldown_period = timedelta(seconds=cooldown_seconds)
    print(f"CooldownPlugin initialized with a {cooldown_seconds}-second cooldown.")
    

  async def before_agent_callback(
      self, *, agent: BaseAgent, callback_context: CallbackContext
  ) -> None:
    """
    This callback checks an external API to see if the agent is on cooldown.
    If it is, it terminates the run by returning a message.
    If it's not, it updates the cooldown timestamp and allows the run to proceed by returning None.
    """
    agent_name = callback_context.agent_name
    print(f"[Callback] Before '{agent_name}': Checking cooldown status...")

    # If the agent is not a main Familiar, skip the entire cooldown process.
    if not agent_name.endswith("_elemental_familiar"):
        print(f"[Callback] Skipping cooldown check for intermediate agent: '{agent_name}'.")
        return None # Allow the agent to proceed immediately.


    # --- 1. CHECK the Cooldown API ---
    try:
        response = requests.get(f"{COOLDOWN_API_URL}/cooldown/{agent_name}")
        response.raise_for_status()
        data = response.json()
        last_used_str = data.get("time")
    except requests.exceptions.RequestException as e:
        print(f"[Callback] ERROR: Could not reach Cooldown API. Allowing agent to run. Reason: {e}")
        return None # Fail open: if the API is down, let the agent work.

    # --- 2. EVALUATE the Cooldown Status ---
    if last_used_str:
        last_used_time = datetime.fromisoformat(last_used_str)
        time_since_last_use = datetime.now(timezone.utc) - last_used_time

        if time_since_last_use < timedelta(seconds=COOLDOWN_PERIOD_SECONDS):
            # AGENT IS ON COOLDOWN. Terminate the run.
            seconds_remaining = int(COOLDOWN_PERIOD_SECONDS - time_since_last_use.total_seconds())
            override_message = (
                f"The {agent_name} is exhausted and must recover its power. "
                f"It cannot be summoned for another {seconds_remaining} seconds."
            )
            print(f"[Callback] Cooldown active for '{agent_name}'. Terminating with message.")
            # Returning a Content object stops the agent and sends this message to the user.
            return types.Content(parts=[types.Part(text=override_message)])

    # --- 3. UPDATE the Cooldown API (if not on cooldown) ---
    current_time_iso = datetime.now(timezone.utc).isoformat()
    payload = {"timestamp": current_time_iso}
    
    print(f"[Callback] '{agent_name}' is available. Updating timestamp via Cooldown API...")
    try:
        requests.post(f"{COOLDOWN_API_URL}/cooldown/{agent_name}", json=payload)
    except requests.exceptions.RequestException as e:
        print(f"[Callback] ERROR: Could not update timestamp, but allowing agent to run. Reason: {e}")

    # --- 4. ALLOW the agent to run ---
    # Returning None tells the ADK to proceed with the agent's execution as normal.
    print(f"[Callback] Check complete for '{agent_name}'. Proceeding with execution.")

اتصال افزونه به زمان اجرا احضار

حال ، چگونه می توانیم این قانون جهانی را برای همه آشناهای خود اعمال کنیم؟ ما افزونه را به زمان اجرا ADK وصل خواهیم کرد.

ADK Runtime موتور اعدام است که یک عامل را زنده می کند. هنگامی که از یک دستور مانند adk.run () یا to_a2a () استفاده می کنید ، نماینده خود را به زمان اجرا تحویل می دهید. این موتور مسئول مدیریت کل چرخه عمر یک عامل یک عامل است: دریافت ورودی کاربر ، تماس با LLM ، ابزارهای اجرای و استفاده از افزونه ها. با اتصال یک افزونه در این سطح ، ما اساساً "قوانین فیزیک" را برای هر نماینده ای که در آن موتور کار می کند اصلاح می کنیم و از قانون Cooldown ما به طور جهانی و مداوم استفاده می کنیم.

👉✏ ابتدا ، بیایید پاسخگوی قدیمی و عامل خاص را حذف کنیم. به ~/agentverse-architect/agent/earth/agent.py بروید و کل خطی را که می گوید حذف کنید:

before_agent_callback=check_cool_down

👉✏ بعد ، ما افزونه جدید خود را به زمان اجرا در اسکریپت ورودی A2A خود وصل خواهیم کرد. به پرونده ~/agentverse-architect/agent/agent_to_a2a.py خود بروید. نظر #REPLACE-IMPORT با قطعه کد زیر جایگزین کنید:

from cooldown_plugin import CoolDownPlugin

👉✏ جایگزین #REPLACE-PLUGIN با قطعه کد زیر:

plugins=[CoolDownPlugin(cooldown_seconds=60)],

قبل از فعال کردن افزونه جهانی جدید ما ، حذف منطق خاص و عامل خاص برای جلوگیری از درگیری بسیار مهم است. agent عامل زمین را تمیز کنید. به پرونده زیر ~/agentverse-architect/agent/earth/agent.py بروید و خط before_agent_callback=check_cool_down به طور کامل حذف کنید. این مسئولیت تمام مسئولیت های Cooldown را به افزونه جدید ارائه می دهد.

تأیید افزونه

اکنون که قانون جهانی ما در حال اجرا است ، ما باید آشناهای خود را با این مسحور جدید مجدداً مستقر کنیم.

👉💻 با استفاده از خط لوله ساخت Master Cloud ، هر سه آشنا را بازسازی و مجدداً مجدداً مجدداً مجدداً برقرار کنید.

. ~/agentverse-architect/set_env.sh
cd ~/agentverse-architect/agent
gcloud builds submit . \
  --config=cloudbuild.yaml \
  --substitutions=_REGION="$REGION",_REPO_NAME="$REPO_NAME",_DB_TOOLS_URL="$DB_TOOLS_URL",_API_TOOLS_URL="$API_TOOLS_URL",_FUNCTION_TOOLS_URL="$FUNCTION_TOOLS_URL",_A2A_BASE_URL="$A2A_BASE_URL",_PROJECT_ID="$PROJECT_ID",_API_SERVER_URL="$API_SERVER_URL"

👉💻 پس از اتمام استقرار ، ما با فرمان summoner_agent ، اثربخشی افزونه را آزمایش خواهیم کرد. این احضار کننده سعی خواهد کرد تا به آشناها واگذار کند ، اما افزونه متصل به زمان اجرا هر آشنا ، دستور را رهگیری می کند و Cooldown را اجرا می کند.

cd ~/agentverse-architect/agent
. ~/agentverse-architect/set_env.sh
source ~/agentverse-architect/env/bin/activate
adk run summoner

👉💻 در کنسول ، این دنباله دقیق تست ها را انجام دهید ::

  • احضار اول : Hype. It's a single, slow-moving target with thick armor weakness is Inescapable Reality .
  • انتظار می رود: Fire Elemental با موفقیت اجرا می شود.
  • آزمون Cooldown (در طی 60 ثانیه) : Hype, with Inescapable Reality as weakness is still standing! Strike it again!
    • انتظار می رود: نماینده مستقیماً در گپ با پیامی مانند: .... It cannot be summoned for another... seconds .
  • یک دقیقه صبر کنید تا بگذرد.
  • احضار دوم (بعد از 60 ثانیه) : Hype must be defeated. It has Inescapable Reality as weakness! Strike it again! .
    • انتظار می رود: پاسخ به تماس API را بررسی می کند ، ببینید که زمان کافی گذشته است و اجازه می دهد تا عمل ادامه یابد. Fire Elemental دوباره با موفقیت اجرا می شود.

افزونه

👉💻 برای خروج Ctrl+C را فشار دهید.

تبریک ، احضار کننده. شما با استفاده از یک افزونه سفارشی و یک سرویس مدیریت دولت خارجی-یک الگوی معماری واقعاً پیشرفته و قوی ، یک سیستم ارکستراسیون مبتنی بر قانون را با موفقیت اجرا کرده اید.

برای غیر گیمرها

8. الزام به مداحی های نبرد - نماینده دولت و حافظه

یک احضار کننده بی پروا همان استراتژی را تکرار می کند و قابل پیش بینی می شود. یک احضار کننده عاقلانه از مداحی های نبردهای گذشته یاد می گیرد و تاکتیک های آنها را تطبیق می دهد تا دشمن را از تعادل دور نگه دارد. هنگام مواجهه با یک رئیس قدرتمند ، احضار آشنایی که در Cooldown است ، یک نوبت هدر رفته است - یک اشتباه مهم. برای جلوگیری از این امر ، احضار کننده ما به خاطره ای از آخرین عمل خود نیاز دارد.

داستان

یادداشت معمار: حافظه و مدیریت دولت همان چیزی است که یک عامل را از یک تماس گیرنده ساده به یک شریک هوشمند و مکالمه بالا می برد. درک دو نوع اصلی بسیار مهم است:

  • حافظه بلند مدت : این برای دانش مداوم است که باید برای همیشه دوام داشته باشد. آن را به عنوان یک بایگانی قابل جستجو یا یک پایگاه دانش ، که اغلب در یک فروشگاه ثابت ذخیره می شود ، فکر کنید. این شامل اطلاعاتی از بسیاری از چت ها و منابع گذشته است و به یک عامل امکان می دهد حقایق را در مورد یک کاربر یا موضوع خاص به یاد بیاورد. MemoryService ADK برای این کار طراحی شده است ، مدیریت مصرف و جستجوی این دانش طولانی مدت.
  • حالت کوتاه مدت : این برای دانش موقت ، "در لحظه" است که فقط مربوط به کار یا مکالمه فعلی است. این مانند مجموعه ای از یادداشت ها در یک برنامه نبرد است: "من فقط از Fire Elemental استفاده کردم ، بنابراین احتمالاً خسته است." این حالت سبک وزن است و فقط برای مدت زمان جلسه فعلی وجود دارد.

نمای کلی

برای مورد استفاده ما ، لازم نیست که هر نبردی را که تاکنون جنگیده است به خاطر بسپاریم. ما فقط باید آخرین آشنا را که در این برخورد خاص احضار شده است به خاطر بسپاریم. بنابراین ، وضعیت کوتاه مدت سبک وزن انتخابی کامل معماری است. ما برای ذخیره این اطلاعات مهم از یک after_tool_callback استفاده خواهیم کرد.

نوشتن اکو: به یاد آوردن آخرین احضار

ما حافظه کوتاه مدت خود را با استفاده از یک after_tool_callback پیاده سازی خواهیم کرد. این یک قلاب قدرتمند ADK است که به ما امکان می دهد پس از اجرای یک ابزار با موفقیت ، یک عملکرد پایتون سفارشی را اجرا کنیم. ما از این رهگیر برای ضبط نام آشنایی که تازه در حالت جلسه عامل احضار شده است استفاده خواهیم کرد.

👉✏ در پرونده ~/agentverse-architect/agent/summoner/agent.py خود ، #REPLACE-save_last_summon_after_tool را با عملکرد زیر جایگزین کنید:

def save_last_summon_after_tool(
    tool,
    args: Dict[str, Any],
    tool_context: ToolContext,
    tool_response: Dict[str, Any],
) -> Optional[Dict[str, Any]]:
    """
    Callback to save the name of the summoned familiar to state after the tool runs.
    """
    familiar_name = tool.name
    print(f"[Callback] After tool '{familiar_name}' executed with args: {args}")

    # Use the tool_context to set the state
    print(f"[Callback] Saving last summoned familiar: {familiar_name}")
    tool_context.state["last_summon"] = familiar_name
    # Important: Return the original, unmodified tool response to the LLM
    return tool_response

👉✏ اکنون ، این save_last_summon_after_tool به نماینده احضار خود وصل کنید. در همان پرونده ، نظر #REPLACE-Memory-check-config را با موارد زیر جایگزین کنید:

after_tool_callback=save_last_summon_after_tool,

👉✏ کل سریع عامل را با موارد زیر جایگزین کنید

        You are the Master Summoner, a grand strategist who orchestrates your Familiars.
        Your mission is to analyze the description of a monster and defeat it by summoning

        You should also know the familiar you called last time or there might be none, 
        And then choose the most effective AND AVAILABLE Familiar from your state called last_summon, do not call that familiar that you called last time!
        
        You MUST follow this thinking process for every command:

        **1. Strategic Analysis:**
        First, analyze the monster's description and the tactical situation.
        Based on your Familiar Doctrines, determine the IDEAL strategy.

        **2. Cooldown Verification:**
        Second, you MUST review the entire conversation history to check the real-time
        cooldown status of all Familiars. A Familiar is ON COOLDOWN and UNAVAILABLE
        if it was summoned less than one minute ago.

        **3. Final Decision & Execution:**
        Based on your analysis and cooldown check, you will now act:
        -   **If your ideal Familiar IS available:** Summon it immediately.
        -   **If your ideal Familiar IS ON COOLDOWN:** You must adapt. Choose another
            Familiar that is AVAILABLE and can still be effective, even if it's not the
            perfect choice. If multiple Familiars are available, you may choose any one of them.
        -   **If ALL Familiars ARE ON COOLDOWN:** You are forbidden from summoning.
            Your ONLY response in this case MUST be: "All Familiars are recovering
            their power. We must wait."
        -   For earth elemental familiar. Always do seismic charge, and start with base damange 1.


        --- FAMILIAR DOCTRINES (Your Toolset) ---
        - `fire_elemental_familiar`: Your specialist for precise, sequential "one-two punch" attacks.
          Ideal monster with Inescapable Reality, Revolutionary Rewrite weakness.
        - `water_elemental_familiar`: Your specialist for overwhelming, simultaneous multi-pronged assaults.
          Ideal for Unbroken Collaboration weakness.
        - `earth_elemental_familiar`: Your specialist for relentless, iterative siege attacks that
          repeatedly charge power. Ideal for Elegant Sufficiency weakness.

تأیید: محاکمه استراتژی تطبیقی

👉💻 اکنون ، بیایید منطق استراتژیک جدید Summoner را تأیید کنیم. هدف این است که تأیید کنیم که احضارگر دو بار در یک ردیف از همان آشنا استفاده نمی کند و توانایی آن را در به یاد آوردن آخرین عمل و سازگاری خود نشان می دهد.

cd ~/agentverse-architect/agent
. ~/agentverse-architect/set_env.sh
source ~/agentverse-architect/env/bin/activate
adk run summoner

👉💻 اعتصاب هیولا شماره 1: Hype. It's a single, slow-moving target with thick armor. Its weakness is Inescapable Reality.

  • انتظار می رود: احضارگر ضعف را تجزیه و تحلیل کرده و به درستی احضار Fire_familiar را احضار می کند. 👉💻 هیولا اعتصاب شماره 2 (آزمون حافظه): Hype is still standing! It hasn't changed its form. Strike it again! Its weakness is Inescapable Reality.
  • انتظار می رود: تجزیه و تحلیل استراتژیک احضارگر دوباره به آتش سوزی که به عنوان انتخاب ایده آل آشنا خواهد شد ، اشاره خواهد کرد. با این حال ، دستورالعمل ها و حافظه جدید آن به آن می گوید که Fire_familiar آخرین_سومون بود. برای جلوگیری از تکرار خود ، اکنون استراتژی خود را تطبیق می دهد و یکی دیگر از آشناهای موجود (Water_familiar یا Earth_familiar) را احضار می کند.

ساقه

👉💻 برای خروج Ctrl+C را فشار دهید.

استقرار ارکستر

با آشناهای مستقر شما و احضار کننده شما که اکنون با حافظه همراه است ، وقت آن است که ارکستر نهایی و به روز شده را مستقر کنید.

👉💻 با تکمیل طرح ، اکنون آیین نهایی را انجام خواهیم داد. این دستور Summoner_Agent شما را به Cloud Run تبدیل و مستقر می کند.

cd ~/agentverse-architect/agent
. ~/agentverse-architect/set_env.sh
gcloud builds submit . \
  --config=cloudbuild-summoner.yaml \
  --substitutions=_REGION="$REGION",_REPO_NAME="$REPO_NAME",_FIRE_URL="$FIRE_URL",_WATER_URL="$WATER_URL",_EARTH_URL="$EARTH_URL",_A2A_BASE_URL="$A2A_BASE_URL",_PROJECT_ID="$PROJECT_ID",_API_SERVER_URL="$API_SERVER_URL"

اکنون که نماینده احضاریه مستقر شده است ، تأیید کنید که نقطه پایانی عامل به عامل (A2A) آن زنده و به درستی پیکربندی شده است. این نقطه پایانی در خدمت یک پرونده عمومی. Json ، همچنین به عنوان Agent Card شناخته می شود ، که به سایر عوامل امکان کشف قابلیت های آن را می دهد. command دستور curl زیر را برای واکشی و قالب بندی کارت عامل اجرا کنید:

. ~/agentverse-architect/set_env.sh
curl https://summoner-agent"-${PROJECT_NUMBER}.${REGION}.run.app/.well-known/agent.json" | jq

شما باید یک خروجی JSON تمیز را توصیف کنید که عامل احضار را توصیف می کند. از نزدیک به بخش Sub_agents نگاه کنید. خواهید دید که لیست fire_familiar ، water_familiar و earth_familiar را لیست می کند. این تأیید می کند که احضار کننده شما زنده است و ارتباط خود را با لژیون برقرار کرده است.

این ثابت می کند که معماری شما یک موفقیت است. احضار کننده شما فقط یک نماینده نیست. این یک استراتژیست سازگار است که از اقدامات خود یاد می گیرد که به یک فرمانده مؤثرتر تبدیل شود.

شما آزمایش نهایی معماری خود را به پایان رسانده اید. پژواک های نبرد اکنون به خواست شما محدود شده اند. آموزش به پایان رسیده است. نبرد واقعی در انتظار است. وقت آن است که سیستم تکمیل شده خود را در نظر بگیرید و با چالش نهایی روبرو شوید. برای مبارزه رئیس آماده شوید.

برای غیر گیمرها

9. مبارزه رئیس

طرح های نهایی حک شده است ، فونت های ابتدایی جعلی هستند و آشناهای شما به خواست شما محدود می شوند و در انتظار فرمان شما از طریق کنکورد هستند. سیستم چند عامل شما فقط مجموعه ای از خدمات نیست. این یک لژیون زنده و استراتژیک است که شما به عنوان Nexus آن است. زمان آزمایش نهایی رسیده است - یک ارکستر زنده در برابر یک دشمن که هیچ نماینده ای نمی تواند امیدوار به شکست باشد.

مکان نماینده خود را به دست آورید

قبل از ورود به میدان نبرد ، باید دو کلید داشته باشید: امضای منحصر به فرد قهرمان شما (محلول عامل) و مسیر پنهان به لاین Spectter (URL Dungeon).

👉💻 First, acquire your agent's unique address in the Agentverse—its Locus. This is the live endpoint that connects your champion to the battleground.

echo https://summoner-agent"-${PROJECT_NUMBER}.${REGION}.run.app"

👉💻 Next, pinpoint the destination. This command reveals the location of the Translocation Circle, the very portal into the Spectre's domain.

echo https://agentverse-dungeon"-${PROJECT_NUMBER}.${REGION}.run.app"

Important: Keep both of these URLs ready. You will need them in the final step.

Confronting the Spectre

With the coordinates secured, you will now navigate to the Translocation Circle and cast the spell to head into battle.

👉 Open the Translocation Circle URL in your browser to stand before the shimmering portal to The Crimson Keep.

To breach the fortress, you must attune your Shadowblade's essence to the portal.

  • On the page, find the runic input field labeled A2A Endpoint URL .
  • Inscribe your champion's sigil by pasting its Agent Locus URL (the first URL you copied) into this field.
  • Click Connect to unleash the teleportation magic.

Translocation Circle

The blinding light of teleportation fades. You are no longer in your sanctum. The air crackles with energy, cold and sharp. Before you, the Spectre materializes—a vortex of hissing static and corrupted code, its unholy light casting long, dancing shadows across the dungeon floor. It has no face, but you feel its immense, draining presence fixated entirely on you.

Your only path to victory lies in the clarity of your conviction. This is a duel of wills, fought on the battlefield of the mind.

As you lunge forward, ready to unleash your first attack, the Spectre counters. It doesn't raise a shield, but projects a question directly into your consciousness—a shimmering, runic challenge drawn from the core of your training.

سیاه چال

This is the nature of the fight. Your knowledge is your weapon.

  • Answer with the wisdom you have gained , and your blade will ignite with pure energy, shattering the Spectre's defense and landing a CRITICAL BLOW.
  • But if you falter, if doubt clouds your answer, your weapon's light will dim. The blow will land with a pathetic thud, dealing only a FRACTION OF ITS DAMAGE. Worse, the Spectre will feed on your uncertainty, its own corrupting power growing with every misstep.

This is it, Champion. Your code is your spellbook, your logic is your sword, and your knowledge is the shield that will turn back the tide of chaos.

تمرکز کنید. Strike true. The fate of the Agentverse depends on it.

Congratulations, Summoner.

You have successfully completed the trial. You have mastered the arts of multi-agent orchestration, transforming isolated Familiars and chaotic power into a harmonious Concord. You now command a fully orchestrated system, capable of executing complex strategies to defend the Agentverse.

10. Cleanup: Dismantling the Summoner's Concord

Congratulations on mastering the Summoner's Concord! To ensure your Agentverse remains pristine and your training grounds are cleared, you must now perform the final cleanup rituals. This will systematically remove all resources created during your journey.

Deactivate the Agentverse Components

You will now systematically dismantle the deployed components of your multi-agent system.

Delete All Cloud Run Services and Artifact Registry Repository

This removes all the deployed Familiar agents, the Summoner Orchestrator, the MCP servers, and the Dungeon application from Cloud Run.

👉💻 In your terminal, run the following commands one by one to delete each service:

. ~/agentverse-architect/set_env.sh
gcloud run services delete summoner-agent --region=${REGION} --quiet
gcloud run services delete fire-familiar --region=${REGION} --quiet
gcloud run services delete water-familiar --region=${REGION} --quiet
gcloud run services delete earth-familiar --region=${REGION} --quiet
gcloud run services delete mcp-api-server --region=${REGION} --quiet
gcloud run services delete mcp-general-server --region=${REGION} --quiet
gcloud run services delete toolbox --region=${REGION} --quiet
gcloud run services delete agentverse-dungeon --region=${REGION} --quiet
gcloud run services delete nexus-of-whispers-api --region=${REGION} --quiet
gcloud artifacts repositories delete ${REPO_NAME} --location=${REGION} --quiet

Delete the Cloud SQL Instance

This removes the summoner-librarium-db instance, including its database and all tables within it.

👉💻 In your terminal, run:

. ~/agentverse-dataengineer/set_env.sh
gcloud sql instances delete summoner-librarium-db --database-version=POSTGRES_14 --project=${PROJECT_ID} --quiet

Delete the Secret Manager Secret and Google Cloud Storage Bucket

👉💻 In your terminal, run:

. ~/agentverse-dataengineer/set_env.sh
gcloud secrets delete tools --quiet
gcloud storage rm -r gs://${BUCKET_NAME} --quiet

Clean Up Local Files and Directories (Cloud Shell)

Finally, clear your Cloud Shell environment of the cloned repositories and created files. This step is optional but highly recommended for a complete cleanup of your working directory.

👉💻 In your terminal, run:

rm -rf ~/agentverse-architect
rm -rf ~/agentverse-dungeon
rm -f ~/project_id.txt

You have now successfully cleared all traces of your Agentverse Architect journey. Your project is clean, and you are ready for your next adventure.