IELTS / app.py
LiuZhiwen0706's picture
Update app.py
75a11d4 verified
#该应用创建工具共包含三个区域,顶部工具栏,左侧代码区,右侧交互效果区,其中右侧交互效果是通过左侧代码生成的,存在对照关系。
#顶部工具栏:运行、保存、新开浏览器打开、实时预览开关,针对运行和在浏览器打开选项进行重要说明:
#[运行]:交互效果并非实时更新,代码变更后,需点击运行按钮获得最新交互效果。
#[在浏览器打开]:新建页面查看交互效果。
#以下为应用创建工具的示例代码
import gradio as gr
import _thread as thread
import base64
import datetime
import hashlib
import hmac
import json
from urllib.parse import urlparse
import ssl
from datetime import datetime
from time import mktime
from urllib.parse import urlencode
from wsgiref.handlers import format_date_time
import websocket
class Ws_Param(object):
# 初始化
def __init__(self, APPID, APIKey, APISecret, gpt_url):
self.APPID = APPID
self.APIKey = APIKey
self.APISecret = APISecret
self.host = urlparse(gpt_url).netloc
self.path = urlparse(gpt_url).path
self.gpt_url = gpt_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.gpt_url + '?' + urlencode(v)
# 此处打印出建立连接时候的url,参考本demo的时候可取消上方打印的注释,比对相同参数时生成的url与自己代码生成的url是否一致
return url
# 收到websocket错误的处理
def on_error(ws, error):
print("### error:", error)
# 收到websocket关闭的处理
def on_close(ws):
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, question=ws.question))
ws.send(data)
# 收到websocket消息的处理
def on_message(ws, message):
# print(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"]
print(content, end='')
with open('output.txt', 'a', encoding='utf-8') as f:
f.write(content)
if status == 2:
ws.close()
def gen_params(appid, question):
"""
通过appid和用户的提问来生成请参数
"""
data = {
"header": {
"app_id": appid,
"uid": "1234"
},
"parameter": {
"chat": {
"domain": "generalv2",
"random_threshold": 0.1,
"max_tokens": 2048,
"auditing": "default"
}
},
"payload": {
"message": {
"text": [
{"role": "user", "content": question}
]
}
}
}
return data
def score(appid, api_key, api_secret, gpt_url, question):
wsParam = Ws_Param(appid, api_key, api_secret, gpt_url)
websocket.enableTrace(False)
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.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})
def greet(appid, api_secret, api_key, topic, answer):
with open('output.txt', 'w') as f:
pass
if appid and api_secret and api_key:
appid = appid
api_secret = api_secret
api_key = api_key
else:
appid="39951d99"
api_secret="ZjVhNmFiMjg2YWExODlmNjhjMDliOWMz"
api_key="1CopZeypHcpbuerDSNGYT8ryNJE3izi3Uu"
question = f"作为专业的雅思考试作文指导老师,需要你根据雅思考试第二篇作文的题目要求:{topic}为学生的答案:{answer}分别从Task Response、Coherence and Cohesion、Lexical Resource、Grammatical Range and Accuracy四项评分角度从0、0.5、1、1.5、2、2.5、3、3.5、4、4.5、5、5.5、6中选一个数值为考生的答案给出各个角度的分数结果,并结合学生答案的具体句子或词汇给出具体的评分依据和修改意见,最后结合以上四项评分结果,严格从0、0.5、1、1.5、2、2.5、3、3.5、4、4.5、5、5.5、6以上这13个数值中选择一个数值作为该考生答案的综合得分,并给出综合的评分依据和修改意见。你要严格按照以下模板格式进行回复:Task Response项分数结果:Task Response项角度润色意见:Coherence and Cohesion项分数结果:Coherence and Cohesion项角度润色意见:Lexical Resource项分数结果:Lexical Resource项角度润色意见:Grammatical Range and Accuracy项分数结果:Grammatical Range and Accuracy项角度润色意见:综合得分:综合润色意见:"
print(question)
score(appid=appid,
api_secret=api_secret,
api_key=api_key,
gpt_url="ws://spark-api.xf-yun.com/v2.1/chat",
question=question)
with open('output.txt', 'r') as f:
opinions = f.read()
return opinions
with gr.Blocks() as demo:
gr.Markdown(
"""
# 欢迎使用雅思大作文评分助手!
若您没有讯飞星火大模型API接口权限,则将使用作者的API,额度有限,请您尽量使用自己的API接口信息。
""")
# 设置输入组件
with gr.Row() as row:
appid = gr.Textbox(label="请输入您的appid")
api_secret = gr.Textbox(label="请输入您的api_secret")
api_key = gr.Textbox(label="请输入您的api_key")
with gr.Row() as row:
with gr.Column():
gr.Markdown("## 作文题目及答案输入")
topic = gr.Textbox(label="请输入作文题目", lines=5)
answer = gr.Textbox(label="请输入您的答案",lines=25)
with gr.Column():
# 设置输出组件
greet_btn = gr.Button("提交作文题目及答案") # 设置按钮
output = gr.TextArea(label="评分及润色意见", lines=33)
# 设置按钮点击事件
greet_btn.click(fn=greet, inputs=[appid, api_secret, api_key, topic, answer], outputs=output)
demo.launch()