49 lines
2.0 KiB
Python
49 lines
2.0 KiB
Python
"""HTTP adapters for chat; business logic lives in services."""
|
|
|
|
from flask import Blueprint, Response, request, stream_with_context
|
|
|
|
from .. import business_service, chat_service
|
|
|
|
bp = Blueprint('chat', __name__)
|
|
|
|
@bp.route('/stream_chat', methods=['GET', 'POST'])
|
|
def stream_chat():
|
|
def error(message):
|
|
return Response(chat_service.sse({'e':message}) + chat_service.sse({'d':1}), mimetype='text/event-stream')
|
|
|
|
if request.method == 'POST':
|
|
data = request.get_json(silent=True)
|
|
if not isinstance(data, dict):
|
|
return error('请求格式无效,请重新发送问题。')
|
|
msg = data.get('msg', '')
|
|
conv_id = data.get('conv_id')
|
|
else:
|
|
msg = request.args.get('msg', '')
|
|
conv_id = request.args.get('conv_id')
|
|
if not isinstance(msg, str):
|
|
return error('问题必须是文本,请重新输入。')
|
|
msg = msg.strip()
|
|
if isinstance(conv_id, (bool, float)):
|
|
return error('会话编号无效,请新建对话后重试。')
|
|
if conv_id not in (None, '', 0):
|
|
if not isinstance(conv_id, (str, int)):
|
|
return error('会话编号无效,请新建对话后重试。')
|
|
if isinstance(conv_id, str) and (len(conv_id) > 19 or not conv_id.isascii() or not conv_id.isdecimal()):
|
|
return error('会话编号无效,请新建对话后重试。')
|
|
try:
|
|
conv_id = int(conv_id)
|
|
except (ValueError, TypeError):
|
|
return error('会话编号无效,请新建对话后重试。')
|
|
if not 0 < conv_id <= 9223372036854775807:
|
|
return error('会话编号无效,请新建对话后重试。')
|
|
else:
|
|
conv_id = None
|
|
frames, headers = chat_service.create_chat_stream(msg, conv_id)
|
|
body = frames if isinstance(frames, str) else stream_with_context(frames)
|
|
return Response(body, mimetype='text/event-stream', headers=headers)
|
|
|
|
|
|
@bp.route('/api/feedback', methods=['POST'])
|
|
def feedback():
|
|
return business_service.feedback(request.get_json(silent=True))
|