tools_library.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. '''
  2. 工具库模块,提供工具库中的工具调用、保存新的待接入工具的信息
  3. 分为三个函数:
  4. 1. 调用工具库中的工具
  5. 2. 保存新的待接入工具的信息
  6. 3. 获取工具调用参数信息
  7. '''
  8. import requests
  9. import os
  10. import json
  11. import re
  12. TOOL_SERVER_URL = "http://47.84.182.56:8001/tools/call"
  13. def call_tool(tool_name: str, arguments: dict):
  14. """
  15. 调用工具库中的工具
  16. :param tool_name: 工具名称
  17. :param arguments: 工具参数字典
  18. :return: 工具调用结果
  19. """
  20. url = f"{TOOL_SERVER_URL}/{tool_name}"
  21. headers = {
  22. 'Content-Type': 'application/json'
  23. }
  24. try:
  25. response = requests.post(url, headers=headers, json=arguments)
  26. response.raise_for_status()
  27. return response.json()
  28. except requests.RequestException as e:
  29. # 在实际生产中可能需要更复杂的错误处理或日志记录
  30. return {"error": f"Failed to call tool {tool_name}: {str(e)}"}
  31. def save_tool_info(tool_name: str, tool_doc: str):
  32. """
  33. 保存新的待接入工具的信息
  34. :param tool_name: 工具名称
  35. :param tool_doc: 工具文档字符串
  36. :return: 保存的文件路径
  37. """
  38. # 获取当前文件所在目录
  39. current_dir = os.path.dirname(os.path.abspath(__file__))
  40. # 创建 tool_infos 目录(如果不存在)
  41. save_dir = os.path.join(current_dir, 'tool_infos')
  42. if not os.path.exists(save_dir):
  43. os.makedirs(save_dir)
  44. file_path = os.path.join(save_dir, f"{tool_name}.txt")
  45. try:
  46. with open(file_path, 'w', encoding='utf-8') as f:
  47. f.write(tool_doc)
  48. return file_path
  49. except IOError as e:
  50. return f"Error saving tool info: {str(e)}"
  51. def get_all_tool_infos() -> str:
  52. """
  53. 获取所有已保存工具的信息
  54. :return: 所有工具信息的拼接字符串
  55. """
  56. current_dir = os.path.dirname(os.path.abspath(__file__))
  57. save_dir = os.path.join(current_dir, 'tool_infos')
  58. if not os.path.exists(save_dir):
  59. return ""
  60. tool_infos = []
  61. try:
  62. for filename in os.listdir(save_dir):
  63. if filename.endswith(".txt"):
  64. file_path = os.path.join(save_dir, filename)
  65. with open(file_path, 'r', encoding='utf-8') as f:
  66. content = f.read().strip()
  67. tool_infos.append(f"--- Tool: {filename[:-4]} ---\n{content}\n")
  68. except Exception as e:
  69. return f"Error reading tool infos: {str(e)}"
  70. return "\n".join(tool_infos)
  71. def get_tool_info(tool_name: str) -> str:
  72. """
  73. 获取指定工具的信息
  74. :param tool_name: 工具名称
  75. :return: 工具信息文本,如果不存在返回空字符串
  76. """
  77. current_dir = os.path.dirname(os.path.abspath(__file__))
  78. save_dir = os.path.join(current_dir, 'tool_infos')
  79. if not os.path.exists(save_dir):
  80. return ""
  81. file_path = os.path.join(save_dir, f"{tool_name}.txt")
  82. if not os.path.exists(file_path):
  83. return ""
  84. try:
  85. with open(file_path, 'r', encoding='utf-8') as f:
  86. return f.read().strip()
  87. except Exception as e:
  88. return f"Error reading tool info: {str(e)}"
  89. def get_tool_params(tools_id: str) -> str:
  90. """
  91. 根据tools_id获取工具调用参数信息
  92. :param tools_id: 工具调用ID
  93. :return: 工具参数信息的JSON字符串,如果未找到返回空字符串
  94. """
  95. current_dir = os.path.dirname(os.path.abspath(__file__))
  96. prompt_dir = os.path.join(current_dir, 'prompt')
  97. params_file = os.path.join(prompt_dir, 'all_tools_params.md')
  98. if not os.path.exists(params_file):
  99. return ""
  100. try:
  101. with open(params_file, 'r', encoding='utf-8') as f:
  102. content = f.read()
  103. # 查找工具调用ID的位置
  104. # 格式:工具调用ID:<tools_id>
  105. id_pattern = f"工具调用ID:{re.escape(tools_id)}"
  106. match = re.search(id_pattern, content)
  107. if not match:
  108. return ""
  109. # 从匹配位置开始往后找JSON块
  110. start_index = match.end()
  111. json_start = content.find('{', start_index)
  112. if json_start == -1:
  113. return ""
  114. # 简单的JSON提取逻辑:找匹配的大括号
  115. brace_count = 0
  116. json_end = -1
  117. for i in range(json_start, len(content)):
  118. if content[i] == '{':
  119. brace_count += 1
  120. elif content[i] == '}':
  121. brace_count -= 1
  122. if brace_count == 0:
  123. json_end = i + 1
  124. break
  125. if json_end != -1:
  126. return content[json_start:json_end]
  127. return ""
  128. except Exception as e:
  129. return f"Error reading tool params: {str(e)}"