tools_library.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. '''
  2. 工具库模块,提供工具库中的工具调用、保存新的待接入工具的信息
  3. 分为两个函数:
  4. 1. 调用工具库中的工具
  5. curl --location 'http://47.84.182.56:8001/tools/call/wechat_search_article' \
  6. --header 'Content-Type: application/json' \
  7. --data '{
  8. "keyword": "英雄联盟"
  9. }'
  10. 其中的data和wechat_search_article是函数的入参,把工具名替换到wechat_search_article,把参数字典替换到data
  11. 2. 保存新的待接入工具的信息
  12. 入参为工具信息,是一个工具的文档字符串
  13. 目前默认将这个文档字符串保存到一个文件中,文件名默认是工具的名称
  14. '''
  15. import requests
  16. import os
  17. import json
  18. TOOL_SERVER_URL = "http://47.84.182.56:8001/tools/call"
  19. def call_tool(tool_name: str, arguments: dict):
  20. """
  21. 调用工具库中的工具
  22. :param tool_name: 工具名称
  23. :param arguments: 工具参数字典
  24. :return: 工具调用结果
  25. """
  26. url = f"{TOOL_SERVER_URL}/{tool_name}"
  27. headers = {
  28. 'Content-Type': 'application/json'
  29. }
  30. try:
  31. response = requests.post(url, headers=headers, json=arguments)
  32. response.raise_for_status()
  33. return response.json()
  34. except requests.RequestException as e:
  35. # 在实际生产中可能需要更复杂的错误处理或日志记录
  36. return {"error": f"Failed to call tool {tool_name}: {str(e)}"}
  37. def save_tool_info(tool_name: str, tool_doc: str):
  38. """
  39. 保存新的待接入工具的信息
  40. :param tool_name: 工具名称
  41. :param tool_doc: 工具文档字符串
  42. :return: 保存的文件路径
  43. """
  44. # 获取当前文件所在目录
  45. current_dir = os.path.dirname(os.path.abspath(__file__))
  46. # 创建 tool_infos 目录(如果不存在)
  47. save_dir = os.path.join(current_dir, 'tool_infos')
  48. if not os.path.exists(save_dir):
  49. os.makedirs(save_dir)
  50. '''
  51. 工具库模块,提供工具库中的工具调用、保存新的待接入工具的信息
  52. 分为两个函数:
  53. 1. 调用工具库中的工具
  54. curl --location 'http://47.84.182.56:8001/tools/call/wechat_search_article' \
  55. --header 'Content-Type: application/json' \
  56. --data '{
  57. "keyword": "英雄联盟"
  58. }'
  59. 其中的data和wechat_search_article是函数的入参,把工具名替换到wechat_search_article,把参数字典替换到data
  60. 2. 保存新的待接入工具的信息
  61. 入参为工具信息,是一个工具的文档字符串
  62. 目前默认将这个文档字符串保存到一个文件中,文件名默认是工具的名称
  63. '''
  64. import requests
  65. import os
  66. import json
  67. TOOL_SERVER_URL = "http://47.84.182.56:8001/tools/call"
  68. def call_tool(tool_name: str, arguments: dict):
  69. """
  70. 调用工具库中的工具
  71. :param tool_name: 工具名称
  72. :param arguments: 工具参数字典
  73. :return: 工具调用结果
  74. """
  75. url = f"{TOOL_SERVER_URL}/{tool_name}"
  76. headers = {
  77. 'Content-Type': 'application/json'
  78. }
  79. try:
  80. response = requests.post(url, headers=headers, json=arguments)
  81. response.raise_for_status()
  82. return response.json()
  83. except requests.RequestException as e:
  84. # 在实际生产中可能需要更复杂的错误处理或日志记录
  85. return {"error": f"Failed to call tool {tool_name}: {str(e)}"}
  86. def save_tool_info(tool_name: str, tool_doc: str):
  87. """
  88. 保存新的待接入工具的信息
  89. :param tool_name: 工具名称
  90. :param tool_doc: 工具文档字符串
  91. :return: 保存的文件路径
  92. """
  93. # 获取当前文件所在目录
  94. current_dir = os.path.dirname(os.path.abspath(__file__))
  95. # 创建 tool_infos 目录(如果不存在)
  96. save_dir = os.path.join(current_dir, 'tool_infos')
  97. if not os.path.exists(save_dir):
  98. os.makedirs(save_dir)
  99. file_path = os.path.join(save_dir, f"{tool_name}.txt")
  100. try:
  101. with open(file_path, 'w', encoding='utf-8') as f:
  102. f.write(tool_doc)
  103. return file_path
  104. except IOError as e:
  105. return f"Error saving tool info: {str(e)}"
  106. def get_all_tool_infos() -> str:
  107. """
  108. 获取所有已保存工具的信息
  109. :return: 所有工具信息的拼接字符串
  110. """
  111. current_dir = os.path.dirname(os.path.abspath(__file__))
  112. save_dir = os.path.join(current_dir, 'tool_infos')
  113. if not os.path.exists(save_dir):
  114. return ""
  115. tool_infos = []
  116. try:
  117. for filename in os.listdir(save_dir):
  118. if filename.endswith(".txt"):
  119. file_path = os.path.join(save_dir, filename)
  120. with open(file_path, 'r', encoding='utf-8') as f:
  121. content = f.read().strip()
  122. tool_infos.append(f"--- Tool: {filename[:-4]} ---\n{content}\n")
  123. except Exception as e:
  124. return f"Error reading tool infos: {str(e)}"
  125. return "\n".join(tool_infos)
  126. def get_tool_info(tool_name: str) -> str:
  127. """
  128. 获取指定工具的信息
  129. :param tool_name: 工具名称
  130. :return: 工具信息文本,如果不存在返回空字符串
  131. """
  132. current_dir = os.path.dirname(os.path.abspath(__file__))
  133. save_dir = os.path.join(current_dir, 'tool_infos')
  134. if not os.path.exists(save_dir):
  135. return ""
  136. file_path = os.path.join(save_dir, f"{tool_name}.txt")
  137. if not os.path.exists(file_path):
  138. return ""
  139. try:
  140. with open(file_path, 'r', encoding='utf-8') as f:
  141. return f.read().strip()
  142. except Exception as e:
  143. return f"Error reading tool info: {str(e)}"