Créer un chatbot IA à l'aide de CopilotKit intégré à un backend Flask peut être un projet passionnant. Vous trouverez ci-dessous un guide étape par étape sur la façon de configurer votre projet, y compris les composants nécessaires pour le frontend (à l'aide de React et CopilotKit) et le backend (à l'aide de Flask).
Tout d'abord, créez un environnement virtuel et installez Flask :
mkdir chatbot-backend cd chatbot-backend python -m venv venv source venv/bin/activate # On Windows use `venv\Scripts\activate` pip install Flask flask-cors
Créez un fichier nommé app.py :
from flask import Flask, request, jsonify from flask_cors import CORS import openai # Make sure to install OpenAI SDK if you're using it app = Flask(__name__) CORS(app) # Allow CORS for all domains # Set your OpenAI API key openai.api_key = 'YOUR_OPENAI_API_KEY' @app.route('/api/chat', methods=['POST']) def chat(): user_message = request.json.get('message') # Call the AI model (e.g., OpenAI GPT) response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": user_message}] ) bot_message = response.choices[0].message['content'] return jsonify({'response': bot_message}) if __name__ == '__main__': app.run(debug=True)
Exécutez votre application Flask :
python app.py
Votre backend devrait maintenant fonctionner sur http://127.0.0.1:5000.
Dans un nouveau répertoire, créez votre application React :
npx create-react-app chatbot-frontend cd chatbot-frontend
Installez CopilotKit et Axios pour effectuer des appels API :
npm install @copilotkit/react axios
Créez un fichier nommé Chatbot.js dans le répertoire src :
import React, { useState, useEffect } from 'react'; import axios from 'axios'; import { CopilotSidebar, useCopilotChat } from '@copilotkit/react'; import './Chatbot.css'; // Importing CSS file for styling const Chatbot = () => { const [message, setMessage] = useState(''); const [chatHistory, setChatHistory] = useState([]); const [selectedPrompt, setSelectedPrompt] = useState(''); const [conversations, setConversations] = useState([]); const [prompts, setPrompts] = useState([]); const [newPrompt, setNewPrompt] = useState(''); const [searchTerm, setSearchTerm] = useState(''); const [showPromptInput, setShowPromptInput] = useState(false); // State to toggle prompt input visibility const { addMessage } = useCopilotChat(); useEffect(() => { // Load conversations and prompts from local storage on component mount const storedChats = JSON.parse(localStorage.getItem('chatHistory')) || []; const storedPrompts = JSON.parse(localStorage.getItem('prompts')) || []; setConversations(storedChats); setPrompts(storedPrompts); // Load the most recent conversation into chat history if available if (storedChats.length > 0) { setChatHistory(storedChats[storedChats.length - 1].history); } }, []); const handleSendMessage = async () => { const userMessage = { sender: 'User', text: message }; const updatedChatHistory = [...chatHistory, userMessage]; setChatHistory(updatedChatHistory); setMessage(''); try { const response = await axios.post('http://127.0.0.1:5000/api/chat', { message }); const botMessage = { sender: 'Bot', text: response.data.response }; updatedChatHistory.push(botMessage); setChatHistory(updatedChatHistory); // Add messages to Copilot addMessage(userMessage); addMessage(botMessage); // Save updated chat history to local storage localStorage.setItem('chatHistory', JSON.stringify(updatedChatHistory)); } catch (error) { console.error('Error sending message:', error); } }; const handlePromptSelect = (prompt) => { setSelectedPrompt(prompt); setMessage(prompt); }; const handleConversationClick = (conversation) => { setChatHistory(conversation.history); }; const handleSaveConversation = () => { const title = prompt("Enter a title for this conversation:"); if (title) { const newConversation = { title, history: chatHistory }; const updatedConversations = [...conversations, newConversation]; setConversations(updatedConversations); localStorage.setItem('chatHistory', JSON.stringify(updatedConversations)); } }; const handleAddPrompt = () => { if (newPrompt.trim()) { const updatedPrompts = [...prompts, newPrompt.trim()]; setPrompts(updatedPrompts); localStorage.setItem('prompts', JSON.stringify(updatedPrompts)); setNewPrompt(''); setShowPromptInput(false); // Hide the input after adding } }; // Function to delete a conversation const handleDeleteConversation = (index) => { const updatedConversations = conversations.filter((_, i) => i !== index); setConversations(updatedConversations); localStorage.setItem('chatHistory', JSON.stringify(updatedConversations)); // Optionally reset chat history if the deleted conversation was currently loaded if (chatHistory === conversations[index].history) { setChatHistory([]); } }; // Filtered prompts based on search term const filteredPrompts = prompts.filter(prompt => prompt.toLowerCase().includes(searchTerm.toLowerCase()) ); // Filtered conversations based on search term const filteredConversations = conversations.filter(conversation => conversation.title.toLowerCase().includes(searchTerm.toLowerCase()) ); return ( <div className="chatbot-container"> <CopilotSidebar title="Recent Conversations"> <input type="text" placeholder="Search Conversations..." value={searchTerm} onChange={(e) => setSearchTerm(e.target.value)} className="search-input" /> {filteredConversations.map((conversation, index) => ( <div key={index} className="conversation-title"> <span onClick={() => handleConversationClick(conversation)}> {conversation.title} </span> <button className="delete-button" onClick={() => handleDeleteConversation(index)}> ?️ {/* Delete icon */} </button> </div> ))} <button onClick={handleSaveConversation} className="save-button">Save Conversation</button> </CopilotSidebar> <div className="chat-area"> <h2>AI Chatbot</h2> <div className="chat-history"> {chatHistory.map((chat, index) => ( <div key={index} className={`message ${chat.sender === 'User' ? 'user' : 'bot'}`}> <strong>{chat.sender}:</strong> {chat.text} </div> ))} </div> <div className="input-area"> <select value={selectedPrompt} onChange={(e) => handlePromptSelect(e.target.value)} className="prompt-select" > <option value="">Select a prompt...</option> {filteredPrompts.map((prompt, index) => ( <option key={index} value={prompt}>{prompt}</option> ))} </select> {/* Button to toggle visibility of the new prompt input */} <button onClick={() => setShowPromptInput(!showPromptInput)} className="toggle-prompt-button"> {showPromptInput ? "Hide Prompt Input" : "Add New Prompt"} </button> {/* New Prompt Input Field */} {showPromptInput && ( <input type="text" value={newPrompt} onChange={(e) => setNewPrompt(e.target.value)} placeholder="Add a new prompt..." className="new-prompt-input" /> )} {/* Button to add the new prompt */} {showPromptInput && ( <button onClick={handleAddPrompt} className="add-prompt-button">Add Prompt</button> )} {/* Message Input Field */} <input type="text" value={message} onChange={(e) => setMessage(e.target.value)} placeholder="Type your message..." className="message-input" /> <button onClick={handleSendMessage} className="send-button">Send</button> </div> </div> </div> ); }; export default Chatbot;
Remplacez le contenu de src/App.js par :
import React from 'react'; import Chatbot from './Chatbot'; function App() { return ( <div className="App"> <Chatbot /> </div> ); } export default App;
.chatbot-container { display: flex; height: 100vh; } .chat-area { margin-left: 20px; flex-grow: 1; padding: 20px; background-color: #f9f9f9; border-radius: 8px; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); } .chat-history { border: 1px solid #ccc; padding: 10px; height: calc(100% - 120px); /* Adjust height based on input area */ overflow-y: scroll; border-radius: 8px; } .message { margin-bottom: 10px; } .user { text-align: right; } .bot { text-align: left; } .input-area { display: flex; align-items: center; } .prompt-select { margin-right: 10px; } .message-input { flex-grow: 1; padding: 10px; border-radius: 4px; border: 1px solid #ccc; } .send-button { padding: 10px 15px; background-color: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; } .send-button:hover { background-color: #0056b3; } .conversation-title { padding: 10px; cursor: pointer; } .conversation-title:hover { background-color: #f0f0f0; } .save-button { margin-top: 10px; padding: 5px 10px; background-color: #28a745; color: white; border: none; border-radius: 4px; cursor: pointer; } .save-button:hover { background-color: #218838; } .prompt-select, .new-prompt-input, .message-input { margin-right: 10px; } .search-input { margin-bottom: 10px; } .new-prompt-input { flex-grow: 1; /* Allow it to take remaining space */ padding: 10px; border-radius: 4px; border: 1px solid #ccc; } .add-prompt-button, .send-button, .save-button { padding: 10px 15px; background-color: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; } .add-prompt-button:hover, .send-button:hover, .save-button:hover { background-color: #0056b3; /* Darker shade for hover */ } .conversation-title { padding: 10px; cursor: pointer; } .conversation-title:hover { background-color: #f0f0f0; /* Highlight on hover */ } .toggle-prompt-button { margin-right: 10px; padding: 10px 15px; background-color: #17a2b8; /* Different color for visibility */ color: white; border: none; border-radius: 4px; cursor: pointer; } .toggle-prompt-button:hover { background-color: #138496; /* Darker shade for hover */ }
Démarrez votre application React :
npm start
Votre interface devrait maintenant fonctionner sur http://localhost:3000.
Pour inclure une URL de référentiel GitHub dans votre publication dev.to sur la création d'un chatbot avec CopilotKit, Flask et React, vous pouvez la formater comme suit :
Dans cet article, nous passerons en revue les étapes de création d'un chatbot IA interactif en utilisant CopilotKit pour le frontend, Flask comme backend et React pour l'interface utilisateur.
Vous pouvez retrouver le code complet de ce projet sur GitHub : Chatbot avec CopilotKit
Vous disposez désormais d'un chatbot IA de base construit à l'aide de CopilotKit pour le frontend et de Flask pour le backend ! Vous pouvez améliorer ce projet en ajoutant des fonctionnalités telles que l'authentification des utilisateurs, l'enregistrement de l'historique des discussions ou l'amélioration de la conception UI/UX.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!