Files
dsyoon 46460b77f8 init
2025-12-27 14:06:26 +09:00

57 lines
2.2 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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;