2. Envelope 구조 (Frame Envelope)
2.1. 공통 Envelope
송수신되는 모든 WSS 프레임은 다음 JSON 구조를 준수해야 한다 (MUST).
{
"v": 1,
"type": "String (필수, 네임스페이스 기반 이벤트 타입)",
"message_id": "String (필수, UUID v4)",
"timestamp": "String (필수, ISO 8601, 밀리초 정밀도 권장)",
"session_id": "String (필수, 소속 세션 식별자)",
"turn_id": "String (선택, 현재 Turn 식별자, UUID v4)",
"parent_id": "String (선택, 이 메시지가 응답하는 대상 message_id)",
"metadata": {},
"payload": {}
}
필드 상세
| 필드 | 필수 | 설명 |
|---|---|---|
v |
MUST | Envelope 버전. 본 규격에서는 항상 정수 1. 수신자는 자신이 지원하지 않는 v 값을 수신하면 해당 프레임을 무시하고 session.error로 응답해야 한다 (MUST). |
type |
MUST | 네임스페이스 기반 이벤트 타입. §3에서 정의. |
message_id |
MUST | 프레임 고유 식별자. 중복 수신 시 멱등성(Idempotency) 판단 기준. |
timestamp |
MUST | 발신 시각. ISO 8601. 밀리초 정밀도 권장 (SHOULD). |
session_id |
MUST | RAWP 1.0 §5.1에서 발급된 세션 식별자. |
turn_id |
SHOULD | 현재 에이전트 Turn의 식별자. 동일 Turn 내 모든 프레임은 같은 turn_id를 공유. |
parent_id |
OPTIONAL | 요청-응답 상관 관계. agent.prompt.request에 대한 agent.prompt.delta는 해당 요청의 message_id를 parent_id로 참조. |
metadata |
OPTIONAL | 확장 및 디버깅용 자유 형식 객체. 빈 객체 {} 허용. |
payload |
MUST | 이벤트 타입별 페이로드. §3에서 각 타입별로 정의. |
2.2. 파싱 규약
- Postel's Law: 수신자는
payload내 알 수 없는 키를 무시해야 한다 (MUST). - Unknown Type: 수신자는 자신이 처리할 수 없는
type을 수신하면 해당 프레임을 무시하고, 로그에 기록해야 한다 (MUST). 에러를 발생시키거나 연결을 종료해서는 안 된다 (MUST NOT). - Envelope 버전:
v필드가 지원 범위를 벗어나면 프레임을 무시하고session.error를 발송해야 한다 (MUST).
2.3. 프레임 순서 보장
WSS는 메시지 순서를 보장하므로, 동일 연결 내 프레임은 발신 순서대로 수신됨을 전제한다. 단, 재연결(reattach) 후 session.history 프레임을 통해 과거 이력이 재전송될 때는 timestamp와 message_id 기준으로 순서를 재구성해야 한다 (MUST).