youngtsai's picture
Update app.py
922302c verified
raw
history blame
4.12 kB
import os
import subprocess
from datetime import datetime
import gradio as gr
# 自動檢查並安裝必要的套件
def install_and_import(package):
try:
__import__(package)
except ImportError:
subprocess.check_call(["pip", "install", package])
# 安裝依賴
install_and_import("notion-client")
install_and_import("gradio")
install_and_import("groq")
from notion_client import Client
from groq import Groq
# 從環境變數中提取 Notion API Key 和資料庫 ID
NOTION_API_KEY = os.getenv("NOTION_API_KEY")
NOTION_DB_ID = os.getenv("NOTION_DB_ID")
if not NOTION_API_KEY or not NOTION_DB_ID:
raise ValueError("請設置 NOTION_API_KEY 和 NOTION_DB_ID 環境變數!")
# 初始化 Notion 客戶端
notion = Client(auth=NOTION_API_KEY)
# 設定 Groq 的 API Key
groq_key = os.getenv("groq_key")
if not groq_key:
raise ValueError("groq_key 環境變數未設置!")
client = Groq(api_key=groq_key)
# 定義 Chatbot 類
class SimpleChatBot:
def __init__(self):
self.initial_prompt = [
{
"role": "system",
"content": "你是一個英文老師,會教我背單字,並用蘇格拉底問答引導我,引導時請用繁體中文 zhTW"
}
]
def get_response(self, message, chat_history):
messages = self.initial_prompt + chat_history
messages.append({"role": "user", "content": message})
# 使用 groq 的 chat.completions API 生成回應
completion = client.chat.completions.create(
model="llama3-8b-8192",
messages=messages,
temperature=1,
max_tokens=1024,
top_p=1,
stream=False,
)
# 修正:正確提取 completion 的內容
response_content = completion.choices[0].message.content
return response_content
chatbot = SimpleChatBot()
# 記錄聊天內容到 Notion 資料庫
def log_to_notion(user_name, user_message, bot_response):
try:
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
notion.pages.create(
parent={"database_id": NOTION_DB_ID},
properties={
"Timestamp": {"date": {"start": timestamp}},
"Name": {"title": [{"text": {"content": user_name or "Anonymous"}}]},
"User Input": {"rich_text": [{"text": {"content": user_message}}]},
"Bot Response": {"rich_text": [{"text": {"content": bot_response}}]},
},
)
print("Logged to Notion successfully.")
except Exception as e:
print(f"Error logging to Notion: {e}")
# 定義回應邏輯
def respond(name, message, chat_history):
chat_history = [{"role": entry["role"], "content": entry["content"]} for entry in chat_history]
response = chatbot.get_response(message, chat_history)
chat_history.append({"role": "user", "content": message})
chat_history.append({"role": "assistant", "content": response})
# 記錄到 Notion
log_to_notion(name, message, response)
return chat_history, ""
# 定義用於存儲用戶名字的狀態
def set_name(name):
return name
# 建立 Gradio 界面
with gr.Blocks(title="簡單的Gradio聊天機器人") as demo:
gr.Markdown("# 簡單的Gradio聊天機器人")
# 用戶名稱輸入框
with gr.Row():
name_input = gr.Textbox(placeholder="輸入你的名字(僅需填寫一次)", label="你的名字", interactive=True)
name_button = gr.Button("確認名字")
# 聊天區
chatbot_interface = gr.Chatbot(type="messages")
with gr.Row():
user_input = gr.Textbox(placeholder="輸入訊息...", label="你的訊息")
send_button = gr.Button("發送")
# 狀態保持,用於存儲用戶名稱
user_name = gr.State()
# 事件綁定
name_button.click(set_name, inputs=[name_input], outputs=[user_name])
send_button.click(
respond,
inputs=[user_name, user_input, chatbot_interface],
outputs=[chatbot_interface, user_input]
)
demo.launch(share=True)