简易版的kimi智能助手
·
基于pyqt写的kimi智能助手(简易版)
import sys
import json
import requests
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout,
QHBoxLayout, QTextEdit, QPushButton, QLabel,
QScrollArea, QFrame)
from PyQt5.QtCore import Qt, QSize
from PyQt5.QtGui import QFont, QIcon, QColor, QPalette
class KimiChatWindow(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
self.chat_history = []
def initUI(self):
# 设置窗口基本属性
self.setWindowTitle('Kimi 智能助手')
self.setGeometry(100, 100, 800, 600)
self.setMinimumSize(600, 400)
# 创建中央部件
central_widget = QWidget()
self.setCentralWidget(central_widget)
# 主布局
main_layout = QVBoxLayout(central_widget)
main_layout.setContentsMargins(20, 20, 20, 20)
main_layout.setSpacing(15)
# 聊天历史区域
self.chat_area = QScrollArea()
self.chat_area.setWidgetResizable(True)
self.chat_area.setFrameShape(QFrame.NoFrame)
# 聊天容器
self.chat_container = QWidget()
self.chat_layout = QVBoxLayout(self.chat_container)
self.chat_layout.setAlignment(Qt.AlignTop)
self.chat_layout.setSpacing(15)
self.chat_layout.setContentsMargins(10, 10, 10, 10)
self.chat_area.setWidget(self.chat_container)
main_layout.addWidget(self.chat_area, 7)
# 分隔线
separator = QFrame()
separator.setFrameShape(QFrame.HLine)
separator.setFrameShadow(QFrame.Sunken)
main_layout.addWidget(separator)
# 输入区域
input_layout = QVBoxLayout()
# API Key 输入区域
api_key_layout = QHBoxLayout()
api_key_label = QLabel("API Key:")
self.api_key_input = QTextEdit()
self.api_key_input.setPlaceholderText("请输入您的 Kimi API Key...")
self.api_key_input.setMaximumHeight(30)
font = QFont()
font.setPointSize(11)
self.api_key_input.setFont(font)
api_key_layout.addWidget(api_key_label)
api_key_layout.addWidget(self.api_key_input, 1)
input_layout.addLayout(api_key_layout)
# 文本输入框
self.text_input = QTextEdit()
self.text_input.setPlaceholderText("请输入您的问题...")
self.text_input.setMaximumHeight(100)
self.text_input.setFont(font)
# 按钮区域
button_layout = QHBoxLayout()
button_layout.setAlignment(Qt.AlignRight)
self.send_button = QPushButton("发送")
self.send_button.setFixedSize(80, 30)
self.send_button.clicked.connect(self.send_message)
self.clear_button = QPushButton("清空")
self.clear_button.setFixedSize(80, 30)
self.clear_button.clicked.connect(self.clear_chat)
button_layout.addWidget(self.clear_button)
button_layout.addWidget(self.send_button)
input_layout.addWidget(self.text_input)
input_layout.addLayout(button_layout)
main_layout.addLayout(input_layout, 2)
# 设置样式
self.setStyleSheet("""
QMainWindow {
background-color: #f5f5f5;
}
QScrollArea {
background-color: white;
border-radius: 10px;
border: 1px solid #e0e0e0;
}
QTextEdit {
background-color: white;
border-radius: 10px;
border: 1px solid #e0e0e0;
padding: 8px;
}
QPushButton {
background-color: #4a86e8;
color: white;
border-radius: 5px;
padding: 5px 10px;
font-weight: bold;
}
QPushButton:hover {
background-color: #3a76d8;
}
QPushButton#clear_button {
background-color: #f0f0f0;
color: #333;
border: 1px solid #ccc;
}
QPushButton#clear_button:hover {
background-color: #e0e0e0;
}
""")
# 初始欢迎消息
self.add_message("Kimi 助手", "您好!我是 Kimi 智能助手,请问有什么可以帮助您的?", "assistant")
def add_message(self, sender, text, role):
# 创建消息框
message_frame = QFrame()
message_frame.setObjectName(f"{role}_frame")
message_layout = QVBoxLayout(message_frame)
# 发送者标签
sender_label = QLabel(sender)
sender_label.setObjectName(f"{role}_sender")
# 消息内容
message_content = QLabel(text)
message_content.setObjectName(f"{role}_content")
message_content.setWordWrap(True)
message_content.setTextInteractionFlags(Qt.TextSelectableByMouse)
message_layout.addWidget(sender_label)
message_layout.addWidget(message_content)
# 设置样式
if role == "user":
message_frame.setStyleSheet("""
QFrame#user_frame {
background-color: #e6f7ff;
border-radius: 10px;
padding: 10px;
}
QLabel#user_sender {
color: #0066cc;
font-weight: bold;
}
""")
else:
message_frame.setStyleSheet("""
QFrame#assistant_frame {
background-color: #f0f0f0;
border-radius: 10px;
padding: 10px;
}
QLabel#assistant_sender {
color: #333333;
font-weight: bold;
}
""")
self.chat_layout.addWidget(message_frame)
# 滚动到底部
self.chat_area.verticalScrollBar().setValue(
self.chat_area.verticalScrollBar().maximum()
)
def send_message(self):
user_input = self.text_input.toPlainText().strip()
if not user_input:
return
# 添加用户消息
self.add_message("您", user_input, "user")
self.chat_history.append({"role": "user", "content": user_input})
# 清空输入框
self.text_input.clear()
# 调用 Kimi API 获取回复
response = self.get_kimi_response(user_input)
# 添加 Kimi 回复
self.add_message("Kimi 助手", response, "assistant")
self.chat_history.append({"role": "assistant", "content": response})
def get_kimi_response(self, query):
# 调用 Kimi API 获取回复
try:
# Kimi API 配置
api_key = self.api_key_input.toPlainText().strip()
if not api_key:
return "请先输入有效的 Kimi API Key"
api_url = "https://api.moonshot.cn/v1/chat/completions"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {api_key}"
}
# 准备请求数据
payload = {
"model": "moonshot-v1-8k", # 或其他 Kimi 支持的模型
"messages": self.chat_history,
"temperature": 0.7
}
# 发送请求
response = requests.post(api_url, headers=headers, json=payload)
response.raise_for_status() # 检查请求是否成功
# 解析响应
result = response.json()
return result["choices"][0]["message"]["content"]
except Exception as e:
return f"抱歉,调用 Kimi API 时出现错误: {str(e)}"
def clear_chat(self):
# 清空聊天历史
for i in reversed(range(self.chat_layout.count())):
widget = self.chat_layout.itemAt(i).widget()
if widget:
widget.deleteLater()
self.chat_history = []
# 添加初始欢迎消息
self.add_message("Kimi 助手", "您好!我是 Kimi 智能助手,请问有什么可以帮助您的?", "assistant")
if __name__ == '__main__':
app = QApplication(sys.argv)
window = KimiChatWindow()
window.show()
sys.exit(app.exec_())
更多推荐



所有评论(0)