Geri Dönüş Sağlayıcıları ve Devre Kesiciler
Birincil sağlayıcı yavaş veya kullanılamaz olduğunda devre kesici deseniyle OpenAI'dan Anthropic'e, oradan da yerel bir modele otomatik olarak geçen bir sağlayıcı zinciri oluşturun.
Geri Dönüş Sağlayıcıları ve Devre Kesiciler, CoddyKit'te ücretsiz bir AI Engineering Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Engineering Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Engineering Academy kursu toplamda 4 dersten oluşur.
Tek Sağlayıcı Riski
Tek bir LLM sağlayıcısına güvenmek tek bir arıza noktası oluşturur. OpenAI, çözülmesi dakikalar ile saatler süren kesintiler yaşadı. Tüm uygulamanız GPT-4o'nun kullanılabilir olmasına bağlıysa, herhangi bir sağlayıcı olayı doğrudan kullanıcıya yansıyan hizmet kesintisine dönüşür. Geri dönüş sağlayıcısı stratejisi, birincil sağlayıcı başarısız olduğunda alternatif sağlayıcılara yönlendirerek hizmet sürekliliğini korur.
Sağlayıcı Zincirini Tanımlama
Sağlayıcı zinciri, sırayla denenen sağlayıcıların ve modellerin sıralı listesidir. Birincil sağlayıcı başarısız olduğunda veya zaman aşımına uğradığında sistem otomatik olarak bir sonraki sağlayıcıyı dener. Tipik bir zincir şöyle olabilir: OpenAI GPT-4o → Anthropic Claude 3.5 Sonnet → yerel olarak dağıtılmış bir Llama modeli. Her düzey bir geri dönüş seçeneğidir; yerel model ise devre dışı kalamayacak son çare olarak hizmet eder.
from dataclasses import dataclass
from typing import Optional
@dataclass
class Provider:
name: str
base_url: Optional[str]
api_key_env: str
model: str
priority: int # lower = higher priority
CASCADE = [
Provider('openai', None, 'OPENAI_API_KEY', 'gpt-4o', 1),
Provider('anthropic', 'https://api.anthropic.com/v1', 'ANTHROPIC_API_KEY', 'claude-3-5-sonnet', 2),
Provider('local', 'http://localhost:8000/v1', 'LOCAL_KEY', 'llama-3.1-8b-inst', 3),
]Geri Dönüş Döngüsünü Uygulama
Geri dönüş döngüsünü, zincir üzerinde yineleme yapan basit bir try/except olarak uygulayın. Geçici hataları (zaman aşımları, 500'ler, 503'ler) yakalayıp bir sonraki sağlayıcıya geçin. Kimlik doğrulama hatalarını (401) veya geçersiz istek hatalarını (400) yakalamayın; bunlar başka bir sağlayıcıya geçmek yerine hemen görünür olması gereken programlama hatalarıdır.
import openai
import os
TRANSIENT_ERRORS = (openai.APITimeoutError, openai.InternalServerError, openai.APIConnectionError)
async def call_with_fallback(messages: list, **kwargs) -> str:
for provider in CASCADE:
try:
client = openai.AsyncOpenAI(
api_key=os.environ[provider.api_key_env],
base_url=provider.base_url
)
resp = await client.chat.completions.create(
model=provider.model,
messages=messages,
timeout=10.0,
**kwargs
)
return resp.choices[0].message.content
except TRANSIENT_ERRORS as e:
print(f'Provider {provider.name} failed: {e}, trying next...')
raise RuntimeError('All providers failed')Devre Kesici Nedir
Devre kesici, bir kesinti sırasında başarısız olan bir hizmetin istek yağmuruna tutulmasını önler. Elektrik devre kesicilerinden esinlenen bu yapı üç duruma sahiptir: Kapalı (istekler normal biçimde geçer), Açık (istekler hemen reddedilir) ve Yarı Açık (hizmetin düzelip düzelmediğini denetlemek için tek bir sınama isteğinin geçmesine izin verilir). Bu, olaylar sırasında hem alt hizmeti hem de kendi uygulamanızı korur.
# Circuit breaker state machine:
#
# CLOSED --> (failure_count >= threshold) --> OPEN
# ^ |
# | (test_request succeeds) | (timeout expires)
# +------------ HALF_OPEN <-----------------+
#
# In OPEN state: immediately return fallback/error
# In HALF_OPEN: allow one request through to test recovery
# In CLOSED: normal operation, count failuresDevre Kesici Uygulama
Burada en basit hâliyle bir devre kesici uygulaması yer alıyor. Hata sayısını ve devrenin açıldığı zamanı izleyin. Hata sayısı eşiği aştığında devreyi açın. Yapılandırılabilir bir sıfırlama zaman aşımından sonra bir yoklama isteğine izin verin. Yoklama başarılı olursa devreyi kapatın. Başarısız olursa devreyi açık tutup zaman aşımını sıfırlayın.
import time
from enum import Enum
class State(Enum):
CLOSED = 'closed'
OPEN = 'open'
HALF_OPEN = 'half_open'
class CircuitBreaker:
def __init__(self, failure_threshold=5, reset_timeout=60):
self.state = State.CLOSED
self.failure_count = 0
self.failure_threshold = failure_threshold
self.reset_timeout = reset_timeout
self.opened_at = None
def record_success(self):
self.failure_count = 0
self.state = State.CLOSED
def record_failure(self):
self.failure_count += 1
if self.failure_count >= self.failure_threshold:
self.state = State.OPEN
self.opened_at = time.time()
def can_attempt(self) -> bool:
if self.state == State.CLOSED:
return True
if self.state == State.OPEN:
if time.time() - self.opened_at > self.reset_timeout:
self.state = State.HALF_OPEN
return True # allow one probe
return False
return True # HALF_OPEN: allow probeDevre Kesicileri Sağlayıcılarla Tümleştirme
Her sağlayıcı için bir devre kesiciyi koruyun. Bir sağlayıcıyı çağırmadan önce devre kesicisinin denemeye izin verip vermediğini denetleyin. Her çağrıdan sonra başarıyı veya başarısızlığı kaydedin. Bir sağlayıcının devresi açıldığında geri dönüş döngüsü bu sağlayıcıyı doğal olarak atlar ve her çağrıda zaman aşımını beklemeden zincirdeki bir sonraki sağlayıcıyı dener.
breakers = {p.name: CircuitBreaker(failure_threshold=5, reset_timeout=60) for p in CASCADE}
async def call_with_circuit_breaker(messages: list) -> str:
for provider in CASCADE:
breaker = breakers[provider.name]
if not breaker.can_attempt():
continue # skip this provider, circuit is open
try:
result = await call_provider(provider, messages)
breaker.record_success()
return result
except TRANSIENT_ERRORS as e:
breaker.record_failure()
print(f'{provider.name} failed ({breaker.failure_count}/{breaker.failure_threshold})')
raise RuntimeError('All providers exhausted')Yavaş Çağrıları Hata Olarak Algılama
30 saniyede yanıt veren bir sağlayıcı, kullanıcı deneyimi açısından tamamen devre dışı bir sağlayıcı kadar kötüdür. Her sağlayıcı çağrısı için zaman aşımını düşük bir değere ayarlayın ve zaman aşımı istisnalarını devre kesicide hata olarak ele alın. 10 saniyelik bir zaman aşımı, geri dönüşün yeterince hızlı devreye girmesini sağlar; böylece kullanıcı takılı kalmış bir ekran yerine yalnızca kısa bir gecikme görür.
async def call_provider(provider: Provider, messages: list) -> str:
client = openai.AsyncOpenAI(
api_key=os.environ[provider.api_key_env],
base_url=provider.base_url
)
try:
resp = await asyncio.wait_for(
client.chat.completions.create(model=provider.model, messages=messages),
timeout=10.0 # fail fast, let circuit breaker count it
)
return resp.choices[0].message.content
except asyncio.TimeoutError:
raise openai.APITimeoutError('Provider timed out')Sağlayıcı Sağlığı Panosu
Her sağlayıcının mevcut devre kesici durumunu; hata sayısı, durum (kapalı/açık/yarı açık) ve sıfırlamaya kalan süreyle birlikte gösteren bir /health/providers uç noktası sunun. Bu, bir olay sırasında hangi sağlayıcıların sağlıklı olduğunu bir bakışta görmeyi kolaylaştırır ve sıfırlamayı elle zorlayıp zorlamamaya veya otomatik kurtarmayı beklemeye karar vermenize yardımcı olur.
from fastapi import FastAPI
app = FastAPI()
@app.get('/health/providers')
def provider_health():
return {
name: {
'state': cb.state.value,
'failure_count': cb.failure_count,
'seconds_until_reset': (
max(0, cb.reset_timeout - (time.time() - cb.opened_at))
if cb.state == State.OPEN else None
)
}
for name, cb in breakers.items()
}Sağlayıcı Çıktılarını Uyumlu Hâle Getirme
Farklı sağlayıcıların yanıt biçimleri, güvenlik filtreleri ve yetenekleri farklıdır. GPT-4o'dan Claude'a geçerken model, GPT-4o'nun yanıtlayacağı bazı istekleri reddedebilir. İstemlerinizi her sağlayıcının kurallarına uyarlayan sağlayıcıya özgü istem sarmalayıcıları bulundurun. Kullanım durumunuz için kabul edilebilir çıktı ürettiğinden emin olmak üzere her geri dönüş sağlayıcısını bağımsız olarak sınayın.
def adapt_messages_for_provider(provider: Provider, messages: list) -> list:
if provider.name == 'anthropic':
# Claude prefers explicit task descriptions
system = next((m['content'] for m in messages if m['role'] == 'system'), '')
if 'JSON' not in system:
messages = [{'role': 'system', 'content': system + ' Respond in JSON.'}] + [
m for m in messages if m['role'] != 'system'
]
return messagesGeri Dönüş Davranışını Sınama
Birincil sağlayıcıyı (geçersiz bir API anahtarı sağlayarak veya hata fırlatan bir benzetim kullanarak) başarısız olmaya zorlayan ve geri dönüşün devreye girerek geçerli bir yanıt döndürdüğünü doğrulayan bir test yazın. Ayrıca devre kesicinin yapılandırılan hata sayısından sonra doğru şekilde açıldığını ve sıfırlama zaman aşımından sonra kurtulduğunu sınayın. Hiç sınanmamış geri dönüş mantığı gerçek bir kesintide güvenilmezdir.
import pytest
from unittest.mock import AsyncMock, patch
@pytest.mark.asyncio
async def test_fallback_on_primary_timeout():
# Primary provider times out
with patch('your_module.call_provider', side_effect=[
openai.APITimeoutError('Timeout'), # primary fails
'Claude response' # fallback succeeds
]):
result = await call_with_circuit_breaker([{'role': 'user', 'content': 'Hello'}])
assert result == 'Claude response'Sağlayıcı Zincirlerinde Maliyet Hususları
Yedek sağlayıcıların fiyatlandırması çoğu zaman birincil sağlayıcınızdan farklıdır. Anthropic Claude, model katmanına bağlı olarak OpenAI GPT-4o’dan daha pahalı veya daha ucuz olabilir. Her isteğe hangi sağlayıcının yanıt verdiğini izleyin ve maliyet dağılımını ayrı ayrı hesaplayın. Yedek sağlayıcı sürekli olarak daha pahalıysa birincil sağlayıcının yetersiz kaynakla çalışıp çalışmadığını ve daha yüksek bir hız sınırı katmanına geçmenin sık yedek sağlayıcı kullanımından daha uygun maliyetli olup olmayacağını araştırın.
# Approximate costs per 1M tokens (2026):
PROVIDER_COSTS = {
'openai/gpt-4o': {'input': 2.50, 'output': 10.00},
'anthropic/claude-3.5-sonnet': {'input': 3.00, 'output': 15.00},
'openai/gpt-4o-mini': {'input': 0.15, 'output': 0.60},
'local/llama-3.1-8b': {'input': 0.00, 'output': 0.00}, # infra cost only
}
# If fallback adds $0.50/day and a Tier 2 upgrade costs $100/month:
# Tier 2 pays off if you use fallback > 200 requests/dayKısa Kontrol
Devre kesiciler ve yedek sağlayıcılar hakkındaki anlayışınızı sınayın.
Ders Özeti
Bu derste şunları öğrendiniz: sağlayıcı zincirleri, birincil sağlayıcılardan yedek LLM sağlayıcılarına uzanan sıralı bir yedekleme dizisi tanımlar; devre kesiciler, belirli bir hata eşiğine ulaşıldığında hızlıca kısa devre yaparak arızalı bir sağlayıcıya tekrar tekrar istek gönderilmesini önler; sağlayıcı başına zaman aşımı değerleri ise yavaş çağrıların kullanıcıları bekletmek yerine hızlıca yedek sağlayıcıya geçmesini sağlar. Sırada zaman aşımı bütçelerini ayarlayıp zarif gerileme uygulayacağız.
Yapay zeka eğitmeniyle Python öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 30
- Dersler
- 120
Sıkça Sorulan Sorular
“Geri Dönüş Sağlayıcıları ve Devre Kesiciler” dersi ücretsiz mi?
Evet — “Geri Dönüş Sağlayıcıları ve Devre Kesiciler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Engineering Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Engineering Academy kursu toplamda 4 dersten oluşur.
“Geri Dönüş Sağlayıcıları ve Devre Kesiciler” dersinde ne öğreneceğim?
Birincil sağlayıcı yavaş veya kullanılamaz olduğunda devre kesici deseniyle OpenAI'dan Anthropic'e, oradan da yerel bir modele otomatik olarak geçen bir sağlayıcı zinciri oluşturun. AI Engineering Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
AI Engineering Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te AI Engineering Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Geri Dönüş Sağlayıcıları ve Devre Kesiciler” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu AI Engineering Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her AI Engineering Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- LLM Gecikmesini Ölçme: TTFT ve TPOT
- Yük Dengeleme ve Birden Çok Anahtar Stratejileri
- Geri Dönüş Sağlayıcıları ve Devre Kesiciler
- Zaman Aşımı Bütçeleri ve Zarif Bozulma