现在人工智能也是挺火的,就比如说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密钥"替换为实际密钥