This commit is contained in:
dsyoon
2025-12-27 14:06:26 +09:00
parent 23f5388c56
commit 46460b77f8
33 changed files with 4600 additions and 1 deletions

View File

@@ -0,0 +1,57 @@
// 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;