스트리밍 응답: 요구사항 및 정책
Stop은 진행 중인 생성 스트림을 중단하고, 부분적인 어시스턴트 텍스트를 저장하며, 사용자 메시지는 유지하고, 재생성은 새로운 시도로 허용하며, 전송 연결 끊김을 명시적 사용자 중단과 구분합니다.
패키지 상태: 참조 컨텍스트가 인간 검토를 위해 준비됨. 계약과 테스트 시나리오는 완성되었으나, 이를 통과한 채택 구현체가 있다고 주장하지는 않습니다.
결정
Stop은 전송 중단 신호로 활성 스트림을 중단합니다. 사용자 메시지는 커밋된 턴으로 유지됩니다. 수신된 어시스턴트 토큰은 부분적으로 stopped 태그와 함께 저장됩니다. 재생성은 새로운 attempt_id를 시작하며, 중단이 없었던 것처럼 기록을 덮어쓰지 않습니다. 소켓 연결 끊김, 유휴 타임아웃, HTTP/2 리셋은 사용자 중단이 아닌 연결 끊김 또는 타임아웃으로 간주합니다. 이러한 이벤트는 재개를 제공할 수 있으나 Stop 복사를 사용해서는 안 됩니다. 자세한 내용은 sequence.md를 참조하세요.
범위
- 점진적 텍스트를 출력하는 LLM 채팅 및 기타 스트리밍 API.
- 중단 신호, 부분 저장, 새로운 시도로서의 재생성.
- 중단, 연결 끊김, 타임아웃을 구분하는 기록.
- 중단 전에 이미 커밋된 도구; 이 블록은 완료만 기록합니다.
이 블록 외부
- 도구가 프로덕션 데이터를 변경할 수 있는지 여부.
- 검색된 텍스트에 대한 프롬프트 인젝션 방어.
- 시도 신원 외의 토큰 과금.
계약
- Stop 활성화는 진행 중인 요청을 중단하여 확인 후 추가 토큰이 붙지 않도록 합니다.
- 사용자 턴은 유지되며, 어시스턴트 턴은 상태
stopped와 정확한 부분 텍스트와 함께 저장됩니다. - 재생성은 동일한 사용자 턴에 연결된 새로운
attempt_id를 생성하며, 사용자가 삭제하지 않는 한 중단된 부분을 삭제하지 않습니다. - 전송 연결 끊김은
disconnected를 설정하며 Stop 분석 또는 Stop 확인 복사를 실행해서는 안 됩니다. idle_ms동안 토큰이 없으면timed_out을 설정하며, 재연결은 유효한 스트림 커서가 있을 때만 재개할 수 있습니다.- Stop은 이미 커밋된 도구의 부작용을 롤백하지 않습니다.
구현
Stop을 AbortSignal에 연결하고 프로토콜이 허용할 때 서버 취소를 전송합니다. 각 청크 또는 중단 시점 중 빠른 시점에 저장합니다. 재연결은 Stop과 별도의 경로로 유지합니다. Stop generating과 Retry connection을 구분하여 표시합니다. 프롬프트 비밀 없이 시도 ID를 기록합니다.
실패 처리
중단 신호가 서버에 도달하지 않으면 UI를 정지시키고 로컬 부분을 stopped로 표시하며 늦게 도착하는 청크는 버립니다. 저장에 실패하면 재시도할 때까지 세션 저장소에 부분을 유지합니다. 재생성이 열린 스트림과 경합하면 중단 완료 전까지 거부합니다. 취소 후 추가 토큰은 취소 누수 메트릭을 증가시킵니다.
검증
중단부터 마지막 토큰까지 지연, 취소 누수, 저장 실패, 잘못 분류된 연결 끊김을 측정합니다. sequence.md의 세 가지 시퀀스를 점검합니다. 네트워크 오류와 구분하여 생성 중단을 알립니다. 패키지화된 시나리오를 실행합니다.
이 패키지의 실행 예시는 픽스처 및 수용 계약입니다. 컬렉션 루트에서
python tools/validate.py를 실행하여 패키지 구조와 메타데이터를 확인한 후,
대상 저장소에서 시나리오를 구현하고 실행하세요.
채택 가정
example.yaml의 이름과 숫자 값은 채택 프로필이며 보편적 기본값이 아닙니다.- 채택 팀은 행위자, 데이터 클래스, 오류 어휘, 소유권을 자사 시스템에 맞게 매핑해야 합니다.