選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

tool.py 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import json
  2. import os
  3. from chatgpt_tool_hub.apps import load_app
  4. from chatgpt_tool_hub.apps.app import App
  5. import plugins
  6. from bridge.context import ContextType
  7. from bridge.reply import Reply, ReplyType
  8. from common.log import logger
  9. from config import conf
  10. from plugins import *
  11. @plugins.register(name="tool", desc="Arming your ChatGPT bot with various tools", version="0.1", author="goldfishh", desire_priority=0)
  12. class Tool(Plugin):
  13. def __init__(self):
  14. super().__init__()
  15. self.handlers[Event.ON_HANDLE_CONTEXT] = self.on_handle_context
  16. os.environ["OPENAI_API_KEY"] = conf().get("open_ai_api_key", "")
  17. os.environ["PROXY"] = conf().get("proxy", "")
  18. self.app = self._reset_app()
  19. logger.info("[tool] inited")
  20. def get_help_text(self, **kwargs):
  21. help_text = "这是一个能让chatgpt联网,搜索,数字运算的插件,将赋予强大且丰富的扩展能力"
  22. return help_text
  23. def on_handle_context(self, e_context: EventContext):
  24. if e_context['context'].type != ContextType.TEXT:
  25. return
  26. content = e_context['context'].content
  27. content_list = e_context['context'].content.split(maxsplit=1)
  28. if not content or len(content_list) < 1:
  29. e_context.action = EventAction.CONTINUE
  30. return
  31. logger.debug("[tool] on_handle_context. content: %s" % content)
  32. reply = Reply()
  33. reply.type = ReplyType.TEXT
  34. # todo: 有些工具必须要api-key,需要修改config文件,所以这里没有实现query增删tool的功能
  35. if content.startswith("$tool"):
  36. if len(content_list) == 1:
  37. logger.debug("[tool]: get help")
  38. reply.content = self.get_help_text()
  39. e_context['reply'] = reply
  40. e_context.action = EventAction.BREAK_PASS
  41. return
  42. elif len(content_list) > 1:
  43. if content_list[1].strip() == "reset":
  44. logger.debug("[tool]: reset config")
  45. self._reset_app()
  46. reply.content = "重置工具成功"
  47. e_context['reply'] = reply
  48. e_context.action = EventAction.BREAK_PASS
  49. return
  50. elif content_list[1].startswith("reset"):
  51. logger.debug("[tool]: remind")
  52. reply.content = "你随机挑一个方式,提醒用户如果想重置tool插件,reset之后不要加任何字符"
  53. e_context['reply'] = reply
  54. e_context.action = EventAction.BREAK
  55. return
  56. logger.debug("[tool]: just-go")
  57. # chatgpt-tool-hub will reply you with many tools
  58. # todo: I don't know how to pass someone session into this ask method yet
  59. reply.content = self.app.ask(content_list[1])
  60. e_context['reply'] = reply
  61. e_context.action = EventAction.BREAK_PASS
  62. return
  63. def _read_json(self) -> dict:
  64. curdir = os.path.dirname(__file__)
  65. config_path = os.path.join(curdir, "config.json")
  66. tool_config = {
  67. "tools": [],
  68. "kwargs": {}
  69. }
  70. if not os.path.exists(config_path):
  71. return tool_config
  72. else:
  73. with open(config_path, "r") as f:
  74. tool_config = json.load(f)
  75. return tool_config
  76. def _reset_app(self) -> App:
  77. tool_config = self._read_json()
  78. return load_app(tools_list=tool_config.get("tools"), **tool_config.get("kwargs"))