Two valid patterns, one wrong move
For multi-provider systems, two patterns are valid: (1) provider port — a narrow ABC over the streaming API, every provider implements it, downstream code stays neutral; or (2) canonical-shape variants — pick one provider as canonical, others specialize downstream. Both ship; both survive. The wrong move is generalizing prematurely on day one with one provider.
cwkPippa picked variants
cwkPippa's adapter ABC is intentionally narrow — only the streaming-turn boundary. Routes, store, and frontend assume Claude shape. ChatGPT, Gemini, and Ollama brains are variants, not peers. This is Rule 2 from cwkPippa's architecture: cost is absorbed downstream, never pushed upstream. The result is fewer abstractions and more direct code, at the cost of needing a canonical decision early.
When to choose port instead
If your providers are genuinely interchangeable (same capabilities, same cost shape, swappable mid-traffic), a strict port pays off — you can A/B providers, fail over cleanly, and bring up new ones without touching downstream code. If they are not interchangeable (one has prompt caching, another has agent harness, another is local-only), variants will serve you better.