# Sam AI 개발 문서 ## 프로젝트 개요 Sam AI는 Google Gemini Live API를 활용한 실시간 음성 AI 어시스턴트입니다. React (CDN)와 PHP를 사용하여 구현되었으며, 사용자의 음성 명령으로 대시보드 네비게이션과 파일 검색 기능을 제공합니다. ## 기술 스택 - **Frontend**: React 18 (CDN), Tailwind CSS (CDN), Babel (브라우저 변환) - **Backend**: PHP 7.3+ - **AI SDK**: Google GenAI SDK (`@google/genai@^1.31.0`) - **API**: Gemini Live API (`gemini-2.5-flash-native-audio-preview-09-2025`) - **오디오**: Web Audio API, ScriptProcessorNode ## 설치 과정 ### 1. 파일 구조 ``` ai_sam/ ├── index.php # 메인 애플리케이션 파일 ├── api/ │ └── get_api_key.php # API 키 조회 엔드포인트 ├── API_KEY_GUIDE.md # API 키 발급 가이드 └── dev.md # 개발 문서 (본 파일) ``` ### 2. API 키 설정 #### 필요한 API 키 **Gemini Live API**를 사용하기 위해서는 **Google AI Studio**에서 발급받은 **Gemini API 키**가 필요합니다. ⚠️ **중요**: - Vertex AI API 키가 아닙니다 - 서비스 계정 OAuth 토큰이 아닙니다 - Google AI Studio의 일반 Gemini API 키입니다 #### API 키 발급 방법 **방법 1: Google AI Studio (권장)** 1. https://makersuite.google.com/app/apikey 접속 2. Google 계정으로 로그인 (Codebridge-Chatbot 프로젝트 계정) 3. "Create API Key" 버튼 클릭 4. 프로젝트 선택: **Codebridge-Chatbot** 5. 생성된 API 키 복사 **방법 2: Google Cloud Console** 1. https://console.cloud.google.com/ 접속 2. 프로젝트 선택: **Codebridge-Chatbot** 3. "API 및 서비스" > "라이브러리" 4. "Generative Language API" 검색 후 "사용 설정" 5. "API 및 서비스" > "자격 증명" 6. "자격 증명 만들기" > "API 키" 7. 생성된 API 키 복사 #### API 키 저장 생성된 API 키를 `apikey/gemini_api_key.txt` 파일에 저장합니다. ``` # 파일 위치: apikey/gemini_api_key.txt # 파일 내용: API 키만 저장 (설명 텍스트 제외) AIzaSyAbCdEfGhIjKlMnOpQrStUvWxYz1234567 ``` #### 프로젝트 확인 `ai_sam/api/get_api_key.php`는 Codebridge-Chatbot 프로젝트의 서비스 계정(`apikey/google_service_account.json`)을 확인하여 프로젝트 일치 여부를 검증합니다. ```php // 프로젝트 ID 확인 if ($serviceAccount['project_id'] !== 'codebridge-chatbot') { // 오류 반환 } ``` ### 3. 의존성 모든 의존성은 CDN을 통해 로드됩니다: - **React & ReactDOM**: `https://unpkg.com/react@18/umd/react.development.js` - **Babel**: `https://unpkg.com/@babel/standalone/babel.min.js` - **Tailwind CSS**: `https://cdn.tailwindcss.com` - **Google GenAI SDK**: `https://aistudiocdn.com/@google/genai@^1.31.0` (ES Module) ### 4. 서버 요구사항 - PHP 7.3 이상 - `openssl` 확장 (서비스 계정 인증용, 선택사항) - HTTPS 또는 localhost (마이크 접근 권한 필요) ## 개발 과정에서 발생한 이슈 및 해결 ### 이슈 1: WebSocket이 즉시 종료되는 문제 **증상**: "Call Sam" 버튼을 클릭하면 연결이 시작되자마자 즉시 종료됨 **원인 분석**: - WebSocket 연결 상태 추적 부족 - 세션 객체 관리 미흡 - 오디오 스트림 정리 로직 부재 **해결 방법**: 1. **연결 상태 추적 추가** ```javascript this.isConnected = false; this.session = null; ``` 2. **안전한 데이터 전송** ```javascript if (this.session && this.isConnected) { try { this.session.sendRealtimeInput({ media: pcmBlob }); } catch (sendError) { // WebSocket이 닫힌 경우 처리 } } ``` 3. **리소스 정리 개선** - `cleanup()` 메서드 추가 - 미디어 스트림 트랙 중지 - ScriptProcessor 연결 해제 - AudioContext 종료 - 세션 종료 ### 이슈 2: 디버그 로깅 시스템 구축 **목적**: 연결 과정의 각 단계를 추적하여 문제점 파악 **구현 내용**: 1. **LiveManager 클래스에 디버그 로깅 추가** ```javascript this.debugLog = []; this.log = (msg, data = null) => { const timestamp = new Date().toISOString(); const logEntry = { timestamp, msg, data }; this.debugLog.push(logEntry); console.log(`[Sam AI Debug ${timestamp}]`, msg, data || ''); }; ``` 2. **주요 디버그 포인트** - API 키 확인 - Google GenAI SDK 로드 상태 - AudioContext 생성 - WebSocket 연결 (시도, 성공, 실패, 종료) - 미디어 스트림 (마이크 접근 권한) - 세션 관리 3. **콘솔 출력** - 연결 성공/실패/종료 시 전체 디버그 로그 출력 - 각 단계별 상세 정보 표시 ### 이슈 3: API 키 종류 혼동 **문제**: Vertex AI API 키와 Gemini API 키의 차이점 불명확 **해결**: - Google AI Studio에서 발급받은 일반 Gemini API 키 사용 - `API_KEY_GUIDE.md` 문서 작성 - `get_api_key.php`에서 프로젝트 검증 로직 추가 ### 이슈 4: ScriptProcessorNode Deprecation 경고 **경고**: `ScriptProcessorNode`는 deprecated되었으며 `AudioWorkletNode` 사용 권장 **현재 상태**: - 기능은 정상 동작 - 향후 `AudioWorkletNode`로 마이그레이션 필요 **참고**: https://bit.ly/audio-worklet ## 주요 컴포넌트 ### LiveManager 클래스 Gemini Live API와의 연결을 관리하는 핵심 클래스입니다. **주요 메서드**: - `initAI()`: Google GenAI SDK 초기화 - `connect()`: WebSocket 연결 시작 - `handleOpen()`: 연결 성공 시 미디어 스트림 시작 - `handleMessage()`: 서버 메시지 처리 (오디오, 도구 호출) - `cleanup()`: 리소스 정리 - `disconnect()`: 연결 종료 **상태 관리**: - `isConnected`: 연결 상태 플래그 - `session`: WebSocket 세션 객체 - `inputAudioContext`: 입력 오디오 컨텍스트 (16kHz) - `outputAudioContext`: 출력 오디오 컨텍스트 (24kHz) - `mediaStream`: 마이크 스트림 - `scriptProcessor`: 오디오 처리 노드 ### App 컴포넌트 메인 React 컴포넌트로 UI와 상태를 관리합니다. **주요 기능**: - 메뉴 네비게이션 - 파일 검색 - Sam AI 연결 관리 - 오디오 시각화 ### 도구 (Tools) AI가 사용할 수 있는 기능들: 1. **navigateToPage**: 대시보드 메뉴 네비게이션 2. **searchDocuments**: 파일 검색 ## 사용 방법 ### 1. 기본 사용 1. 브라우저에서 `ai_sam/index.php` 접속 2. "Call Sam" 버튼 클릭 3. 마이크 접근 권한 허용 4. 음성으로 명령 (예: "Settings 화면으로 이동해줘") ### 2. 디버그 모드 1. 브라우저 개발자 도구 열기 (F12) 2. Console 탭 선택 3. "Call Sam" 버튼 클릭 4. 콘솔에 출력되는 디버그 로그 확인 ### 3. 예시 명령어 - "Show me the finance dashboard" - "Find the Q3 report from October" - "Settings 화면으로 이동해줘" - "Find the financial report" ## 파일 구조 상세 ### index.php 메인 애플리케이션 파일로 다음을 포함합니다: - HTML 구조 - React 컴포넌트 (Sidebar, FileList, Visualizer, App) - LiveManager 클래스 - 오디오 유틸리티 함수 - 상수 정의 (MOCK_FILES, MOCK_MENU, SYSTEM_INSTRUCTION) ### api/get_api_key.php API 키를 안전하게 조회하는 PHP 엔드포인트: - 서비스 계정 프로젝트 검증 - API 키 파일 읽기 - 플레이스홀더 텍스트 필터링 - JSON 응답 반환 ## 보안 고려사항 1. **API 키 보호** - API 키는 서버 측에서만 관리 - 클라이언트에 직접 노출되지 않음 - `get_api_key.php`를 통해서만 전달 2. **프로젝트 검증** - Codebridge-Chatbot 프로젝트만 허용 - 서비스 계정 정보로 검증 3. **HTTPS 권장** - 마이크 접근 권한은 HTTPS 또는 localhost에서만 가능 - 프로덕션 환경에서는 반드시 HTTPS 사용 ## 성능 최적화 1. **오디오 처리** - ScriptProcessorNode 사용 (향후 AudioWorkletNode로 마이그레이션 예정) - 16kHz 샘플레이트로 입력 최적화 - 24kHz 샘플레이트로 출력 최적화 2. **리소스 관리** - 연결 종료 시 모든 리소스 정리 - 메모리 누수 방지 3. **에러 처리** - 모든 비동기 작업에 try-catch 적용 - 사용자 친화적 에러 메시지 ## 향후 개선 사항 1. **AudioWorkletNode 마이그레이션** - ScriptProcessorNode 대신 AudioWorkletNode 사용 - 더 나은 성능과 안정성 2. **에러 복구 메커니즘** - 자동 재연결 기능 - 네트워크 오류 처리 개선 3. **사용자 경험 개선** - 연결 상태 시각적 표시 개선 - 오디오 레벨 표시 개선 - 더 많은 도구 추가 ## 참고 자료 - [Google AI Studio](https://makersuite.google.com/) - [Google Cloud Console](https://console.cloud.google.com/) - [Gemini API 문서](https://ai.google.dev/docs) - [Web Audio API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API) - [AudioWorklet](https://developer.mozilla.org/en-US/docs/Web/API/AudioWorklet) ## 변경 이력 ### 2025-01-XX (초기 개발) - Sam AI 기본 구조 구현 - React (CDN) 기반 UI 구성 - Gemini Live API 통합 - 실시간 음성 대화 기능 구현 - 도구 시스템 (navigateToPage, searchDocuments) 구현 - 디버그 로깅 시스템 구축 - WebSocket 연결 안정화 - API 키 관리 시스템 구축 - Codebridge-Chatbot 프로젝트 연동 ## 문제 해결 체크리스트 연결이 안 될 때 확인 사항: - [ ] API 키가 올바르게 설정되었는가? (`apikey/gemini_api_key.txt`) - [ ] API 키 형식이 올바른가? (약 39자, `AIzaSy`로 시작) - [ ] Google Cloud Console에서 "Generative Language API"가 활성화되었는가? - [ ] Codebridge-Chatbot 프로젝트에서 API 키가 생성되었는가? - [ ] 브라우저 콘솔에 에러 메시지가 있는가? - [ ] 마이크 접근 권한이 허용되었는가? - [ ] HTTPS 또는 localhost에서 실행 중인가? - [ ] Google GenAI SDK가 정상적으로 로드되었는가? ## 개발자 노트 - 모든 디버그 로그는 브라우저 콘솔에서 확인 가능 - 연결 과정의 각 단계는 타임스탬프와 함께 로깅됨 - 에러 발생 시 전체 디버그 로그가 자동으로 출력됨 - API 키는 절대 클라이언트 코드에 하드코딩하지 않음