chat.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import json
  2. from Log import logger
  3. from app.config.agent_base_url import RG_CHAT_DIALOG
  4. from app.config.config import settings
  5. from app.config.const import max_chunk_size
  6. from app.models.v2.session_model import ChatSessionDao
  7. from app.service.v2.app_driver.chat_dialog import ChatDialog
  8. async def service_chat_dialog(db, chat_id:str, question: str, session_id: str, user_id):
  9. token = "ragflow-YzMzE1NDRjYzMyZjExZWY5ZjkxMDI0Mm"
  10. url = settings.fwr_base_url+RG_CHAT_DIALOG.format(chat_id)
  11. chat = ChatDialog(token)
  12. request_data = {
  13. "question": question,
  14. "stream": True,
  15. "session_id": session_id
  16. }
  17. headers = {
  18. 'Content-Type': 'application/json',
  19. 'Authorization': f"Bearer {token}"
  20. }
  21. try:
  22. await ChatSessionDao(db).update_or_insert_by_id(
  23. session_id=session_id,
  24. name=question[:255],
  25. agent_id=chat_id,
  26. agent_type=1,
  27. tenant_id=user_id,
  28. message={"role": "user", "content": question},
  29. conversation_id=session_id,
  30. event_type="message"
  31. )
  32. except Exception as e:
  33. logger.error(e)
  34. try:
  35. message = {"role": "assistant","answer":"", "reference": {}}
  36. async for ans in chat.chat_completions(url, request_data, headers):
  37. if ans.get("code", None) == 102:
  38. error = ans.get("message", "请输入你的问题!")
  39. data = {"answer":error}
  40. event = "message"
  41. else:
  42. if isinstance(ans.get("data"), bool) and ans.get("data") is True:
  43. data = {}
  44. event = "message_end"
  45. else:
  46. data = ans.get("data", {})
  47. message = ans.get("data", {})
  48. event = "message"
  49. message_str = "data: " + json.dumps({"event": event, "data": data}, ensure_ascii=False) + "\n\n"
  50. for i in range(0, len(message_str), max_chunk_size):
  51. chunk = message_str[i:i + max_chunk_size]
  52. # print(chunk)
  53. yield chunk # 发送分块消息
  54. await ChatSessionDao(db).update_session_by_id(
  55. session_id=session_id,
  56. session=None,
  57. message=message
  58. )
  59. except Exception as e:
  60. logger.error(e)
  61. yield "data: " + json.dumps({"message": "message",
  62. "data": {"answer": "**ERROR**: " + str(e), "reference": []}},
  63. ensure_ascii=False) + "\n\n"
  64. yield "data: " + json.dumps({"message": "message_end",
  65. "data": {}},
  66. ensure_ascii=False) + "\n\n"