以上代码,要实现需修改扩展库存“libraries”——“Spark.py”。文件所在路径:C:\Users\lenovo\AppData\Local\DFScratch\extensions\ac000108-spark-thirdex\python\libraries
import _thread as thread
import os
import base64
import hashlib
import hmac
import json
from urllib.parse import urlparse , urlencode
import ssl
from datetime import datetime
from time import mktime
from wsgiref.handlers import format_date_time
import websocket
import openpyxl
from concurrent.futures import ThreadPoolExecutor, as_completed
import requests
from PIL import Image
class Spark:
def __init__(self,appid,api_secret,api_key,Personality):
self.appid = appid
self.api_secret = api_secret
self.api_key = api_key
self.gpt_url = "wss://spark-api.xf-yun.com/v3.5/chat"
self.tti_url = "https://spark-api.cn-huabei-1.xf-yun.com/v2.1/tti"
self.domain = "generalv3.5"
self.Personality = Personality
self.msgs = ""
self.history = ""
self.flag = True
self.imageBase=""
# 收到websocket错误的处理
def on_error(self,ws, error):
#print("### error:", error)
pass
# 收到websocket关闭的处理
def on_close(self,ws):
#print("### closed ###")
pass
# 收到websocket连接建立的处理
def on_open(self,ws):
#print("### open ###")
thread.start_new_thread(self.run, (ws,))
def run(self,ws, *args):
#print("### run ###")
data = json.dumps(self.gen_params(appid=ws.appid, query=ws.query, domain=ws.domain))
ws.send(data)
# 收到websocket消息的处理
def on_message(self,ws, message):
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"]
self.msgs = self.msgs + content
#print(content,end='')
if status == 2:
self.flag = False
ws.close()
ws.keep_running = False
def gen_params(self,appid, query, domain):
text = []
text.extend(self.Personality)
text.extend(self.history)
text.append({"role": "user", "content": query})
data = {
"header": {
"app_id": appid,
"uid": "1234"
},
"parameter": {
"chat": {
"domain": domain,
"temperature": 0.5,
"max_tokens": 4096,
"auditing": "default"
}
},
"payload": {
"message": {
"text": text
}
}
}
return data
def ask(self,prompt,history):
self.flag = True
self.msgs = ""
self.history = history
try:
host = urlparse(self.gpt_url).netloc
path = urlparse(self.gpt_url).path
websocket.enableTrace(False)
now = datetime.now()
date = format_date_time(mktime(now.timetuple()))
signature_origin = "host: " + host + "\n"
signature_origin += "date: " + date + "\n"
signature_origin += "GET " + path + " HTTP/1.1"
signature_sha = hmac.new(self.api_secret.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.api_key}", 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": host
}
wsUrl = self.gpt_url + '?' + urlencode(v)
ws = websocket.WebSocketApp(wsUrl, on_message=self.on_message, on_open=self.on_open, on_error=self.on_error, on_close=self.on_close )
ws.appid = self.appid
ws.query = prompt
ws.domain = self.domain
ws.history = history
ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})
while(self.flag):
pass
return self.msgs
except:
pass
def tti(self,prompt):
stidx = self.tti_url.index("://")
host = self.tti_url[stidx + 3:]
schema = self.tti_url[:stidx + 3]
edidx = host.index("/")
if edidx <= 0:
raise AssembleHeaderException("invalid request url:" + self.tti_url)
path = host[edidx:]
host = host[:edidx]
now = datetime.now()
date = format_date_time(mktime(now.timetuple()))
signature_origin = "host: {}\ndate: {}\n{} {} HTTP/1.1".format(host, date, 'POST', path)
signature_sha = hmac.new(self.api_secret.encode('utf-8'), signature_origin.encode('utf-8'),
digestmod=hashlib.sha256).digest()
signature_sha = base64.b64encode(signature_sha).decode(encoding='utf-8')
authorization_origin = "api_key="%s", algorithm="%s", headers="%s", signature="%s"" % (
self.api_key, "hmac-sha256", "host date request-line", signature_sha)
authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8')
values = {
"host": host,
"date": date,
"authorization": authorization
}
url = self.tti_url + "?" + urlencode(values)
print(url)
body= {
"header": {
"app_id": self.appid,
"uid":"123456789"
},
"parameter": {
"chat": {
"domain": "general",
"width": 1280,
"height": 720
}
},
"payload": {
"message":{
"text":[
{
"role":"user",
"content":prompt
}
]
}
}
}
response = requests.post(url,json=body,headers={'content-type': "application/json"}).text
data = json.loads(response)
code = data['header']['code']
if code != 0:
print(f'请求错误: {code}, {data}')
else:
text = data["payload"]["choices"]["text"]
imageContent = text[0]
self.imageBase = imageContent["content"]
imgdata = base64.b64decode(self.imageBase)
with open("1.jpg",'wb') as f:
f.write(imgdata)
img = Image.open("1.jpg")
# 旋转方式二
img2 = img.rotate(90,expand=True) # 自定义旋转度数
img2 = img2.resize((240, 320)) # 改变图片尺寸
img2.save("1.png")
复制代码
Mind+ 连接行空板,在终端中使用命令, cd mindplus/.lib/thirdExtension/进入第三方扩展文件夹,使用 ls 命令查看是否存在 ac000108-spark-thirdex文件夹。如果存在,使用 rm -r ac000108-spark-thirdex删除。再次运行图形化程序, Mind+ 会将修改后的扩展,下载到行空板中。