From 1455a48f55377eeab8a763490f16a42981ae7d6a Mon Sep 17 00:00:00 2001 From: happybell80 Date: Mon, 29 Sep 2025 16:03:05 +0900 Subject: [PATCH] =?UTF-8?q?PoC=20=EA=B0=9C=EB=B0=9C=20=EA=B3=84=ED=9A=8D?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80:=20pexpect=20=EA=B8=B0=EB=B0=98=20?= =?UTF-8?q?=EB=8B=A8=EC=9D=BC=20CLI=20=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Phase 0 추가: 1-2일 단일 CLI(Claude) PoC 개발 - pexpect 사용 (pty 대신) - 안정성과 패턴 매칭 우수 - JSONL 메시지 스키마 정의 (request/chunk/final/error) - CLI 어댑터 계약 및 인터페이스 명시 - 파싱 규칙 및 에러 복구 전략 구체화 - 골든 로그 기반 테스트 체계 - 개발 일정 조정: PoC 1-2일 + 확장 3-5일 --- ...29_happybell80_multi_ai_cli_integration.md | 58 ++++++++++++++++--- 1 file changed, 51 insertions(+), 7 deletions(-) diff --git a/ideas/250929_happybell80_multi_ai_cli_integration.md b/ideas/250929_happybell80_multi_ai_cli_integration.md index 4e678a0..852f965 100644 --- a/ideas/250929_happybell80_multi_ai_cli_integration.md +++ b/ideas/250929_happybell80_multi_ai_cli_integration.md @@ -79,11 +79,21 @@ tmux attach -t ai-panel - **결과**: 균형잡힌 설계 결정 ## 구현 로드맵 -1. **Phase 1** (즉시): tmux 스크립트 작성 및 테스트 -2. **Phase 2** (1주): Python subprocess 래퍼 개발 -3. **Phase 3** (2주): FastAPI 백엔드 구축 -4. **Phase 4** (3주): 웹 UI 및 실시간 통신 -5. **Phase 5** (1개월): 세션 공유, 응답 분석 기능 + +### 개발 일정 +1. **Phase 0** (1-2일): 단일 CLI PoC - Claude만으로 PTY/파싱 검증 +2. **Phase 1** (즉시): tmux 스크립트 작성 및 테스트 +3. **Phase 2** (3-5일): Python pexpect 래퍼 개발 및 확장 +4. **Phase 3** (2주): FastAPI 백엔드 구축 +5. **Phase 4** (3주): 웹 UI 및 실시간 통신 +6. **Phase 5** (1개월): 세션 공유, 응답 분석 기능 + +### 산출물 +- **PoC 스크립트**: 단일 CLI 제어 검증 코드 +- **재현 스크립트**: 각종 에러 상황 시뮬레이션 +- **골든 로그**: raw/clean 출력 샘플 +- **파서 규칙 문서**: ANSI 제거, 프롬프트 패턴 +- **계약 테스트**: 어댑터 인터페이스 검증 ## 배포 방식 **UV 가상환경 사용** (Docker 대신) @@ -92,6 +102,40 @@ tmux attach -t ai-panel - tmux는 pipx로 설치 - FastAPI는 uv로 관리 +## PoC 개발 계획 + +### Phase 0: 단일 CLI 프로토타입 (1-2일) +- **대상**: Claude CLI만으로 시작 +- **기술**: pexpect (pty 대신) - PTY 제어, 타임아웃, 패턴 매칭에 강점 +- **검증 시나리오**: + - 정상 스트리밍 응답 + - 세션 만료 처리 + - Rate limit 대응 + - 느리거나 중단된 스트림 + - 프롬프트 미복귀 상황 + +### 메시지 스키마 (JSONL) +``` +{"type": "request", "model": "claude", "prompt": "...", "timestamp": "..."} +{"type": "chunk", "model": "claude", "content": "...", "timestamp": "..."} +{"type": "final", "model": "claude", "content": "...", "latency": 1.23} +{"type": "error", "model": "claude", "error": "session_expired", "timestamp": "..."} +``` + +### CLI 어댑터 계약 +- **인터페이스**: healthcheck() | ask()->async iterator | cancel() | resume() +- **모드**: PTY/STDIO 모드 지원 +- **정규화**: ANSI 제거, 프롬프트 재출현, 타임아웃 규칙 내장 + +### 파싱 규칙 +- **종료 판단**: 프롬프트 패턴 + 침묵 타임아웃(1-2초) + 길이 상한 +- **정규화**: 코드블록/표 정상화, fence 언어 보정 +- **골든 로그**: raw/clean 출력 비교로 파서 규칙 확정 + +### 에러 복구 전략 +- **분류**: Auth/Rate/Parse/Timeout +- **복구**: 지수 백오프, 재시도, 세션 만료시 수동 로그인 안내 + ## 기술적 고려사항 ### 세션 관리 @@ -100,9 +144,9 @@ tmux attach -t ai-panel - **헬스 체크**: claude me, gemini whoami로 세션 상태 확인 ### 입출력 제어 -- **PTY 사용**: Python pty 모듈로 실제 터미널 환경 시뮬레이션 +- **pexpect 사용**: pty 모듈보다 안정적, 패턴 매칭 우수 - **비동기 처리**: asyncio.subprocess로 여러 CLI 동시 제어 -- **입력 전송**: stdin.write() 후 flush() 필수 +- **입력 전송**: expect/send 메소드 활용 ### 응답 파싱 - **ANSI 코드 제거**: 색상 코드, 스피너, ASCII 아트 정규식 제거