
Stack Overflow’daki “RateLimitError” ve “MaxTokensError” hatalarını aldınız ve dokümantasyondaki basit retry çözümleri işe yaramadı mı? LangChain, CrewAI veya AutoGen ile multi-agent sistemlerinizi production’a aldığınızda zincirleme çökmeler, bütçe erimesi ve sistem kilitlenmeleriyle karşılaşıyorsanız yalnız değilsiniz. Bu makalede, LLM’lerin deterministik olmayan doğasıyla birleşen cascading failure sorununa karşı production-ready Circuit Breaker ve Rollback mekanizmasını derinlemesine ele alıyoruz.
Multi-agent sistemlerinde bağımlılık zinciri doğrusaldır. Bir ajan (örneğin Ajan A) RateLimitError aldığında veya ContextWindowExceeded hatası verdiğinde, ona bağlı Ajan B ve C ne yapacağını bilemez. Bozuk girdiyle çalışan ajanlar sonsuz döngüye girer, hatalı veriyi tekrar tekrar işler ve tüm orkestrasyon hattını (state graph) kilitler.
Dokümantasyonlar genellikle max_retries=3 ve time.sleep() önerir. Ancak bunlar zincirleme çökmeleri (cascading failures) engelleyemez.
Aşağıdaki yaklaşım, asenkron multi-agent mimarilerine doğrudan entegre edilebilecek state yönetimli bir Circuit Breaker tasarımıdır. (Makalede belirtilen kod örneği projenize göre uyarlanabilir.)
Bu yapı:

import time import logging from typing import Callable, Any, Dict, List
logging.basicConfig(level=logging.INFO, format=”%(asctime)s - %(levelname)s - %(message)s”) logger = logging.getLogger(“GlobalAIOrchestrator”)
class CircuitBreakerOpenException(Exception): """Circuit Breaker AÇIK (Sistem korumada) olduğunda fırlatılan özel hata.""" pass
class MultiAgentCircuitBreaker: def init(self, failure_threshold: int = 3, recovery_timeout: float = 10.0): self.failure_threshold = failure_threshold # Kaç hatadan sonra devre kesilecek? self.recovery_timeout = recovery_timeout # Devrenin açık kalma süresi (saniye) self.failure_count = 0 self.state = “CLOSED” # CLOSED (Normal), OPEN (Hatalı/Korumada), HALF-OPEN (Test) self.last_state_change = time.time() self.state_history: List[Dict[str, Any]] = [] # Rollback için geçmiş durum havuzu
def save_state(self, agent_name: str, payload: Dict[str, Any]):
"""Ajanların kararlı durumlarını (State) rollback için hafızaya kaydeder."""
self.state_history.append({
"timestamp": time.time(),
"agent_name": agent_name,
"payload": payload.copy()
})
logger.info(f"[State Checkpoint] '{agent_name}' için son başarılı durum hafızaya alındı.")
def rollback(self) -> Dict[str, Any]:
"""Sistem çöktüğünde bir önceki en kararlı ajanın durumuna geri döner."""
if len(self.state_history) < 2:
logger.warning("[Rollback Başarısız] Geri dönülecek geçmiş veri yok! Başlangıç noktasına dönülüyor.")
return {}
# Son hata veren/patlayan durumu temizle, bir önceki doğrulanmış başarılı durumu al
self.state_history.pop()
last_stable = self.state_history[-1]
logger.error(f"[ROLLBACK TETİKLENDİ] Otomatik olarak '{last_stable['agent_name']}' durumuna geri çekiliyor!")
return last_stable["payload"]
def __call__(self, agent_func: Callable, agent_name: str, payload: Dict[str, Any], *args, **kwargs):
current_time = time.time()
# 1. Devre OPEN (Açık) ise ve recovery süresi dolmadıysa LLM'e istek atmayı engelle
if self.state == "OPEN":
if current_time - self.last_state_change > self.recovery_timeout:
self.state = "HALF-OPEN"
logger.warning(f"[{self.state}] Devre test moduna alındı. Sınırlı istek trafiğine izin veriliyor...")
else:
logger.error(f"[{self.state}] Kritik Hata Limiti Aşıldı! LLM isteği engellendi. Sistem koruma modunda.")
raise CircuitBreakerOpenException(f"'{agent_name}' çağrısı reddedildi. Devre şu an OPEN konumunda.")
try:
# Mevcut durumu yedekle (İşlem başarılı olursa zincirde kalıcı olacak)
self.save_state(agent_name, payload)
# Ajanı tetikle (Gerçek LLM API çağrısı veya agent logic burada çalışır)
result = agent_func(payload, *args, **kwargs)
# Başarılı ise hata sayacını sıfırla ve devreyi kapat
if self.state in ["OPEN", "HALF-OPEN"]:
logger.info(f"[CLOSED] Sistem tamamen iyileşti. Devre kapatıldı, trafik normale döndü.")
self.failure_count = 0
self.state = "CLOSED"
return result
except Exception as e:
self.failure_count += 1
logger.error(f"[AJAN HATASI] '{agent_name}' başarısız oldu! Sayaç: {self.failure_count}/{self.failure_threshold}. Hata: {e}")
# Eşik değeri aşıldıysa devreyi AÇ ve trafiği kilitle
if self.failure_count >= self.failure_threshold:
self.state = "OPEN"
self.last_state_change = time.time()
logger.critical(f"[OPEN] ARDIL ÇÖKME TESPİT EDİLDİ! Devre AÇIK konumuna getirildi. LLM çağrıları durduruldu.")
# Otomatik Rollback mekanizmasını çalıştır ve güvenli durumu geri döndür
safe_payload = self.rollback()
return {"status": "fallback_activated", "safe_data": safe_payload, "error": str(e)}
def mock_llm_agent(payload: Dict[str, Any], should_fail: bool = False): """Gerçek bir LLM/API çağrısını simüle eden fonksiyon.""" if should_fail: raise RuntimeError(“OpenAI API 429: Rate Limit Exceeded!”) payload[“step”] += 1 return {“status”: “success”, “data”: payload}
circuit_breaker = MultiAgentCircuitBreaker(failure_threshold=2, recovery_timeout=4) app_state = {“step”: 0, “context”: “Global_Veri_Kumesi”}
print(“\n=== FAZ 1: Kararlı Çalışma Akışı ===”) app_state = circuit_breaker(mock_llm_agent, “Veri_Yazar_Ajani”, app_state, should_fail=False)[“data”] app_state = circuit_breaker(mock_llm_agent, “Semantik_Editor_Ajani”, app_state, should_fail=False)[“data”]
print(“\n=== FAZ 2: İlk Hata ve Otomatik Rollback Aktivasyonu ===“)
response = circuit_breaker(mock_llm_agent, “Gorsek_Analiz_Ajani”, app_state, should_fail=True)
print(“\n=== FAZ 3: Eşik Aşımı ve Devrenin Tamamen Açılması (Koruma) ===“)
response2 = circuit_breaker(mock_llm_agent, “Gorsek_Analiz_Ajani”, app_state, should_fail=True) try: response3 = circuit_breaker(mock_llm_agent, “Gorsek_Analiz_Ajani”, app_state, should_fail=True) except CircuitBreakerOpenException as ex: print(f”\n[YAKALANAN GÜVENLİK İSTİSNASI]: {ex}”)

