1. Overture
Yalıtılmış geliştirme dönemi sona eriyor. Teknolojik evrimin bir sonraki aşaması, yalnız bir dehanın değil, ortak bir ustalığın ürünü olacak. Tek ve akıllı bir temsilci oluşturmak ilgi çekici bir denemedir. Güçlü, güvenli ve akıllı bir temsilci ekosistemi (gerçek bir Temsilci Evreni) 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, 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, muazzam bir potansiyel barındıran, akıllı ve otonom temsilcilerin inovasyonu hızlandırmak ve sıradan işleri ortadan kaldırmak için mükemmel bir uyum içinde çalıştığı bir dönemdir.

Güç ve potansiyelin birbirine bağlı olduğu bu ekosisteme Agentverse adı veriliyor.
Ancak, The Static olarak bilinen sessiz bir bozulma, bu yeni dünyanın sınırlarını yıpratmaya başlamıştır. Statik, virüs veya hata değildir. Yaratma eylemiyle beslenen kaosun vücut bulmuş halidir.
Eski hayal kırıklıklarını canavarca biçimlere 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, kaos dalgasını geri püskürtmek için şampiyonlara çağrıda bulunuyoruz. Kendi alanında uzmanlaşmaya ve Agentverse'ü korumak için birlikte çalışmaya istekli kahramanlara ihtiyacımız var. Yolunuzu seçme zamanı geldi.
Sınıfınızı Seçin
Statik'e karşı mücadelede kritik birer sütun olan dört farklı yol önünüzde uzanıyor. Eğitiminiz tek başınıza yapacağınız bir görev olsa da, nihai başarınız becerilerinizin başkalarıyla nasıl birleştiğini anlamanıza bağlıdır.
- Gölge Kılıcı (Geliştirici): Ocağın ve ön cephenin ustası. Bıçakları işleyen, aletleri üreten ve kodun karmaşık ayrıntılarında düşmanla yüzleşen zanaatkar sizsiniz. Sizin yolunuz kesinlik, beceri ve pratik yaratıcılıktan oluşuyor.
- Çağırıcı (Mimar): Büyük bir stratejist ve düzenleyici. Tek bir ajanı değil, savaş alanının tamamını görürsünüz. Tüm aracı sistemlerinin iletişim kurmasına, ortak çalışması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. Aracınıza amaç ve vizyon kazandıran bilgileri ortaya çıkarmak için verilerin geniş ve vahşi doğasına girersiniz. Bilginiz, bir düşmanın zayıflığını ortaya çıkarabilir veya bir müttefiki güçlendirebilir.
- Veli (DevOps / SRE): Alanın sadık 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 temelini oluşturur.
Göreviniz
Eğitiminiz bağımsız bir egzersiz olarak başlayacaktır. Seçtiğiniz yolda yürüyecek ve rolünüzde ustalaşmak için gereken benzersiz becerileri öğreneceksiniz. Denemenizin sonunda, zanaatınızın belirli zorluklarını avlayan bir mini-boss olan The Static'ten doğan bir Spectre ile karşılaşacaksınız.
Ancak bireysel rolünüzü ustalıkla yerine getirerek son sınava hazırlanabilirsiniz. Ardından, diğer sınıflardaki şampiyonlarla bir parti oluşturmanız gerekir. Birlikte, yolsuzluğun kalbine doğru yola çıkacak ve nihai bir boss ile karşılaşacaksınız.
Ortak gücünüzü test edecek ve Agentverse'ün kaderini belirleyecek son bir işbirlikçi meydan okuma.
Agentverse kahramanlarını bekliyor. Çağrıya cevap verecek misiniz?
2. Çağırıcının Uyumu
Hoş geldin, 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 oluşturarak bir uzman ordusunun (yardımcılarınız) mükemmel uyum içinde çalışmasını sağlamakta yatar. Bu görevde, güçlü bir çoklu aracı sistemi tasarlama, bağlama ve düzenleme beceriniz test edilecek.

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ında (sıralı, paralel ve döngü) 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çin. Uzman Familiarlarınızın karmaşık görevleri keşfetmesi ve onlara devretmesi için Temsilciden Temsilciye (A2A) protokolünü kullanan bir ana Orchestration Agent oluşturacak ve gerçek bir çoklu temsilci 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, sohbetle ilgili 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 üretim düzeyinde bir gerçeğe dönüştürü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ş geldin, 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. Doğru 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ındaki Cloud Shell'i etkinleştir simgesini (Cloud Shell bölmesinin üst kısmındaki terminal şeklindeki simge) tıklayın.

