graph_router.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import logging
  2. import sys,os
  3. import traceback
  4. from agent.cdss.capbility import CDSSCapability
  5. from agent.cdss.models.schemas import CDSSInput, CDSSInt, CDSSText
  6. from model.response import StandardResponse
  7. from service.cdss_service import CdssService
  8. from service.kg_node_service import KGNodeService
  9. current_path = os.getcwd()
  10. sys.path.append(current_path)
  11. import time
  12. from fastapi import APIRouter, Depends, Query
  13. from typing import Optional, List
  14. import sys
  15. sys.path.append('..')
  16. from utils.agent import call_chat_api,get_conversation_id
  17. import json
  18. router = APIRouter(tags=["Knowledge Graph"])
  19. service = CdssService()
  20. logger = logging.getLogger(__name__)
  21. @router.get("/knowledge/disease/recommend", response_model=StandardResponse)
  22. @router.get("/graph/nodes/recommend", response_model=StandardResponse)
  23. async def recommend(
  24. chief: str,
  25. present_illness: Optional[str] = None,
  26. sex: Optional[str] = None,
  27. age: Optional[int] = None,
  28. department: Optional[str] = None,
  29. ):
  30. start_time = time.time()
  31. app_id = "256fd853-60b0-4357-b11b-8114b4e90ae0"
  32. conversation_id = get_conversation_id(app_id)
  33. desc = "主诉:"+chief
  34. if present_illness:
  35. desc+="\n现病史:" + present_illness
  36. result = call_chat_api(app_id, conversation_id, desc)
  37. json_data = json.loads(result)
  38. keyword = " ".join(json_data["symptoms"])
  39. result = await neighbor_search(keyword=keyword,sex=sex,age=age,department=department)
  40. end_time = time.time()
  41. print(f"recommend执行完成,耗时:{end_time - start_time:.2f}秒")
  42. return result
  43. @router.get("/neighbor_search", response_model=StandardResponse)
  44. async def neighbor_search(
  45. keyword: str = Query(..., min_length=2),
  46. sex: Optional[str] = None,
  47. age: Optional[int] = None,
  48. department: Optional[str] = None
  49. ):
  50. """
  51. 根据关键词和属性过滤条件搜索图谱节点
  52. """
  53. try:
  54. keywords = keyword.split(" ")
  55. record = CDSSInput(
  56. pat_age=CDSSInt(type="month", value=age),
  57. pat_sex=CDSSText(type="sex", value=sex),
  58. chief_complaint=keywords,
  59. department=CDSSText(type='department', value=department)
  60. )
  61. # 使用从main.py导入的capability实例处理CDSS逻辑
  62. output = capability.process(input=record)
  63. output.diagnosis.value = [{"name":key,"count":value["count"],"score":value["score"],"symptoms":value["symptoms"]
  64. } for key,value in output.diagnosis.value.items()]
  65. result = {}
  66. if len(output.diagnosis.value)>0:
  67. result = service.get_disease_detail(output.diagnosis.value[0]['name'], '疾病')
  68. return StandardResponse(
  69. success=True,
  70. data={"可能诊断":output.diagnosis.value,"症状":keywords,"disease_detail":result}
  71. )
  72. except Exception as e:
  73. traceback.print_exc()
  74. logger.error(f"get_disease_detail failed: {str(e)}")
  75. return StandardResponse(
  76. success=False,
  77. errorCode=500,
  78. errorMsg=str(e)
  79. )
  80. @router.get("/knowledge/disease/{disease_name}/detail", response_model=StandardResponse)
  81. async def get_disease_detail(
  82. disease_name: str
  83. ):
  84. try:
  85. result = service.get_disease_detail(disease_name,'疾病')
  86. return StandardResponse(success=True, data=result)
  87. except Exception as e:
  88. traceback.print_exc()
  89. logger.error(f"get_disease_detail failed: {str(e)}")
  90. return StandardResponse(
  91. success=False,
  92. errorCode=500,
  93. errorMsg=str(e)
  94. )
  95. capability = CDSSCapability()
  96. graph_router = router