|
|
@@ -0,0 +1,111 @@
|
|
|
+from fastapi import APIRouter
|
|
|
+# 数据格式
|
|
|
+from utils.data import RequestOptions, SendMessageOptions, ErrorCodeMessage, RequestProps
|
|
|
+import json
|
|
|
+# 异步请求
|
|
|
+from starlette.responses import StreamingResponse, JSONResponse
|
|
|
+# openai
|
|
|
+from openai import OpenAI
|
|
|
+chatglm = OpenAI(
|
|
|
+ api_key="xxx",
|
|
|
+ base_url="http://10.58.0.2:6678/v1",
|
|
|
+)
|
|
|
+# 日志
|
|
|
+import logging
|
|
|
+
|
|
|
+main_router = APIRouter()
|
|
|
+
|
|
|
+
|
|
|
+@main_router.post("/chat-process")
|
|
|
+async def chat_process(request: RequestProps):
|
|
|
+ first_chunk = True
|
|
|
+
|
|
|
+ logging.info(f"API收到请求: {request}")
|
|
|
+
|
|
|
+ async def event_stream(request : RequestProps):
|
|
|
+ nonlocal first_chunk
|
|
|
+ try:
|
|
|
+ newline = '\n'
|
|
|
+ process=lambda chat: (yield f"{'' if first_chunk else newline}{chat.json()}")
|
|
|
+ await chat_reply_process(
|
|
|
+ RequestOptions(
|
|
|
+ message=request.prompt,
|
|
|
+ lastContext=request.options,
|
|
|
+ process='process',
|
|
|
+ systemMessage=request.systemMessage,
|
|
|
+ temperature=request.temperature,
|
|
|
+ top_p=request.top_p,
|
|
|
+ )
|
|
|
+ )
|
|
|
+ except Exception as error:
|
|
|
+ logging.warning(f"流出错: {error}")
|
|
|
+ yield str(error)
|
|
|
+ finally:
|
|
|
+ logging.info("流结束")
|
|
|
+ yield "\n"
|
|
|
+
|
|
|
+ res = StreamingResponse(event_stream(request), media_type="application/octet-stream")
|
|
|
+ return res
|
|
|
+
|
|
|
+async def chat_reply_process(options: RequestOptions):
|
|
|
+ logging.info("开始处理聊天回复")
|
|
|
+
|
|
|
+ try:
|
|
|
+ options_dict = options.model_dump()
|
|
|
+ message = options_dict.get('message')
|
|
|
+ lastContext = options_dict.get('lastContext')
|
|
|
+ process = options_dict.get('process')
|
|
|
+ systemMessage = options_dict.get('systemMessage')
|
|
|
+ temperature = options_dict.get('temperature')
|
|
|
+ top_p = options_dict.get('top_p')
|
|
|
+
|
|
|
+ send_options = SendMessageOptions()
|
|
|
+ send_options_dict = send_options.model_dump()
|
|
|
+
|
|
|
+ logging.info(f"聊天回复参数: {message}, {lastContext}, {process}, {systemMessage}, {temperature}, {top_p}")
|
|
|
+
|
|
|
+ if systemMessage:
|
|
|
+ send_options_dict['systemMessage'] = systemMessage
|
|
|
+ send_options_dict['completionParams'] = {'model': 'chatglm', 'temperature': temperature, 'top_p': top_p}
|
|
|
+
|
|
|
+ if lastContext:
|
|
|
+ send_options_dict['parentMessageId'] = lastContext.get('parentMessageId')
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ response = chatglm.chat.completions.create(
|
|
|
+ model="chatglm",
|
|
|
+ messages=[
|
|
|
+ {"role": "system", "content": systemMessage},
|
|
|
+ {"role": "user", "content": message}
|
|
|
+ ]
|
|
|
+ )
|
|
|
+
|
|
|
+ logging.info(f"聊天回复结果: {response}")
|
|
|
+
|
|
|
+ return {"status": "Success", "data": response, "message": ''}
|
|
|
+
|
|
|
+ except Exception as e:
|
|
|
+ code = e.status_code
|
|
|
+ if ErrorCodeMessage(code):
|
|
|
+ return {"type": "Fail", "message": ErrorCodeMessage(code)}
|
|
|
+ return {"type": "Fail", "message": str(e)}
|
|
|
+
|
|
|
+
|
|
|
+@main_router.post("/chat")
|
|
|
+async def chat():
|
|
|
+ pass
|
|
|
+
|
|
|
+@main_router.post("/config")
|
|
|
+async def config():
|
|
|
+ pass
|
|
|
+
|
|
|
+@main_router.post("/session")
|
|
|
+async def session():
|
|
|
+ return JSONResponse(status_code=200, content={'status': 'Success', 'message': '', 'data': {'auth': True, 'model': 'ChatGPTAPI'}})
|
|
|
+
|
|
|
+@main_router.post("/verify")
|
|
|
+async def verify():
|
|
|
+ return JSONResponse(status_code=200, content={'status': 'Success', 'message': 'Verify successfully', 'data': ''})
|
|
|
+ pass
|
|
|
+
|