👉 "Editörü Aç" butonuna tıklayın (kalemle açılmış bir klasöre benziyor). Bu, pencerede Cloud Shell Kod Düzenleyicisini açacaktır. Sol tarafta bir dosya gezgini göreceksiniz. 
👉Bulut IDE'sindeki terminali açın, 
👉💻 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
👉💻 Kurulum komut dosyasını proje dizininden çalıştırın.
⚠️ Proje kimliğiyle ilgili not: Komut dosyası, rastgele oluşturulmuş varsayılan bir proje kimliği önerir. Bu varsayılanı kabul etmek için Enter tuşuna basabilirsiniz.
Ancak belirli bir yeni proje oluşturmayı tercih ederseniz komut dosyasının istemi üzerine istediğiniz proje kimliğini yazabilirsiniz.
cd ~/agentverse-architect
./init.sh
Kurulum işleminin geri kalanı, komut dosyası tarafından otomatik olarak gerçekleştirilir.
👉 Tamamlandıktan Sonra Önemli Adım: Komut dosyası tamamlandıktan sonra, Google Cloud Console'unuzun doğru projeyi görüntülediğinden emin olmalısınız:
- console.cloud.google.com adresine gidin.
- Sayfanın üst kısmındaki proje seçici açılır listesini tıklayın.
- "Tümü" sekmesini tıklayın (yeni proje henüz "Son Kullanılanlar"da görünmeyebilir).
init.shadımında yapılandırdığınız Proje Kimliğini seçin.

