SAY Realtime
실시간 AI 상담의 session lifecycle과 provider 경계를 안정화하고, translation·audio pipeline을 연결한 케이스.
- Role
- Co-Lead
- Scope
- Session Lifecycle
- Stack
- FastAPI · WebSocket
- Status
- 공동 주 기여
문제
Problem실시간 상담 session이 종료되지 않으면 zombie session이 남고 resource와 cost를 계속 사용할 수 있었다. reconnect가 기존 session 정리와 겹치면 race가 생기고, audio event 순서가 어긋나면 비동기 결과가 다른 turn에 연결될 위험도 있었다.
STT·LLM provider마다 인증, 언어 코드, 종료 조건이 달랐기 때문에 provider 차이를 runtime 전체로 퍼뜨리지 않으면서 WebSocket의 실시간성과 translation·audio 순서를 유지해야 했다.
결정
Decision연결 하나를 오래 유지하는 문제를 개별 예외 처리로 덮지 않고, session lifecycle과 provider boundary를 명시적인 runtime 경계로 만들었다.
- Lifecyclesession의 생성·전환·종료·GC를 lifecycle로 관리하고, reconnect race는 기존 session과 신규 연결의 경쟁을 이 경계에서 제한한다.
- Provider Boundaryprovider별 인증과 종료 semantics는 adapter가 소유하고, 상담 runtime은 공통 lifecycle 계약을 사용하도록 분리한다.
- Sequence Controlstaggered translation·audio pipeline과 sequence matching으로 비동기 결과가 다른 turn에 연결되지 않도록 흐름을 관리한다.
시스템
SystemWebSocket runtime이 session lifecycle을 소유하고, provider adapter와 translation·audio pipeline이 그 아래에서 순서를 관리하는 구조다.
WebSocket Session Runtime
생성·전환·종료·GC와 reconnect race를 명시적인 session lifecycle로 관리.
Provider Adapter
STT·LLM provider별 인증과 종료 차이를 adapter 경계 뒤로 격리.
Translation · Audio
staggered pipeline과 audio sequence matching으로 turn 순서를 관리.
Dashboard Boundary
structured output schema와 fallback, dashboard boundary test로 분석 연계를 고정.
운영 근거
Operating Evidencelifecycle·reconnect·provider adapter·translation/audio 변경과 structured output fallback, migration procedure, dashboard boundary test가 운영 근거로 남아 있다. public traffic·latency·availability 수치는 확인되지 않아 주장하지 않는다.