// AIService.js // ----------------------------------------------------------------------------- // 백엔드 `/chat` 엔드포인트 호출 전용 모듈. // - question : 사용자가 보낸 텍스트 // - toolId : 엔진 ID (ex: dev_chatbot) // - sessionId : 세션 지속용 ID (null이면 서버가 새로 발급) // - files : 첨부 파일 배열 // 응답 형태 { response, sessionId, toolName } // 프론트엔드의 ChatHandler / ChatInput 등에서 재사용한다. // ----------------------------------------------------------------------------- // 실제 운영환경에서는 REACT_APP_* 형태의 .env 값을 사용하도록 권장. const OPENAI_API_KEY = process.env.REACT_APP_OPENAI_API_KEY; // FastAPI 서버 주소 – 필요시 프록시 / env 로 분리. const API_BASE_URL = 'http://localhost:8010'; /** * 챗봇 API 호출 함수 (multipart/form-data) * @param {string} question - 사용자 질문 * @param {string} toolId - 엔진 ID * @param {string|null} sessionId- 세션 ID (옵션) * @param {File[]} files - 첨부 파일 배열 * @returns {Promise<{response:string, sessionId:string, toolName:string}>} */ const AIService = async (question, toolId, sessionId = null, files = []) => { try { // ------------ FormData 구성 ------------- const formData = new FormData(); formData.append('message', question); formData.append('tool_id', toolId); if (sessionId) formData.append('session_id', sessionId); files.forEach(file => formData.append('image', file)); // ------------- Fetch ------------------- const response = await fetch(`${API_BASE_URL}/chat`, { method: 'POST', body: formData, }); if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`); const data = await response.json(); return { response : data.response?.trim() || 'AI 응답을 생성하지 못했습니다.', sessionId: data.session_id, toolName : data.tool_name, }; } catch (e) { console.error('AI 서비스 오류:', e); return { response: 'AI 응답을 생성하지 못했습니다.', sessionId: null, toolName: '' }; } }; export default AIService;