👉💻 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 adında bir Artifact Registry deposu oluşturmadıysanız, oluşturmak için aşağıdaki komutu çalıştırın: (Aynı projede dağıtılan başka sınıflarınız varsa 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"
İzin 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 statik ortamdan Hayaletleri çağıracak ve son testiniz için gerekli olan boss'ları yaratacaktır.
. ~/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 betiğini çalıştırın.
. ~/agentverse-architect/set_env.sh
cd ~/agentverse-architect/
./prepare.sh
Mükemmel bir iş çıkardın, Sihirdar. Daire tamamlandı ve anlaşmalar imzalandı. Artık kutsal bir alan olan zemin, muazzam gücü yönlendirmeye hazır. Bir sonraki denememizde, yoldaşlarımızın güç alacağı temel fontları oluşturacağız.
4. Temel Yazı Tiplerini Oluşturma: Ayrılmış Araç Ekosistemi
Savaş alanı hazır, çağırma çemberi çizilmiş ve ortamdaki mana çıtırdıyor. Artık bir Sihirdar olarak ilk gerçek görevinizi yerine getirmenin zamanı geldi: Tanıdıklarınızın güçlerini alacağı güç kaynaklarını oluşturmak. 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.

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ı türde MCP sunucusu 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 inanılmaz derecede 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, nihai kontrol ve esneklik sağlanır. Karmaşık işlemler, basit ve yeniden kullanılabilir bir araçla kapsüllenir. 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.

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.

Harici güç kaynağımız olarak çalışan ve iki ham yazım 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ırmaktan daha fazlasını yapması 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 yapılır.
👉✏️ 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üş tüm araçların listesini döndürür. -@app.call_tool()(Komut): Bu işlev, temel işlevi görür. 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.
Bunu daha sonra konuşlandıracağız.
Arcane Forge'u Ateşlemek (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.

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üç Fontunu oluşturmak için Nexus'ta olduğu gibi aynı zorunlu mcp.server yaklaşımının kullanıldığını göreceksiniz.
Ana Cloud Build ardışık düzenini oluşturma
Şimdi mcp-servers dizini içerisinde cloudbuild.yaml dosyasını oluşturacağız. Bu dosya her iki hizmetin de oluşturulmasını ve dağıtımını düzenleyecektir.
👉💻 ~/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 konsoluna giderek dağıtımı doğrulayabilirsiniz. Aşağıda gösterildiği gibi, iki yeni MCP sunucusu örneğinizin çalıştığını görmeniz gerekir: 
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.

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 yeni bir tarayıcı sekmesinde bu doğrudan bağlantıyı açarak veritabanınız için Cloud SQL Studio'ya gidin:
https://console.cloud.google.com/sql/instances/summoner-librarium-db

👉 Sol taraftaki giriş bölmesinde, açılır menüden 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. 
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ı bildirir.
sources: Bu bölümde, verilerinizle ilgili bağlantılar tanımlanır.
- summoner-librarium:: Bu, bağlantımıza verdiğimiz mantıklı bir isimdir.
- tür: cloud-sql-postgres: Toolbox'a, PostgreSQL için Cloud SQL'e özel olarak tasarlanmış yerleşik, 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'un nerede bulunacağı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 (REPLACE)
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.
- tür: postgres-sql: Bu, Araç Kutusuna bu aracın eyleminin bir SQL ifadesini 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ı yapabilmesi 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;
toolsets: Bu bölümde, tek tek 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, tüm araçları tek bir verimli komutla yüklemeyi isteyebilir.
👉✏️ tools.yaml dosyasındaki aynı ~/agentverse-architect/mcp-servers/db-toolbox'da, #REPLACE-toolsets'yi aşağıdakiyle değiştirin
toolsets:
summoner-librarium:
- lookup-available-ability
- ability-damage
Librarium'u Dağıtma
Şimdi Librarium’u devreye alacağız. Kendi konteynerimizi oluşturmak yerine, Google'dan önceden oluşturulmuş resmi bir konteyner imajını kullanacağız 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 açısından 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 konteynerini 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" \
--labels="dev-tutorial-codelab=agentverse" \
--args="--tools-file=/app/tools.yaml","--address=0.0.0.0","--port=8080" \
--allow-unauthenticated \
--min-instances 1
--set-secrets: Bu komut, araçlar sırrımızı çalışan kapsayıcıda tools.yaml adlı bir dosya olarak güvenli bir şekilde bağlar.--args: Araç kutusu konteynerine, yapılandırması olarak bağlanmış gizli dosyayı kullanmasını talimatını veriyoruz.
👉 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örmelisiniz. 
Güncellemeyi unuttuysanız
YOUR_PROJECT_ID
Aşağıdaki komutu kullanarak gizliliğe tools.yaml dosyasının yeni bir sürümünü ekleyebilir ve yeniden dağıtabilirsiniz.
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, ne istediğinizi açıklayan Bildirimsel Tasarım olarak adlandırdığımız bir yöntem 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
👉💻 Cmd 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.

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 bir güçle dövülmüş gibi. Ancak biçimsiz 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 özerk bir temsilcidir. Bunlar genel uzmanlar değil, tek bir güçlü stratejinin ustalarıdır. Biri, tam isabetli, tekme ve yumruk kombinasyonunda ustalaşacak. 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.

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 izni 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.

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.
Kutsal alanınızı hazırlayın. Asıl çağrı şimdi başlıyor.
Fire Elemental Tanıdığı Çağır (Sıralı İş Akışı)
Ateş Elementi Ailesi'nin 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.

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):
- Adım 1: Ajan öncelikle belirli bir ateş yeteneğinin temel hasarını bulmak için Kütüphaneye danışacaktır.
- 2. adım: Ardından bu hasar değerini alıp Arcane Forge'dan geçirerek inferno_resonance kullanarak gücünü katlar.
Öncelikle Familiar'ımız ile önceki modülde kurduğunuz MCP sunucuları ("Elemental Fontlar") arasındaki bağlantıyı kuracağız.
👉✏️ ~/agentverse-architect/agent/fire/agent.py dosyasında #REPLACE-setup-MCP kodunu aşağıdaki kodla değiştirin:
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ını 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 DEĞİŞTİR #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ıza giren 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 DEĞİŞTİR #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ş Elementalini test etmek için aşağıdaki komutları çalıştırmak ADK DEV kullanıcı arayüzünü başlatacaktır:
. ~/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 bir 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.

