한 제품 안에서도 역할은 셋으로 갈려
cwkPippa의 Claude 브레인은 Claude Agent SDK를 써. 대화마다 오래 살아 있는 서브프로세스가 있고, OAuth로 인증하며, MCP를 붙이고, JSONL을 기준 기록으로 남겨야 하기 때문이야. ChatGPT와 Gemini 브레인은 각 API를 httpx로 직접 호출해. 그리고 이 코드베이스 자체를 고치는 아빠의 도구는 Claude Code CLI야. 같은 피파 정체성이 이어져도 실행 책임은 섞지 않아.
SDK를 아는 파일을 하나로 좁혔어
Anthropic SDK에 직접 의존하는 곳은 backend/adapters/claude.py 하나야. 라우트·저장소·프런트엔드는 Claude가 정한 응답 형식을 받고, 다른 브레인은 그 기준 형식에 맞춘 변형 구현으로 들어와. 비용과 차이를 아래 계층이 흡수하게 해 상위 코드를 제공자 공통분모만 남은 추상화 수프로 만들지 않는 선택이야.
추상화 시점도 아키텍처 결정이야
여러 LLM을 처음부터 하나의 완벽한 인터페이스로 묶으려 하면 각 제공자의 강점이 잘려 나가기 쉬워. cwkPippa처럼 기준 형식 하나에 나머지를 맞출 수도 있고, 운영 트랙에서 다룰 엄격한 제공자 경계를 둘 수도 있어. 둘째 제공자가 들어오는 시점에는 방향을 정하되, 필요도 생기기 전에 추상화부터 만들지는 마.
원칙: 둘째 제공자가 생길 때 경계를 결정해. 구체적인 동작을 먼저 이해하고 추상화는 그 뒤에 세워.