grokTest / app.py
Browen0311's picture
Update app.py
003f2e8 verified
raw
history blame
3.12 kB
import gradio as gr
import os
import json
import requests
from typing import List, Tuple
# 環境變數設置
XAI_API_KEY = os.getenv("XAI_API_KEY")
if not XAI_API_KEY:
raise ValueError("Please set XAI_API_KEY environment variable")
def call_grok_api(messages: List[dict]) -> str:
"""調用Grok API"""
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {XAI_API_KEY}"
}
data = {
"messages": messages,
"model": "grok-beta",
"stream": False,
"temperature": 0.7
}
try:
response = requests.post(
"https://api.x.ai/v1/chat/completions",
headers=headers,
json=data
)
response.raise_for_status()
return response.json()["choices"][0]["message"]["content"]
except requests.exceptions.RequestException as e:
return f"Error calling Grok API: {str(e)}"
def format_history(history: List[Tuple[str, str]]) -> List[dict]:
"""將聊天歷史格式化為Grok API需要的格式"""
formatted_messages = [
{
"role": "system",
"content": """You are Grok, a chatbot inspired by the Hitchhikers Guide to the Galaxy.
Please respond in Traditional Chinese (繁體中文).
Keep your responses natural and conversational while maintaining Traditional Chinese characters."""
}
]
for user_msg, assistant_msg in history:
if user_msg:
formatted_messages.append({
"role": "user",
"content": user_msg
})
if assistant_msg:
formatted_messages.append({
"role": "assistant",
"content": assistant_msg
})
return formatted_messages
def respond(message: str, history: List[Tuple[str, str]]) -> Tuple[str, List[Tuple[str, str]]]:
"""處理用戶輸入並生成回應"""
# 格式化歷史記錄並添加新消息
history_for_api = format_history(history + [(message, None)])
# 獲取Grok的回應
response = call_grok_api(history_for_api)
# 返回更新後的歷史記錄和空字符串(用於清除輸入框)
history.append((message, response))
return "", history
# 創建Gradio界面
with gr.Blocks() as demo:
gr.Markdown("""
# Grok 聊天機器人
與 Elon Musk 的 Grok AI 聊天!這個聊天機器人使用了 xAI 的 Grok API。
""")
chatbot = gr.Chatbot(
value=[],
height=500,
bubble_full_width=False,
show_copy_button=True,
)
with gr.Row():
msg = gr.Textbox(
placeholder="輸入訊息...",
container=False,
scale=7,
autofocus=True, # 自動聚焦到輸入框
)
clear = gr.ClearButton([msg, chatbot], variant="secondary", scale=1)
# 注意這裡輸出添加了msg,用於清除輸入框
msg.submit(respond, [msg, chatbot], [msg, chatbot], api_name="chat")
demo.queue()
# 啟動應用
if __name__ == "__main__":
demo.launch()