用python与pyqt5写一个自己的ai智能小助手

现在人工智能也是挺火的,就比如说kimi,deepseek,gpt等这些.
最近也是无聊就来搞了一个小的智能小助手来试一下

下面我将使用Python和PyQt5创建一个基于Kimi API的对话应用。
这个应用包含完整的聊天界面和API交互功能,支持多轮对话和消息格式美化。


哒哒,让我们展示下成果
在这里插入图片描述

代码如下:

import sys
import json
import requests
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, 
                             QTextEdit, QLineEdit, QPushButton, QLabel, QStatusBar, QMenuBar, QMenu, QAction)
from PyQt5.QtCore import Qt, QThread, pyqtSignal
from PyQt5.QtGui import QIcon, QFont, QPalette, QColor

# 月之暗面Kimi API配置
API_URL = "https://api.moonshot.cn/v1/chat/completions"
API_KEY = "你的API密钥"  # 替换为实际API密钥

class Worker(QThread):
    """后台线程处理API请求"""
    response_received = pyqtSignal(dict)
    error_occurred = pyqtSignal(str)

    def __init__(self, messages, model="kimi-thinking-preview"):
        super().__init__()
        self.messages = messages
        self.model = model

    def run(self):
        headers = {
            "Authorization": f"Bearer {API_KEY}",
            "Content-Type": "application/json"
        }
        
        payload = {
            "model": self.model,
            "messages": self.messages,
            "temperature": 0.7,
            "max_tokens": 2000
        }
        
        try:
            response = requests.post(API_URL, headers=headers, json=payload, timeout=60)
            if response.status_code == 200:
                result = response.json()
                self.response_received.emit(result)
            else:
                error_msg = f"API错误: {response.status_code} - {response.text}"
                self.error_occurred.emit(error_msg)
        except Exception as e:
            self.error_occurred.emit(f"请求失败: {str(e)}")

