request_tool.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. # !/usr/bin/ python
  2. # -*- coding: utf-8 -*-
  3. '''
  4. @Project : lq-agent-api
  5. @File :request_tool.py
  6. @IDE :Cursor
  7. @Author :
  8. @Date :2025/08/21
  9. '''
  10. import json
  11. import requests
  12. import time
  13. from requests.exceptions import RequestException
  14. from base.config import config_handler
  15. from logger.loggering import server_logger
  16. from utils.common import handler_err
  17. class KnowledgeDifyAction:
  18. """
  19. 与后端http对接交互类,支持 Token 认证和会话保持
  20. """
  21. def __init__(self, token=None, use_session=True):
  22. """
  23. 初始化连接
  24. :param host: 主机地址
  25. :param port: 端口号
  26. :param token: 认证令牌(可选)
  27. :param use_session: 是否使用会话保持(默认True)
  28. """
  29. self.dify_server_url = config_handler.get("knowledge_dify","DIFY_SERVER_URL")
  30. self.dify_api_key = config_handler.get("knowledge_dify","DIFY_API_KEY")
  31. self.dify_dataset_id_list_str = config_handler.get("knowledge_dify","DIFY_DATASET_ID_LIST")
  32. self.dify_dataset_id_list = [dataset_id for dataset_id in self.dify_dataset_id_list_str.split(",")]
  33. self.token = self.dify_api_key
  34. self.use_session = use_session
  35. # 创建会话对象(如果需要会话保持)
  36. if self.use_session:
  37. self.session = requests.Session()
  38. # 如果提供了token,添加到会话头
  39. if self.token:
  40. self.session.headers.update({"Authorization": f"Bearer {self.token}"})
  41. def get_request_knowledge_retrieve_list(self , params=None, headers=None, timeout=20, trace_id=""):
  42. """
  43. dify 批量知识库检索
  44. :param params: 请求参数(可选)
  45. :param headers: 额外请求头(可选)
  46. :param timeout: 超时时间(秒,默认5秒)
  47. :param trace_id: 操作id
  48. :return: 响应内容(json格式data 内容)
  49. """
  50. server_logger.info(trace_id=trace_id, msg=f"开始执行 dify 批量知识库检索,dify_dataset_id_list:{self.dify_dataset_id_list}")
  51. all_record_list = []
  52. for dataset_id in self.dify_dataset_id_list:
  53. response = self.get_request_knowledge_retrieve(trace_id=trace_id ,dataset_id=dataset_id , params=params , headers=headers , timeout=timeout)
  54. # 判断返回结果 ,如果 存在code 则返回错误
  55. if "code" in response:
  56. error_msg = f"检索知识库内容失败,详细信息:{response['status']-{response["code"]}-{response['message']}}"
  57. server_logger.info(f"dataset_id:{dataset_id}, {error_msg}", trace_id=trace_id)
  58. continue
  59. # 把 所有 检索列表 合并 为一个 list
  60. all_record_list += response["records"]
  61. return all_record_list
  62. def get_request_knowledge_retrieve(self , dataset_id , params=None, headers=None, timeout=20, trace_id=""):
  63. """
  64. dify 知识检索 -发送HTTP请求
  65. :param params: 请求参数(可选)
  66. :param headers: 额外请求头(可选)
  67. :param timeout: 超时时间(秒,默认5秒)
  68. :param trace_id: 操作id
  69. :return: 响应内容(json格式data 内容)
  70. """
  71. dify_dataset_url = config_handler.get("knowledge_dify","DIFY_DATASET_URL")
  72. # 替换 知识库id 配置
  73. dify_dataset_url = dify_dataset_url.format(dataset_id=dataset_id)
  74. # 准备请求头
  75. request_headers = {}
  76. request_headers["Content-Type"] = "application/json"
  77. if self.token: # 非会话模式需单独添加token
  78. request_headers["Authorization"] = f"Bearer {self.token}"
  79. if headers: # 合并额外请求头
  80. request_headers.update(headers)
  81. request_url = "{dify_server_url}{dify_dataset_url}".format(
  82. dify_server_url=self.dify_server_url, dify_dataset_url=dify_dataset_url)
  83. server_logger.info(f"{request_url}, header: {request_headers}, params={params}", trace_id=trace_id)
  84. try:
  85. response = requests.post(
  86. request_url,
  87. json=params,
  88. headers=request_headers,
  89. timeout=timeout
  90. )
  91. # 检查HTTP状态码
  92. response_data = response.json()
  93. server_logger.info(f"url: {request_url}, dataset_id:{dataset_id}, response: {response_data}", trace_id=trace_id)
  94. return response_data
  95. except RequestException as e:
  96. handler_err(server_logger, trace_id=trace_id, err=e, err_name='get_request_knowledge_retrieve')
  97. #raise e
  98. return {}