Çoklu ajan orkestrasyonlarında yaşanan tıkanıklıkların temel nedenleri:
Durum Bağımlılığı ve Veri Zehirlenmesi
Ajanlar doğal dil çıktılarını birbirine context olarak aktarır. Bozuk çıktı bir sonraki prompt’a girdiğinde halüsinasyon veya kod seviyesinde çökmeler (KeyError, TypeError) tetiklenir.
Kısa Süreli Hafıza Dağılması
Ortak Buffer Memory veya State Graph’e hatalı veri yazıldığında sistem kalıcı olarak kararsızlaşır.
İş Parçacığı Tıkanması (Thread Pool Exhaustion)
Senkron retry’ler thread’leri bloke eder ve büyük ölçekli concurrent sistemlerde gateway kilitlenmesine yol açar.
Circuit Breaker, LLM sağlayıcısının çöktüğünü algıladığı anda zinciri kırar. Rollback ise sistemi doğrulanmış son başarılı duruma geri getirir. Bu sayede sistem çökmek yerine resilience kazanır ve operasyon kesintisiz devam eder.
Siz kendi multi-agent mimarinizde state management’ı bellekte mi yoksa Redis/PostgreSQL gibi harici store’larda mı tutuyorsunuz? Deneyimlerinizi yorumlarda paylaşın.
Üretim ortamında sürdürülebilir multi-agent AI sistemleri için basit retry’lerden öteye geçmek şart. Circuit Breaker ve Rollback mekanizmaları, cascading failure’ları önleyerek sisteminizi daha robust ve maliyet-etkin hale getirir. Bu pattern’leri projenize entegre ederek LLM tabanlı orkestrasyonlarınızı production seviyesine taşıyabilirsiniz.
Sıkça Sorulan Sorular
Multi-agent sistemlerde Circuit Breaker ne işe yarar?
Circuit Breaker, RateLimitError gibi hatalarda istek akışını anında keserek zincirleme çökmeleri önler.
Rollback mekanizması neden gereklidir?
Hatalı verinin yayılmasını engeller ve sistemi son kararlı duruma güvenli şekilde geri döndürür.
Basit retry mekanizmaları yeterli değil mi?
Hayır. Multi-agent bağımlılıklarında cascading failure yaratır.
Hangi framework’lerle uyumludur?
LangChain, CrewAI, AutoGen ve LangGraph ile entegre edilebilir.
State yönetimi için ne önerilir?
Kurumsal projelerde Redis veya PostgreSQL gibi harici state store’lar tercih edilmelidir.
İlgili Diğer Yazılar: