好久没有发布文章了,今天教大家制作一个类似chatgpt的界面,还有自己的ai在这个界面如何回复。
首先就是申请一些模型的apl密钥,我这边是星火的。
然后写一些代码,哎呀太烦了不想写太多,我就直接把所有的源码展示给你们把,你们直接粘贴就可以用了。
import tkinter as tk
from tkinter import scrolledtext
import json
import hashlib
import hmac
import base64
import websocket
import _thread as thread
import ssl
from urllib.parse import urlparse, urlencode
from wsgiref.handlers import format_date_time
from datetime import datetime
from time import mktime
answer = ""
class Ws_Param(object):
# 初始化
def __init__(self, APPID, APIKey, APISecret, Spark_url):
self.APPID = APPID
self.APIKey = APIKey
self.APISecret = APISecret
self.host = urlparse(Spark_url).netloc
self.path = urlparse(Spark_url).path
self.Spark_url = Spark_url
# 生成url
def create_url(self):
# 生成RFC1123格式的时间戳
now = datetime.now()
date = format_date_time(mktime(now.timetuple()))
# 拼接字符串
signature_origin = "host: " + self.host + "\n"
signature_origin += "date: " + date + "\n"
signature_origin += "GET " + self.path + " HTTP/1.1"
# 进行hmac-sha256进行加密
signature_sha = hmac.new(self.APISecret.encode('utf-8'), signature_origin.encode('utf-8'),
digestmod=hashlib.sha256).digest()
signature_sha_base64 = base64.b64encode(signature_sha).decode(encoding='utf-8')
authorization_origin = f'api_key="{self.APIKey}", algorithm="hmac-sha256", headers="host date request-line", signature="{signature_sha_base64}"'
authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8')
# 将请求的鉴权参数组合为字典
v = {
"authorization": authorization,
"date": date,
"host": self.host
}
# 拼接鉴权参数,生成url
url = self.Spark_url + '?' + urlencode(v)
# 此处打印出建立连接时候的url,参考本demo的时候可取消上方打印的注释,比对相同参数时生成的url与自己代码生成的url是否一致
return url
# 收到websocket错误的处理
def on_error(ws, error):
print("### error:", error)
# 收到websocket关闭的处理
def on_close(ws, one, two):
print("### closed ###")
# 收到websocket连接建立的处理
def on_open(ws):
thread.start_new_thread(run, (ws,))
def run(ws, *args):
data = json.dumps(gen_params(appid=ws.appid, domain=ws.domain, question=ws.question))
ws.send(data)
# 收到websocket消息的处理
def on_message(ws, message):
global answer
data = json.loads(message)
code = data['header']['code']
if code != 0:
print(f'请求错误: {code}, {data}')
ws.close()
else:
choices = data["payload"]["choices"]
status = choices["status"]
content = choices["text"][0]["content"]
answer += content
if status == 2:
ws.close()
chat_messages.config(state=tk.NORMAL)
chat_messages.insert(tk.END, f"星火: {answer}\n")
chat_messages.config(state=tk.DISABLED)
chat_messages.yview(tk.END)
def gen_params(appid, domain, question):
"""
通过appid和用户的提问来生成请参数
"""
data = {
"header": {
"app_id": appid,
"uid": "1234"
},
"parameter": {
"chat": {
"domain": domain,
"random_threshold": 0.5,
"max_tokens": 2048,
"auditing": "default"
}
},
"payload": {
"message": {
"text": question
}
}
}
return data
def main(appid, api_key, api_secret, Spark_url, domain, question):
wsParam = Ws_Param(appid, api_key, api_secret, Spark_url)
wsUrl = wsParam.create_url()
ws = websocket.WebSocketApp(wsUrl, on_message=on_message, on_error=on_error, on_close=on_close, on_open=on_open)
ws.appid = appid
ws.question = question
ws.domain = domain
ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})
# 以下密钥信息从控制台获取
appid = "*************" # 填写控制台中获取的 APPID 信息
api_secret = "***********" # 填写控制台中获取的 APISecret 信息
api_key = "*************" # 填写控制台中获取的 APIKey 信息
# 用于配置大模型版本,默认“general/generalv2”
domain = "generalv2" # v2.0版本
# 云端环境的服务地址
Spark_url = "wss://spark-api.xf-yun.com/v3.1/chat" # v2.0环境的地址
text = []
def getText(role, content):
jsoncon = {}
jsoncon["role"] = role
jsoncon["content"] = content
text.append(jsoncon)
return text
def getlength(text):
length = 0
for content in text:
temp = content["content"]
leng = len(temp)
length += leng
return length
def checklen(text):
while getlength(text) > 8000:
del text[0]
return text
def send_message():
global answer
user_input = chat_input.get().strip()
if user_input == '':
return
chat_messages.config(state=tk.NORMAL)
chat_messages.insert(tk.END, f"你: {user_input}\n")
chat_messages.config(state=tk.DISABLED)
chat_input.delete(0, tk.END)
chat_messages.yview(tk.END)
question = checklen(getText("user", user_input))
answer = ""
main(appid, api_key, api_secret, Spark_url, domain, question)
getText("assistant", answer)
def new_chat():
chat_messages.config(state=tk.NORMAL)
chat_messages.delete(1.0, tk.END)
chat_messages.config(state=tk.DISABLED)
text.clear()
def login():
# 这里可以实现登录功能
pass
# 创建主窗口
root = tk.Tk()
root.title("科大讯飞AI智能聊天框ui界面")
# 创建侧边栏
sidebar = tk.Frame(root, width=200, bg='#f0f0f0')
sidebar.pack(side=tk.LEFT, fill=tk.Y)
new_chat_button = tk.Button(sidebar, text="新对话", command=new_chat, bg='#007bff', fg='white')
new_chat_button.pack(pady=10, padx=10, fill=tk.X)
login_button = tk.Button(sidebar, text="登录", command=login, bg='#007bff', fg='white')
login_button.pack(pady=10, padx=10, fill=tk.X)
# 创建聊天框
chat_frame = tk.Frame(root)
chat_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True)
chat_messages = scrolledtext.ScrolledText(chat_frame, state=tk.DISABLED, wrap=tk.WORD)
chat_messages.pack(padx=10, pady=10, fill=tk.BOTH, expand=True)
chat_input_container = tk.Frame(chat_frame)
chat_input_container.pack(fill=tk.X, padx=10, pady=10)
chat_input = tk.Entry(chat_input_container, width=80)
chat_input.pack(side=tk.LEFT, fill=tk.X, expand=True)
send_button = tk.Button(chat_input_container, text="发送", command=send_message, bg='#007bff', fg='white')
send_button.pack(side=tk.RIGHT)
root.mainloop()
好了,你们只需要修改apl密钥就好了,直接可以运行了,密钥在哪一行?自己看
注意那个云端服务地址,假如你是gpt4,那么云端地址也不一样
运行后ui界面是这样的
我本来说ui界面我弄好看点的,但是我自己写的代码太烦了,看着不想改,界面你们可以自己改,我是真的不想动,嘿嘿,有问题联系我,拜拜