Spaces:
Running
Running
# Importing necessary Python libraries (pre-made code that helps us do specific tasks) | |
import os # This helps us access environment variables, like secret keys | |
import gradio as gr # Gradio helps us build simple web interfaces | |
import openai # This allows us to connect to Poe’s API (powered by OpenAI) | |
# ------------------------- | |
# 🛠️ Poe API Setup | |
# ------------------------- | |
# We get the Poe API key from the environment (it's stored securely in Hugging Face Secrets) | |
# This key lets us connect to Poe’s chatbot service | |
POE_API_KEY = os.environ["POE_API_KEY"] | |
# Creating a client (connection) to the Poe API | |
# `base_url` is where the Poe service lives online | |
client = openai.OpenAI( | |
api_key=POE_API_KEY, | |
base_url="https://api.poe.com/v1" | |
) | |
# ------------------------- | |
# 💬 Chat Function | |
# ------------------------- | |
# This is the main function that handles the conversation with Poe | |
def chat_with_poe(history, message): | |
# `history` stores past messages between user and bot | |
# `message` is the new user message that needs a reply | |
# Convert Gradio’s format to Poe’s format | |
messages = [] # This will be a list of messages we send to Poe | |
for user_msg, bot_msg in history: | |
# Add the user’s previous message | |
messages.append({"role": "user", "content": user_msg}) | |
# If there's a bot reply, add it too | |
if bot_msg: | |
messages.append({"role": "assistant", "content": bot_msg}) | |
# Add the new user message to the end of the list | |
messages.append({"role": "user", "content": message}) | |
try: | |
# Send the messages to Poe and get the response from the chatbot | |
response = client.chat.completions.create( | |
model="My_Tutor_Shq", # The name of your bot on Poe | |
messages=messages # All past and current messages | |
) | |
# Extract the bot’s reply from the response | |
bot_reply = response.choices[0].message.content | |
except Exception as e: | |
# If something goes wrong, show an error message | |
bot_reply = f"⚠️ Error: {str(e)}" | |
# Add the new message and bot reply to the chat history | |
history.append((message, bot_reply)) | |
# Return updated chat history twice (Gradio expects it this way) | |
return history, history | |
# ------------------------- | |
# 🖼️ Gradio Chat Interface (UI) | |
# ------------------------- | |
# `with gr.Blocks()` sets up a visual layout for our chat interface | |
# `theme=gr.themes.Soft()` makes the interface look nice and clean | |
with gr.Blocks(theme=gr.themes.Soft()) as demo: | |
# This adds a title and description at the top | |
gr.Markdown( | |
# 🤖 Your title goes here | |
# Description | |
# Type below to start chatting. | |
""" | |
# 🤖 Python Tutor Bot | |
""" | |
) | |
# This creates the actual chatbot display window | |
chatbot = gr.Chatbot([], height=400) | |
# A text box where the user can type their message | |
msg = gr.Textbox(placeholder="Type your message...") | |
# A button to clear the chat history | |
clear = gr.Button("Clear Chat") | |
# When the user presses enter in the textbox: | |
# Call `chat_with_poe()` using the current chat and new message | |
# Update the chat window with the new messages | |
msg.submit(chat_with_poe, [chatbot, msg], [chatbot, chatbot]) | |
# When the "Clear Chat" button is clicked, reset the chatbot window to empty | |
clear.click(lambda: [], None, chatbot) | |
# ------------------------- | |
# 🚀 Launch the App | |
# ------------------------- | |
# This runs the app if the file is being executed directly (not imported) | |
if __name__ == "__main__": | |
demo.launch() # Starts the Gradio interface so users can chat with the bot | |