制作自己的AIGC(包括ui界面)基于星火模型

好久没有发布文章了,今天教大家制作一个类似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界面我弄好看点的,但是我自己写的代码太烦了,看着不想改,界面你们可以自己改,我是真的不想动,嘿嘿,有问题联系我,拜拜

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值