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

1. Overture

Yalıtılmış geliştirme dönemi sona eriyor. Teknolojik evrimin bir sonraki aşaması, yalnız bir dahinin değil, ortak bir ustalığın ürünü olacak. Tek ve akıllı bir aracı oluşturmak ilgi çekici bir denemedir. Güçlü, güvenli ve akıllı bir müşteri temsilcisi ekosistemi (gerçek bir Agentverse) oluşturmak, modern işletmelerin karşılaştığı en büyük zorluktur.

Bu yeni çağda başarıya ulaşmak için dört kritik rolün bir araya gelmesi gerekir. Bu roller, gelişen tüm yapay sistemleri destekleyen temel unsurlardır. Herhangi bir alandaki eksiklik, yapının tamamını tehlikeye atabilecek bir zayıflık oluşturur.

Bu atölye çalışması, Google Cloud'da yapay zeka destekli geleceğe hakim olmak için kesin bir kurumsal yol haritası sunar. Bir fikrin ilk heyecanından tam ölçekli, operasyonel bir gerçekliğe kadar size yol gösteren uçtan uca bir yol haritası sunuyoruz. Birbirine bağlı bu dört laboratuvarda, güçlü bir Agentverse oluşturmak, yönetmek ve ölçeklendirmek için geliştirici, mimar, veri mühendisi ve SRE'nin uzmanlık becerilerinin nasıl bir araya gelmesi gerektiğini öğreneceksiniz.

Hiçbir sütun, Agentverse'ü tek başına destekleyemez. Mimarın büyük tasarımı, geliştiricinin hassas uygulaması olmadan işe yaramaz. Geliştiricinin temsilcisi, Veri Mühendisi'nin bilgeliği olmadan kördür ve tüm sistem, SRE'nin koruması olmadan kırılgandır. Ekibiniz ancak sinerji ve birbirlerinin rollerini ortak bir şekilde anlayarak yenilikçi bir konsepti görev açısından kritik bir operasyonel gerçeğe dönüştürebilir. Yolculuğunuz burada başlıyor. Rolünüzde uzmanlaşmaya ve büyük resmin neresinde olduğunuzu öğrenmeye hazır olun.

Welcome to The Agentverse: A Call to Champions

Kurumsal alanın geniş dijital dünyasında yeni bir dönem başladı. Bu, yapay zeka destekli temsilcilerin çağıdır. Bu dönemde, akıllı ve bağımsız temsilciler, inovasyonu hızlandırmak ve sıradan işleri ortadan kaldırmak için mükemmel bir uyum içinde çalışır.

agentverse.png

Güç ve potansiyel içeren bu bağlı ekosisteme Agentverse adı verilir.

Ancak The Static olarak bilinen sessiz bir yozlaşma, bu yeni dünyanın sınırlarını yıpratmaya başladı. Statik, virüs veya hata değildir. Yaratma eylemiyle beslenen kaosun vücut bulmuş halidir.

Eski hayal kırıklıklarını canavarca şekillere dönüştürerek Gelişimin Yedi Hayaleti'ni doğurur. Bu kutu işaretlenmezse The Static and its Spectres ilerlemeyi durdurur ve Agentverse'ün vaadini teknik borç ve terk edilmiş projelerden oluşan bir çorak araziye dönüştürür.

Bugün, kaosun önüne geçmek için şampiyonlara sesleniyoruz. Agentverse'ü korumak için ustalıklarını geliştirmeye ve birlikte çalışmaya istekli kahramanlara ihtiyacımız var. Yolunuzu seçme zamanı geldi.

Sınıfınızı Seçin

Önünüzde dört farklı yol var. Bunların her biri, The Static ile mücadelede önemli birer dayanak noktası. Eğitiminiz tek başınıza yapacağınız bir görev olsa da nihai başarınız, becerilerinizin diğer becerilerle nasıl birleştiğini anlamanıza bağlıdır.

  • The Shadowblade (Geliştirici): Demirci ve ön cephe ustası. Bıçakları yapan, araçları inşa eden ve kodun karmaşık ayrıntılarında düşmanla yüzleşen zanaatkar sizsiniz. Yolunuz hassasiyet, beceri ve pratik yaratıcılık üzerine kurulu.
  • Çağırıcı (Mimar): Büyük bir stratejist ve düzenleyici. Tek bir ajanı değil, tüm savaş alanını görürsünüz. Tüm aracı sistemlerinin iletişim kurmasına, işbirliği yapmasına ve tek bir bileşenin ulaşabileceğinden çok daha büyük bir hedefe ulaşmasına olanak tanıyan ana planları tasarlarsınız.
  • Bilgin (Veri Mühendisi): Gizli gerçekleri arayan ve bilgeliğin koruyucusu. Temsilcilerinize amaç ve vizyon kazandıran bilgileri ortaya çıkarmak için verilerin geniş ve vahşi doğasına girersiniz. Bilginiz, düşmanın zayıflığını ortaya çıkarabilir veya bir müttefiki güçlendirebilir.
  • The Guardian (Veli) (DevOps / SRE): Krallığın yılmaz koruyucusu ve kalkanı. Kaleler inşa eder, güç kaynaklarının tedarik hatlarını yönetir ve tüm sistemin Static'in kaçınılmaz saldırılarına dayanabilmesini sağlarsınız. Gücünüz, takımınızın zaferinin temelidir.

Misyonunuz

Eğitiminiz bağımsız bir egzersiz olarak başlar. Seçtiğiniz rotada ilerleyerek rolünüzde uzmanlaşmak için gereken benzersiz becerileri öğreneceksiniz. Deneme sürenizin sonunda, The Static'ten doğan bir Spectre ile karşılaşırsınız. Bu mini boss, zanaatınızın özel zorluklarından beslenir.

Son denemeye ancak kendi rolünüzde ustalaşarak hazırlanabilirsiniz. Ardından, diğer sınıflardaki şampiyonlarla bir parti oluşturmanız gerekir. Birlikte, nihai bir patronla yüzleşmek için yozlaşmanın kalbine doğru ilerleyeceksiniz.

Gücünüzü test edecek ve Agentverse'ün kaderini belirleyecek son bir ortak mücadele.

Agentverse, kahramanlarını bekliyor. Aramayı yanıtlayacak mısın?

2. The Summoner's Concord

Hoş geldiniz, Sihirdar. Sizin yolunuz vizyon ve büyük strateji yoludur. Diğerleri tek bir kılıca veya tek bir büyüye odaklanırken siz tüm savaş alanını görürsünüz. Tek bir aracıya komuta etmezsiniz, tüm orkestrayı yönetirsiniz. Gücünüz doğrudan çatışmada değil, kusursuz ve kapsamlı bir plan tasarlamada yatar. Bu plan, bir uzman ordusunun (yani yardımcılarınızın) mükemmel uyum içinde çalışmasını sağlar. Bu görevde, güçlü bir çoklu aracı sistemi tasarlama, bağlama ve yönetme beceriniz test edilecek.

genel bakış

Neler öğreneceksiniz?

  • Ayrılmış bir araç ekosistemi tasarlama: Bir dizi bağımsız, mikro hizmet tabanlı MCP araç sunucusu tasarlayın ve dağıtın. Bu temel katmanın neden ölçeklenebilir, sürdürülebilir ve güvenli yapay ajan sistemleri oluşturmak için kritik öneme sahip olduğunu öğreneceksiniz.
  • Gelişmiş Aracı İş Akışlarında Uzmanlaşın: Tek bir aracıyla yetinmeyin ve uzman "Yardımcılar" ordusu oluşturun. Temel ADK iş akışı kalıpları (Sıralı, Paralel ve Döngü) konusunda uzmanlaşacak ve doğru görev için doğru kalıbı seçmeyle ilgili mimari ilkeleri öğreneceksiniz.
  • Akıllı bir düzenleyici uygulayın: Basit bir aracı oluşturucudan gerçek bir sistem mimarına geçiş yapın. Uzman tanıdıklarınıza karmaşık görevler atamak ve bu görevleri keşfetmek için Agent-to-Agent (A2A) protokolünü kullanan bir ana Orchestration Agent oluşturacak ve gerçek bir çoklu aracı sistemi yaratacaksınız.
  • Kuralları İstemlerle Değil Kodla Uygulama: Etkileşim kurallarını durum bilgisiyle uygulayarak daha güvenilir ve öngörülebilir aracıları nasıl oluşturacağınızı öğrenin. ADK'nın güçlü eklenti ve geri çağırma sistemini kullanarak özel mantık uygulayacak ve bekleme süreleri gibi gerçek dünya kısıtlamalarını yöneteceksiniz.
  • Aracı durumunu ve belleğini yönetme: Aracılarınıza öğrenme ve hatırlama özelliği kazandırın. Daha akıllı ve bağlama duyarlı etkileşimler oluşturmak için hem kısa süreli, sohbet odaklı durumu hem de uzun süreli, kalıcı belleği yönetme tekniklerini keşfedeceksiniz.
  • Uçtan Uca Bir Bulut Dağıtımı Gerçekleştirin: Çoklu aracı sisteminizin tamamını yerel bir prototipten üretime hazır bir gerçekliğe taşıyın. Aracılarınızı ve düzenleyicinizi nasıl kapsayacağınızı ve bunları Google Cloud Run'da ölçeklenebilir, bağımsız mikro hizmetler koleksiyonu olarak nasıl dağıtacağınızı öğreneceksiniz.

