使用python进行deepseek的API调用

使用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()

你可能感兴趣的:(python,开发语言)