agent.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import json
  2. import uuid
  3. from fastapi import Depends, APIRouter, Query, HTTPException
  4. from fastapi.responses import JSONResponse
  5. from pydantic import BaseModel
  6. from sqlalchemy.orm import Session
  7. from app.api import Response, get_current_user, ResponseList
  8. from app.config.config import settings
  9. from app.models.agent_model import AgentType, AgentModel
  10. from app.models.base_model import get_db
  11. from app.models.user_model import UserModel
  12. from app.service.bisheng import BishengService
  13. from app.service.ragflow import RagflowService
  14. from app.service.token import get_ragflow_token, get_bisheng_token
  15. router = APIRouter()
  16. @router.get("/list", response_model=ResponseList)
  17. async def agent_list(db: Session = Depends(get_db)):
  18. agents = db.query(AgentModel).order_by(AgentModel.sort.asc()).all()
  19. result = [item.to_dict() for item in agents]
  20. return ResponseList(code=200, msg="", data=result)
  21. @router.get("/{agent_id}/sessions", response_model=ResponseList)
  22. async def chat_list(
  23. agent_id: str,
  24. page: int = Query(1, ge=1),
  25. limit: int = Query(10, ge=1, le=100),
  26. db: Session = Depends(get_db),
  27. current_user: UserModel = Depends(get_current_user)):
  28. agent = db.query(AgentModel).filter(AgentModel.id == agent_id).first()
  29. if not agent:
  30. return ResponseList(code=404, msg="Agent not found")
  31. if agent.agent_type == AgentType.RAGFLOW:
  32. ragflow_service = RagflowService(base_url=settings.fwr_base_url)
  33. try:
  34. token = get_ragflow_token(db, current_user.id)
  35. result = await ragflow_service.get_chat_sessions(token, agent_id)
  36. except Exception as e:
  37. raise HTTPException(status_code=500, detail=str(e))
  38. return ResponseList(code=200, msg="", data=result)
  39. elif agent.agent_type == AgentType.BISHENG:
  40. bisheng_service = BishengService(base_url=settings.sgb_base_url)
  41. try:
  42. token = get_bisheng_token(db, current_user.id)
  43. print(f"Calling get_chat_sessions with token={token}, page={page}, limit={limit}")
  44. result = await bisheng_service.get_chat_sessions(token, page, limit)
  45. except Exception as e:
  46. raise HTTPException(status_code=500, detail=str(e))
  47. return ResponseList(code=200, msg="", data=result)
  48. else:
  49. return ResponseList(code=200, msg="Unsupported agent type")
  50. @router.get("/{agent_id}/{conversation_id}/session_log")
  51. async def session_log(agent_id: str, conversation_id: str, db: Session = Depends(get_db), current_user: UserModel = Depends(get_current_user)):
  52. agent = db.query(AgentModel).filter(AgentModel.id == agent_id).first()
  53. if not agent:
  54. return Response(code=404, msg="Agent not found")
  55. if agent.agent_type == AgentType.RAGFLOW:
  56. ragflow_service = RagflowService(base_url=settings.fwr_base_url)
  57. try:
  58. token = get_ragflow_token(db, current_user.id)
  59. result = await ragflow_service.get_session_log(token, conversation_id)
  60. if 'session_log' in result and 'reference' in result:
  61. combined_logs = []
  62. last_question = None
  63. references = result['reference']
  64. reference_index = 0
  65. for session in result['session_log']:
  66. if session['role'] == 'user':
  67. last_question = session['message']
  68. elif session['role'] == 'assistant' and last_question:
  69. if reference_index < len(references):
  70. reference = references[reference_index]
  71. else:
  72. reference = None
  73. combined_logs.append({
  74. 'question': last_question,
  75. 'answer': session['message'],
  76. 'reference': reference
  77. })
  78. last_question = None
  79. reference_index += 1
  80. return JSONResponse(status_code=200, content={"code": 200, "data": combined_logs})
  81. else:
  82. return JSONResponse(status_code=200, content={"code": 400, "message": "Invalid result structure"})
  83. except Exception as e:
  84. raise HTTPException(status_code=500, detail=str(e))
  85. if agent.agent_type == AgentType.BISHENG:
  86. bisheng_service = BishengService(base_url=settings.sgb_base_url)
  87. try:
  88. token = get_bisheng_token(db, current_user.id)
  89. result = await bisheng_service.get_session_log(token, agent_id, conversation_id)
  90. combined_logs = []
  91. last_question = None
  92. for session in result:
  93. message = session['message']
  94. # 判断message是字符串还是json 对象,如果是json取其中的question字段,或者report_name字段赋值给message
  95. try:
  96. message_json = json.loads(message)
  97. if 'question' in message_json:
  98. message = message_json['question']
  99. elif 'query' in message_json:
  100. message = message_json['query']
  101. elif 'report_name' in message_json:
  102. message = message_json['report_name']
  103. except json.JSONDecodeError:
  104. pass
  105. if session['role'] == 'question':
  106. last_question = message
  107. elif session['role'] == 'answer' and last_question:
  108. combined_logs.append({
  109. 'question': last_question,
  110. 'answer': message
  111. })
  112. last_question = None
  113. return JSONResponse(status_code=200, content={"code": 200, "data": combined_logs})
  114. except Exception as e:
  115. raise HTTPException(status_code=500, detail=str(e))
  116. else:
  117. return JSONResponse(status_code=200, content={"code": 200, "log": "Unsupported agent type"})
  118. @router.get("/get-chat-id/{agent_id}", response_model=Response)
  119. async def get_chat_id(agent_id: str, db: Session = Depends(get_db)):
  120. agent = db.query(AgentModel).filter(AgentModel.id == agent_id).first()
  121. if not agent:
  122. return Response(code=404, msg="Agent not found")
  123. return Response(code=200, msg="", data={"chat_id": uuid.uuid4().hex})