3. Çağırma Çemberini Çizme

Hoş geldiniz, Sihirdar. Tek bir Yoldaş çağrılmadan, herhangi bir anlaşma yapılmadan önce üzerinde durduğunuz zemin hazırlanmalıdır. Kontrolsüz bir ortam kaosa davetiye çıkarır. Gerçek bir Sihirdar yalnızca kutsal ve güçlü bir alanda çalışır. İlk görevimiz çağırma çemberini çizmek: gerekli bulut hizmetlerini uyandıran güç runelerini yazmak ve çalışmamıza rehberlik edecek eski planları edinmek. Bir Sihirdar'ın gücü, titiz bir hazırlıktan doğar.

👉 Google Cloud Console'un üst kısmında Cloud Shell'i Etkinleştir'i tıklayın (Cloud Shell bölmesinin üst kısmındaki terminal şeklindeki simge).

alt text

👉 "Open Editor" (Düzenleyiciyi aç) düğmesini tıklayın (kalemli açık bir klasöre benzer). Bu işlem, pencerede Cloud Shell kod düzenleyiciyi açar. Sol tarafta bir dosya gezgini görürsünüz. alt text

👉Google Cloud proje kimliğinizi bulma:

  • Google Cloud Console'u açın: https://console.cloud.google.com
  • Sayfanın üst kısmındaki proje açılır listesinden bu atölye çalışması için kullanmak istediğiniz projeyi seçin.
  • Proje kimliğiniz, kontrol panelindeki Proje bilgileri kartında gösterilir. alt text

👉Bulut IDE'sinde terminali açın. alt text

👉💻 Terminalde, aşağıdaki komutu kullanarak kimliğinizin doğrulandığını ve projenin proje kimliğinize ayarlandığını doğrulayın:

gcloud auth list

👉💻 Bootstrap projesini GitHub'dan kopyalayın:

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

👉💻 Başlatma komut dosyasını çalıştırın. Bu komut dosyası, Google Cloud proje kimliğinizi girmenizi ister. Ayrıca, init.sh komut dosyası tarafından istendiğinde son adımda bulduğunuz Google Cloud proje kimliğini girin.

cd ~/agentverse-architect
./init.sh

👉💻 Gerekli proje kimliğini ayarlayın:

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

👉💻 Gerekli Google Cloud API'lerini etkinleştirmek için aşağıdaki komutu çalıştırın:

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

👉💻 Henüz agentverse-repo adlı bir Artifact Registry deposu oluşturmadıysanız oluşturmak için aşağıdaki komutu çalıştırın: (Aynı projede başka sınıflar dağıttıysanız bu adımı atlayın)

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

İzinleri ayarlama

👉💻 Terminalde aşağıdaki komutları çalıştırarak gerekli izinleri verin:

. ~/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"

👉💻 Eğitime başladığınızda son mücadeleyi hazırlayacağız. Aşağıdaki komutlar, kaotik statiklerden hayaletleri çağırarak son testiniz için patronları oluşturur.

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

👉💻 Son olarak, ilk kurulum görevlerini gerçekleştirmek için prepare.sh komut dosyasını çalıştırın.

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

Mükemmel bir iş çıkardınız, Sihirdar. Daire tamamlandı ve anlaşmalar imzalandı. Zemin artık kutsal ve muazzam gücü yönlendirmeye hazır. Bir sonraki denememizde, Familiarlarımızın gücünü alacağı Elemental Font'ları oluşturacağız.

4. Temel Yazı Tiplerini Oluşturma: Ayrılmış Araç Ekosistemi

Savaş alanı hazır, çağırma çemberi çizildi ve ortamdaki mana çıtırdıyor. Artık bir Çağırıcı olarak ilk gerçek eyleminizi gerçekleştirme zamanı geldi: Tanıdıklarınızın güçlerini alacağı güç kaynaklarını oluşturma. Bu ritüel üç bölüme ayrılır. Her bölüm, belirli bir güç türünün kararlı ve bağımsız kaynağı olan bir Element Yazı Tipi'ni uyandırır. Çağırma işleminin daha karmaşık kısmı için üç yazı tipinin de etkin olması gerekir.

Hikaye

Mimara Not: Model Context Protocol (MCP) sunucusu, modern bir asistan sisteminin temel bileşenidir. Bir asistanın uzak araçları keşfetmesine ve kullanmasına olanak tanıyan standartlaştırılmış bir iletişim köprüsü görevi görür. Araç ekosistemimizde, her biri kritik bir mimari modeli temsil eden iki farklı MCP sunucusu türü oluşturacağız. Veritabanımıza bağlanmak için Database Toolbox ile bildirimsel bir yaklaşım kullanacağız ve araçlarımızı basit bir yapılandırma dosyasında tanımlayacağız. Bu kalıp, yapılandırılmış veri erişimini kullanıma sunmak için son derece verimli ve güvenlidir. Ancak özel iş mantığı uygulamamız veya harici üçüncü taraf API'lerini çağırmamız gerektiğinde, sunucunun mantığını adım adım kodda yazarak zorunlu bir yaklaşım kullanırız. Bu sayede, karmaşık işlemleri basit ve yeniden kullanılabilir bir araçla kapsayarak üst düzey kontrol ve esneklik elde edebiliriz. Bir baş mimar, her bileşen için doğru yaklaşımı seçmek üzere her iki kalıbı da anlamalı ve sağlam, güvenli ve ölçeklenebilir bir araç temeli oluşturmalıdır.

genel bakış

Fısıltıların Nexus'unu Uyandırma (Harici API MCP Sunucusu)

Bilge bir Sihirdar, gücün tamamının kendi alanından gelmediğini bilir. Bazen kaotik olan ve büyük bir etkiyle yönlendirilebilen harici enerji kaynakları vardır. Fısıltıların Bağlantı Noktası, bu güçlere açılan kapımızdır.

Hikaye

Harici güç kaynağımız olarak çalışan ve iki ham yazım denetimi uç noktası (/cryosea_shatter ve /moonlit_cascade) sunan, halihazırda yayında olan bir hizmet var.

Mimarın Notu: Sunucunun mantığını adım adım açıkça tanımlayan bir zorunlu yaklaşım kullanacaksınız. Bu, araçlarınızın diğer API'leri çağırmak gibi basit bir SQL sorgusu çalıştırmanın ötesine geçmesi gerektiğinde çok önemli olan daha fazla kontrol ve esneklik sağlar. Her iki kalıbı da anlamak, temsilci mimarı için kritik bir beceridir.

👉✏️ ~/agentverse-architect/mcp-servers/api/main.py dizinine gidin ve REPLACE #REPLACE-MAGIC-CORE kısmını aşağıdaki kodla DEĞİŞTİRİN :

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}"

Komut dosyasının temelinde düz Python işlevleri yer alır. Asıl çalışma burada gerçekleşir.

👉✏️ Aynı dosyada ~/agentverse-architect/mcp-servers/api/main.py REPLACE #REPLACE-Runes of Communication ifadesini aşağıdaki kodla değiştirin:

@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() (El Sıkışma): Bu işlev, sunucunun selamıdır. Yeni bir aracı bağlandığında ilk olarak bu uç noktayı arayarak "Ne yapabilirsin?" diye sorar. Kodumuz, adk_to_mcp_tool_type kullanılarak evrensel MCP biçimine dönüştürülmüş, kullanılabilir tüm araçların listesini içeren bir yanıt veriyor. - @app.call_tool() (Komut): Bu işlev, temel işlevdir. Aracı bir araç kullanmaya karar verdiğinde, aracın adını ve bağımsız değişkenlerini içeren bir isteği bu uç noktaya gönderir. Kodumuz, mevcut araçlar "büyü kitabımızda" aracı arar, run_async ile çalıştırır ve sonucu standart MCP biçiminde döndürür.

Bu özelliği daha sonra kullanıma sunacağız.

Arcane Forge'u ateşleme (Genel İşlevler MCP Sunucusu)

Gücün kaynağı yalnızca eski kitaplar veya uzak fısıltılar değildir. Bazen bir Sihirdar, kendi sihrini ham irade ve saf mantıkla yaratmalıdır. Arcane Forge, bu güç kaynağıdır. Durum bilgisi içermeyen, genel amaçlı yardımcı işlevler sağlayan bir sunucudur.

Hikaye

Mimarın Notu: Bu, başka bir mimari kalıptır. Mevcut sistemlere bağlanmak yaygın bir durum olsa da genellikle kendi benzersiz iş kurallarınızı ve mantığınızı uygulamanız gerekir. Bunun gibi özel bir "işlevler" veya "yardımcı programlar" aracı oluşturmak en iyi uygulamadır. Özel mantığınızı kapsar, ekosisteminizdeki herhangi bir aracı için yeniden kullanılabilir hale getirir ve veri kaynaklarınızdan ve harici entegrasyonlarınızdan bağımsız tutar.