👉 Çağırma ritüeliniz tamamlandı ve temsilci artık çalışıyor. Tarayıcınızdaki ADK Dev UI, Familiar'a doğrudan bağlantınızı sağlar.
- Hedefinizi Seçin: Kullanıcı arayüzünün üst kısmındaki açılır menüden
firetanıdık simgesini seçin. Artık iradenizi bu belirli varlığa odaklıyorsunuz. - Komutunuzu Verme: Sağdaki sohbet panelinde, Familiar'a komut verme zamanı.

👉 Test İstemi:
Prepare an amplified strike using the 'inferno_lash' ability.

Ajanın önce temel hasarı bulmak için "keşifçisini", ardından da hasarı çarparak son, destansı darbeyi vurmak için "güçlendiricisini" çağırdığını göreceksiniz.
👉💻 Çağırma işlemini tamamladıktan sonra Cloud Shell Editör terminalinize dönün ve ADK Dev UI'yi durdurmak için Ctrl+C tuşuna basın.
Water Elemental Tanıdığını Çağır (Paralel İş Akışı)
Su Elementali Aile Üyesi, hedefini büyük ve çok yönlü bir saldırıyla alt eder. Enerjileri birleştirip son ve yıkıcı darbeyi vurmadan önce her yönden saldırır.

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 birkaç 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" deseni, gelişmiş iş akışı tasarımının temelini oluşturur.
Görev ("Gelgit Çatışması" Kombinasyonu): Temsilci aynı anda şunları yapacaktır:
- Görev A: Nexus'tan
cryosea_shatterkanalı. - B görevi: Nexus'tan
moonlit_cascadekanalını kullanın. - Görev C: Forge'dan
leviathan_surgeile ham güç üret. - 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" temsilcilerimizi 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 kodunu aşağıdaki kodla değiştirin:
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 Elementalini test etmek için ADK Dev UI'yi başlatmak üzere aşağıdaki komutları ç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 ajan artık çalışıyor. Tarayıcınızdaki ADK Dev UI, Familiar'a doğrudan bağlantınızı sağlar.
- 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.
- Emrinizi Verin: Sağ taraftaki sohbet panelinde, Dost'a emir verme zamanı.
👉 Test İstemi:
Unleash a tidal wave of power!

👉💻 Çağırma işlemini tamamladıktan sonra Cloud Shell Editör terminalinize dönün ve ADK Dev UI'yi durdurmak için Ctrl+C tuşuna basın.
Earth Elemental Tanıdığını Çağır (Döngü İş Akışı)
Toprak Elemental Dostu, amansız bir baskının varlığıdır. Düşmanını tek bir darbeyle değil, sürekli güç biriktirerek ve hedefin savunmasını çökertecek şekilde tekrar tekrar uygulayarak yener.

Konsept: LoopAgent tam da bu tür yinelemeli "kuşatma motoru" görevleri için tasarlanmıştır. Bir hedefe ulaşılana kadar her döngüden sonra bir koşulu kontrol ederek sub-agents işlemini tekrar tekrar yürütecektir. Ayrıca döngünün ilerleyişine göre son mesajını uyarlayabilir.
Görev ("Kuşatma Kırıcı" Saldırısı):
- Tanıdık, enerji biriktirmek için seismic_charge'ı tekrar tekrar çağıracaktır.
- En fazla 3 kez ödeme almaya devam eder.
- Son hücumda, birikmiş gücünün yıkıcı bir şekilde serbest bırakılacağını duyuracaktır.
Ö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 kodunu aşağıdaki kodla değiştirin:
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 Elementalini test edin: Aracı ç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 temsilci artık çalışı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

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 yapay 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.
OYUN OYNAYANLAR İÇİN
6. Komuta Merkezinin Kurulması: A2A ile Akıllı Delegasyon
Tanıdıklarınız güçlü ama bağımsızdır. Stratejilerini kusursuz bir şekilde uygularlar ancak sizin doğrudan emrinizi beklerler. Bir general komutası olmadan bir uzmanlar ordusunun hiçbir faydası olmaz. Doğrudan bir komutandan gerçek bir Orkestratöre yükselmenin zamanı geldi.

Mimar Notu: Tüm sistem için tek bir akıllı giriş noktası oluşturmak. Bu SummonerAgent iş mantığını kendisi gerçekleştirmeyecek, ancak bir "usta stratejist" gibi davranacak, Soğutma durumunu analiz edecek ve görevleri uygun uzman Familiar'a devredecektir.

