原生 python 实现调用 kimi 接口实现对话聊天窗口

280 阅读1分钟

原生 python 实现调用 kimi 接口实现对话聊天窗口

请自行部署 kimi 接口,以下代码能实现实时聊天,支持流式响应

20240604_103945_516_copy.png

import requests
import json
import tkinter as tk
from tkinter import scrolledtext, END

# 设置自定义的 kimi 密钥和URL
OPENAI_API_KEY = 'eyJhbG***pyZA'
OPENAI_URL = 'https://kimi-free-api***.com/v1/chat/completions'

# 创建主应用程序窗口
window = tk.Tk()
window.title("GPT Chat Application")

# 创建一个文本框以显示对话
chat_log = scrolledtext.ScrolledText(window, wrap=tk.WORD)
chat_log.pack(padx=10, pady=10, fill=tk.BOTH, expand=True)

# 创建一个输入框以输入用户消息
user_input = tk.Entry(window, width=100)
user_input.pack(padx=10, pady=10, fill=tk.X)

def display_message(message, align, end="\n"):
    chat_log.tag_configure(align, justify=align)
    chat_log.insert(tk.END, message + end, align)
    chat_log.yview(tk.END)

def send_message(event=None):
    user_text = user_input.get()
    if user_text:
        display_message(user_text, 'right', "\n")
        user_input.delete(0, tk.END)

        headers = {
            'Content-Type': 'application/json',
            'Authorization': f'Bearer {OPENAI_API_KEY}',
        }
        data = {
            'model': 'gpt-3.5-turbo',
            'messages': [{'role': 'user', 'content': user_text}],
            'stream': True
        }

        response = requests.post(OPENAI_URL, headers=headers, json=data, stream=True)

        if response.status_code == 200:
            buffer = ""
            for line in response.iter_lines(decode_unicode=True):
                if line:
                    if line.startswith('data: '):
                        line = line[len('data: '):]  # 去除前缀
                    if line == '[DONE]':
                        break
                    try:
                        parsed_line = json.loads(line)
                        if 'choices' in parsed_line:
                            delta = parsed_line['choices'][0]['delta']
                            if 'content' in delta:
                                gpt_text = delta['content']
                                buffer += gpt_text
                                display_message(gpt_text, 'left', "")
                                window.update_idletasks()  # 强制更新GUI
                    except json.JSONDecodeError as e:
                        print(f"JSONDecodeError: {e}")
            display_message("", 'left', "\n")
            print("Full response received: ", buffer)
        else:
            display_message(f"Error: {response.status_code} - {response.text}", 'left', "\n")

# 绑定Enter键以发送消息
user_input.bind("<Return>", send_message)

# 启动应用程序
window.mainloop()