👀 Google Cloud IDE'nizdeki ~/agentverse-architect/mcp-servers/general/main.py dosyasına göz atın. Bu özel Güç Yazı Tipi'ni oluşturmak için Nexus'ta olduğu gibi aynı emir kipi, mcp.server yaklaşımının kullanıldığını göreceksiniz.

Ana Cloud Build ardışık düzenini oluşturma

Şimdi mcp-servers dizininde cloudbuild.yaml dosyasını oluşturacağız. Bu dosya, her iki hizmetin derlenmesini ve dağıtılmasını düzenler.

👉💻 ~/agentverse-architect/mcp-servers dizininden aşağıdaki komutları çalıştırın:

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"

Tüm dağıtımlar tamamlanana kadar bekleyin.

👉 Cloud Run Console'a giderek dağıtımı doğrulayabilirsiniz. Aşağıda gösterildiği gibi, iki yeni MCP sunucu örneğinizin çalıştığını görmeniz gerekir: alt text

Bilgi Kitaplığı'nı Uyandırma (Database ToolBox MCP Sunucusu)

Bir sonraki Font'umuz, Cloud SQL veritabanımıza doğrudan bağlantı sağlayan Librarium of Knowledge olacak.

Hikaye

Mimarın Notu: Bu işlem için modern ve bildirimsel Database Toolbox'ı kullanacağız. Bu, veri kaynağımızı ve araçlarımızı bir YAML yapılandırma dosyasında tanımladığımız güçlü bir yaklaşımdır. Araç kutusu, sunucuyu oluşturma ve çalıştırma gibi karmaşık işlemleri yöneterek yazmamız ve bakımını yapmamız gereken özel kod miktarını azaltır.

Tüm kritik bilgilerimizi barındıracak Cloud SQL veritabanı olan "Summoner's Librarium"u oluşturma zamanı geldi. Bunu otomatik olarak yapmak için bir kurulum komut dosyası kullanacağız.

👉💻 Öncelikle veritabanını ayarlayacağız. Terminalinizde aşağıdaki komutları çalıştırın:

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

Komut dosyası tamamlandıktan sonra veritabanınız doldurulur ve temel hasar verileri kullanıma hazır olur. Artık Grimoire'inizin içeriğini doğrudan doğrulayabilirsiniz.

👉 Öncelikle, bu doğrudan bağlantıyı yeni bir tarayıcı sekmesinde açarak veritabanınız için Cloud SQL Studio'ya gidin:

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

Cloud SQL

👉 Soldaki giriş bölmesinde, açılır listeden familiar_grimoire veritabanını seçin.

👉 Kullanıcı olarak summoner, şifre olarak 1234qwer girip Authenticate'i (Kimlik doğrulama) tıklayın.

👉📜 Bağlantı kurulduktan sonra, açık değilse yeni bir sorgu düzenleyici sekmesi açın. Kazınmış temel hasar verilerini görüntülemek için aşağıdaki SQL sorgusunu yapıştırıp çalıştırın:

SELECT * FROM
  "public"."abilities"

Artık abilities tablosunu sütunları ve satırları doldurulmuş şekilde görmelisiniz. Bu, Grimoire'ınızın hazır olduğunu onaylar. Veriler

ToolBox MCP sunucusunu yapılandırma

tools.yaml yapılandırma dosyası, sunucumuzun planı olarak işlev görür. Veritabanı Araç Kutusu'na veritabanımıza tam olarak nasıl bağlanacağını ve hangi SQL sorgularının araç olarak sunulacağını söyler.

kaynaklar: Bu bölümde, verilerinize yapılan bağlantılar tanımlanır.

  • summoner-librarium:: Bu, bağlantımıza verdiğimiz mantıksal addır.
  • kind: cloud-sql-postgres: Toolbox'a, özellikle PostgreSQL İçin Cloud SQL için tasarlanmış yerleşik ve güvenli bağlayıcısını kullanmasını söyler.
  • proje, bölge, örnek vb.: Bunlar, prepare.sh komut dosyası sırasında oluşturduğunuz Cloud SQL örneğinin tam koordinatlarıdır ve araç kutusuna Librarium'u nerede bulacağını söyler.

👉✏️ tools.yaml bölümündeki ~/agentverse-architect/mcp-servers/db-toolbox sayfasına gidin, #REPLACE-Source yerine aşağıdakileri girin:

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"

👉✏️ 🚨🚨DEĞİŞTİR

YOUR_PROJECT_ID

yerine proje kimliğinizi yazın.

araçlar: Bu bölümde, sunucumuzun sunacağı gerçek yetenekler veya işlevler tanımlanır.

  • lookup-available-ability:: Bu, ilk aracımızın adıdır.
  • kind: postgres-sql: Bu, araç kutusuna bu aracın eyleminin bir SQL ifadesi yürütmek olduğunu söyler.
  • source: summoner-librarium: Bu, aracı kaynaklar bloğunda tanımladığımız bağlantıya bağlar. Araç, sorgusunu hangi veritabanında çalıştıracağını bu şekilde anlar.
  • açıklama ve parametreler: Bu bilgiler, Dil Modeli'ne sunulur. Açıklama, temsilciye aracı ne zaman kullanacağını söyler. Parametreler ise aracın ihtiyaç duyduğu girişleri tanımlar. Bu, temsilcinin işlev çağrısı özelliğini etkinleştirmek için kritik öneme sahiptir.
  • statement: Bu, yürütülecek ham SQL sorgusudur. 1 ABD doları, aracı tarafından sağlanan familiar_name parametresinin güvenli bir şekilde ekleneceği güvenli bir yer tutucudur.

👉✏️ tools.yaml dosyasındaki aynı ~/agentverse-architect/mcp-servers/db-toolbox içinde #REPLACE-tools yerine aşağıdakileri girin:

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;

Araç setleri: Bu bölümde, ayrı ayrı araçlarımız gruplandırılmıştır.

  • summoner-librarium:: Kaynağımızla aynı ada sahip bir araç seti oluşturuyoruz. Teşhis aracımız daha sonra bağlandığında, sihirdar-kütüphane araç setindeki tüm araçların tek bir verimli komutla yüklenmesini isteyebilir.

👉✏️ tools.yaml dosyasındaki aynı ~/agentverse-architect/mcp-servers/db-toolbox içinde #REPLACE-toolsets yerine aşağıdakileri girin:

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

Librarium'u dağıtma

Şimdi Librarium'u dağıtacağız. Kendi kapsayıcımızı oluşturmak yerine Google'ın önceden oluşturulmuş resmi bir kapsayıcı görüntüsünü kullanacak ve Secret Manager'ı kullanarak tools.yaml yapılandırmamızı güvenli bir şekilde sağlayacağız. Bu, güvenlik ve sürdürülebilirlik için en iyi uygulamadır.

👉💻 tools.yaml dosyasından gizli oluşturma

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

👉💻 Resmi araç kutusu container'ını Cloud Run'a dağıtın.

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: Bu komut, araçlarımızın sırrını çalışan kapsayıcıda tools.yaml adlı bir dosya olarak güvenli bir şekilde bağlar.
  • --args: Araç kutusu kapsayıcısına, bağlı gizli dosyanın yapılandırma olarak kullanılmasını bildiririz.

👉 Araç kutunuzun başarıyla dağıtıldığını onaylamak için Cloud Run konsoluna gidin. Aşağıdaki resimde olduğu gibi, summoner-toolbox hizmetinin doğru şekilde çalıştığını gösteren yeşil bir onay işaretiyle listelendiğini görmeniz gerekir. alt text

Güncellemeyi unuttuysanız

YOUR_PROJECT_ID

Aşağıdaki komutu kullanarak gizli anahtara tools.yaml dosyasının yeni bir sürümünü ekleyebilir ve tekrar dağıtım yapabilirsiniz.

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

Bilgi Kitaplığı(Database ToolBox MCP Sunucusu) artık bulutta etkin ve erişilebilir durumda. Bu MCP sunucusu, istediğiniz şeyi açıklayan Bildirimsel Tasarım'ı kullanıyordu ve araç kutusu, sunucuyu sizin için oluşturuyordu.

Doğrulama: Çırağın Yargılanması

👉💻 Şimdi de eksiksiz, bulut tabanlı araç ekosistemimizi Teşhis Temsilcisi ile test edeceğiz.

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

👉💻 Komut satırı test aracında üç yazı tipini de test edin:

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.

final-result

Tebrikler, Sihirdar. Üç Elemental Font'unuz artık etkin, bağımsız olarak dağıtılmış ve küresel olarak erişilebilir durumda. Böylece, yapay zeka destekli ordunuzun sarsılmaz temelini oluşturuyor. Çıkmak için Ctrl+C tuşuna basın.

OYUNCU OLMAYANLAR İÇİN

