import logging import sys,os import traceback from agent.cdss.capbility import CDSSCapability from agent.cdss.models.schemas import CDSSInput, CDSSInt, CDSSText from model.response import StandardResponse from service.cdss_service import CdssService from service.kg_node_service import KGNodeService current_path = os.getcwd() sys.path.append(current_path) import time from fastapi import APIRouter, Depends, Query from typing import Optional, List import sys sys.path.append('..') from utils.agent import call_chat_api,get_conversation_id import json router = APIRouter(tags=["Knowledge Graph"]) service = CdssService() logger = logging.getLogger(__name__) @router.get("/knowledge/disease/recommend", response_model=StandardResponse) @router.get("/graph/nodes/recommend", response_model=StandardResponse) async def recommend( chief: str, present_illness: Optional[str] = None, sex: Optional[str] = None, age: Optional[int] = None, department: Optional[str] = None, ): start_time = time.time() app_id = "256fd853-60b0-4357-b11b-8114b4e90ae0" conversation_id = get_conversation_id(app_id) desc = "主诉:"+chief if present_illness: desc+="\n现病史:" + present_illness result = call_chat_api(app_id, conversation_id, desc) json_data = json.loads(result) keyword = " ".join(json_data["symptoms"]) result = await neighbor_search(keyword=keyword,sex=sex,age=age,department=department) end_time = time.time() print(f"recommend执行完成,耗时:{end_time - start_time:.2f}秒") return result @router.get("/neighbor_search", response_model=StandardResponse) async def neighbor_search( keyword: str = Query(..., min_length=2), sex: Optional[str] = None, age: Optional[int] = None, department: Optional[str] = None ): """ 根据关键词和属性过滤条件搜索图谱节点 """ try: keywords = keyword.split(" ") record = CDSSInput( pat_age=CDSSInt(type="month", value=age), pat_sex=CDSSText(type="sex", value=sex), chief_complaint=keywords, department=CDSSText(type='department', value=department) ) # 使用从main.py导入的capability实例处理CDSS逻辑 output = capability.process(input=record) output.diagnosis.value = [{"name":key,"count":value["count"],"score":value["score"],"symptoms":value["symptoms"] } for key,value in output.diagnosis.value.items()] result = {} if len(output.diagnosis.value)>0: result = service.get_disease_detail(output.diagnosis.value[0]['name'], '疾病') return StandardResponse( success=True, data={"可能诊断":output.diagnosis.value,"症状":keywords,"disease_detail":result} ) except Exception as e: traceback.print_exc() logger.error(f"get_disease_detail failed: {str(e)}") return StandardResponse( success=False, errorCode=500, errorMsg=str(e) ) @router.get("/knowledge/disease/{disease_name}/detail", response_model=StandardResponse) async def get_disease_detail( disease_name: str ): try: result = service.get_disease_detail(disease_name,'疾病') return StandardResponse(success=True, data=result) except Exception as e: traceback.print_exc() logger.error(f"get_disease_detail failed: {str(e)}") return StandardResponse( success=False, errorCode=500, errorMsg=str(e) ) capability = CDSSCapability() graph_router = router