front-end/React

React GPT API 사용해서 챗봇 만들기

Hoon0211 2024. 4. 1. 10:36
728x90

1. GPT api 발급 받은 키 .env에 저장하기

REACT_APP_OPENAI_API_KEY ='발급받은키'

 

2. chatbot.jsx 파일에 엔드포인트 및 api key 입력하기

   const apiKey = process.env.REACT_APP_OPENAI_API_KEY;
   const apiEndpoint = 'https://api.openai.com/v1/chat/completions';

 

3. 사용할 변수 입력하기

   const [messages, setMessages] = useState([]);
   const [userInput, setUserInput] = useState('');
   const [loading, setLoading] = useState(false);

 

4. 메세지 추가 함수

   const addMessage = (sender, message) => {
      setMessages(prevMessages => [...prevMessages, { sender, message }]);
   };

 

5. 메시지 입력 함수 및 엔터키 할당

  const handleSendMessage = async () => {
      const message = userInput.trim();
      if (message.length === 0) return;

      addMessage('user', message);
      setUserInput('');
      setLoading(true);

      try {
         const response = await fetch(apiEndpoint, {
            method: 'POST',
            headers: {
               'Content-Type': 'application/json',
               'Authorization': `Bearer ${apiKey}`,
            },
            body: JSON.stringify({
               model: 'gpt-3.5-turbo',
               messages: [{ role: 'user', content: message }],
               max_tokens: 1024,
               top_p: 1,
               temperature: 1,
               frequency_penalty: 0.5,
               presence_penalty: 0.5,
               stop: ['문장 생성 중단 단어'],
            }),
         });

         const data = await response.json();
         const aiResponse = data.choices?.[0]?.message?.content || 'No response';
         addMessage('bot', aiResponse);
      } catch (error) {
         console.error('오류 발생!', error);
         addMessage('오류 발생!');
      } finally {
         setLoading(false);
      }
   };

   const handleKeyDown = (event) => {
      if (event.key === 'Enter') {
         handleSendMessage();
      }
   };

 

6. 테일원드를 사용한 화면 구현

  <>
         <div className='mt-5 w-[90%] h-[1000px] ml-auto mr-auto border-2 border-gray-300 rounded-lg overflow-y-auto'>
            {loading && <span className="messageWait bg-blue-100 text-blue-800 font-semibold py-2 px-4 rounded">답변을 기다리고 있습니다...</span>}
            <div className="messagesContainer space-y-2 p-4">
               {messages.map((msg, index) => (
                  <div key={index} className={`message ${msg.sender === 'user' ? 'bg-blue-500 text-white' : 'bg-gray-300 text-gray-800'} p-2 rounded shadow`}>
                     {`${msg.sender === 'user' ? '나' : '챗봇'}: ${msg.message}`}
                  </div>
               ))}
            </div>
         </div>

         <div className="flex items-center justify-center p-5 w-[90%] ml-auto mr-auto">
            <input
               type='text' placeholder='메시지를 입력하세요'
               className="w-full mb-4 p-2 border-2 border-gray-300 rounded-lg"
               value={userInput} onChange={(e) => setUserInput(e.target.value)}
               onKeyDown={handleKeyDown}
            />
            <button className=" w-44 ml-4 mb-4 bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded" onClick={handleSendMessage}>전송</button>
         </div>
      </>

 

자세한 내용은 OPEN AI API 문서를 참고바랍니다.

728x90
댓글수0