5. Yardımcıları Çağırma: Temel Alan İş Akışı

Elemental Fonts, ham ve dizginsiz güçle dolu bir şekilde üretilir. Ancak şekil olmadan güç, kaosa yol açar. Gerçek bir Sihirdar, ham enerjiyi sadece kullanmaz; ona irade, amaç ve özel bir biçim verir. Güç kaynakları oluşturmanın ötesine geçip asıl işe, yani ilk Familiars'ınızı çağırmaya başlama zamanı.

Çağırdığınız her bir Familiar, belirli bir savaş doktrinine bağlı, sadık bir hizmetçi olan bağımsız bir temsilcidir. Genel uzmanlar değil, tek bir güçlü stratejinin ustalarıdır. Biri, tam isabetli tekme-yumruk kombo ustası olacak. Diğeri ise eş zamanlı ve çok yönlü bir saldırıyla düşmanları alt eder. Üçüncüsü ise hedefi yıkılana kadar baskı uygulayan amansız bir kuşatma motoru olacaktır.

Hikaye

MCP sunucuları tarafından sağlanan süreçleri, iş mantığını ve işlemleri özel, bağımsız iş akışı aracılarına kapsüllemek için. Her aracı, işlevini yerine getirmek için ihtiyaç duyduğu belirli MCP aracı sunucularına erişim verilerek tanımlanmış bir "operasyonel bölgeye" sahip olur. Bu laboratuvarda, doğru iş için doğru aracı türünün nasıl seçileceği gösterilmektedir.

genel bakış

Bu modülde, bu stratejilere hayat vermek için ADK'nın güçlü iş akışı aracılarını nasıl kullanacağınız öğretilecektir. SequentialAgent, ParallelAgent veya LoopAgent mimari seçiminin yalnızca teknik bir ayrıntı olmadığını, Familiar'ınızın doğasının özü ve savaş alanındaki gücünün temeli olduğunu öğreneceksiniz.

Sanctum'unuzu hazırlayın. Gerçek çağırma başlamak üzere.

Fire Elemental Familiar'ı çağırma (Sıralı İş Akışı)

Ateş Elementi Yoldaşının saldırısı, iki bölümden oluşan hassas bir kombo: Hedeflenen bir vuruşun ardından güçlü bir tutuşturma. Bunun için işlemlerin katı ve sıralı bir şekilde yapılması gerekir.

Hikaye

Konsept: SequentialAgent, bu iş için mükemmel bir araçtır. Bir dizi alt aracının birbiri ardına çalışmasını ve önceki adımın sonucunu bir sonrakine aktarmasını sağlar.

Görev ("Güçlendirilmiş İhtar" Kombinasyonu):

  • 1. adım: Temsilci, belirli bir ateş yeteneğinin temel hasarını bulmak için önce Librarium'a danışır.
  • 2. adım: Ardından bu hasar değeri alınır ve Arcane Forge'dan geçirilerek inferno_resonance kullanılarak gücü katlanır.

Öncelikle, önceki modülde dağıttığınız Familiar ve MCP sunucuları ("Elemental Fonts") arasındaki bağlantıyı kuracağız.

👉✏️ ~/agentverse-architect/agent/fire/agent.py dosyasında #REPLACE-setup-MCP yerine aşağıdaki kodu girin:

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

Ardından, uzman "çalışan" aracılarımızı oluştururuz. Her birine dar ve iyi tanımlanmış bir amaç verilir ve yalnızca belirli bir araç setine erişim izni verilerek kendi "operasyonel bölgesi" ile sınırlandırılır.

👉✏️ ~/agentverse-architect/agent/fire/agent.py dosyasında REPLACE #REPLACE-worker-agents ifadesini aşağıdaki kodla değiştirin:

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],
)

Bu aracılar, modüler ve yeniden kullanılabilir bileşenlerdir. Teorik olarak, bu scout_agent'ı veritabanına sorgu göndermesi gereken tamamen farklı bir iş akışında kullanabilirsiniz. Sorumlulukları ayrı tutarak esnek yapı taşları oluştururuz. Bu, mikro hizmet ve bileşen tabanlı tasarımın temel ilkelerinden biridir.

Ardından, iş akışını bir araya getireceğiz. Bu aşamada kompozisyonun büyüsü gerçekleşir. SequentialAgent, uzmanlık alanımızdaki bileşenlerin nasıl bir araya getirileceğini ve nasıl etkileşime gireceğini tanımlayan "ana plan"dır.

👉✏️ ~/agentverse-architect/agent/fire/agent.py dosyasında REPLACE #REPLACE-sequential-agent ifadesini aşağıdaki kodla değiştirin:

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

👉💻 Ateş Elementali'ni test etmek için aşağıdaki komutları çalıştırarak ADK DEV kullanıcı arayüzünü başlatın:

. ~/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

Komutları çalıştırdıktan sonra terminalinizde ADK Web Sunucusu'nun başlatıldığını belirten bir çıkış görmelisiniz. Bu çıkış şuna benzer:

+-----------------------------------------------------------------------------+
| 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)

👉 Ardından, tarayıcınızdan ADK Dev kullanıcı arayüzüne erişmek için:

Cloud Shell araç çubuğundaki (genellikle sağ üstte) Web önizlemesi simgesinden (genellikle göz veya ok içeren bir kareye benzer) Bağlantı noktasını değiştir'i seçin. Pop-up pencerede bağlantı noktasını 8000 olarak ayarlayın ve "Değiştir ve Önizle"yi tıklayın. Ardından Cloud Shell, ADK Dev kullanıcı arayüzünü gösteren yeni bir tarayıcı sekmesi veya penceresi açar.

webpreview

👉 Çağırma ritüeliniz tamamlandı ve aracı çalıştırılıyor. Tarayıcınızdaki ADK Dev UI, Familiar ile doğrudan bağlantınızdır.

  • Hedefinizi Seçin: Kullanıcı arayüzünün üst kısmındaki açılır menüden fire simgesini seçin. Artık iradenizi bu belirli varlığa odaklıyorsunuz.
  • Komutunuzu Verme: Sağdaki sohbet panelinde, Familiar'a komut verme zamanı.

fire-select

👉 Test İstem:

Prepare an amplified strike using the 'inferno_lash' ability.

fire-result

Önce temel hasarı aramak için "izci"sini, ardından da bunu çarpıp son ve destansı darbeyi indirmek için "güçlendirici"sini çağıran ajanın düşünme sürecini göreceksiniz.

👉💻 Çağırma işlemini tamamladığınızda Cloud Shell Düzenleyici terminalinize dönün ve ADK Dev UI'yi durdurmak için Ctrl+C tuşuna basın.

Water Elemental Familiar'ı (Paralel İş Akışı) çağırma

Su Elementi Ailesi, hedefini büyük ve çok yönlü bir saldırıyla alt eder. Enerjileri birleştirip son ve yıkıcı bir darbe indirmeden önce her yönden aynı anda saldırır.

Hikaye

Kavram: ParallelAgent, verimliliği en üst düzeye çıkarmak için birden fazla bağımsız görevi aynı anda yürütmek için idealdir. Bu, aynı anda birden fazla saldırı başlattığınız bir "kıskaç saldırısıdır". Bu, SequentialAgent içinde eşzamanlı saldırılar başlatarak sonrasında nihai bir "birleştirme" adımı gerçekleştirir. Bu "fan-out, fan-in" kalıbı, gelişmiş iş akışı tasarımının temelini oluşturur.

Görev ("Tidal Clash" Kombosu): Ajan aynı anda şunları yapacak:

  • A görevi: Nexus'tan cryosea_shatter kanalını oynatın.
  • B görevi: Nexus'tan moonlit_cascade kanalını kullanın.
  • C görevi: Forge'dan leviathan_surge ile ham güç üretin.
  • Son olarak, tüm hasarı toplayın ve birleşik saldırıyı açıklayın.

Öncelikle, önceki modülde dağıttığınız Familiar ve MCP sunucuları ("Elemental Fonts") arasındaki bağlantıyı kuracağız.

👉✏️ ~/agentverse-architect/agent/water/agent.py dosyasında #REPLACE-setup-MCP yerine aşağıdaki kodu girin:

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

Ardından, uzman "çalışan" aracılarımızı oluşturacağız. Her birine dar ve iyi tanımlanmış bir amaç verilir ve yalnızca belirli bir araç setine erişim izni verilerek kendi "operasyonel bölgesi" ile sınırlandırılır.

👉✏️ ~/agentverse-architect/agent/water/agent.py dosyasında #REPLACE-worker-agents yerine aşağıdaki kodu girin:

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],
)

Ardından, iş akışını oluşturacağız. Kompozisyonun büyüsü burada gerçekleşir. ParallelAgent ve SequentialAgent, uzman bileşenlerimizin nasıl bir araya getirildiğini ve "Tidal Clash" kombinasyonunu oluşturmak için nasıl etkileşime girdiğini tanımlayan "ana plan"dır.

👉✏️ ~/agentverse-architect/agent/water/agent.py dosyasında #REPLACE-parallel-agent yerine aşağıdaki kodu girin:

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."
 )