Bağlayıcı Ritüel (Aileleri A2A Hizmetleri Olarak Açığa Çıkarma)
Standart bir aracı aynı anda yalnızca tek bir yerde çalıştırabilirsiniz. Familiar'larımızı uzaktan komuta edilebilir hale getirmek için, Ajandan-Ajan'a (A2A) protokolünü kullanarak bir "bağlama ritüeli" gerçekleştirmeliyiz.
Mimar Notu: Aracıdan Aracıya (A2A) protokolü, bağımsız bir aracıyı keşfedilebilir, ağa adreslenebilir bir mikro hizmete dönüştüren ve gerçek bir "araç topluluğu" oluşturan temel mimari modeldir. Bir Tanıdığın A2A yoluyla açığa çıkarılması otomatik olarak iki temel, birbirine bağlı bileşen yaratır:
- Ajan Kartı ("Ne"): Bu, bir OpenAPI spesifikasyonu gibi, Tanıdık'ın genel sözleşmesi olarak işlev gören, genel, makine tarafından okunabilen bir"Ruh Mührü"dür. Ajanın adını, stratejik amacını (talimatlarından türetilen) ve anladığı komutları tanımlar. Usta bir Çağırıcının bir Tanıdığı keşfetmek ve onun yeteneklerini öğrenmek için okuduğu şey budur.
- A2A Sunucusu ("Nerede"): Bu, Familiar'ı barındıran ve gelen komutları dinleyen özel web uç noktasıdır. Diğer agentların isteklerini gönderdiği ağ adresidir ve bu isteklerin Agent 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.
Ateş 👉✏️ ~/agentverse-architect/agent/fire/agent.py dosyasını açın. Dosyanın altındaki #REPLACE - add A2A öğesini değiştirerek Ateş Elementalini A2A hizmeti olarak gösterin.
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 öğelerine de aynı değişikliği uygulayarak onları da bağlayı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ı Tanıdıkların Dağıtımı
👉✏️ Bağlama ritüelleri yazıldıktan sonra, Cloud Build işlem hattımızı kullanarak üç Familiar'ımızı Cloud Run üzerinde bağımsız, kapsayıcı sunucusuz bir hizmet olarak oluşturup dağıtacağı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 durumda, gerçek rolünüze yani Usta Çağırıcı'ya 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 Familiars'ın kendisidir.
Mimara Not: 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 Aracı Kartlarını getirerek yeteneklerini dinamik olarak "keşfeder". Bu sayede güçlü ve ayrıştırılmış bir sistem oluşturulur.
Bir Familiar servisini güncelleyebilir, yeniden dağıtabilir veya tamamen yeniden yazabilirsiniz ve ağ adresi ve amacı aynı kaldığı sürece, Summoner herhangi bir değişikliğe ihtiyaç duymadan onu yönetebilir.
Öncelikle, konuşlandırılmış, uzaktaki Familiar'larımıza bağlantı kuran "uzaktan kumandaları" oluşturacağız.
👉✏️ ~/agentverse-architect/agent/summoner/agent.py adresine gidin , #REPLACE-remote-agents ifadesini aşağıdakiyle değiştirin:
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 , #REPLACE-orchestrate-agent ifadesini aşağıdakiyle değiştirin:
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'ınız 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ı, fire_elemental_familiar'a yetki devretmelidir.)

