프로덕션급 LLM 도구 개발에서 배운 멀티 어댑터 패턴과 신뢰성 설계
LLMMixer라는 멀티 LLM 워크플로우 도구를 v0.3으로 업그레이드하면서 프로덕션 환경에서 돌릴 수 있는 수준까지 안정성을 끌어올렸다. 이 과정에서 Claude, Codex, Gemini 같은 서로 다른 LLM API를 하나의 일관된 인터페이스로 묶는 어댑터 패턴과 실시간 터미널 연동, 세션 관리 등 복잡한 상태를 다루는 방법을 정리했다. 배경:...

Source: DEV Community
LLMMixer라는 멀티 LLM 워크플로우 도구를 v0.3으로 업그레이드하면서 프로덕션 환경에서 돌릴 수 있는 수준까지 안정성을 끌어올렸다. 이 과정에서 Claude, Codex, Gemini 같은 서로 다른 LLM API를 하나의 일관된 인터페이스로 묶는 어댑터 패턴과 실시간 터미널 연동, 세션 관리 등 복잡한 상태를 다루는 방법을 정리했다. 배경: 무엇을 만들고 있는가 LLMMixer는 여러 LLM을 조합해서 복잡한 작업을 자동화하는 워크플로우 엔진이다. 사용자가 "이 코드를 리팩토링하고 테스트도 짜줘"라고 하면, Claude가 분석하고 Codex가 구현하고 Gemini가 검토하는 식으로 각 모델의 강점을 활용한다. 지금까지는 MVP 수준이었는데, 실제 개발 환경에 통합하려니 여러 문제가 터졌다. API 호출이 실패하면 전체가 멈추고, 터미널 명령어 실행이 불안정하고, 여러 세션이 꼬이는 문제들이다. 이번 작업의 목표는 이런 문제들을 해결해서 실제로 쓸 수 있는 도구로 만드는 것이었다. 멀티 LLM 어댑터 패턴과 장애 처리 각 LLM의 특성을 하나의 인터페이스로 통합하기 Claude, Codex, Gemini는 각각 다른 API 구조와 응답 형식을 가진다. 이걸 일일이 처리하면 워크플로우 엔진이 복잡해진다. 해결책은 공통 어댑터 패턴이다. abstract class BaseLLMAdapter { abstract processRequest(prompt: string, options: RequestOptions): Promise<LLMResponse> abstract handleStreaming(callback: StreamCallback): void abstract validateResponse(response: any): boolean } 각 LLM별로 이 인터페이스를 구현하되, 핵심은 실패 시나리오를 어댑터 레벨에서 처리하는 것이다. Claude API가 rate limit에 걸리면 자동으로 Gemini로 fallback하고, Codex가 응답