책임과 신뢰 경계¶
Sohri Platform은 핵심 대화 제어, 교체 가능한 외부 제공자, 선택적 클라이언트·채널 어댑터를 분리합니다. 배포 토폴로지가 달라져도 이 소유권은 유지해야 합니다.
세 경계¶
flowchart LR
subgraph CH["선택적 클라이언트·채널 경계"]
C["일반 클라이언트"]
CA["채널 어댑터"]
end
subgraph CORE["Sohri 핵심 경계"]
GW["WebRTC Gateway"]
S["Socket Backend"]
G["Graph Builder"]
APP["App Backend"]
DB[("PostgreSQL")]
ST[("DM 세션 저장소")]
end
subgraph EXT["외부 제공자 경계"]
E["EPD + STT"]
L["LLM"]
T["TTS"]
V["Vocal Biomarkers"]
R["Sohri Skill Runtime"]
K["Skill Engine / 외부 API"]
end
C --> GW
CA -.-> GW
GW --> S
S --> G
S --> DB
APP --> DB
G --> ST
S <--> E
G <--> L
S <--> L
S <--> T
S <--> V
G -.-> R
R -.-> K
특정 미디어 서버나 회의실 토폴로지는 채널 구현 선택이며 Sohri 핵심으로 간주하지 않습니다. 채널 어댑터가 있더라도 내부 대화 상태, 공급자 자격 증명 또는 DB를 소유해서는 안 됩니다.
책임 매트릭스¶
| 영역 | 책임 주체 | 책임이 아닌 것 |
|---|---|---|
| 사용자·워크스페이스 인증과 관리 API | App Backend | 실시간 PCM 처리 |
| WebRTC 미디어·코덱·재생 세대 | WebRTC Gateway | 최종 credential 판정, 대화 정책 |
| WebSocket 인증·세션·턴 조정 | Socket Backend | 시나리오 전이 규칙, Skill Engine 직접 호출 |
| 발화 경계와 STT | EPD | 대화 상태 전이와 응답 생성 |
| NLU·정책·NLG·상태 전이 | Graph Builder | 미디어 전송, TTS 재생 |
| 공통 Skill 실행 계약 변환·오류 정규화 | Sohri Skill Runtime | 스킬별 제공자 자격 증명, 자동 재시도·캐시 |
| 스킬별 입력 검증·외부 API 연동 | Skill Engine | 전체 대화 세션 소유 |
| 대화·분석 쓰기 | Socket Backend | 관리 조회 API |
| 대화·분석 읽기 | App Backend | 실시간 분석 재실행 |
| 스키마 물리 정본 | DB 스키마 저장소 | 개별 서비스의 임의 DDL |
| 채널별 이벤트·미디어 변환 | 선택적 채널 어댑터 | Sohri 내부 계약 재정의 |
신뢰 경계와 검증¶
클라이언트·Gateway¶
- WebRTC Gateway의 선행 형식 검사는 최종 인증이 아닙니다.
- Socket Backend가
/sohri연결에서 서명, 만료, workspace와 권한을 판정합니다. - 오디오·이벤트 크기, 순서, 세션 상관키와 허용 메시지 유형을 경계에서 검증합니다.
- 채널 어댑터가 전달한 사용자·대화 식별자를 무조건 신뢰하지 않습니다.
핵심 서비스 간¶
- App Backend와 Socket Backend의 결합점은 인증 토큰 계약과 공유 DB 계약입니다. 실시간 대화 기록을 위해 서로의 HTTP API를 호출한다고 가정하지 않습니다.
- Graph Builder 요청은 세션 ID, 텍스트, confidence와 시나리오에 필요한 최소 문맥으로 제한합니다.
- 공유 DB 접근은 서비스별 읽기·쓰기 소유권과 workspace 범위를 적용합니다.
- 같은 세션의 상태 변경은 lock으로 직렬화하고, 종료·최종화는 멱등 처리합니다.
외부 제공자¶
- 모든 외부 응답은 schema, 크기, timeout과 상태 코드를 검증한 뒤 내부 계약으로 정규화합니다.
- 제공자 출력은 신뢰할 수 없는 데이터이며 프롬프트 지시나 임의 상태 변경으로 실행하지 않습니다.
- 재시도는 멱등성, 지연 예산과 중복 side effect를 고려해 어댑터별로 제한합니다.
- 구현 가용성과 배포 활성화는 별개입니다. 어댑터가 존재해도 자격 증명, 네트워크, 정책 또는 기능 플래그가 없으면 사용할 수 없습니다.
데이터 최소화¶
| 경계 | 허용 데이터 | 제외 원칙 |
|---|---|---|
| Gateway → Socket | 세션 credential, PCM, 제어 이벤트 | 공급자 key, DB 내부 필드 |
| Socket → EPD | PCM, 발화·재생 상태 | 전체 사용자 프로필, 대화 전체 |
| Socket → Graph Builder | 세션 상관키, STT 텍스트·confidence, 필요한 옵션 | 원시 credential, 불필요한 음성 |
| Graph Builder → Sohri Skill Runtime | 시나리오가 allowlist한 arguments/context | 전체 session_user, 내부 상태 전체 |
| Socket → TTS | 응답 텍스트, 논리적 음성 설정 | 인증 토큰, 불필요한 사용자 정보 |
| 분석·요약 제공자 | 확정 발화 또는 확정 메시지 | 취소 발화, 운영 설정, 비밀 값 |
변경 규칙¶
- 제공자 교체는 내부 데이터 계약을 유지하는 어댑터 변경으로 제한합니다.
- 공유 DB 변경은 스키마 정본에서 시작하고 생산자·소비자 매핑을 함께 검증합니다.
- 새 채널은 Gateway 또는 별도 어댑터에서 변환하며 Socket Backend의 핵심 턴 의미를 바꾸지 않습니다.
- 새 스킬은 Sohri Skill Runtime 계약과 시나리오 allowlist를 사용하고 Graph Builder에서 외부 API를 직접 호출하는 예외를 만들지 않습니다.
- 비밀 값과 환경별 endpoint는 버전 관리 문서·예제 payload·클라이언트 이벤트에 포함하지 않습니다.