用python接入deepseek

import tkinter as tk
from tkinter import scrolledtext, font
import requests
import json
import re

class MarkdownRenderer:
    @staticmethod
    def apply_markdown(text_widget, text):
        """
        在文本组件中应用基础Markdown格式
        支持:**粗体** *斜体* `代码块`
        """
        # 清除旧标签
        text_widget.configure(state="normal")
        text_widget.delete("1.0", tk.END)
        
        # 预定义样式
        text_widget.tag_configure("bold", font=("Arial", 10, "bold"))
        text_widget.tag_configure("italic", font=("Arial", 10, "italic"))
        text_widget.tag_configure("code", background="#f0f0f0", relief="solid", borderwidth=1)
        
        # 正则表达式匹配
        patterns = [
            (r"\*\*(.*?)\*\*", "bold"),
            (r"\*(.*?)\*", "italic"),
            (r"`(.*?)`", "code")
        ]
        
        # 插入文本并应用标签
        position = 0
        for line in text.split('\n'):
            insert_pos = f"1.{position}"
            text_widget.insert(insert_pos, line + "\n")
            
            for pattern, tag in patterns:
                matches = re.finditer(pattern, line)
                for match in matches:
                    start = match.start()
                    end = match.end()
                    text_widget.tag_add(
                        tag,
                        f"{insert_pos}+{start}c",
                        f"{insert_pos}+{end}c"
                    )
            position += len(line) + 1  # +1 for newline

class DeepSeekChat:
    def __init__(self, root):
        self.root = root
        self.root.title("DeepSeek Chat (Markdown)")
        
        # 设置字体
        self.base_font = font.Font(family="Arial", size=10)
        
        # 聊天历史区域
        self.chat_history = scrolledtext.ScrolledText(
            root,
            wrap=tk.WORD,
            font=self.base_font,
            padx=10,
            pady=10
        )
        self.chat_history.pack(expand=True, fill="both")
        
        # 输入区域
        self.input_frame = tk.Frame(root)
        self.input_frame.pack(fill="x", padx=10, pady=10)
        
        self.user_input = tk.Entry(self.input_frame, font=self.base_font)
        self.user_input.pack(side="left", expand=True, fill="x")
        
        self.send_btn = tk.Button(
            self.input_frame,
            text="Send",
            command=self.send_message,
            bg="#4CAF50",
            fg="white"
        )
        self.send_btn.pack(side="right", padx=5)
        
        # API配置
        self.API_KEY = "skapi"  # 替换为你的API Key
        self.API_URL = "https://api.deepseek.com/v1/chat/completions"
        
        # 对话历史
        self.conversation = []
        
        # 绑定回车键
        self.user_input.bind("<Return>", lambda event: self.send_message())

    def send_message(self):
        query = self.user_input.get().strip()
        if not query:
            return
        
        self.user_input.delete(0, tk.END)
        self._add_message("You", query, is_user=True)
        
        try:
            response = self._get_api_response(query)
            self._add_message("AI", response, is_user=False)
        except Exception as e:
            self._add_message("System", f"Error: {str(e)}", is_user=False)

    def _get_api_response(self, query):
        headers = {
            "Authorization": f"Bearer {self.API_KEY}",
            "Content-Type": "application/json"
        }
        
        self.conversation.append({"role": "user", "content": query})
        
        payload = {
            "model": "deepseek-chat",
            "messages": self.conversation,
            "temperature": 0.7,
            "stream": False
        }
        
        response = requests.post(
            self.API_URL,
            headers=headers,
            json=payload,
            timeout=30
        )
        
        if response.status_code == 200:
            result = response.json()
            content = result['choices'][0]['message']['content']
            self.conversation.append({"role": "assistant", "content": content})
            return content
        else:
            raise Exception(f"API Error {response.status_code}: {response.text}")

    def _add_message(self, sender, message, is_user):
        # 添加消息头
        self.chat_history.configure(state="normal")
        self.chat_history.insert(tk.END, f"{sender}: \n", "header")
        
        # 创建临时文本框处理Markdown
        temp_text = tk.Text(self.chat_history, wrap=tk.WORD)
        MarkdownRenderer.apply_markdown(temp_text, message)
        
        # 获取格式化的内容
        formatted_content = temp_text.get("1.0", tk.END)
        self.chat_history.insert(tk.END, formatted_content)
        
        # 复制标签配置
        for tag in temp_text.tag_names():
            ranges = temp_text.tag_ranges(tag)
            for i in range(0, len(ranges), 2):
                start = self.chat_history.index(
                    f"end-1c - {len(formatted_content)-int(ranges[i].string.split('.')[1])} chars"
                )
                end = self.chat_history.index(
                    f"{start}+{int(ranges[i+1].string.split('.')[1]) - int(ranges[i].string.split('.')[1])}c"
                )
                self.chat_history.tag_add(tag, start, end)
        
        self.chat_history.insert(tk.END, "\n\n")
        self.chat_history.configure(state="disabled")
        self.chat_history.see(tk.END)

if __name__ == "__main__":
    root = tk.Tk()
    app = DeepSeekChat(root)
    root.mainloop()

此篇完

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值