이슈 #237
Ryan Lee이(가) 7달 전에 변경
스트리밍 응답 처리
## 완료 내역
- Anthropic SDK의 `messages.stream()` 사용하여 스트리밍 응답 처리 (`src/services/api/anthropic.ts:58`)
- `react-native-fetch-api`의 `textStreaming: true` 플래그로 RN 환경에서 청크 기반 스트림 수신 (`anthropic.ts:36-39`)
- `streamChat()` 콜백 기반 인터페이스:
- `onFinal({ text, usage })`: 스트림 완료 후 최종 텍스트와 토큰 사용량 전달
- `onAbort()`: 사용자 중단 처리 (AbortController.signal 연동)
- `onError(error)`: 실패 처리
- 대화별 AbortController 관리로 개별 요청 취소 가능 (`src/stores/chatStore.ts:174-175, 301-304`)
- 완료 후 처리 파이프라인 (`chatStore.ts:180-235`):
- `parseCodeBlocks()`로 응답에서 HTML/코드블록 추출
- HTML 첨부 존재 시 완료 메시지 문구로 교체, 코드블록만 있을 경우 원문 표시
- HTML은 낙관적 UI(`pending: true`)로 먼저 렌더 → `persistSingleHtml()`로 비동기 파일 저장 → filePath 교체
- 저장 실패 시 토스트 노출
- 토큰 사용량 저장 및 dev 로그 (캐시 HIT/MISS/WRITE 상태 포함) (`anthropic.ts:95-105`)
- `stop_reason === 'max_tokens'` 시 dev 경고 (`anthropic.ts:76-80`)
- 오류 타입 감지: AbortError 구분 처리 (`anthropic.ts:21-32`)
## 주요 파일
- `src/services/api/anthropic.ts` — `streamChat()` 스트리밍 호출 + `streamingFetch` 플래그
- `src/stores/chatStore.ts` — 콜백 연동, 낙관적 UI, 중단/에러/완료 처리
- `src/utils/parseCodeBlocks.ts` — 응답에서 첨부 추출
- `src/services/storage/htmlFiles.ts` — HTML 파일 영속화
## 관련 커밋
- `3b6c46b` (fixes ref #237) — Claude API 호출 및 응답 처리
- `91a0930` — AI 응답에서 HTML 추출 로직 (후속, #242 소관)
## 참고
- 중단 사유는 `interruptReasons` Map에 보존되어 어시스턴트 메시지에 기록됨
- `max_tokens`은 현재 64,000으로 설정 (`anthropic.ts:61`)
뒤로