使用openai库进行deepssek的调用
下载openai库
pip install openai
一、命令行界面,实现简单的调用连续对话,对角色进行了标识,启用了流式输出实时显示回答,调用代码如下:
from openai import OpenAI
client = OpenAI(api_key="你的api_key", base_url="https://api.deepseek.com")
# 初始化对话历史(包含系统消息)
messages = [{"role": "system", "content": "You are a helpful assistant"}]
while True:
# 获取用户输入
user_input = input("\nYou: ")
# 退出条件
if user_input.lower() in ["exit", "quit"]:
print("对话结束")
break
# 添加用户消息到历史
messages.append({"role": "user", "content": user_input})
try:
# 发起流式请求
response = client.chat.completions.create(
model="deepseek-reasoner", #可替换为deepseek-chat,v3模型,当前r1
messages=messages,
stream=True # 启用流式输出
)
# 初始化回复收集
full_response = []
print("\nAssistant: ", end="", flush=True) # 先打印前缀
# 实时处理流式响应
for chunk in response:
content = chunk.choices[0].delta.content
if content: # 过滤空内容
print(content, end="", flush=True) # 逐字打印
full_response.append(content)
# 添加完整回复到历史
ai_response = "".join(full_response)
messages.append({"role": "assistant", "content": ai_response})
print() # 换行
except Exception as e:
print(f"\n发生错误: {str(e)}")
break
二、简单图形界面,更友好一些,添加了进入程序的用户名和密码,不需要可自行修改,代码如下:
import tkinter as tk
from tkinter import scrolledtext, messagebox, ttk
import threading
import queue
from openai import OpenAI
import requests
# ================= 配置信息 =================
USER_CREDENTIALS = {"username": "用户名", "password": "密码"}
API_BASE_URL = "https://api.deepseek.com"
API_KEY = "你的api"
COLOR_SCHEME = {
"user": "#2B547E",
"assistant": "#2E8B57",
"system": "#708090",
"error": "#FF0000"
}
# ================= 核心消息处理器 =================
class MessageProcessor:
@staticmethod
def build_valid_messages(history_messages):
valid_messages = []
last_role = None
for msg in history_messages:
if msg["role"] == "system" or msg["role"] != last_role:
valid_messages.append(msg)
last_role = msg["role"] if msg["role"] != "system" else None
if valid_messages and valid_messages[-1]["role"] == "assistant":
valid_messages.append({"role": "user", "content": "请继续"})
return valid_messages
# ================= 主应用类 =================
class ChatApplication:
def __init__(self, root):
self.root = root
self.root.title("DeepSeek Chat")
self.message_lock = threading.Lock()
self.setup_gui()
self.setup_client()
self.setup_threading()
self.init_message_history()
def init_message_history(self):
with self.message_lock:
self.messages = [{
"role": "system",
"content": "You are a helpful assistant"
}]
def setup_gui(self):
main_frame = ttk.Frame(self.root)
main_frame.pack(expand=True, fill='both', padx=10, pady=10)
self.chat_history = scrolledtext.ScrolledText(
main_frame,
wrap=tk.WORD,
state='disabled',
font=('Microsoft YaHei', 11),
spacing3=5
)
self.chat_history.pack(expand=True, fill='both')
for role, color in COLOR_SCHEME.items():
self.chat_history.tag_config(role, foreground=color)
input_frame = ttk.Frame(main_frame)
input_frame.pack(fill='x', pady=5)
self.input_entry = ttk.Entry(
input_frame,
font=('Microsoft YaHei', 11)
)
self.input_entry.pack(side='left', expand=True, fill='x')
self.input_entry.bind("", self.send_message)
ttk.Button(
input_frame,
text="发送",
command=self.send_message
).pack(side='left', padx=5)
ttk.Button(
input_frame,
text="清空",
command=self.clear_history
).pack(side='left', padx=5)
ttk.Button(
input_frame,
text="退出",
command=self.clean_exit
).pack(side='right')
def clear_history(self):
self.chat_history.configure(state='normal')
self.chat_history.delete(1.0, tk.END)
self.chat_history.configure(state='disabled')
self.init_message_history()
def setup_client(self):
self.client = OpenAI(
api_key=API_KEY,
base_url=API_BASE_URL
)
def setup_threading(self):
self.response_queue = queue.Queue()
self.running = True
self.root.after(100, self.process_queue)
def send_message(self, event=None):
user_input = self.input_entry.get().strip()
if not user_input:
return
self.input_entry.delete(0, tk.END)
self.append_message("user", f"You: {user_input}\n")
with self.message_lock:
self.messages.append({"role": "user", "content": user_input})
threading.Thread(
target=self.stream_response,
daemon=True
).start()
def stream_response(self):
full_response = []
try:
with self.message_lock:
valid_messages = MessageProcessor.build_valid_messages(self.messages)
stream = self.client.chat.completions.create(
model="deepseek-chat",
messages=valid_messages,
stream=True,
temperature=0.7
)
first_content = True # 新增:标记是否为第一个内容块
for chunk in stream:
if content := chunk.choices[0].delta.content:
if first_content:
# 先发送角色前缀
self.response_queue.put(("assistant_prefix", None))
first_content = False
self.response_queue.put(content)
full_response.append(content)
self.response_queue.put(("success", "".join(full_response)))
except requests.exceptions.ConnectionError:
self.response_queue.put(("error", "\n[错误:网络连接异常]"))
except Exception as e:
self.response_queue.put(("error", f"\n[系统错误:{str(e)}]"))
def process_queue(self):
while not self.response_queue.empty():
content = self.response_queue.get()
if isinstance(content, tuple):
status, data = content
if status == "success":
with self.message_lock:
self.messages.append({"role": "assistant", "content": data})
self.append_message("assistant", "\n", stream=True)
elif status == "assistant_prefix":
self.append_message("assistant", "Assistant: ", stream=True)
else:
self.append_message("error", data)
else:
self.append_message("assistant", content, stream=True)
if self.running:
self.root.after(100, self.process_queue)
def append_message(self, role, content, stream=False):
self.chat_history.configure(state='normal')
self.chat_history.insert(tk.END, content, (role,))
if stream:
self.chat_history.see(tk.END)
self.chat_history.update()
self.chat_history.configure(state='disabled')
def clean_exit(self):
self.running = False
self.root.destroy()
# ================= 登录窗口类 =================
class LoginWindow:
def __init__(self, root):
self.root = root
self.root.title("用户登录")
self.setup_ui()
def setup_ui(self):
main_frame = ttk.Frame(self.root)
main_frame.pack(padx=20, pady=20)
ttk.Label(main_frame, text="用户名:").grid(row=0, column=0, pady=5)
self.username_entry = ttk.Entry(main_frame)
self.username_entry.grid(row=0, column=1, pady=5)
ttk.Label(main_frame, text="密码:").grid(row=1, column=0, pady=5)
self.password_entry = ttk.Entry(main_frame, show="*")
self.password_entry.grid(row=1, column=1, pady=5)
ttk.Button(
main_frame,
text="登录",
command=self.authenticate
).grid(row=2, columnspan=2, pady=10)
def authenticate(self):
username = self.username_entry.get()
password = self.password_entry.get()
if username == USER_CREDENTIALS["username"] and password == USER_CREDENTIALS["password"]:
self.root.destroy()
root = tk.Tk()
ChatApplication(root)
root.mainloop()
else:
messagebox.showerror("错误", "用户名或密码错误")
self.root.destroy()
if __name__ == "__main__":
root = tk.Tk()
LoginWindow(root)
root.mainloop()