You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

143 lines
5.2 KiB

#dc
import dash
import os
import time
from loguru import logger
from urllib.parse import unquote
from flask import request, session,Response,send_from_directory,jsonify
from user_agents import parse
from config.env import AppConfig
from config.global_config import PathConfig
from llm_services import sk_data_request
app = dash.Dash(
__name__,
compress=True,
suppress_callback_exceptions=True,
update_title=None
)
server = app.server
app.title = AppConfig.app_name
# 配置密钥
app.server.secret_key = AppConfig.app_secret_key
app.server.config['COMPRESS_ALGORITHM'] = AppConfig.app_compress_algorithm
app.server.config['COMPRESS_BR_LEVEL'] = AppConfig.app_compress_br_level
log_time = time.strftime("%Y%m%d", time.localtime())
# sys_log_file_path = os.path.join(PathConfig.ABS_ROOT_PATH, 'log', 'sys_log', f'sys_request_log_{log_time}.log')
api_log_file_path = os.path.join(PathConfig.ABS_ROOT_PATH, 'log', 'api_log', f'api_request_log_{log_time}.log')
# logger.add(sys_log_file_path, filter=lambda x: '[sys]' in x['message'],
# rotation="50MB", encoding="utf-8", enqueue=True, compression="zip")
logger.add(api_log_file_path, filter=lambda x: '[api]' in x['message'],
rotation="50MB", encoding="utf-8", enqueue=True, compression="zip")
# 获取用户浏览器信息
# @server.before_request
# def get_user_agent_info():
# request_addr = request.headers.get("X-Forwarded-For") if AppConfig.app_env == 'prod' else request.remote_addr
# user_string = str(request.user_agent)
# user_agent = parse(user_string)
# bw = user_agent.browser.family
# if user_agent.browser.version != ():
# bw_version = user_agent.browser.version[0]
# print ("bw_version",bw_version)
# if bw == 'IE':
# logger.warning("[sys]请求人:{}||请求IP:{}||请求方法:{}||请求Data:{}",
# session.get('name'), request_addr, request.method, '用户使用IE内核')
# return "<h1 style='color: red'>请不要使用IE浏览器或360浏览器兼容模式</h1>"
# # if bw_version < 71:
# if bw_version < -1:
# logger.warning("[sys]请求人:{}||请求IP:{}||请求方法:{}||请求Data:{}",
# session.get('name'), request_addr, request.method, '用户Chrome内核版本太低')
# return "<h1 style='color: red'>Chrome内核版本号太低,请升级浏览器</h1>" \
# "<h1 style='color: red'><a href='https://www.google.cn/chrome/'>点击此处</a>可下载最新版Chrome浏览器</h1>"
# 配置系统日志
# @server.after_request
# def get_callbacks_log(response):
# logger.info("[sys]请求人:{}||请求IP:{}||请求方法:{}||请求Data:{}",
# session.get('name'), request.remote_addr, request.method, request.data.decode("utf-8"))
#
# return response
@app.server.route("/data-chat")
def stream_chat():
"""统一处理示例流式接口,及内置支持的各类大模型对话服务流式数据返回"""
print("已进入ai接口调用1")
# 获取问题内容
question = request.args.get("question", "")
# 获取模型厂商名称
model_name = request.args.get("model_name")
# 获取具体子模型名称
sub_model_name = request.args.get("sub_model_name")
# 获取temperature参数
temperature = request.args.get("temperature") and float(
request.args.get("temperature")
)
# 获取max_tokens参数
max_tokens = request.args.get("max_tokens") and int(request.args.get("max_tokens"))
# 获取对话id
conversation_id = request.args.get("conversation_id")
# 获取消息id
message_id = request.args.get("message_id")
# 处理问题内容两侧空白字符
question = unquote(question).strip()
# 若问题为空,则输出“无效问题提示”
if not question:
return Response(
"data: %s\n\n"
% json.dumps(
dict(
type="<无效问题>",
timestamp=time.time(),
content="您输入的问题经系统判定无效,请重新输入。",
)
),
# mimetype="text/event-stream",
)
print("已进入ai接口调用2")
response_data = sk_data_request(
question=question,
model_name=model_name,
sub_model_name=sub_model_name,
temperature=temperature,
max_tokens=max_tokens,
conversation_id=conversation_id,
message_id=message_id,
)
return jsonify(response_data)
@app.server.route("/upload", methods=["POST"])
def upload():
uploadId = request.values.get("uploadId")
filename = request.files["file"].filename
try:
os.mkdir(os.path.join("caches", uploadId))
except FileExistsError:
pass
with open(os.path.join("caches", uploadId, filename), "wb") as f:
for chunk in iter(lambda: request.files["file"].read(1024 * 1024 * 10), b""):
f.write(chunk)
return {"filename": filename}
@app.server.route("/download")
def download():
path = request.args.get("path")
filename = request.args.get("filename")
return send_from_directory(path, filename)