콘텐츠로 이동

대화·분석 조회

대화의 쓰기와 읽기는 서비스 경계로 분리됩니다. Socket Backend가 실시간 세션 중 대화, 메시지, 감정·치매·우울·음성 바이오마커, 요약과 음성 메타데이터를 기록하고 App Backend는 공유 PostgreSQL에서 조회 모델을 조합합니다.

sequenceDiagram
    participant C as 실시간 클라이언트
    participant S as Socket Backend
    participant DB as 공유 PostgreSQL
    participant A as App Backend
    participant D as 대시보드 클라이언트

    C->>S: WebSocket 음성 대화
    S->>DB: dialog·message·analysis·summary 쓰기
    Note over S,A: Socket → App 직접 HTTP 호출 없음
    D->>A: GET /v1/dialogs...
    A->>DB: 워크스페이스 범위 읽기
    DB-->>A: 저장된 대화·분석 결과
    A-->>D: REST 조회 응답

물리 스키마와 파티션의 정본은 sohri-db입니다. App Backend의 엔티티는 읽기 계약을 구현하며 대화·분석 파이프라인 자체를 재실행하지 않습니다.

조회 기능

  • 대화 목록: 최신순 페이지, turnCount > 0만 포함
  • 선택 필터: externalUserId, scenarioId
  • 상세: dialogId 또는 외부 WebSocket sessionId
  • 기본 상세: 대화 요약, 키워드, 대표 감정, 대화 단위 바이오마커 요약
  • detail=true: 감정 세부 점수, 치매·우울 점수, 발화별 바이오마커 지표 추가
  • 사용자 그룹 통계: 1분 이상 완료 대화 건수와 구성원별 건수

완료 대화 통계는 started_at과 ended_at이 모두 있고 차이가 60초 이상인 세션만 셉니다. 날짜 범위는 KST 기준 양 끝을 포함합니다.

확정 발화만 분석 조회

분석 상세와 요약 입력은 dialog_message.speech_phase='CONFIRMED'를 화이트리스트로 읽습니다. CANCELLED 발화와 그 하위 분석 결과는 응답에서 제외됩니다. 저장된 원래 turn 번호를 다시 매기지 않으므로 messageTurns에 1, 2, 4처럼 공백이 생길 수 있습니다.

음성 프록시는 감사·디버깅 경로이므로 message ID를 이미 아는 경우 CANCELLED 발화도 별도로 필터링하지 않습니다.

메시지 음성

상세 응답의 audio.url은 GCS 서명 URL이 아니라 다음 App Backend 프록시를 가리킵니다.

GET /v1/dialogs/{dialogId}/messages/{messageId}/audio

프록시는 인증·테넌트 확인과 감사 로그를 적용한 뒤 GCS 스트림을 전달합니다. Cache-Control: private, no-store, Referrer-Policy: no-referrer, X-Content-Type-Options: nosniff를 설정하며 Range 요청은 현재 지원하지 않습니다. 브라우저 <audio src>는 Authorization 헤더를 붙이지 못하므로 fetch 후 Blob URL을 사용해야 합니다.

JWT 호출은 이 음성 경로에서 X-Workspace-Id가 필수입니다. API key 호출은 키 귀속 워크스페이스를 사용합니다. 대화 목록·상세의 JWT 헤더 동작 차이는 워크스페이스와 테넌시를 확인하세요.

필드 계약은 공유 데이터 계약, 경로 목록은 REST API 참조를 참고하세요.