tools_library.py 5.9 KB

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