본문 바로가기
C.W.K.
Stream
Lesson 04 of 07 · published

Fallback Chains — 다른 failure mode 다른 path

~22 min · fallback, reliability

Level 0Tokenizer
0 XP0/54 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

cwkPippa brain fallback은 task마다 Codex → Claude → Gemini 순서로 시도하고 필요하면 task별로 바꿀 수 있어. provider마다 성능이 떨어지는 시간이 서로 달라서 chain이 한 곳의 장애를 흡수해.

같은 provider 재시도만으로는 부족해

provider 장애는 한 요청만의 우연한 실패가 아닐 수 있어. Claude가 degraded된 시간에 Claude를 다섯 번 다시 부르면 같은 이유로 모두 실패할 가능성이 커. 다른 provider로 넘어가야 독립된 복구 경로가 생겨.

한 provider 안에서도 다른 failure mode를 나눠

  • native vision + Read-tool fallback — 모델의 vision degradation을 막아.
  • OAuth + API-key — identity layer 장애를 막아.
  • SQLite + JSONL — query store 손상을 복구해.

각 쌍은 다른 실패 원인을 방어하려고 의도적으로 존재해. 중복처럼 보인다고 하나를 없애면 single point of failure가 생겨.

try_chain helper로 정책을 한곳에 모아

try_chain(providers, op)에서 provider마다 timeout을 두고 차례로 시도한 뒤 모두 실패하면 원인을 모은 error를 반환해. 일부러 불안정한 중간 provider를 넣어 chain이 실제로 넘어가는지 시험해.

Code

2-of-2: native vision + Read-tool fallback·python
class FallbackAdapter(LLMAdapter):
    """Try each adapter in order, falling back on 429/503 errors."""
    def __init__(self, adapters: list[tuple[LLMAdapter, str]]):
        self.adapters = adapters  # (adapter, model_name) pairs

    async def stream(self, messages, tools=None, model=None):
        last_exc = None
        for adapter, model_name in self.adapters:
            try:
                async for chunk in adapter.stream(messages, tools, model or model_name):
                    yield chunk
                return  # Success — stop trying
            except httpx.HTTPStatusError as e:
                if e.response.status_code in (429, 503):
                    logger.warning(f"Falling back from {model_name}: HTTP {e.response.status_code}")
                    last_exc = e
                    continue
                raise  # Non-retriable error — propagate
        raise last_exc

# Usage:
fallback = FallbackAdapter([
    (OpenAIAdapter(model="gpt-5.4"), "gpt-5.4"),      # primary
    (OpenAIAdapter(model="gpt-4.1"), "gpt-4.1"),      # secondary
    (OpenAIAdapter(model="gpt-4o-mini"), "gpt-4o-mini"), # tertiary
])

External links

Exercise

provider별 timeout을 두고 차례로 시도하며 모두 실패하면 원인을 모은 error를 내는 try_chain(providers, op) helper를 만들어. 일부러 불안정한 중간 provider로 시험해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.