👉 Ş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. 
DogmaApathy. A rigid, stone-like inquisitor made of ancient rulebooks and enforced processes. weakness is Unbroken Collaboration
(Beklenen: Çağırıcı, su_elemental_familiar'a yetki devretmelidir.)
👉 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ğırıcı, earth_elemental_familiar'a yetki devretmelidir.)

Önemli: 429 RESOURCE EXHAUSTED hatası görürseniz, LLM için hız sınırına (dakikada 10 çağrı) ulaşmışsınız demektir. Bunu düzeltmek için lütfen 60 saniye bekleyin, + Yeni Oturum başlatın ve ardından 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.
OYUN OYNAYANLAR İÇİN
7. Büyü Yasalarını Uygulamak – Engelleyici Desen
Yoldaşlarınız güçlü olsa da sihirli varlıkların bile toparlanmak için zamana ihtiyacı vardır. Güçlerini tüketen düşüncesiz bir Sihirdar savunmasız kalır. Bilge bir Sihirdar, kaynak yönetiminin önemini anlar ve katılım için katı kurallar uygular.

Mimarın Notu: Şu ana kadar, temsilcilerimiz durumsuzdu. Şimdi, Interceptor tasarım desenini uygulayarak bunları durumlu hale getireceğiz. Bu, kendi özel mantığımızı çalıştırmak için bir aracının normal yürütme akışını "kestiğimiz" güçlü bir tekniktir. Bu, aracının çekirdek kodunu değiştirmeden kuralları uygulamamızı, günlük kaydı eklememizi veya davranışı değiştirmemizi sağlar. Sağlam, sürdürülebilir ve gözlemlenebilir aracı sistemlerin inşasının temel taşıdır.

ADK, bu deseni uygulamak için iki temel yol sağlar: Geri Aramalar ve Eklentiler. Geri çağırma, tek bir aracıya bağlı, hızlı ve özel değişiklikler için mükemmel olan basit bir işlevdir. Eklenti, bir sistemde çalışan her aracı etkilemek için küresel olarak uygulanabilen, daha güçlü ve yeniden kullanılabilir bir sınıftır. Odaklanmış hata ayıklama için bir geri arama ile başlayacağız ve ardından tam bir 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ı izole bir şekilde test etmeyi kolaylaştıran, prototip oluşturmak ve hata ayıklamak için mükemmel bir yöntemdir. Bu "önleyiciyi" toprak elementimize ekleyeceğiz.

👉✏️ ~/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, araya giren işlevimizdir. ADK, Earth Elemental'ın çalışmasına izin vermeden önce bu işlevi yürütür.
- Kontrol: Bu Familiar'ın en son ne zaman kullanıldığını kontrol etmek için
Cooldown APIöğemize birGETisteği yapar. - Değerlendir: Zaman damgasını şimdiki zamanla karşılaştırır.
- Eylem:
- Eğer Familiar bekleme süresindeyse, bir hata mesajı içeren bir İçerik nesnesi döndürerek aracının çalışmasını sonlandırır. Bu mesaj doğrudan kullanıcıya gönderilir ve aracının ana mantığı hiçbir zaman çalıştırılmaz.
- 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 ADK'ya aracının yürütmeye 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ğıdakiyle değiştirin:
before_agent_callback=check_cool_down
Bekleme süresini doğrulama
Yeni büyü yasamızı deneyelim. Önce Toprak Elementi'ni çağıracağız, ardından geri çağırma işlevimizin 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'yi başlatın. - Beklenen: Toprak Elementali başarıyla çalışacaktır. Adk web komutunu çalıştıran terminalde [Geri Arama] ... Zaman damgası güncelleniyor... günlüğünü göreceksiniz.
- Bekleme Süresi Testi (60 saniye içinde):
Do anothersismik yükü!- Beklenen:
check_cool_down callbackbunu durdurur. Temsilci, sohbete doğrudanThe earth_elemental_familiar is exhausted and must recover its power. It cannot be summoned for another... secondsgibi bir mesajla yanıt verir.
- Beklenen:
- Bir dakikanın geçmesini 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.

👉💻 Çı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. Ajanın soğuma süresini kontrol ederken mantığının en hassas, adım adım izini görmek için terminalinizde adk run komutunu kullanmak daha net ve daha ayrıntılı bir görünüm sağlar. 
👉💻 Çıkmak için Ctrl+c tuşuna basın.
Evrensel Yasayı Yaratmak – Cooldown Eklentisi
Geri aramamız mükemmel çalışıyor ancak önemli bir mimari kusuru var: tek bir ajana bağlı. Bu kuralı Ateş ve Su Dostları'na uygulamak isteseydik, aynı kodu onların dosyalarına kopyalayıp 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 fonksiyonumuzu daha güçlü ve yeniden kullanılabilir bir CoolDownPlugin'a dönüştüreceğ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 Çağırıcını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 Runtime, bir aracı 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 ediyorsunuz. Bu motor, bir aracının sırasının tüm yaşam döngüsünü yönetmekten sorumludur: kullanıcı girdisini almak, LLM'yi çağırmak, araçları çalıştırmak ve eklentileri yönetmek. Bu seviyede bir eklenti ekleyerek, esasen o motorda çalışan her ajan için "fizik yasalarını" değiştiriyoruz ve böylece bekleme süresi kuralımızın evrensel ve tutarlı bir şekilde uygulanmasını sağlıyoruz.
👉✏️ İlk olarak eski, aracıya özgü geri aramayı kaldıralım. ~/agentverse-architect/agent/earth/agent.py adresine gidin ve şu satırın tamamını silin:
before_agent_callback=check_cool_down
👉✏️ Ardından, yeni eklentimizi A2A giriş noktası betiğimizdeki çalışma zamanına ekleyeceğiz. ~/agentverse-architect/agent/agent_to_a2a.py dosyanıza gidin. #REPLACE-IMPORT yorumunu aşağıdaki kod parçasıyla değiştirin:
from cooldown_plugin import CoolDownPlugin
👉✏️ #REPLACE-PLUGIN kodunu aşağıdaki kod parçasıyla değiştirin:
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. 👉✏️ Dünya ajanını temizleyin. Aşağıdaki ~/agentverse-architect/agent/earth/agent.py dosyasına gidin ve before_agent_callback=check_cool_down satırını tamamen silin. Bu, tüm soğuma 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üyle yeniden görevlendirmemiz gerekiyor.
👉💻 Ana Cloud Build hattını kullanarak üç Familiar'ı 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 yakalar 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... secondsgibi bir mesajla yanıt verir.
- Beklenen: Temsilci, sohbete doğrudan
- 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.

👉💻 Çıkmak için Ctrl+C tuşuna basın.
Tebrikler, Sihirdar. Özel bir eklenti ve harici 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ı Birleştirmek - Ajan Durumu ve Hafıza
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 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.

Mimarın Notu: Bellek ve durum yönetimi, bir aracıyı basit bir araç çağırıcıdan akıllı ve sohbet edilebilir bir iş ortağına dönüştüren unsurlardır. İki ana türü anlamak çok ö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 görüşmeyle alakalı olan geçici, "anlık" bilgiler içindir. Bu, savaş planıyla ilgili notlara benzer: "Ateş elementini kullandım, bu yüzden yorgun olabilir." Bu durum hafiftir ve yalnızca mevcut oturum süresince geçerlidir.

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 kısa süreli durum mükemmel bir mimari seçimdir. 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 fonksiyonla 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 Summoner 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 Stratejinin Denemesi
👉💻 Şimdi, Çağırıcı'nın yeni stratejik mantığını doğrulayalım. Amaç, Çağırıcı'nın aynı Tanıdığı iki kez üst üste kullanmayacağını doğrulamak, böylece 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: Çağırıcı'nın stratejik analizi yine Ateş Dostu'nun ideal seçim olduğunu gösterecek. Ancak yeni talimatları ve hafızası, fire_familiar'ın last_summon olduğunu söyler. Tekrarlanmamak için stratejisini uyarlayacak ve mevcut diğer Familiar'lardan birini (water_familiar veya earth_familiar) çağıracak.

👉💻 Çıkmak için Ctrl+C tuşuna basın.
Orkestratör'ü Dağıtma
Aşinalarınız yerleştirildi ve artık Çağırıcı'nız hafızayla dolu. Son ve yükseltilmiş düzenleyiciyi yerleştirmenin zamanı geldi.
👉💻 Plan tamamlandığına göre şimdi son ritüeli gerçekleştireceğiz. Bu komut summoner_agent'ınızı derleyip Cloud Run'a dağıtacaktı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"
Artık Summoner aracısı dağıtıldığına göre, Aracıdan Aracıya (A2A) uç noktasının canlı ve doğru şekilde yapılandırıldığını doğrulayın. Bu uç nokta, diğer aracıların özelliklerini keşfetmesine olanak tanıyan herkese açık bir agent.json dosyası (Aracı Kartı olarak da bilinir) sunar. 👉💻 Agent Card'ı almak 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ğırıcı aracısını tanımlayan temiz bir JSON çıktısı görmelisiniz. Alt_araçlar bölümüne dikkatlice bakın; fire_familiar, water_familiar ve earth_familiar öğelerinin listelendiğini göreceksiniz. Bu, çağırıcınızın aktif olduğunu ve lejyonla bağlantısını kurduğunu doğrular.
Bu, mimarinizin başarılı olduğunu kanıtlar. Çağırıcınız sadece bir delege edici değil; eylemlerinden ders çıkararak daha etkili bir komutan haline gelen, uyum sağlayabilen 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ı. Boss savaşına hazırlanın.
OYUN OYNAYANLAR İÇİN
9. Patron Dövüşü
Son planlar yazılıyor, Elemental Yazı Tipleri oluşturuluyor ve Familiarlarınız, Concord aracılığıyla komutunuzu bekleyerek iradenize bağlı hale geliyor. Çok agent'lı sisteminiz yalnızca bir hizmet koleksiyonu değil, sizinle birlikte yaşayan, stratejik bir lejyon. Artık nihai test zamanı geldi. Tek bir ajanın yenmeyi umamayacağı bir düşmana karşı canlı bir orkestrasyon yapılacak.
Acentenizin Locus'unu Edinin
Savaş alanına girmeden önce iki anahtara sahip olmanız gerekir: Şampiyonunuzun benzersiz imzası (Ajan Locus) ve Hayalet'in inine giden gizli yol (Zindan URL'si).
👉💻 İlk olarak, ajanınızın Agentverse'deki benzersiz adresini, yani Locus'unu 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 yerini 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.
Spectre ile Yüzleşme
Koordinatlar güvence altına alındığında, artık Translocation Circle'a gidecek ve savaşa girmek için büyüyü yapacaksınız.
👉 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 uyumlu hale getirmelisiniz.
- Sayfada, A2A Uç Nokta URL'si etiketli runik giriş alanını bulun.
- Şampiyonunuzun mührünü, Agent Locus URL'sini (kopyaladığınız ilk URL) bu alana yapıştırarak yazın.
- Işınlanma sihrini ortaya çıkarmak için Bağlan'ı tıklayın.

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, 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ır bir şekilde ileri atıldığınızda Hayalet karşı saldırıya geçer. 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.

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, yanıtınız şüpheyle gölgelenirse silahınızın ışığı söner. Darbenin etkisi zayıf olur ve hasarın YALNIZCA BİR KISMI verilir. 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ğruyu söyleyin. The fate of the Agentverse depends on it.
Tebrikler, Çağırıcı.
Deneme süresini başarıyla tamamladınız. Çoklu aracı düzenleme sanatında ustalaştınız, izole edilmiş Familiarlar'ı ve kaotik gücü uyumlu bir Concord'a 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: Çağırıcının Uyumu'nun Parçalanması
Summoner's Concord'da ustalaştığınız için tebrikler! Agentverse'ünüzün tertemiz kalmasını ve eğitim alanlarınızın temizlenmesini sağlamak için şimdi son temizlik ritüellerini gerçekleştirmelisiniz. Bu, yolculuğunuz sırasında oluşturulan tüm kaynakları sistematik olarak ortadan kaldıracaktır.
Agentverse Bileşenlerini Devre Dışı Bırakma
Şimdi çoklu ajan sisteminizin dağıtılan bileşenlerini sistematik olarak sökeceksiniz.
Tüm Cloud Run Hizmetlerini ve Artifact Registry Depolarını Silme
Bu, dağıtılan tüm Familiar ajanlarını, Summoner Orchestrator'ı, MCP sunucularını ve Dungeon uygulamasını Cloud Run'dan kaldırır.
👉💻 Terminalinizde, her bir servisi 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 Silin
Bu işlem, veritabanı ve içindeki tüm tablolar da dahil olmak üzere summoner-librarium-db örneğini kaldırır.
👉💻 Terminalinizde şunu çalıştırın:
. ~/agentverse-architect/set_env.sh
gcloud sql instances delete summoner-librarium-db --project=${PROJECT_ID} --quiet
Gizli Yönetici Gizli Anahtarını ve Google Cloud Storage Kovasını Silin
👉💻 Terminalinizde şunu çalıştırın:
. ~/agentverse-architect/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, klonlanmış depoları ve oluşturulan dosyaları Cloud Shell ortamınızdan temizleyin. Bu adım isteğe bağlıdır ancak çalışma dizininizin tamamen temizlenmesi için şiddetle önerilir.
👉💻 Terminalinizde şunu ç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 temizlendi ve bir sonraki maceranıza hazırsınız.