👉💻 Su Elementali'ni test etmek için aşağıdaki komutları çalıştırarak ADK Dev UI'yi başlatın:

. ~/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

👉 Çağırma ritüeliniz tamamlandı ve aracı çalıştırılıyor. Tarayıcınızdaki ADK Dev UI, Familiar ile doğrudan bağlantınızdır.

  • Kullanıcı arayüzünün üst kısmındaki açılır menüden su tanıdığını seçin. Artık iradenizi bu belirli varlığa odaklıyorsunuz.
  • Komutunuzu Verme: Sağdaki sohbet panelinde, Familiar'a komut verme zamanı.

👉 Test istemi:

Unleash a tidal wave of power!

water-result

👉💻 Çağırma işlemini tamamladığınızda Cloud Shell Düzenleyici terminalinize dönün ve ADK Dev UI'yi durdurmak için Ctrl+C tuşuna basın.

Earth Elemental Familiar'ı (Loop İş Akışı) çağırma

Bir toprak elementali tanıdığı, amansız bir baskı uygulayan bir varlıktır. Düşmanını tek bir darbeyle yenmez, gücü yavaş yavaş biriktirip hedefinin savunması çökmeye başlayana kadar tekrar tekrar uygular.

Hikaye

Konsept: LoopAgent, tam olarak bu tür yinelemeli, "kuşatma motoru" görevleri için tasarlanmıştır. Bir hedef karşılanana kadar sub-agents işlemini tekrar tekrar yürütür ve her döngüden sonra bir koşulu kontrol eder. Ayrıca, son mesajını döngünün ilerleme durumuna göre de uyarlayabilir.

Görev ("Siegebreaker" Saldırısı):

  • Familiar, enerji biriktirmek için seismic_charge'ı tekrar tekrar çağırır.
  • En fazla 3 kez ödeme almaya devam eder.
  • Son saldırısında, biriktirdiği gücün yıkıcı etkisini duyurur.

Öncelikle döngünün her yinelemesindeki adımları tanımlayan yeniden kullanılabilir bileşenler oluşturacağız. charging_agent enerji biriktirir ve check_agent durumu bildirir. Son dönüşte mesajını dinamik olarak değiştirir.

Öncelikle, önceki modülde dağıttığınız Familiar ve MCP sunucuları ("Elemental Fonts") arasındaki bağlantıyı kuracağız.

👉✏️ ~/agentverse-architect/agent/earth/agent.py dosyasında #REPLACE-setup-MCP yerine aşağıdaki kodu girin:

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

👉✏️ ~/agentverse-architect/agent/earth/agent.py dosyasında #REPLACE-worker-agents yerine aşağıdaki kodu girin:

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"
)

Ardından, iş akışını oluşturacağız. Kompozisyonun büyüsü burada gerçekleşir. LoopAgent, uzman bileşenlerimizin tekrar tekrar yürütülmesini düzenleyen ve döngünün koşullarını yöneten "ana plan"dır.

👉✏️ ~/agentverse-architect/agent/earth/agent.py dosyasında #REPLACE-loop-agent yerine aşağıdaki kodu girin:

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
)

👉💻 Toprak Elementi'ni test edin: Aracıyı çalıştırın

. ~/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

👉 Çağırma ritüeliniz tamamlandı ve aracı çalıştırılıyor. Tarayıcınızdaki ADK Dev UI, Familiar ile doğrudan bağlantınızdır.

  • Hedefinizi seçin: Kullanıcı arayüzünün üst kısmındaki açılır menüden dünya simgesini seçin. Artık iradenizi bu belirli varlığa odaklıyorsunuz.
  • Komutunuzu Verme: Sağdaki sohbet panelinde, Familiar'a komut verme zamanı. 👉 Test istemi:
Begin the seismic charge, starting from zero

earth-result

Mimari çıkarım: Sisteminiz artık son derece özelleşmiş ve modüler bir mantık katmanına sahip. İş süreçleri yalnızca kapsüllenmekle kalmaz, aynı zamanda iş için en verimli davranış kalıbıyla (prosedürel, eşzamanlı veya yinelemeli) uygulanır. Bu, güvenlik, verimlilik ve yeteneği artıran gelişmiş bir ajan tasarımı seviyesini gösterir.

Çağırma işlemini tamamladığınızda Cloud Shell Düzenleyici terminalinize dönün ve ADK Dev UI'yi durdurmak için Ctrl+C tuşuna basın.

OYUNCU OLMAYANLAR İÇİN

6. Komut Merkezi Oluşturma: A2A ile Akıllı Temsil

Tanıdıklarınız güçlü ancak bağımsızdır. Stratejilerini kusursuz bir şekilde uygularlar ancak doğrudan komutunuzu beklerler. Bir generali olmayan uzmanlar ordusu işe yaramaz. Doğrudan komutanlıktan gerçek bir düzenleyiciye yükselme zamanı.

genel bakış

Mimarın Notu: Tüm sistem için tek ve akıllı bir giriş noktası oluşturmak amacıyla. Bu SummonerAgent, iş mantığını kendisi yürütmez ancak "usta stratejist" olarak hareket eder, soğutma durumunu analiz eder ve görevleri uygun uzman Familiar'a devreder.

genel bakış

Bağlama Ritüeli (Aşinaları A2A Hizmetleri Olarak Kullanıma Sunma)

Standart bir aracı aynı anda yalnızca tek bir yerde çalıştırabilirsiniz. Familiars'ı uzaktan komut için kullanılabilir hale getirmek üzere Agent-to-Agent (A2A) protokolünü kullanarak bir "bağlama ritüeli" gerçekleştirmemiz gerekir.

Mimarın Notu: Temsilciden Temsilciye (A2A) protokolü, bağımsız bir temsilciyi keşfedilebilir, ağ adresi atanabilir bir mikro hizmete dönüştürerek gerçek bir "temsilciler topluluğu" oluşturmayı sağlayan temel mimari modeldir. A2A aracılığıyla bir Cihazı kullanıma sunmak, otomatik olarak iki temel ve birbirine bağlı bileşen oluşturur:

  • Aracı Kartı ("Ne"): Bu, Familiar'ın herkese açık sözleşmesi olarak işlev gören, herkese açık, makine tarafından okunabilir bir"Spirit Sigil"dir (OpenAPI spesifikasyonu gibi). Aracının adını, stratejik amacını (talimatlarından türetilir) ve anladığı komutları açıklar. Bu, bir Usta Sihirdar'ın bir tanıdık keşfetmek ve yeteneklerini öğrenmek için okuduğu şeydir.
  • A2A Sunucusu ("Nerede"): Bu, Familiar'ı barındıran ve gelen komutları dinleyen özel web uç noktasıdır. Bu adres, diğer temsilcilerin isteklerini gönderdiği ağ adresidir ve bu isteklerin, Temsilci Kartı'nda tanımlanan sözleşmeye göre işlenmesini sağlar.

Şimdi bu bağlama ritüelini üç tanıdığımızın tamamında gerçekleştireceğiz.

~/agentverse-architect/agent/fire/agent.py dosyasında Fire 👉✏️ seçeneğini kullanın. Dosyanın alt kısmındaki #REPLACE - add A2A yerine, Fire Elemental'ı A2A hizmeti olarak kullanıma sunmak için gerekli bilgileri girin.

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)

Su ve Toprak🚨 👉✏️ ~/agentverse-architect/agent/water/agent.py ve ~/agentverse-architect/agent/earth/agent.py öğelerini de bağlamak için aynı değişikliği uygulayın.

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)

Bağlı Familiarları Dağıtma

👉✏️ Bağlama ritüelleri yazıldıktan sonra, üç Aile Üyemizi Cloud Run'da bağımsız, container mimarisine alınmış sunucusuz hizmetler olarak oluşturup dağıtmak için Cloud Build ardışık düzenimizi kullanacağız.

. ~/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"

Komut Alma (Summoner Aracısını Oluşturma)

Artık Familiarlarınız bağlı ve dinliyor. Bu sayede gerçek rolünüze, yani Usta Çağırıcı rolüne yükseleceksiniz. Bu aracının gücü, temel araçları kullanmaktan değil, diğer aracıları yönetmekten gelir. Araçları, "Ruh Mühürleri" ile keşfedeceği ve komuta edeceği Familiarların kendileridir.

Mimarın Notu: Bu sonraki adım, büyük ölçekli ve dağıtılmış tüm sistemler için kritik bir mimari kalıbı (Hizmet Keşfi) gösterir. SummonerAgent'ta Familiars'ın kodu yerleşik olarak bulunmuyor. Bunun yerine, ağ adresleri (URL'ler) verilir. Çalışma zamanında, herkese açık Agent Cards'larını getirerek yeteneklerini dinamik olarak "keşfeder". Bu sayede güçlü ve ayrıştırılmış bir sistem oluşturulur.

Bir tanıdık hizmeti güncelleyebilir, yeniden dağıtabilir veya tamamen yeniden yazabilirsiniz. Ağ adresi ve amacı aynı kaldığı sürece, Summoner herhangi bir değişiklik yapmasına gerek kalmadan hizmeti kullanabilir.

Öncelikle, dağıtılmış ve uzaktaki Familiarlarımıza bağlantı kuran "uzaktan kumandaları" oluşturacağız.

👉✏️ ~/agentverse-architect/agent/summoner/agent.py adresine gidin ve #REPLACE-remote-agents yerine aşağıdakileri girin:

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}"
    ),
)