class ChatApp(QMainWindow):
    """主聊天窗口"""
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Kimi智能助手")
        self.setGeometry(100, 100, 900, 700)
        self.init_ui()
        
    def init_ui(self):
        """初始化用户界面"""
        # 创建中央部件
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        main_layout = QVBoxLayout(central_widget)
        
        # 创建菜单栏
        self.create_menu_bar()
        
        # 聊天显示区域
        self.chat_display = QTextEdit()
        self.chat_display.setReadOnly(True)
        self.chat_display.setStyleSheet("""
            QTextEdit {
                background-color: #f8f9fa;
                border: 1px solid #e0e0e0;
                border-radius: 8px;
                padding: 10px;
                font-size: 14px;
            }
        """)
        self.chat_display.setFont(QFont("Microsoft YaHei", 10))
        main_layout.addWidget(self.chat_display, 5)
        
        # 输入区域
        input_layout = QHBoxLayout()
        
        self.input_field = QLineEdit()
        self.input_field.setPlaceholderText("输入消息...")
        self.input_field.setStyleSheet("""
            QLineEdit {
                padding: 12px;
                border: 1px solid #e0e0e0;
                border-radius: 6px;
                font-size: 14px;
            }
        """)
        self.input_field.returnPressed.connect(self.send_message)
        
        self.send_button = QPushButton("发送")
        self.send_button.setStyleSheet("""
            QPushButton {
                background-color: #4a86e8;
                color: white;
                border: none;
                border-radius: 6px;
                padding: 12px 24px;
                font-size: 14px;
                font-weight: bold;
            }
            QPushButton:hover {
                background-color: #3a76d8;
            }
            QPushButton:pressed {
                background-color: #2a66c8;
            }
        """)
        self.send_button.clicked.connect(self.send_message)
        
        input_layout.addWidget(self.input_field, 5)
        input_layout.addWidget(self.send_button, 1)
        main_layout.addLayout(input_layout, 1)
        
        # 状态栏
        self.status_bar = QStatusBar()
        self.setStatusBar(self.status_bar)
        self.status_bar.showMessage("就绪 | 使用Kimi长思考模型")
        
        # 初始化对话历史
        self.conversation = [
            {"role": "system", "content": "你是Kimi,由月之暗面(Moonshot AI)开发的智能助手,擅长长文本理解和深度推理。"}
        ]
        
        # 模型选择
        self.current_model = "kimi-thinking-preview"
        
        # 显示欢迎消息
        self.display_message("AI助手", "你好!我是Kimi智能助手,支持200万字长文本理解。有什么可以帮你的吗?:cite[1]:cite[7]")
    
    def create_menu_bar(self):
        """创建菜单栏"""
        menu_bar = self.menuBar()
        
        # 文件菜单
        file_menu = menu_bar.addMenu("文件")
        
        exit_action = QAction("退出", self)
        exit_action.triggered.connect(self.close)
        file_menu.addAction(exit_action)
        
        # 模型菜单
        model_menu = menu_bar.addMenu("模型")
        
        thinking_model = QAction("长思考模型 (kimi-thinking-preview)", self)
        thinking_model.triggered.connect(lambda: self.set_model("kimi-thinking-preview"))
        model_menu.addAction(thinking_model)
        
        model_8k = QAction("短文本模型 (moonshot-v1-8k)", self)
        model_8k.triggered.connect(lambda: self.set_model("moonshot-v1-8k"))
        model_menu.addAction(model_8k)
        
        model_32k = QAction("长文本模型 (moonshot-v1-32k)", self)
        model_32k.triggered.connect(lambda: self.set_model("moonshot-v1-32k"))
        model_menu.addAction(model_32k)
        
        model_128k = QAction("超长文本模型 (moonshot-v1-128k)", self)
        model_128k.triggered.connect(lambda: self.set_model("moonshot-v1-128k"))
        model_menu.addAction(model_128k)
        
        # 帮助菜单
        help_menu = menu_bar.addMenu("帮助")
        
        about_action = QAction("关于", self)
        about_action.triggered.connect(self.show_about)
        help_menu.addAction(about_action)
    
    def set_model(self, model_name):
        """设置当前使用的模型"""
        self.current_model = model_name
        model_display_name = {
            "kimi-thinking-preview": "长思考模型",
            "moonshot-v1-8k": "短文本模型(8K)",
            "moonshot-v1-32k": "长文本模型(32K)",
            "moonshot-v1-128k": "超长文本模型(128K)"
        }
        self.status_bar.showMessage(f"已切换模型: {model_display_name.get(model_name, model_name)}")
    
    def show_about(self):
        """显示关于信息"""
        about_text = (
            "Kimi智能助手客户端\n\n"
            "使用月之暗面(Moonshot AI)的API\n"
            "支持200万字长文本理解和深度推理\n"
            "支持多种文档格式分析:PDF、Word、PPT等\n\n"
            "模型能力:\n"
            "- 长文本总结与分析\n"
            "- 多文档交叉处理\n"
            "- 深度推理与问题解决\n"
            "- 多语言翻译\n\n"
            "© 2025 Kimi助手客户端"
        )
        self.display_message("系统", about_text)
    
    def display_message(self, sender, message):
        """在聊天区域显示消息"""
        if sender == "AI助手":
            formatted = f"""
            <div style="margin:10px; padding:12px; 
                        background-color:#e3f2fd; 
                        border-radius:10px 10px 0 10px;
                        border:1px solid #bbdefb;">
                <b style="color:#1565c0;">{sender}:</b><br>
                {message}
            </div>
            """
        elif sender == "你":
            formatted = f"""
            <div style="margin:10px; padding:12px; 
                        background-color:#e8f5e9; 
                        border-radius:10px 10px 10px 0;
                        border:1px solid #c8e6c9;
                        text-align:right;">
                <b style="color:#2e7d32;">{sender}:</b><br>
                {message}
            </div>
            """
        else:  # 系统消息
            formatted = f"""
            <div style="margin:10px; padding:12px; 
                        background-color:#f5f5f5; 
                        border-radius:5px;
                        border:1px solid #e0e0e0;
                        font-style:italic;">
                <b>{sender}:</b> {message}
            </div>
            """
        
        self.chat_display.append(formatted)
        self.chat_display.verticalScrollBar().setValue(
            self.chat_display.verticalScrollBar().maximum()
        )
        
    def send_message(self):
        """发送用户消息"""
        user_input = self.input_field.text().strip()
        if not user_input:
            return
            
        # 显示用户消息
        self.display_message("你", user_input)
        self.input_field.clear()
        self.status_bar.showMessage("正在思考...")
        
        # 添加到对话历史
        self.conversation.append({"role": "user", "content": user_input})
        
        # 创建并启动工作线程
        self.worker = Worker(self.conversation, self.current_model)
        self.worker.response_received.connect(self.handle_response)
        self.worker.error_occurred.connect(self.handle_error)
        self.worker.start()
        
    def handle_response(self, response):
        """处理API响应"""
        try:
            # 获取回复内容
            reply = response['choices'][0]['message']['content']
            
            # 获取思考过程(如果有)
            reasoning = response['choices'][0]['message'].get('reasoning_content', '')
            
            # 显示AI回复
            self.display_message("AI助手", reply)
            
            # 如果需要显示思考过程
            if reasoning:
                self.display_message("系统", f"思考过程: {reasoning[:500]}...")
            
            # 更新对话历史
            self.conversation.append({
                "role": "assistant", 
                "content": reply,
                "reasoning_content": reasoning
            })
            
            # 显示token使用情况
            usage = response['usage']
            token_info = f"本次消耗: {usage['total_tokens']} tokens (输入:{usage['prompt_tokens']} + 输出:{usage['completion_tokens']})"
            self.status_bar.showMessage(f"就绪 | {token_info}")
            
        except KeyError as e:
            self.handle_error(f"解析响应出错: {str(e)}")
        
    def handle_error(self, error_msg):
        """处理错误信息"""
        self.display_message("系统", f"错误: {error_msg}")
        self.status_bar.showMessage("发生错误")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    
    # 设置应用样式
    app.setStyle("Fusion")
    palette = QPalette()
    palette.setColor(QPalette.Window, QColor(240, 240, 240))
    app.setPalette(palette)
    
    window = ChatApp()
    window.show()
    sys.exit(app.exec_())

使用说明

1. 获取API密钥

访问月之暗面API平台
在这里提醒下,免费API通常有调用限制(Kimi每月免费额度约1000次调用)

注册账号并创建API密钥
在这里插入图片描述

将代码中的API_KEY = "你的API密钥"替换为实际密钥
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

准时准点睡觉

如果觉得不错可以点点这里哦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值