tools_library.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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. })
  45. hot_topic_result = hot_topic_result_json.get('result', '')
  46. tool_name = 'new_red_hot_search_words_ranking'
  47. hot_search_words_result_json = call_tool(tool_name, {
  48. 'typeV1': category,
  49. 'rankDate': rankDate
  50. })
  51. hot_search_words_result = hot_search_words_result_json.get('result', '')
  52. result = f'{hot_topic_result}\n\n\n{hot_search_words_result}'
  53. return result
  54. def save_tool_info(tool_name: str, tool_doc: str):
  55. """
  56. 保存新的待接入工具的信息
  57. :param tool_name: 工具名称
  58. :param tool_doc: 工具文档字符串
  59. :return: 保存的文件路径
  60. """
  61. # 获取当前文件所在目录
  62. current_dir = os.path.dirname(os.path.abspath(__file__))
  63. # 创建 tool_infos 目录(如果不存在)
  64. save_dir = os.path.join(current_dir, 'tool_infos')
  65. if not os.path.exists(save_dir):
  66. os.makedirs(save_dir)
  67. file_path = os.path.join(save_dir, f"{tool_name}.txt")
  68. try:
  69. with open(file_path, 'w', encoding='utf-8') as f:
  70. f.write(tool_doc)
  71. return file_path
  72. except IOError as e:
  73. return f"Error saving tool info: {str(e)}"
  74. def get_all_tool_infos() -> str:
  75. """
  76. 获取所有已保存工具的信息
  77. :return: 所有工具信息的拼接字符串
  78. """
  79. current_dir = os.path.dirname(os.path.abspath(__file__))
  80. save_dir = os.path.join(current_dir, 'tool_infos')
  81. if not os.path.exists(save_dir):
  82. return ""
  83. tool_infos = []
  84. try:
  85. for filename in os.listdir(save_dir):
  86. if filename.endswith(".txt"):
  87. file_path = os.path.join(save_dir, filename)
  88. with open(file_path, 'r', encoding='utf-8') as f:
  89. content = f.read().strip()
  90. tool_infos.append(f"--- Tool: {filename[:-4]} ---\n{content}\n")
  91. except Exception as e:
  92. return f"Error reading tool infos: {str(e)}"
  93. return "\n".join(tool_infos)
  94. def get_tool_info(tool_name: str) -> str:
  95. """
  96. 获取指定工具的信息
  97. :param tool_name: 工具名称
  98. :return: 工具信息文本,如果不存在返回空字符串
  99. """
  100. current_dir = os.path.dirname(os.path.abspath(__file__))
  101. save_dir = os.path.join(current_dir, 'tool_infos')
  102. if not os.path.exists(save_dir):
  103. return ""
  104. file_path = os.path.join(save_dir, f"{tool_name}.txt")
  105. if not os.path.exists(file_path):
  106. return ""
  107. try:
  108. with open(file_path, 'r', encoding='utf-8') as f:
  109. return f.read().strip()
  110. except Exception as e:
  111. return f"Error reading tool info: {str(e)}"
  112. def get_tool_params(tools_id: str) -> str:
  113. """
  114. 根据tools_id获取工具调用参数信息
  115. :param tools_id: 工具调用ID
  116. :return: 工具参数信息的JSON字符串,如果未找到返回空字符串
  117. """
  118. current_dir = os.path.dirname(os.path.abspath(__file__))
  119. prompt_dir = os.path.join(current_dir, 'prompt')
  120. params_file = os.path.join(prompt_dir, 'all_tools_params.md')
  121. if not os.path.exists(params_file):
  122. return ""
  123. try:
  124. with open(params_file, 'r', encoding='utf-8') as f:
  125. content = f.read()
  126. # 查找工具调用ID的位置
  127. # 格式:工具调用ID:<tools_id>
  128. id_pattern = f"工具调用ID:{re.escape(tools_id)}"
  129. match = re.search(id_pattern, content)
  130. if not match:
  131. return ""
  132. # 从匹配位置开始往后找JSON块
  133. start_index = match.end()
  134. json_start = content.find('{', start_index)
  135. if json_start == -1:
  136. return ""
  137. # 简单的JSON提取逻辑:找匹配的大括号
  138. brace_count = 0
  139. json_end = -1
  140. for i in range(json_start, len(content)):
  141. if content[i] == '{':
  142. brace_count += 1
  143. elif content[i] == '}':
  144. brace_count -= 1
  145. if brace_count == 0:
  146. json_end = i + 1
  147. break
  148. if json_end != -1:
  149. return content[json_start:json_end]
  150. return ""
  151. except Exception as e:
  152. return f"Error reading tool params: {str(e)}"
  153. if __name__ == "__main__":
  154. result = default_call_hot_tool(rankDate = '2025-12-06')
  155. print(result)