Spaces:
Build error
Build error
| 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) | |