下面是一个完整的Kivy应用程序示例,它集成了DeepSeek API,实现了一个简单的聊天界面。
首先确保安装了必要的库:
pip install kivy requests
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()
设置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字符串运行程序:
python main.py
界面功能:
添加多轮对话支持:
添加流式响应:
添加设置界面:
添加消息持久化:
这个示例提供了一个完整的起点,你可以根据需要进一步扩展和完善功能。