Phase G: Kei API 통신 정상화 — streaming 전환 + Sonnet fallback 제거

G-1: httpx non-streaming → streaming 전환 (3개 파일)
  - client.post() → client.stream("POST") + response.aiter_lines()
  - SSE 토큰을 실시간 수신 (30분+ 무응답 해소)

G-2: Sonnet fallback 완전 제거
  - kei_client.py: classify_content()에서 _call_anthropic_direct() 호출 제거
  - content_editor.py: fill_content()에서 Sonnet fallback 분기 제거
  - Kei API만 사용. 실패 시 manual_classify() 또는 _apply_defaults() 안전망

G-3: _parse_json() 마크다운 제거 3파일 동기화
  - content_editor.py, design_director.py에 kei_client.py와 동일한 전처리 추가

G-4: FAISS를 CPU로 전환 (GPU 메모리 경쟁 해소)
  - block_search.py + build_block_index.py: device="cpu"

G-5: streaming 파서에 event:error 처리
  - persona_agent 에러 시 무한 대기 방지. 즉시 중단.

G-6: content_editor.py None 가드
  - Kei API 실패 시 _parse_json(None) TypeError 방지

G-7: "mode" → "mode_hint" 필드명 수정 (3개 파일)
  - persona_agent의 실제 필드명에 맞춤

persona_agent 수정: 0건

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-26 01:26:03 +09:00
parent 7038418c8b
commit a01f7a7f8a
8 changed files with 519 additions and 152 deletions

View File

@@ -274,6 +274,33 @@ CLAUDE.md 요구사항 전수검토 결과 발견된 미구현/부분구현/위
---
## Phase G: Kei API 통신 정상화 (4개)
> **실행 상세:** [IMPROVEMENT-PHASE-G.md](IMPROVEMENT-PHASE-G.md)
> design_agent만 수정. persona_agent 코드 수정 0건.
### G-1: httpx non-streaming → streaming 전환 (핵심)
- **문제:** httpx `client.post()`가 SSE 전체 응답 완료까지 대기 (30분+)
- **해결:** `client.stream("POST", ...)`로 전환. SSE 토큰 실시간 수신.
- **파일:** kei_client.py, content_editor.py, design_director.py
### G-2: Sonnet fallback 완전 제거
- **문제:** 사용자 요청 "Kei API만 사용"인데 Sonnet fallback이 남아있음
- **해결:** fallback 분기 제거. Kei API 실패 시 에러 반환.
- **파일:** kei_client.py, content_editor.py
### G-3: `_parse_json()` 마크다운 제거 3파일 동기화
- **문제:** kei_client.py에만 `- ` 제거 있고, content_editor/design_director에 없음
- **해결:** 3개 파일의 `_parse_json()` 동기화
- **파일:** content_editor.py, design_director.py
### G-4: FAISS를 CPU로 전환 (GPU 메모리 경쟁 해소)
- **문제:** persona_agent + design_agent가 같은 GPU 경쟁 → OOM
- **해결:** design_agent의 FAISS를 CPU로 전환 (46개 블록이므로 충분히 빠름)
- **파일:** block_search.py, build_block_index.py
---
## Phase별 의존 관계
```