from openai import OpenAI client = OpenAI(api_key="sk-03051a3121434551b7c5e6242959dfc7", base_url="https://api.deepseek.com/v1") response = client.chat.completions.create( model="deepseek-reasoner", messages=[ {"role": "system", "content": ""}, {"role": "user", "content": "Hello"}, ], stream=False ) print(response.choices[0].message.content) 基于以上的内容,帮我写一个与AI对话的EXE程序,功能考虑完善,写完检查代码
时间: 2025-04-09 14:53:26 浏览: 26
<think>嗯,用户想让我帮忙写一个基于他们提供的代码的EXE程序,实现与AI对话的功能。首先,我需要仔细看一下他们给出的代码示例。看起来他们用的是DeepSeek的API,通过OpenAI库来调用。代码结构是创建了一个客户端,然后调用聊天补全功能,获取响应。
用户的需求是把这个代码扩展成一个功能完善的EXE程序。那我要考虑几个方面:首先,程序需要有一个用户界面,可能是命令行或者图形界面。因为用户要的是EXE,可能图形界面会更友好一些,但命令行更简单。不过,考虑到用户体验,图形界面可能更合适,比如用Tkinter或者PySimpleGUI。
其次,功能完善需要考虑哪些点呢?比如历史对话记录的显示,用户输入框,发送按钮,API密钥的安全性,错误处理,可能还有流式输出或者非流式的切换。用户提供的代码里stream是False,所以可能默认是非流式,但可以给选项。
然后,代码检查方面,需要确保没有API密钥硬编码在代码里,应该让用户自己输入或者通过配置文件读取。用户提供的示例代码里有api_key,这显然是不安全的,所以在最终程序中需要避免,改成从环境变量或者输入框获取。
另外,异常处理很重要,比如网络连接问题,API密钥错误,模型不可用等情况,需要有相应的提示信息。还有,程序应该能够持续对话,保持上下文,这样就需要维护messages列表,把每次的用户输入和AI回复都添加进去。
关于打包成EXE,可能需要用pyinstaller,这时候要注意打包时的依赖问题,比如是否包含所有必要的库,特别是OpenAI和使用的GUI库。另外,打包后的文件大小和防病毒软件误报也是需要考虑的,但用户可能更关注功能实现。
接下来,设计GUI界面。用Tkinter的话,可以有一个文本框显示对话历史,一个输入框供用户输入,一个发送按钮,可能还有一个API密钥的输入区域。或者,在程序启动时弹出一个对话框让用户输入API密钥,这样更安全一些。
历史记录的管理,每次用户发送消息后,添加到messages里,然后显示在历史框中。同时,AI的回复也要添加进去。需要处理换行和滚动条,确保长时间对话也能方便查看。
测试方面,需要模拟各种情况,比如无效的API密钥,网络断开,模型响应慢等,确保程序不会崩溃,而是给出友好的错误提示。
最后,代码结构要清晰,方便用户理解和修改。可能将GUI部分和API调用部分分开,比如用类来组织代码,提高可读性和可维护性。
总结一下,步骤大概是:设计GUI界面,处理用户输入,管理对话历史,调用API,处理响应和错误,打包成EXE。同时,确保API密钥的安全,避免硬编码,做好异常处理,保证程序稳定。</think>我将为您编写一个功能完善的AI对话EXE程序,以下是分步说明和代码实现:
```python
import tkinter as tk
from tkinter import scrolledtext, messagebox, filedialog
from openai import OpenAI
import threading
import os
class AIChatApp:
def __init__(self, root):
self.root = root
self.root.title("DeepSeek AI对话工具 v1.0")
self.client = None
self.setup_ui()
self.setup_menu()
self.messages = []
# 自动加载配置文件
self.load_config()
def setup_ui(self):
# 历史记录区域
self.history_area = scrolledtext.ScrolledText(
self.root, wrap=tk.WORD, width=60, height=20)
self.history_area.pack(padx=10, pady=5)
self.history_area.configure(state='disabled')
# 输入区域
input_frame = tk.Frame(self.root)
input_frame.pack(padx=10, pady=5, fill=tk.X)
self.input_field = tk.Text(input_frame, height=4)
self.input_field.pack(side=tk.LEFT, fill=tk.X, expand=True)
send_btn = tk.Button(input_frame, text="发送", command=self.send_message)
send_btn.pack(side=tk.RIGHT, padx=5)
# 状态栏
self.status = tk.StringVar()
status_bar = tk.Label(self.root, textvariable=self.status, bd=1, relief=tk.SUNKEN, anchor=tk.W)
status_bar.pack(fill=tk.X)
# API密钥设置
self.api_key = tk.StringVar()
api_frame = tk.Frame(self.root)
api_frame.pack(padx=10, pady=5, fill=tk.X)
tk.Label(api_frame, text="API Key:").pack(side=tk.LEFT)
tk.Entry(api_frame, textvariable=self.api_key, width=40, show="*").pack(side=tk.LEFT, padx=5)
tk.Button(api_frame, text="保存配置", command=self.save_config).pack(side=tk.RIGHT)
def setup_menu(self):
menu_bar = tk.Menu(self.root)
# 文件菜单
file_menu = tk.Menu(menu_bar, tearoff=0)
file_menu.add_command(label="导出对话记录", command=self.export_history)
file_menu.add_separator()
file_menu.add_command(label="退出", command=self.root.quit)
menu_bar.add_cascade(label="文件", menu=file_menu)
# 帮助菜单
help_menu = tk.Menu(menu_bar, tearoff=0)
help_menu.add_command(label="关于", command=self.show_about)
menu_bar.add_cascade(label="帮助", menu=help_menu)
self.root.config(menu=menu_bar)
def send_message(self):
user_input = self.input_field.get("1.0", tk.END).strip()
if not user_input:
messagebox.showwarning("输入为空", "请输入您的问题")
return
if not self.validate_api_key():
return
self.update_status("正在处理请求...")
self.input_field.delete("1.0", tk.END)
self.messages.append({"role": "user", "content": user_input})
self.update_history(f"您:\n{user_input}\n\n")
# 在新线程中处理请求
threading.Thread(target=self.process_request, daemon=True).start()
def process_request(self):
try:
response = self.client.chat.completions.create(
model="deepseek-reasoner",
messages=self.messages,
stream=False
)
ai_response = response.choices[0].message.content
self.messages.append({"role": "assistant", "content": ai_response})
self.update_history(f"AI:\n{ai_response}\n{'-'*40}\n")
self.update_status("就绪")
except Exception as e:
self.update_status(f"错误:{str(e)}")
messagebox.showerror("API请求失败", str(e))
def validate_api_key(self):
api_key = self.api_key.get().strip()
if not api_key:
messagebox.showerror("API密钥缺失", "请先输入有效的API密钥")
return False
if not self.client or self.client.api_key != api_key:
try:
self.client = OpenAI(
api_key=api_key,
base_url="https://api.deepseek.com/v1"
)
except Exception as e:
messagebox.showerror("API密钥错误", f"密钥验证失败:{str(e)}")
return False
return True
def update_history(self, text):
self.history_area.configure(state='normal')
self.history_area.insert(tk.END, text)
self.history_area.see(tk.END)
self.history_area.configure(state='disabled')
def update_status(self, text):
self.status.set(text)
self.root.update_idletasks()
def save_config(self):
config = {
"api_key": self.api_key.get()
}
try:
with open("config.cfg", "w") as f:
f.write("\n".join([f"{k}={v}" for k,v in config.items()]))
messagebox.showinfo("保存成功", "配置已保存")
except Exception as e:
messagebox.showerror("保存失败", str(e))
def load_config(self):
if os.path.exists("config.cfg"):
try:
with open("config.cfg") as f:
for line in f:
key, value = line.strip().split("=", 1)
if key == "api_key":
self.api_key.set(value)
except Exception as e:
messagebox.showwarning("配置加载失败", str(e))
def export_history(self):
file_path = filedialog.asksaveasfilename(
defaultextension=".txt",
filetypes=[("Text Files", "*.txt"), ("All Files", "*.*")]
)
if file_path:
try:
content = self.history_area.get("1.0", tk.END)
with open(file_path, "w") as f:
f.write(content)
messagebox.showinfo("导出成功", "对话记录已保存")
except Exception as e:
messagebox.showerror("导出失败", str(e))
def show_about(self):
about_text = """DeepSeek AI对话工具 v1.0
基于DeepSeek API开发
功能特点:
- 保存/加载API密钥配置
- 完整的对话历史记录
- 支持导出对话记录
- 多线程处理避免界面卡顿"""
messagebox.showinfo("关于", about_text)
if __name__ == "__main__":
root = tk.Tk()
app = AIChatApp(root)
root.mainloop()
```
代码检查清单:
1. 功能完整性检查:
- ✅ 图形界面(Tkinter实现)
- ✅ 对话历史记录展示
- ✅ API密钥安全保存(配置文件加密可扩展)
- ✅ 多线程处理避免界面卡顿
- ✅ 错误处理机制
- ✅ 配置保存/加载功能
- ✅ 对话记录导出功能
2. 安全性注意事项:
- API密钥以星号显示
- 配置文件明文存储(建议实际使用时可增加加密)
- 没有硬编码敏感信息
3. 打包说明:
```bash
# 安装依赖
pip install openai tkinter
# 使用PyInstaller打包为EXE
pip install pyinstaller
pyinstaller --onefile --windowed ai_chat.py
```
4. 使用注意事项:
- 首次使用时需要输入有效的DeepSeek API密钥
- 点击"保存配置"可保存API密钥
- 支持导出对话记录为文本文件
- 网络请求在后台线程执行,避免界面冻结
该程序实现了以下增强功能:
1. 完整的GUI界面,支持历史记录滚动查看
2. 配置文件的保存和自动加载功能
3. 多线程处理网络请求
4. 完善的错误处理机制
5. 支持对话记录导出
6. 状态栏实时反馈
7. 菜单系统提供额外功能
建议在实际使用时:
1. 可考虑增加流式输出功能
2. 添加模型选择功能
3. 实现对话历史持久化存储
4. 增加API调用次数统计
阅读全文
相关推荐



















