用 DeepSeek API Key 和 PyQt6 打造专属 AI 聊天助手

先分享界面效果如下,可以切换使用R1和V3模型,代码很简单,大家买好api key后可以自己弄着玩:

在询问问题过程中的等待界面是需要自己按喜好设置一个gif,效果如下:

步骤 1:获取 DeepSeek API Key

首先,你需要从 DeepSeek 获取一个有效的 API Key。可以在 DeepSeek官网 上注册并获取。记得保管好你的 API Key,因为它将用于验证你的请求。(一定要截图,只能获取一次后面就看不到了)

步骤 2:环境准备及代码分享
  1. 安装 Python:确保你已经安装了 Python 3.6 及以上版本。如果没有安装,可以从 Python官网https://www.python.org/downloads/ 下载并安装。
  2. 安装必要的库:运行命令安装 PyQt6 和 requests 库。
  3. 本文提供的代码将创建一个包含聊天窗口、输入框、发送按钮、以及模型选择下拉菜单的应用程序。应用会根据选择的模型和用户输入,通过 DeepSeek API 发送请求并展示返回的响应。需要做的:1,将你买的api-key放在代码中。2,替换图片路径为你保存的图片的路径
    import sys
    import json
    from PyQt6.QtWidgets import (
        QApplication, QMainWindow, QWidget, QVBoxLayout, QTextEdit, QLineEdit, QPushButton, QLabel, QComboBox
    )
    from PyQt6.QtCore import Qt, QThread, pyqtSignal
    from PyQt6.QtGui import QColor, QTextCharFormat, QTextCursor, QMovie
    import requests
    
    DEEPSEEK_API_URL = "https://api.deepseek.com/v1/chat/completions"
    
    
    class APICallThread(QThread):
        """用于在后台调用 DeepSeek API 的线程"""
        finished = pyqtSignal(str)  # 用于传递 API 返回的结果
    
        def __init__(self, api_key, messages, model):
            super().__init__()
            self.api_key = api_key
            self.messages = messages
            self.model = model
    
        def run(self):
            """线程运行逻辑"""
            headers = {
                "Authorization": f"Bearer {self.api_key}",
                "Content-Type": "application/json",
            }
            data = {
                "model": self.model,  # 使用传入的模型
                "messages": self.messages,
            }
    
            try:
                response = requests.post(DEEPSEEK_API_URL, headers=headers, json=data)
                response.raise_for_status()  # 检查 HTTP 状态码
                result = response.json()
    
                # 检查 API 返回的数据是否有效
                if "choices" not in result or len(result["choices"]) == 0:
                    self.finished.emit("API 返回的数据无效")
                    return
    
                self.finished.emit(result["choices"][0]["message"]["content"])
            except requests.exceptions.RequestException as e:
                self.finished.emit(f"请求失败: {str(e)}")
            except json.JSONDecodeError as e:
                self.finished.emit(f"API 返回的数据无法解析: {str(e)}")
            except Exception as e:
                self.finished.emit(f"未知错误: {str(e)}")
    
    
    class ChatWindow(QMainWindow):
        def __init__(self):
            super().__init__()
            self.history = []  # 存储对话历史
            self.init_ui()
            self.set_api_key("替换为你的 API Key")  # 替换为你的 API Key
    
        def set_api_key(self, key):
            self.api_key = key
    
        def init_ui(self):
            self.setWindowTitle("DeepSeek Chat (PyQt6)")
            self.setGeometry(100, 100, 800, 600)
            self.setStyleSheet("background-color: #2E3440; color: #D8DEE9;")  # 设置窗口背景颜色
    
            # 主布局
            central_widget = QWidget()
            self.setCentralWidget(central_widget)
            layout = QVBoxLayout(central_widget)
            layout.setContentsMargins(10, 10, 10, 10)  # 设置边距
            layout.setSpacing(10)  # 设置组件间距
    
            # 模型选择下拉菜单
            self.model_selector = QComboBox()
            self.model_selector.addItem("deepseek-reasoner")
            self.model_selector.addItem("deepseek-chat")
            self.model_selector.setStyleSheet(
                """
                QComboBox {
                    background-color: #4C566A;
                    color: #D8DEE9;
                    font-family: Consolas, Courier New;
                    font-size: 14px;
                    border-radius: 5px;
                    padding: 10px;
                }
                QComboBox::drop-down {
                    border: none;
                }
                """
            )
            layout.addWidget(self.model_selector)
    
            # 对话显示区域
            self.chat_display = QTextEdit()
            self.chat_display.setReadOnly(True)
            self.chat_display.setStyleSheet(
                """
                QTextEdit {
                    background-color: #3B4252;
                    color: #D8DEE9;
                    font-family: Consolas, Courier New;
                    font-size: 14px;
                    border-radius: 5px;
                    padding: 10px;
                }
                """
            )
            layout.addWidget(self.chat_display)
    
            # 输入框
            self.input_box = QLineEdit()
            self.input_box.setPlaceholderText("输入你的问题(支持代码),按 Enter 或点击发送")
            self.input_box.setStyleSheet(
                """
                QLineEdit {
                    background-color: #4C566A;
                    color: #D8DEE9;
                    font-family: Consolas, Courier New;
                    font-size: 14px;
                    border-radius: 5px;
                    padding: 10px;
                }
                """
            )
            self.input_box.returnPressed.connect(self.send_message)  # 绑定回车键
            layout.addWidget(self.input_box)
    
            # 发送按钮
            self.send_button = QPushButton("发送")
            self.send_button.setStyleSheet(
                """
                QPushButton {
                    background-color: #5E81AC;
                    color: #D8DEE9;
                    font-family: Consolas, Courier New;
                    font-size: 14px;
                    border-radius: 5px;
                    padding: 10px;
                }
                QPushButton:hover {
                    background-color: #81A1C1;
                }
                """
            )
            self.send_button.clicked.connect(self.send_message)  # 绑定按钮点击
            layout.addWidget(self.send_button)
    
            # 羊驼动画
            self.animation_label = QLabel(self)
            self.animation_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
            self.movie = QMovie("C:\\Users\\sy\\PycharmProjects\\qt_1\\OIP-C.gif")
            self.animation_label.setMovie(self.movie)
            self.animation_label.hide()  # 初始隐藏
            self.animation_label.resize(50, 50)  # 设置动画标签的大小
            layout.addWidget(self.animation_label)
    
        def send_message(self):
            """发送消息并获取 DeepSeek 的回复"""
            user_input = self.input_box.text().strip()
            if not user_input:
                return
    
            # 显示用户输入
            self.append_message("你", user_input)
            self.input_box.clear()
    
            # 显示羊驼动画
            self.animation_label.show()
            self.movie.start()
    
            # 获取当前选择的模型
            selected_model = self.model_selector.currentText()
    
            # 调用 DeepSeek API(在后台线程中)
            self.history.append({"role": "user", "content": user_input})
            self.api_thread = APICallThread(self.api_key, self.history, selected_model)
            self.api_thread.finished.connect(self.handle_api_response)
            self.api_thread.start()
    
        def handle_api_response(self, response):
            """处理 API 返回的响应"""
            # 停止并隐藏动画
            self.movie.stop()
            self.animation_label.hide()
    
            # 显示 DeepSeek 回复
            if response:
                self.append_message("DeepSeek", response)
                self.history.append({"role": "assistant", "content": response})
    
        def append_message(self, sender, message):
            """在聊天区域添加消息"""
            cursor = self.chat_display.textCursor()
            cursor.movePosition(QTextCursor.MoveOperation.End)
    
            # 设置发送者样式
            sender_format = QTextCharFormat()
            sender_format.setForeground(QColor("#88C0D0" if sender == "你" else "#81A1C1"))
            sender_format.setFontWeight(700)  # 加粗
            cursor.insertText(f"{sender}:\n", sender_format)
    
            # 设置消息样式
            message_format = QTextCharFormat()
            message_format.setForeground(QColor("#D8DEE9"))
            cursor.insertText(f"{message}\n\n", message_format)
    
            # 滚动到底部
            self.chat_display.ensureCursorVisible()
    
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        window = ChatWindow()
        window.show()
        sys.exit(app.exec())

直接运行即可,之后你就可以切换使用R1和V3模型。当然也可以打包成exe与朋友分享~不过那样建议先将key做成环境变量什么的,不要硬编码了,如下:

import os
api_key = os.getenv("DEEPSEEK_API_KEY")

如果大家需要的话我也可以直接分享exe

结语:

希望本文对你有所帮助,祝你在构建自己的应用程序时顺利!如果你有任何问题,欢迎在评论区留言。

免责声明:本文中的 API Key 仅供学习和参考使用,请读者自行申请并替换为自己的 API Key,以避免滥用或泄露个人信息。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值