Bu satır çalıştırıldığında RemoteA2aAgent, hizmet keşfi işlemi gerçekleştirir: Sağlanan URL'ye (ör. https://fire-familiar-xxxx.a.run.app/.well-known/agent.json) bir HTTP GET isteğinde bulunur. Uzak sunucudan "Spirit Sigil" (agent.json dosyası) indirilir.

İkinci olarak, bu uzaktan kumandaları kullanacak olan düzenleyici aracıyı tanımlayacağız. Talimatı, stratejik karar alma sürecinin planıdır.

👉✏️ ~/agentverse-architect/agent/summoner/agent.py adresine gidin ve #REPLACE-orchestrate-agent yerine aşağıdakileri girin:

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
)

Doğrulama: Strateji Denemesi

Karar anı geldi, çattı. Aşinalarınız dağıtıldı ve Sihirdarınız, ağ genelinde onlara komuta etmeye hazır. Stratejik zekasını test edelim.

👉💻 summoner_agent için ADK Dev UI'yi başlatın(8000 bağlantı noktasıyla web önizlemesi):

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

👉 Tarayıcınızdaki ADK Geliştirici Kullanıcı Arayüzü, Familiar ile doğrudan bağlantınızdır.

  • Kullanıcı arayüzünün üst kısmındaki açılır menüden çağrıcı aracısını seçin. Artık iradenizi bu belirli varlığa odaklıyorsunuz.
  • Komutunuzu Verme: Sağdaki sohbet panelinde, yardımcılarınızı çağırma zamanı geldi.

👉 Canavarları tanıtın:

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

(Beklenen: Çağırıcı, ateş_elementi_yardımcısı için yetki vermelidir.)

fire-result

👉 Şimdi de Summoner'a farklı bir istekte bulunalım. Aracının temiz bir başlangıç yapmasını ve önceki etkileşimimizi hatırlamamasını sağlamak için ekranın sağ üst köşesindeki + Oturum düğmesini tıklayarak yeni bir oturum başlatın. new-session

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

