| | import os |
| | import gradio as gr |
| | from datetime import datetime |
| |
|
| | |
| | try: |
| | from notion_client import Client |
| | except ImportError: |
| | os.system('pip install notion-client') |
| | from notion_client import Client |
| |
|
| | try: |
| | from groq import Groq |
| | except ImportError: |
| | os.system('pip install groq') |
| | from groq import Groq |
| |
|
| | |
| | client = Groq(api_key=os.getenv('groq_key')) |
| |
|
| | |
| | notion = Client(auth=os.getenv("NOTION_API_KEY")) |
| | NOTION_DB_ID = os.getenv("NOTION_DB_ID") |
| |
|
| | def log_to_notion(name, user_input, bot_response): |
| | """Logs the conversation to Notion.""" |
| | try: |
| | notion.pages.create( |
| | parent={"database_id": NOTION_DB_ID}, |
| | properties={ |
| | "Name": {"title": [{"text": {"content": name}}]}, |
| | "Timestamp": {"date": {"start": datetime.now().isoformat() }}, |
| | "User Input": {"rich_text": [{"text": {"content": user_input}}]}, |
| | "Bot Response": {"rich_text": [{"text": {"content": bot_response}}]}, |
| | }, |
| | ) |
| | except Exception as e: |
| | print(f"Failed to log to Notion: {e}") |
| |
|
| | def process_message(message, history): |
| | """Processes the user message and returns the bot response.""" |
| | messages = [ |
| | { |
| | "role": "system", |
| | "content": "你是一個高中數學老師,使用的語言是英文。學生用中文問妳任何字彙,你都可以告訴他那個中文對應的英文和例句,以及在數學上的可能用法以及數學例題和解法。\n說明數學上的可能用法時,先用中文講一遍再用B1程度的英文複述一遍\n" |
| | } |
| | ] |
| |
|
| | for user_msg, bot_msg in history: |
| | messages.append({"role": "user", "content": user_msg}) |
| | messages.append({"role": "assistant", "content": bot_msg}) |
| |
|
| | messages.append({"role": "user", "content": message}) |
| |
|
| | completion = client.chat.completions.create( |
| | model="llama-3.3-70b-versatile", |
| | messages=messages, |
| | temperature=1, |
| | max_tokens=1024, |
| | top_p=1, |
| | stream=True, |
| | stop=None, |
| | ) |
| |
|
| | response_text = "" |
| | for chunk in completion: |
| | delta_content = chunk.choices[0].delta.content |
| | if delta_content is not None: |
| | response_text += delta_content |
| | yield response_text |
| |
|
| | |
| | with gr.Blocks() as demo: |
| | with gr.Row(): |
| | name_input = gr.Textbox(placeholder="輸入您的名字...", label="Name") |
| | msg = gr.Textbox(placeholder="輸入您的問題...", label="User Input") |
| |
|
| | chatbot = gr.Chatbot(height=600, show_label=False, container=True) |
| | clear = gr.Button("清除對話") |
| |
|
| | def user(name, user_message, history): |
| | return "", history + [[user_message, None]], name |
| |
|
| | def bot(name, history): |
| | history[-1][1] = "" |
| | for response in process_message(history[-1][0], history[:-1]): |
| | history[-1][1] = response |
| | yield history |
| |
|
| | |
| | if name.strip(): |
| | log_to_notion(name, history[-1][0], history[-1][1]) |
| |
|
| | msg.submit(user, [name_input, msg, chatbot], [msg, chatbot, name_input], queue=False).then( |
| | bot, [name_input, chatbot], chatbot |
| | ) |
| | clear.click(lambda: None, None, chatbot, queue=False) |
| |
|
| | |
| | if __name__ == "__main__": |
| | demo.queue() |
| | demo.launch() |
| |
|
| |
|