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

여러 제공업체를 위한 어댑터 방식

~14 min · providers, adapter

Level 0수련생
0 XP0/100 lessons0/14 achievements
0/120 XP to next level120 XP to go0% complete

좁은 경계 하나에 여러 구현을 연결해

전체 기술 묶음을 다시 쓰지 않고 여러 제공업체를 다루려면 스트리밍 호출 표면만 담는 어댑터 인터페이스를 만들고 제공업체별로 구현해. 분기, 저장, 화면은 어댑터를 부를 뿐 SDK를 직접 부르지 않아.

어댑터가 맡을 것

  • 시스템 프롬프트, 메시지, 도구, tool_choice, 샘플러, max_tokens, 선택적 추론 예산을 받는 스트리밍 호출.
  • 토큰 조각, 도구 호출 조각, 종료 이유, 사용량 자료를 내보내는 사건.
  • 429, 5xx, 콘텐츠 정책 거절을 공통 오류로 바꾸는 일.

어댑터가 맡지 않을 것

  • 분기, 대화 기록, RAG 같은 애플리케이션 로직.
  • 저장.
  • 사용자 화면.

어댑터는 좁게 유지해. 모든 것을 추상화하고 싶은 유혹을 참아. cwkPippa도 backend/adapters/base.py에서 이 방식을 써.

Code

최소 어댑터 인터페이스 개요·python
class Adapter(Protocol):
    async def stream(
        self,
        *,
        system: str,
        messages: list[Message],
        tools: list[Tool] | None = None,
        tool_choice: ToolChoice = "auto",
        temperature: float = 0.2,
        max_tokens: int = 1024,
        thinking_budget: int | None = None,
    ) -> AsyncIterator[Event]:
        ...

class ClaudeAdapter:
    async def stream(self, **kw) -> AsyncIterator[Event]:
        ...  # talks to anthropic SDK

class OpenAIAdapter:
    async def stream(self, **kw) -> AsyncIterator[Event]:
        ...  # talks to openai SDK

class GeminiAdapter:
    async def stream(self, **kw) -> AsyncIterator[Event]:
        ...  # talks to gemini SDK

Exercise

코드베이스에 스트리밍 호출 표면만 담는 어댑터 인터페이스를 그려봐. 제공업체 두 곳에 구현하고 나머지 코드가 바뀌지 않았는지 확인해.

Progress

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

댓글 0

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

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