(Beklenen: Çağıran, su_elemental_familiar'a yetki vermelidir.)water-result

👉 Son testimiz için bir kez daha temiz bir başlangıç yapalım. Bir sonraki istemi girmeden önce yeni bir oturum başlatmak için + Oturum düğmesini tıklayın.

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

(Beklenen: Çağıran, earth_elemental_familiar'a yetki vermelidir.)

earth-result

Önemli: 429 RESOURCE EXHAUSTED hatası görürseniz LLM için sıklık sınırına (10 çağrı/dakika) ulaşmışsınızdır. Bu sorunu düzeltmek için lütfen 60 saniye bekleyin, + Yeni Oturum başlatın ve isteminizi yeniden deneyin.

👉💻 Çağırma işlemini tamamladığınızda Cloud Shell Düzenleyici terminalinize dönün ve ADK Dev UI'yi durdurmak için Ctrl+C tuşuna basın.

OYUNCU OLMAYANLAR İÇİN

7. Imposing the Laws of Magic – The Interceptor Pattern

Aileniz güçlü olsa da sihirli varlıkların bile toparlanmak için zamana ihtiyacı vardır. Güçlerini tüketen bir Çağırıcı savunmasız kalır. Bilge bir Sihirdar, kaynak yönetiminin önemini anlar ve katılım için katı kurallar uygular.

Hikaye

Mimara Not: Şimdiye kadar aracılarımız durum bilgisizdi. Şimdi Interceptor tasarım kalıbını uygulayarak bunları durum bilgili hale getireceğiz. Bu, kendi özel mantığımızı çalıştırmak için bir aracının normal yürütme akışını "engellediğimiz" güçlü bir tekniktir. Bu sayede, aracının temel kodunu değiştirmeden kuralları uygulayabilir, günlük kaydı ekleyebilir veya davranışı değiştirebiliriz. Sağlam, bakımı yapılabilir ve gözlemlenebilir aracı sistemler oluşturmanın temel taşıdır.

genel bakış

ADK, bu kalıbı uygulamak için iki temel yöntem sunar: Geri aramalar ve Eklentiler. Geri arama, tek bir aracıya eklenen basit bir işlevdir ve hızlı, belirli değişiklikler için idealdir. Eklenti, bir sistemde çalışan her aracı etkileyecek şekilde genel olarak uygulanabilen, daha güçlü ve yeniden kullanılabilir bir sınıftır. Odaklanmış hata ayıklama için geri arama özelliğiyle başlayıp daha sonra tam eklentiye geçeceğiz.

The Law Giver – Scribing the Cooldown callback

Öncelikle, bekleme süresi mantığımızı basit bir geri çağırma işlevi olarak uygulayacağız. Bu, doğrudan tek bir aracıya bağlı olduğu için kuralı prototiplemek ve hatalarını ayıklamak için mükemmel bir yöntemdir. Böylece kuralı bağımsız olarak test etmek kolaylaşır. Bu "önleyiciyi" toprak elementimize ekleyeceğiz.

Bekleme Süresi

👉✏️ ~/agentverse-architect/agent/earth/agent.py bölümüne geri dönün ve #REPLACE-before_agent-function yerine aşağıdaki Python kodunu girin.

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.")

Bu check_cool_down işlevi, kesicimizdir. ADK, Earth Elemental'ın çalışmasına izin vermeden önce bu işlevi yürütür.

  • Kontrol: Bu tanıdığın en son ne zaman kullanıldığını kontrol etmek için Cooldown API hizmetimize GET isteği gönderir.
  • Değerlendir: Zaman damgasını geçerli saatle karşılaştırır.
  • Yasa:
    • Familiar bekleme süresindeyse hata mesajı içeren bir Content nesnesi döndürerek aracının çalışmasını sonlandırır. Bu mesaj doğrudan kullanıcıya gönderilir ve temsilcinin ana mantığı hiçbir zaman yürütülmez.
    • Familiar kullanılabilirse zaman damgasını güncellemek için Cooldown API'ye bir POST isteği gönderir, ardından None değerini döndürerek devam eder ve ADK'ya aracının yürütülmesine devam edebileceğini bildirir.

👉✏️ Şimdi bu kesiciyi Earth Elemental'a uygulayın. Aynı ~/agentverse-architect/agent/earth/agent.py dosyasında, #REPLACE-before_agent-config yorumunu aşağıdakilerle değiştirin:

before_agent_callback=check_cool_down

Bekleme süresini doğrulama

Yeni sihirli yasamızı test edelim. Önce Earth Elemental'ı çağıracağız, ardından geri çağırmamızın ikinci denemeyi başarıyla yakalayıp engelleyip engellemediğini görmek için hemen tekrar çağırmayı deneyeceğiz.

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

👉💻 Konsolda:

  • İlk Çağrı: seismic charge, starting from zero'ı başlatın.
  • Beklenen: Toprak elementi başarıyla çalışır. adk web komutunun çalıştırıldığı terminalde [Callback] ... Updating timestamp.... günlüğünü görürsünüz.
  • Bekleme süresi testi (60 saniye içinde): Do another sismik yükleme!
    • Beklenen: check_cool_down callback bunu engelleyecektir. Temsilci, sohbete doğrudan The earth_elemental_familiar is exhausted and must recover its power. It cannot be summoned for another... seconds gibi bir mesajla yanıt verir.
  • Bir dakika bekleyin.
  • İkinci Çağrı (60 saniye sonra): Begin the seismic charge again.
    • Beklenen: Geri çağırma, API'yi kontrol eder, yeterli sürenin geçtiğini görür ve işlemin devam etmesine izin verir. Toprak Elementi tekrar başarıyla çalışır.

callback

👉💻 Çıkmak için Ctrl+c tuşuna basın.

İsteğe bağlı: Web kullanıcı arayüzünde geri aramayı gözlemleme

Alternatif olarak, adk web earth komutunu çalıştırarak bu akışı web arayüzünde de test edebilirsiniz. Ancak web kullanıcı arayüzünün görselleştirmesinin, geri çağırma döngüsü tarafından gerçekleştirilen hızlı ve yinelemeli kontrolleri görüntülemek için optimize edilmediğini ve bu nedenle akışı doğru şekilde oluşturamayabileceğini unutmayın. Aracının bekleme süresini kontrol ederken kullandığı mantığın en hassas ve adım adım izini görmek için terminalinizde adk run komutunu kullanmak daha net ve ayrıntılı bir görünüm sağlar. loop

👉💻 Çıkmak için Ctrl+c tuşuna basın.

Evrensel Yasa'yı Oluşturma: Cooldown Eklentisi

Geri arama özelliğimiz kusursuz çalışıyor ancak büyük bir mimari kusuru var: Tek bir temsilciye bağlı. Bu kuralı Ateş ve Su Ailelerine uygulamak isteseydik aynı kodu kopyalayıp dosyalarına yapıştırmamız gerekirdi. Bu yöntem verimsizdir ve bakımı zordur.

Mimarın Notu: Eklentiler bu noktada çok önemlidir. Eklentiler, yeniden kullanılabilir mantığımızı çalışma zamanı düzeyinde eklenebilen bir sınıfta kapsar. Bu, tek bir eklentinin kurallarını söz konusu sistemde çalışan her aracıya uygulayabileceği anlamına gelir. Bu, "Kendini Tekrarlama" (DRY) ilkesinin, agent sistemler için nihai ifadesidir.

Şimdi geri çağırma işlevimizi daha güçlü ve yeniden kullanılabilir bir CoolDownPlugin olarak yeniden düzenleyeceğiz.

👉✏️ agent/cooldown_plugin.py dosyasına geri dönün ve eklentiyi oluşturun. #REPLACE-plugin yerine aşağıdaki kodu kullanın:

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.")

Eklentiyi Summoner'ın çalışma zamanına ekleme

Peki bu evrensel yasayı tüm Familiarlarımıza nasıl uygulayacağız? Eklentiyi ADK Runtime'a ekleyeceğiz.

ADK Çalışma Zamanı, bir temsilciyi hayata geçiren yürütme motorudur. adk.run() veya to_a2a() gibi bir komut kullandığınızda aracınızı çalışma zamanına teslim edersiniz. Bu motor, bir aracının dönüşünün tüm yaşam döngüsünü yönetmekten sorumludur: kullanıcı girişini alma, LLM'yi çağırma, araçları yürütme ve eklentileri işleme. Bu seviyede bir eklenti ekleyerek, söz konusu motorda çalışan her aracı için "fizik yasalarını" değiştirmiş oluruz. Böylece, bekleme süresi kuralımızın evrensel olarak ve tutarlı bir şekilde uygulanmasını sağlarız.

👉✏️ Öncelikle eski, aracıya özel geri aramayı kaldıralım. ~/agentverse-architect/agent/earth/agent.py bölümüne gidin ve şu satırın tamamını silin:

before_agent_callback=check_cool_down

👉✏️ Ardından, yeni eklentimizi A2A giriş noktası komut dosyamızdaki çalışma zamanına ekleyeceğiz. ~/agentverse-architect/agent/agent_to_a2a.py dosyanıza gidin. #REPLACE-IMPORT yorumunu aşağıdaki kod snippet'iyle değiştirin:

from cooldown_plugin import CoolDownPlugin

👉✏️ #REPLACE-PLUGIN yerine aşağıdaki kod snippet'ini kullanın:

plugins=[CoolDownPlugin(cooldown_seconds=60)],

Yeni global eklentimizi etkinleştirmeden önce, çakışmaları önlemek için eski ve aracıya özel mantığı kaldırmanız gerekir. 👉✏️ Clean up the Earth aracısını temizleyin. Aşağıdaki dosyaya ~/agentverse-architect/agent/earth/agent.py gidin ve before_agent_callback=check_cool_down satırını tamamen silin. Bu işlem, tüm bekleme süresi sorumluluklarını yeni eklentiye devreder.

Eklentiyi Doğrulama

Evrensel yasamız yürürlüğe girdiğine göre, tanıdıklarımızı bu yeni büyüyü kullanarak yeniden görevlendirmemiz gerekiyor.

👉💻 Ana Cloud Build ardışık düzenini kullanarak üç Familiar'ı da yeniden oluşturun ve yeniden dağıtın.

. ~/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"

👉💻 Dağıtım tamamlandıktan sonra, summoner_agent'ımıza komut vererek eklentinin etkinliğini test edeceğiz. Çağırıcı, komutu Familiarlara devretmeye çalışır ancak her Familiar'ın çalışma zamanına bağlı eklenti, komutu durdurur ve bekleme süresini zorunlu kılar.

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

👉💻 Konsolda,testleri tam olarak şu sırayla gerçekleştirin:

  • İlk Çağrı: Hype. It's a single, slow-moving target with thick armor weakness is Inescapable Reality'ı başlatın.
  • Beklenen: Ateş elementi başarıyla çalışır.
  • Bekleme süresi testi (60 saniye içinde): Hype, with Inescapable Reality as weakness is still standing! Strike it again!
    • Beklenen: Temsilci, sohbete doğrudan .... It cannot be summoned for another... seconds gibi bir mesajla yanıt verir.
  • Bir dakika bekleyin.
  • İkinci Çağrı (60 saniye sonra): Hype must be defeated. It has Inescapable Reality as weakness! Strike it again!.
    • Beklenen: Geri çağırma, API'yi kontrol eder, yeterli sürenin geçtiğini görür ve işlemin devam etmesine izin verir. Ateş Elementi tekrar başarıyla çalışır.

eklenti

👉💻 Çıkmak için Ctrl+C tuşuna basın.

Tebrikler, Sihirdar. Özel bir eklenti ve harici bir durum yönetimi hizmeti kullanarak kural tabanlı bir düzenleme sistemini başarıyla uyguladınız. Bu, gerçekten gelişmiş ve sağlam bir mimari modeldir.

OYUNCU OLMAYANLAR İÇİN

8. Savaşın Yankılarını Bağlama - Ajan Durumu ve Bellek

Dikkatsiz bir Sihirdar, aynı stratejiyi tekrarlayarak tahmin edilebilir hale gelir. Bilge bir Sihirdar, geçmiş savaşların yankılarından ders çıkarır ve taktiklerini düşmanı dengesiz durumda tutacak şekilde uyarlar. Güçlü bir patronla karşı karşıya kalındığında, bekleme süresinde olan bir yoldaşı çağırmak, kritik bir hata olan boş bir turdur. Bunu önlemek için Çağırıcı'nın son eylemini hatırlaması gerekir.

hikaye

Mimarın Notu: Bellek ve durum yönetimi, bir aracıyı basit bir araç çağırıcıdan akıllı, sohbet edilebilir bir iş ortağına dönüştüren unsurlardır. İki ana türü anlamak önemlidir:

  • Uzun Süreli Bellek: Bu, kalıcı olması gereken bilgiler içindir. Bunu, genellikle kalıcı bir depoda saklanan, aranabilir bir arşiv veya bilgi tabanı olarak düşünebilirsiniz. Birçok geçmiş sohbetten ve kaynaktan bilgi içerir. Böylece, bir temsilci belirli bir kullanıcı veya konuyla ilgili bilgileri hatırlayabilir. ADK'nın MemoryService'i bu amaçla tasarlanmıştır ve uzun vadeli bu bilgilerin alınmasını ve aranmasını yönetir.
  • Kısa Süreli Durum: Bu, yalnızca mevcut görev veya sohbetle alakalı olan geçici, "anlık" bilgiler içindir. Savaş planıyla ilgili notlara benzer: "Ateş elementini kullandım, muhtemelen yorgundur." Bu durum hafiftir ve yalnızca mevcut oturum süresince geçerlidir.

Genel Bakış

Kullanım alanımızda, daha önce yapılan tüm savaşları hatırlamamız gerekmiyor. Yalnızca bu karşılaşmada çağrılan son Familiar'ı hatırlamamız yeterli. Bu nedenle, hafif Short-Term State (Kısa Süreli Durum) mükemmel bir mimari tercihtir. Bu önemli bilgiyi kaydetmek için after_tool_callback kullanacağız.

Scribing the Echo: Remembering the Last Summons

Kısa süreli belleğimizi after_tool_callback kullanarak uygulayacağız. Bu, bir araç başarıyla yürütüldükten sonra özel bir Python işlevi çalıştırmamıza olanak tanıyan güçlü bir ADK kancasıdır. Bu araya girme işleyicisini, aracının oturum durumuna yeni çağrılan Familiar'ın adını kaydetmek için kullanacağız.

👉✏️ ~/agentverse-architect/agent/summoner/agent.py dosyanızda #REPLACE-save_last_summon_after_tool yorumunu aşağıdaki işlevle değiştirin:

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

👉✏️ Şimdi bu save_last_summon_after_tool öğesini Sihirdar aracınıza ekleyin. Aynı dosyada, #REPLACE-Memory-check-config yorumunu aşağıdakilerle değiştirin:

after_tool_callback=save_last_summon_after_tool,

👉✏️ Tüm aracı istemini aşağıdakiyle değiştirin.

        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.

Doğrulama: Uyarlanabilir Strateji Denemesi

👉💻 Şimdi de Sihirdar'ın yeni stratejik mantığını doğrulayalım. Amaç, Sihirdar'ın aynı Yoldaş'ı arka arkaya iki kez kullanmayacağını onaylayarak son eylemini hatırlama ve uyum sağlama yeteneğini göstermektir.

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

👉💻 Monster Strike #1: Hype. It's a single, slow-moving target with thick armor. Its weakness is Inescapable Reality.

  • Beklenen: Summoner, zayıflığı analiz edecek ve fire_familiar'ı doğru şekilde çağıracak. 👉💻 Monster Strike #2 (The Memory Test): Hype is still standing! It hasn't changed its form. Strike it again! Its weakness is Inescapable Reality.
  • Beklenen: Sihirdarın stratejik analizi, ideal seçim olarak yine Ateş Yoldaşı'nı gösterecek. Ancak yeni talimatları ve hafızası, fire_familiar'ın last_summon olduğunu söyler. Kendini tekrarlamamak için stratejisini uyarlayacak ve mevcut diğer yardımcıları (water_familiar veya earth_familiar) çağıracak.

final-result

👉💻 Çıkmak için Ctrl+C tuşuna basın.

Orchestrator'ı dağıtma

Aşinalarınız dağıtıldı ve Çağırıcı'nız artık hafızayla dolu. Şimdi son ve yükseltilmiş düzenleyiciyi dağıtma zamanı.

👉💻 Plan tamamlandığına göre şimdi son ritüeli gerçekleştireceğiz. Bu komut, summoner_agent'ınızı oluşturup Cloud Run'a dağıtır.

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"

Summoner aracısı dağıtıldığına göre, aracılar arası (A2A) uç noktasının etkin ve doğru şekilde yapılandırılmış olduğunu doğrulayın. Bu uç nokta, diğer aracıların özelliklerini keşfetmesine olanak tanıyan, Aracı Kartı olarak da bilinen herkese açık bir agent.json dosyası sunar. 👉💻 Aracı kartını getirmek ve biçimlendirmek için aşağıdaki curl komutunu çalıştırın:

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

Çağırma aracısını açıklayan temiz bir JSON çıkışı görmelisiniz. sub_agents bölümüne yakından bakın. Bu bölümde fire_familiar, water_familiar ve earth_familiar listelenir. Bu, sihirdarınızın canlı olduğunu ve lejyonla bağlantı kurduğunu onaylar.

Bu, mimarinizin başarılı olduğunu gösterir. Çağrıcı, yalnızca bir delege değil, daha etkili bir komutan olmak için eylemlerinden ders çıkaran uyarlanabilir bir stratejisttir.

Mimari ile ilgili son denemenizi tamamladınız. Savaşın yankıları artık iradenize bağlı. Eğitim sona erdi. Gerçek savaş sizi bekliyor. Tamamladığınız sistemi alıp nihai zorluğa göğüs germe zamanı. Patron savaşına hazırlanın.

OYUNCU OLMAYANLAR İÇİN

9. The Boss Fight

Son planlar yazıldı, Elemental Yazı Tipleri oluşturuldu ve Aile üyeleriniz, Concord aracılığıyla komutunuzu bekleyerek iradenize bağlı hale getirildi. Çok agent'lı sisteminiz yalnızca bir hizmet koleksiyonu değildir. Sizinle birlikte yaşayan, stratejik bir lejyon gibidir. Artık nihai testin zamanı geldi. Tek bir aracının yenmeyi umamayacağı bir düşmana karşı canlı bir orkestrasyon yapılacak.

Temsilcinizin Locus'unu edinme

Savaş alanına girebilmek için iki anahtara sahip olmanız gerekir: şampiyonunuzun benzersiz imzası (Agent Locus) ve Spectre'ın inine giden gizli yol (Dungeon URL).

👉💻 Öncelikle, temsilcinizin Agentverse'teki benzersiz adresini (Locus) edinin. Bu, şampiyonunuzu savaş alanına bağlayan canlı uç noktadır.

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

👉💻 Ardından, hedefi belirleyin. Bu komut, Spectre'ın alanına açılan portal olan Translocation Circle'ın konumunu gösterir.

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

Önemli: Bu URL'lerin ikisini de hazır bulundurun. Bu bilgilere son adımda ihtiyacınız olacaktır.

Kabusla Yüzleşme

Koordinatlar güvence altına alındıktan sonra artık Yer Değiştirme Çemberi'ne gidip savaşa girmek için büyüyü yapabilirsiniz.

👉 Tarayıcınızda Translocation Circle URL'sini açarak The Crimson Keep'in ışıltılı portalının önünde durun.

Kaleyi aşmak için Gölge Kılıcı'nızın özünü portala uyumlamanız gerekir.

  • Sayfada, A2A Endpoint URL (A2A Uç Nokta URL'si) etiketli runik giriş alanını bulun.
  • Agent Locus URL'sini (kopyaladığınız ilk URL) bu alana yapıştırarak şampiyonunuzun simgesini yazın.
  • Işınlanma sihrini ortaya çıkarmak için Bağlan'ı tıklayın.

Translokasyon Dairesi

Işınlanmanın göz kamaştırıcı ışığı kaybolur. Artık kutsal alanınızda değilsiniz. Hava, soğuk ve keskin bir enerjiyle çıtırdıyor. Önünüzde Spectre beliriyor. Tıslayan statik ve bozuk koddan oluşan bir girdap, kutsal olmayan ışığıyla zindanın zemininde uzun ve dans eden gölgeler oluşturuyor. Yüzü olmamasına rağmen, tamamen size odaklanmış, sizi tüketen varlığını hissediyorsunuz.

Zafere giden tek yol, inancınızın netliğinden geçer. Bu, zihnin savaş alanında verilen bir irade düellosudur.

İlk saldırınızı yapmaya hazırlanırken ileri atıldığınızda Hayalet karşı saldırı yapar. Kalkan oluşturmaz ancak doğrudan bilincinize bir soru yansıtır. Bu soru, eğitiminizin özünden alınmış, parıldayan, runik bir meydan okumadır.

Zindan

Bu, mücadelenin doğasıdır. Bilginiz silahınızdır.

  • Edindiğiniz bilgelikle cevap verin. Böylece kılıcınız saf enerjiyle tutuşur, Spectre'ın savunmasını kırar ve KRİTİK BİR DARBE indirirsiniz.
  • Ancak tereddüt ederseniz, cevabınız şüpheyle gölgelenirse silahınızın ışığı söner. Darbenin etkisi çok zayıf olacak ve hasarın YALNIZCA BİR KISMI verilecek. Daha da kötüsü, Spectre belirsizliğinizden beslenir ve her yanlış adımda kendi yozlaştırıcı gücü artar.

Şampiyon, bu senin anın. Kodunuz büyü kitabınız, mantığınız kılıcınız ve bilginiz kaosun akışını tersine çevirecek kalkanınızdır.

Odaklanma. Doğru vuruş yapın. Agentverse'ün kaderi buna bağlı.

Tebrikler, Sihirdar.

Deneme sürenizi başarıyla tamamladınız. Çoklu aracı düzenleme sanatında ustalaştınız, izole edilmiş tanıdıkları ve kaotik gücü uyumlu bir uyuma dönüştürdünüz. Artık Agentverse'ü savunmak için karmaşık stratejiler uygulayabilen, tamamen düzenlenmiş bir sistemi yönetiyorsunuz.

10. Temizlik: Sihirdar Uyumunun Sökülmesi

Çağırıcıların Uyumu'nda ustalaştığınız için tebrikler! Agentverse'ünüzün temiz kalmasını ve eğitim alanlarınızın temizlenmesini sağlamak için son temizlik ritüellerini gerçekleştirmeniz gerekir. Bu işlem, yolculuğunuz sırasında oluşturulan tüm kaynakları sistematik olarak kaldırır.

Agentverse Bileşenlerini Devre Dışı Bırakma

Artık çok agent'lı sisteminizin dağıtılan bileşenlerini sistematik olarak kaldıracaksınız.

Tüm Cloud Run Hizmetlerini ve Artifact Registry Depolarını Silme

Bu işlem, dağıtılan tüm Familiar aracılarını, Summoner Orchestrator'ı, MCP sunucularını ve Dungeon uygulamasını Cloud Run'dan kaldırır.

👉💻 Terminalinizde, her hizmeti silmek için aşağıdaki komutları tek tek çalıştırın:

. ~/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

Cloud SQL örneğini silme

Bu işlem, veritabanı ve içindeki tüm tablolar da dahil olmak üzere summoner-librarium-db örneğini kaldırır.

👉💻 Terminalinizde şu komutu çalıştırın:

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

Secret Manager gizli anahtarını ve Google Cloud Storage paketini silme

👉💻 Terminalinizde şu komutu çalıştırın:

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

Yerel Dosyaları ve Dizinleri Temizleme (Cloud Shell)

Son olarak, Cloud Shell ortamınızı klonlanmış depolardan ve oluşturulan dosyalardan temizleyin. Bu adım isteğe bağlıdır ancak çalışma dizininizin tamamen temizlenmesi için kesinlikle önerilir.

👉💻 Terminalinizde şu komutu çalıştırın:

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

Artık Agentverse Architect yolculuğunuzun tüm izlerini başarıyla temizlediniz. Projeniz temiz ve bir sonraki maceraya hazırsınız.