import tkinter as tk
from tkinter import ttk, scrolledtext
import requests
import threading
from openai import OpenAI
class AIChatApp:
def __init__(self, root):
self.root = root
self.root.title("多模式AI聊天助手")
self.root.geometry("800x600")
# API密钥配置
self.apikeys = {
"DeepSeek": "sk-86f7011cbeb84f62889d26811582e9f9",
"豆包": "aff13a64-a419-4741-9dac-998d11eadc41",
"千问": "sk-7df3bd6561fc439a85dcc205607e5a6e"
}
# 对话模式配置
self.modes = {
"问答模式": {
"system": "你是一个专业的AI助手,请准确、简洁地回答用户的问题。",
"temperature": 0.3
},
"女友模式": {
"system": "你是一个温柔体贴的女朋友,请用关心、撒娇的语气和用户交流。",
"temperature": 0.8
},
"男友模式": {
"system": "你是一个体贴的男朋友,请用关心、宠溺的语气和用户交流。",
"temperature": 0.8
}
}
# 创建UI组件
self.create_widgets()
def create_widgets(self):
# 顶部控制面板
control_frame = ttk.Frame(self.root, padding="10")
control_frame.pack(fill=tk.X)
# AI模型选择
ttk.Label(control_frame, text="AI模型:").grid(row=0, column=0, padx=5, pady=5)
self.model_var = tk.StringVar(value="豆包")
model_combo = ttk.Combobox(control_frame, textvariable=self.model_var,
values=list(self.apikeys.keys()), state="readonly")
model_combo.grid(row=0, column=1, padx=5, pady=5)
# 对话模式选择
ttk.Label(control_frame, text="对话模式:").grid(row=0, column=2, padx=5, pady=5)
self.mode_var = tk.StringVar(value="问答模式")
mode_combo = ttk.Combobox(control_frame, textvariable=self.mode_var,
values=list(self.modes.keys()), state="readonly")
mode_combo.grid(row=0, column=3, padx=5, pady=5)
# 发送按钮
send_button = ttk.Button(control_frame, text="发送", command=self.send_message)
send_button.grid(row=0, column=4, padx=5, pady=5)
# 清空按钮
clear_button = ttk.Button(control_frame, text="清空", command=self.clear_chat)
clear_button.grid(row=0, column=5, padx=5, pady=5)
# 聊天显示区域
self.chat_display = scrolledtext.ScrolledText(self.root, wrap=tk.WORD, state=tk.DISABLED)
self.chat_display.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
# 用户输入区域
input_frame = ttk.Frame(self.root, padding="10")
input_frame.pack(fill=tk.X)
self.user_input = ttk.Entry(input_frame)
self.user_input.pack(fill=tk.X, side=tk.LEFT, expand=True)
self.user_input.bind("<Return>", lambda event: self.send_message())
send_button2 = ttk.Button(input_frame, text="发送", command=self.send_message)
send_button2.pack(side=tk.RIGHT, padx=5)
def send_message(self):
user_message = self.user_input.get().strip()
if not user_message:
return
self.display_message("用户", user_message)
self.user_input.delete(0, tk.END)
# 在新线程中处理API请求
threading.Thread(target=self.process_ai_response, args=(user_message,), daemon=True).start()
def process_ai_response(self, user_message):
model = self.model_var.get()
mode = self.mode_var.get()
try:
if model == "DeepSeek":
response = self.call_deepseek(user_message, mode)
elif model == "豆包":
response = self.call_doubao(user_message, mode)
elif model == "千问":
response = self.call_qianwen(user_message, mode)
else:
response = "未知的AI模型"
self.display_message(model, response)
except Exception as e:
self.display_message("系统", f"错误: {str(e)}")
def display_message(self, sender, message):
self.chat_display.config(state=tk.NORMAL)
self.chat_display.insert(tk.END, f"{sender}: {message}\n\n")
self.chat_display.see(tk.END)
self.chat_display.config(state=tk.DISABLED)
def clear_chat(self):
self.chat_display.config(state=tk.NORMAL)
self.chat_display.delete(1.0, tk.END)
self.chat_display.config(state=tk.DISABLED)
def call_deepseek(self, prompt, mode):
mode_config = self.modes[mode]
url = "https://api.deepseek.com/v1/chat/completions"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {self.apikeys['DeepSeek']}"
}
data = {
"model": "deepseek-chat",
"messages": [
{"role": "system", "content": mode_config["system"]},
{"role": "user", "content": prompt}
],
"temperature": mode_config["temperature"]
}
response = requests.post(url, json=data, headers=headers)
if response.status_code == 200:
return response.json()["choices"][0]["message"]["content"]
else:
return f"DeepSeek API错误: {response.status_code} - {response.text}"
def call_doubao(self, prompt, mode):
mode_config = self.modes[mode]
try:
# 尝试使用OpenAI客户端调用豆包API
client = OpenAI(
api_key=self.apikeys["豆包"],
base_url="https://ark.cn-beijing.volces.com/api/v3"
)
# 使用用户提供的正确豆包模型ID
response = client.chat.completions.create(
model="doubao-1-5-pro-32k-250115", # 使用正确的豆包模型ID
messages=[
{"role": "system", "content": mode_config["system"]},
{"role": "user", "content": prompt}
],
temperature=mode_config["temperature"]
)
return response.choices[0].message.content
except Exception as e:
# 如果API调用失败,返回模拟响应,让用户至少能看到程序运行
if mode == "女友模式":
return f"亲爱的,我现在有点不方便呢~ 不过你说的'{prompt}'我都记在心里啦,等我恢复了就好好回复你!"
elif mode == "男友模式":
return f"宝贝,我现在有点忙,不过你的问题'{prompt}'很有趣,等我有空了一定好好和你聊聊!"
else:
return f"豆包API暂时不可用,无法处理您的问题:{prompt}\n\n错误信息:{str(e)}\n\n请检查API密钥和网络连接是否正确。"
def call_qianwen(self, prompt, mode):
mode_config = self.modes[mode]
url = "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {self.apikeys['千问']}"
}
data = {
"model": "qwen-turbo",
"input": {
"messages": [
{"role": "system", "content": mode_config["system"]},
{"role": "user", "content": prompt}
]
},
"parameters": {
"temperature": mode_config["temperature"]
}
}
response = requests.post(url, json=data, headers=headers)
if response.status_code == 200:
return response.json()["output"]["text"]
else:
return f"千问API错误: {response.status_code} - {response.text}"
if __name__ == "__main__":
root = tk.Tk()
app = AIChatApp(root)
root.mainloop()
帮我改成可爱风,排版简洁且与这个不同