【DeepSeek】使用Kivy实现DeepSeek聊天系统

使用Kivy实现DeepSeek聊天系统

下面是一个完整的Kivy应用程序示例,它集成了DeepSeek API,实现了一个简单的聊天界面。

完整代码

1. 安装依赖

首先确保安装了必要的库:

pip install kivy requests

2. 主程序代码 (main.py)

import os
import requests
import json
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.scrollview import ScrollView
from kivy.core.window import Window
from kivy.metrics import dp
from kivy.graphics import Color, Rectangle
from kivy.clock import Clock

# 设置窗口大小
Window.size = (400, 600)

class ChatMessage(BoxLayout):
    def __init__(self, text, is_user=False, **kwargs):
        super().__init__(**kwargs)
        self.orientation = 'horizontal'
        self.size_hint_y = None
        self.height = dp(50)
        self.padding = [dp(10), dp(5)]
        
        # 根据消息类型设置对齐和颜色
        if is_user:
            self.alignment = 'right'
            bubble_color = (0.2, 0.6, 1, 1)  # 用户消息气泡颜色(蓝色)
        else:
            self.alignment = 'left'
            bubble_color = (0.9, 0.9, 0.9, 1)  # AI消息气泡颜色(灰色)
        
        with self.canvas.before:
            Color(*bubble_color)
            self.rect = Rectangle(pos=self.pos, size=self.size)
        
        self.bind(pos=self.update_rect, size=self.update_rect)
        
        label = Label(
            text=text,
            size_hint=(None, None),
            size=(Window.width * 0.7, dp(40)),
            text_size=(Window.width * 0.7, None),
            halign='left' if not is_user else 'right',
            valign='middle',
            padding=(dp(10), dp(5)),
            color=(0, 0, 0, 1) if not is_user else (1, 1, 1, 1)
        )
        
        self.add_widget(label)
    
    def update_rect(self, *args):
        self.rect.pos = self.pos
        self.rect.size = self.size

class ChatApp(App):
    def build(self):
        # 主布局
        self.layout = BoxLayout(orientation='vertical')
        
        # 聊天历史区域(可滚动)
        self.chat_history = ScrollView()
        self.chat_container = BoxLayout(
            orientation='vertical',
            spacing=dp(5),
            size_hint_y=None,
            padding=[dp(10), dp(10)]
        )
        self.chat_container.bind(minimum_height=self.chat_container.setter('height'))
        self.chat_history.add_widget(self.chat_container)
        
        # 输入区域
        input_layout = BoxLayout(orientation='horizontal', size_hint_y=None, height=dp(60))
        self.message_input = TextInput(
            hint_text='输入消息...',
            multiline=False,
            size_hint_x=0.8,
            padding=[dp(10), dp(10), dp(10), dp(10)]
        )
        send_button = Button(
            text='发送',
            size_hint_x=0.2,
            background_normal='',
            background_color=(0.2, 0.6, 1, 1)
        )
        send_button.bind(on_press=self.send_message)
        
        input_layout.add_widget(self.message_input)
        input_layout.add_widget(send_button)
        
        # 添加所有部件到主布局
        self.layout.add_widget(self.chat_history)
        self.layout.add_widget(input_layout)
        
        # 添加欢迎消息
        self.add_message("我是DeepSeek AI助手,有什么可以帮您的吗?", is_user=False)
        
        return self.layout
    
    def add_message(self, text, is_user=False):
        """添加消息到聊天界面"""
        message = ChatMessage(text, is_user=is_user)
        self.chat_container.add_widget(message)
        # 滚动到底部
        Clock.schedule_once(lambda dt: self.chat_history.scroll_to(message), 0.1)
    
    def send_message(self, instance):
        """发送消息到DeepSeek API并获取回复"""
        user_message = self.message_input.text.strip()
        if not user_message:
            return
        
        # 添加用户消息到界面
        self.add_message(user_message, is_user=True)
        self.message_input.text = ''
        
        # 显示"正在输入"提示
        thinking_label = Label(
            text="DeepSeek正在思考...",
            size_hint_y=None,
            height=dp(30),
            color=(0.5, 0.5, 0.5, 1)
        )
        self.chat_container.add_widget(thinking_label)
        self.chat_history.scroll_to(thinking_label)
        
        # 调用DeepSeek API(在后台线程中)
        Clock.schedule_once(lambda dt: self.call_deepseek_api(user_message, thinking_label), 0.1)
    
    def call_deepseek_api(self, user_message, thinking_label):
        """调用DeepSeek API"""
        api_key = os.getenv("DEEPSEEK_API_KEY")  # 从环境变量获取API Key
        if not api_key:
            self.chat_container.remove_widget(thinking_label)
            self.add_message("错误: 未设置DEEPSEEK_API_KEY环境变量", is_user=False)
            return
        
        url = "https://api.deepseek.com/v1/chat/completions"
        headers = {
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json",
        }
        
        data = {
            "model": "deepseek-chat",
            "messages": [
                {"role": "system", "content": "你是一个有帮助的AI助手。"},
                {"role": "user", "content": user_message}
            ],
            "temperature": 0.7,
        }
        
        try:
            response = requests.post(url, headers=headers, json=data)
            response.raise_for_status()
            result = response.json()
            
            # 移除"正在思考"提示
            self.chat_container.remove_widget(thinking_label)
            
            # 添加AI回复
            ai_response = result['choices'][0]['message']['content']
            self.add_message(ai_response, is_user=False)
            
        except requests.exceptions.RequestException as e:
            self.chat_container.remove_widget(thinking_label)
            self.add_message(f"API调用错误: {str(e)}", is_user=False)
        except (KeyError, IndexError) as e:
            self.chat_container.remove_widget(thinking_label)
            self.add_message(f"解析响应错误: {str(e)}", is_user=False)

if __name__ == '__main__':
    ChatApp().run()

3. 使用说明

  1. 设置API Key:

    • 在运行程序前,请设置环境变量 DEEPSEEK_API_KEY:
      export DEEPSEEK_API_KEY='your_api_key_here'  # Linux/macOS
      set DEEPSEEK_API_KEY='your_api_key_here'      # Windows
      
    • 或者直接在代码中替换 os.getenv("DEEPSEEK_API_KEY") 为你的API Key字符串
  2. 运行程序:

    python main.py
    
  3. 界面功能:

    • 底部输入框输入消息
    • 点击"发送"按钮或按回车发送消息
    • 用户消息显示在右侧(蓝色气泡)
    • AI回复显示在左侧(灰色气泡)

4. 功能特点

  • 美观的聊天气泡界面
  • 自动滚动到最新消息
  • 发送消息时显示"正在思考"提示
  • 错误处理机制
  • 响应式布局,适应不同窗口大小

5. 扩展建议

  1. 添加多轮对话支持:

    • 维护一个对话历史列表,包含所有先前的消息
    • 每次调用API时发送完整的对话历史
  2. 添加流式响应:

    • 如果DeepSeek支持流式API,可以实现逐字显示回复的效果
  3. 添加设置界面:

    • 允许用户直接在应用中设置API Key
    • 调整模型参数(temperature等)
  4. 添加消息持久化:

    • 将聊天记录保存到本地文件或数据库
    • 支持加载历史聊天记录

这个示例提供了一个完整的起点,你可以根据需要进一步扩展和完善功能。

【DeepSeek】使用Kivy实现DeepSeek聊天系统_第1张图片

你可能感兴趣的:(移动APP,教育信息化,python,DeepSeek,人工智能)