Adapter ABC 디자인의 유혹 — 모든 provider feature 노출 (chat(), stream(), embed(), transcribe(), generate_image()). 저항해. Narrow ABC 1 method (stream(messages, tools) -> AsyncIterator[Event]) 가 모든 provider 를 평등하게 + provider-specific 부분이 implementation 으로 내려감.
왜 narrow?
ABC 가 leaky 하면 provider 차이가 routes/store/frontend 까지 transmit. 1 method 면 wire 차이만 implementation 에서 처리, downstream 코드는 provider-agnostic.
Event protocol
Adapter 가 yield 하는 Event 는 typed — TextDelta, ToolCallRequested, ToolCallArguments, Done, Error. Consumer (orchestrator, frontend) 가 type 으로 dispatch. 새 provider 추가 = 새 implementation, 기존 consumer 코드 0 변경.
cwkPippa 의 Adapter ABC
backend/adapters/base.py 가 정확히 이 shape — 1 ABC, 1 streaming method, Event protocol. Codex/Gemini/Ollama vessel 은 backend/variants/ 에서 specialize. Routes, store, frontend 는 모두 Claude shape 가정. Rule 2 — cost is absorbed downstream, not pushed upstream.
Adapter(ABC) 정의 — 1 method async def stream(messages, tools) -> AsyncIterator[Event]. OpenAIAdapter 구현. FakeAdapter (scripted event yield) 를 swap 한 unit test 로 consumer 코드가 provider-agnostic 임을 verify.
Progress
Progress is local-only — sign in to sync across devices.