index.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. from fastapi import APIRouter
  2. # 数据格式
  3. from utils.data import RequestOptions, SendMessageOptions, ErrorCodeMessage, RequestProps
  4. import json
  5. # 异步请求
  6. from starlette.responses import StreamingResponse, JSONResponse
  7. # openai
  8. from openai import OpenAI
  9. chatglm = OpenAI(
  10. api_key="xxx",
  11. base_url="http://10.58.0.2:6678/v1",
  12. )
  13. # 日志
  14. import logging
  15. main_router = APIRouter()
  16. @main_router.post("/chat-process")
  17. async def chat_process(request: RequestProps):
  18. first_chunk = True
  19. logging.info(f"API收到请求: {request}")
  20. async def event_stream(request : RequestProps):
  21. nonlocal first_chunk
  22. try:
  23. newline = '\n'
  24. process=lambda chat: (yield f"{'' if first_chunk else newline}{chat.json()}")
  25. await chat_reply_process(
  26. RequestOptions(
  27. message=request.prompt,
  28. lastContext=request.options,
  29. process='process',
  30. systemMessage=request.systemMessage,
  31. temperature=request.temperature,
  32. top_p=request.top_p,
  33. )
  34. )
  35. except Exception as error:
  36. logging.warning(f"流出错: {error}")
  37. yield str(error)
  38. finally:
  39. logging.info("流结束")
  40. yield "\n"
  41. res = StreamingResponse(event_stream(request), media_type="application/octet-stream")
  42. return res
  43. async def chat_reply_process(options: RequestOptions):
  44. logging.info("开始处理聊天回复")
  45. try:
  46. options_dict = options.model_dump()
  47. message = options_dict.get('message')
  48. lastContext = options_dict.get('lastContext')
  49. process = options_dict.get('process')
  50. systemMessage = options_dict.get('systemMessage')
  51. temperature = options_dict.get('temperature')
  52. top_p = options_dict.get('top_p')
  53. send_options = SendMessageOptions()
  54. send_options_dict = send_options.model_dump()
  55. logging.info(f"聊天回复参数: {message}, {lastContext}, {process}, {systemMessage}, {temperature}, {top_p}")
  56. if systemMessage:
  57. send_options_dict['systemMessage'] = systemMessage
  58. send_options_dict['completionParams'] = {'model': 'chatglm', 'temperature': temperature, 'top_p': top_p}
  59. if lastContext:
  60. send_options_dict['parentMessageId'] = lastContext.get('parentMessageId')
  61. response = chatglm.chat.completions.create(
  62. model="chatglm",
  63. messages=[
  64. {"role": "system", "content": systemMessage},
  65. {"role": "user", "content": message}
  66. ]
  67. )
  68. logging.info(f"聊天回复结果: {response}")
  69. return {"status": "Success", "data": response, "message": ''}
  70. except Exception as e:
  71. code = e.status_code
  72. if ErrorCodeMessage(code):
  73. return {"type": "Fail", "message": ErrorCodeMessage(code)}
  74. return {"type": "Fail", "message": str(e)}
  75. @main_router.post("/chat")
  76. async def chat():
  77. pass
  78. @main_router.post("/config")
  79. async def config():
  80. pass
  81. @main_router.post("/session")
  82. async def session():
  83. return JSONResponse(status_code=200, content={'status': 'Success', 'message': '', 'data': {'auth': True, 'model': 'ChatGPTAPI'}})
  84. @main_router.post("/verify")
  85. async def verify():
  86. return JSONResponse(status_code=200, content={'status': 'Success', 'message': 'Verify successfully', 'data': ''})
  87. pass