한 interface, 많은 모델
Adapter 패턴이 provider-specific 모양을 single interface 뒤에 숨김. Application 코드는 adapter.generate_stream(messages) 호출; adapter 가 어느 API hit, request 어떻게 포맷, response 어떻게 normalize 알고 있음.
왜 신경 써
- App 코드 안 바꾸고 모델 swap — 한 줄 바꿔서 Gemini → OpenAI → 로컬 Ollama flip.
- Fallback chain 빌드 — Gemini 가 에러 나면 OpenAI, 그 다음 로컬 시도. Chain 이 adapter 의 list.
- Provider A/B 테스트 — 같은 interface 뒤에 새 모델로 트래픽 10% 라우팅.
- Prompt 포맷 번역 — provider 별 quirk (system prompt 위치, tool-call 모양, role 이름) 위에 abstract.
Abstraction line 어디 그리나
좁게. Streaming generate 호출 (그리고 maybe tool loop) 만 abstract. 모든 provider feature — file API, caching, embedding — 을 unified interface 로 abstract 시도 X. Over-broad abstraction 비용은 새 provider 마다 shoehorn 필요. Seam 을 generate_stream 에 두고 provider-specific feature 가 provider-specific 으로 살게.