Update Multi-AI CLI integration doc with verified implementation
- Add implementation completed section (2025-09-29) - Document non-TTY pipe mode solution - Include verified CLI flags for Claude/Gemini/OpenAI - Add environment variables for forcing non-interactive mode - Replace pexpect with subprocess.exec approach
This commit is contained in:
parent
45f9c82d2c
commit
33926080a2
@ -17,6 +17,28 @@ status: idea
|
|||||||
- **51123 서버**: Claude만 설치
|
- **51123 서버**: Claude만 설치
|
||||||
- **51124 서버**: Claude, Gemini, OpenAI 모두 설치, 세션 파일 접근 가능
|
- **51124 서버**: Claude, Gemini, OpenAI 모두 설치, 세션 파일 접근 가능
|
||||||
|
|
||||||
|
## 구현 완료 (2025-09-29)
|
||||||
|
|
||||||
|
### 핵심 해결책: 비-TTY 파이프 모드
|
||||||
|
- **문제**: pexpect가 PTY 생성 → TUI 감지 → 대화형 모드 실행
|
||||||
|
- **해결**: subprocess.exec + 파이프 + 환경변수로 TUI 회피
|
||||||
|
- **검증**: 모든 CLI에서 non-interactive 모드 작동 확인
|
||||||
|
|
||||||
|
### CLI별 구현 방법
|
||||||
|
- **Claude**: `claude -p "prompt" --output-format json` → JSON에서 'result' 필드 추출
|
||||||
|
- **Gemini**: `gemini -p "prompt"` → stdout 라인별 스트리밍
|
||||||
|
- **OpenAI**: `openai chat.completions.create --stream` → SSE 형식 파싱
|
||||||
|
|
||||||
|
### 환경변수 설정
|
||||||
|
```python
|
||||||
|
env = {
|
||||||
|
'CI': '1', # CI 환경 표시
|
||||||
|
'TERM': 'dumb', # 터미널 기능 없음
|
||||||
|
'NO_COLOR': '1', # ANSI 컬러 비활성화
|
||||||
|
'CLICOLOR': '0' # 추가 컬러 비활성화
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## 목표
|
## 목표
|
||||||
여러 AI의 의견을 동시에 얻어 더 나은 의사결정을 내리고 개발 생산성 향상
|
여러 AI의 의견을 동시에 얻어 더 나은 의사결정을 내리고 개발 생산성 향상
|
||||||
|
|
||||||
@ -106,7 +128,7 @@ tmux attach -t ai-panel
|
|||||||
|
|
||||||
### Phase 0: 단일 CLI 프로토타입
|
### Phase 0: 단일 CLI 프로토타입
|
||||||
- **대상**: Claude CLI만으로 시작
|
- **대상**: Claude CLI만으로 시작
|
||||||
- **기술**: pexpect (pty 대신) - PTY 제어, 타임아웃, 패턴 매칭에 강점
|
- **기술**: subprocess.exec (파이프 모드) - PTY 회피로 TUI 방지
|
||||||
- **검증 시나리오**:
|
- **검증 시나리오**:
|
||||||
- 정상 스트리밍 응답
|
- 정상 스트리밍 응답
|
||||||
- 세션 만료 처리
|
- 세션 만료 처리
|
||||||
@ -126,10 +148,10 @@ tmux attach -t ai-panel
|
|||||||
- **인터페이스**: healthcheck() | ask()->async iterator | cancel() | resume()
|
- **인터페이스**: healthcheck() | ask()->async iterator | cancel() | resume()
|
||||||
- **모드**: PTY/STDIO 모드 지원
|
- **모드**: PTY/STDIO 모드 지원
|
||||||
- **정규화**: ANSI 제거, 프롬프트 재출현, 타임아웃 규칙 내장
|
- **정규화**: ANSI 제거, 프롬프트 재출현, 타임아웃 규칙 내장
|
||||||
- **pexpect 패턴**:
|
- **CLI 플래그** (2025-09-29 검증):
|
||||||
- Claude: "❯" 프롬프트, timeout=30
|
- Claude: `-p "prompt" --output-format json` (result 필드 추출)
|
||||||
- Gemini: ">" 프롬프트, timeout=25
|
- Gemini: `-p "prompt"` (stdout 스트리밍)
|
||||||
- Codex: ">>>" 프롬프트, timeout=20
|
- OpenAI: `chat.completions.create --stream` (SSE 파싱)
|
||||||
|
|
||||||
### 파싱 규칙
|
### 파싱 규칙
|
||||||
- **종료 판단**: 프롬프트 패턴 + 침묵 타임아웃 + 길이 상한
|
- **종료 판단**: 프롬프트 패턴 + 침묵 타임아웃 + 길이 상한
|
||||||
@ -152,9 +174,9 @@ tmux attach -t ai-panel
|
|||||||
- ~/.config/codex: 600 (user read/write only)
|
- ~/.config/codex: 600 (user read/write only)
|
||||||
|
|
||||||
### 입출력 제어
|
### 입출력 제어
|
||||||
- **pexpect 사용**: pty 모듈보다 안정적, 패턴 매칭 우수
|
- **파이프 모드 사용**: PTY 생성 회피로 TUI 방지 (2025-09-29 검증)
|
||||||
- **비동기 처리**: asyncio.subprocess로 여러 CLI 동시 제어
|
- **비동기 처리**: asyncio.subprocess로 여러 CLI 동시 제어
|
||||||
- **입력 전송**: expect/send 메소드 활용
|
- **환경변수 강제**: CI=1 TERM=dumb NO_COLOR=1 CLICOLOR=0
|
||||||
|
|
||||||
### 응답 파싱
|
### 응답 파싱
|
||||||
- **ANSI 코드 제거**: 색상 코드, 스피너, ASCII 아트 정규식 제거
|
- **ANSI 코드 제거**: 색상 코드, 스피너, ASCII 아트 정규식 제거
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user