피드로 돌아가기
One SSE stream, seven LLM providers: giving a Next.js app a single streaming code path
Dev.toDev.to
Backend

7종 LLM API를 단일 SSE 인터페이스로 통합한 추상화 레이어 설계

One SSE stream, seven LLM providers: giving a Next.js app a single streaming code path

Ike Li2026년 6월 13일9intermediate

Context

LLM 제공자별로 상이한 Streaming 프로토콜(SSE, NDJSON)과 데이터 스키마로 인해 클라이언트단에 복잡한 분기 로직과 다수의 파서가 발생하는 문제 직면. 제공자 추가 시마다 유지보수 비용이 증가하는 확장성 한계 존재.

Technical Solution

  • 각 제공자의 응답을 순수 텍스트 델타만 반환하는 Async Generator로 모델링하여 데이터 추출 로직 분리
  • Generator를 createSSEStream 래퍼로 감싸 공통 Wire Format(delta, error, [DONE])을 보장하는 단일 SSE 스트림으로 변환
  • finally 블록 내에 termination 시그널([DONE]) 전송 로직을 배치하여 업스트림 장애 시에도 클라이언트 행(Hang) 현상 방지
  • OpenAI 호환 API(Mistral, Groq, Azure)를 단일 구현체로 통합하고 특이 케이스(Anthropic, Ollama)만 개별 파서를 적용하는 계층적 추상화 수행
  • BYOK(Bring Your Own Key) 방식을 통한 백엔드 Secrets 관리 및 저장소 오버헤드 제거

- 서로 다른 외부 API 통합 시 '데이터 추출(Generator)'과 '전송 규격(Wrapper)'을 분리하여 설계했는가 - 스트림 종료 보장을 위해 try-catch-finally 구조를 통한 Termination 시그널 전송을 구현했는가 - 공통 인터페이스를 가진 서비스들을 하나의 구현체로 묶고 예외 케이스만 특수화하는 패턴을 적용했는가

원문 읽기