From 2cf71dd6f2fd9f55650efc99ba92d2d928072883 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?goldfish=E8=8F=8C?= Date: Wed, 5 Apr 2023 13:00:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84tool=E6=96=87=E6=A1=A3=20&=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0tool=E8=BF=87=E6=BB=A4=E3=80=81tool=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E6=9E=84=E5=BB=BA=20(#751)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/tool/README.md | 22 ++++++++++++++++----- plugins/tool/tool.py | 45 +++++++++++++++++++++++++++++++++++------- 2 files changed, 55 insertions(+), 12 deletions(-) diff --git a/plugins/tool/README.md b/plugins/tool/README.md index 19763b3..311ea69 100644 --- a/plugins/tool/README.md +++ b/plugins/tool/README.md @@ -29,14 +29,22 @@ ### 2. 使用搜索引擎工具 - 如果有搜索工具就能让chatgpt获取到你的未传达清楚的上下文信息,比如chatgpt不知道你的地理位置,现在时间等,所以无法查询到天气 - ## 其他工具 -###### 除上述以外还有其他工具,比如搜索联网、数学运算、新闻需要获取api-key, -###### 由于这些工具使用方法暂时还在整理中,如果你不熟悉请不要尝试使用这些工具 -#### [申请方法](https://github.com/goldfishh/chatgpt-tool-hub/blob/master/docs/apply_optional_tool.md) ### 5. wikipedia ###### 可以回答你想要知道确切的人事物 + +### 6. news * +###### 从全球 80,000 多个信息源中获取当前和历史新闻文章 + +### 7. bing-search * +###### bing搜索引擎,从此你不用再烦恼搜索要用哪些关键词 + +### 8. wolfram-alpha * +###### 知识搜索引擎、科学问答系统,常用于专业学科计算 + +###### 注1:带*工具需要获取api-key才能使用,部分工具需要外网支持 +#### [申请方法](https://github.com/goldfishh/chatgpt-tool-hub/blob/master/docs/apply_optional_tool.md) ## config.json 配置说明 ###### 默认工具无需配置,其它工具需手动配置,一个例子: @@ -52,9 +60,13 @@ ``` 注:config.json文件非必须,未创建仍可使用本tool - `tools`:本插件初始化时加载的工具, 目前可选集:["wikipedia", "wolfram-alpha", "bing-search", "google-search", "news"],其中后4个工具需要申请服务api -- `kwargs`:工具执行时的配置,一般在这里存放api-key,或环境配置,no_default用于配置是否默认使用4个工具,如果为false则仅使用tools列表工具 +- `kwargs`:工具执行时的配置,一般在这里存放api-key,或环境配置 + - `no_default`: 用于配置默认加载4个工具的行为,如果为true则仅使用tools列表工具,不加载默认工具 + - `top_k_results`: 控制所有有关搜索的工具返回条目数,数字越高则参考信息越多,但无用信息可能干扰判断,该值一般为2 + - `model_name`: 用于控制tool插件底层使用的llm模型,目前暂未测试3.5以外的模型,一般保持默认 ## 备注 +- 强烈建议申请搜索工具搭配使用,推荐bing-search - 虽然我会有意加入一些限制,但请不要使用本插件做危害他人的事情,请提前了解清楚某些内容是否会违反相关规定,建议提前做好过滤 - 未来一段时间我会实现一些有意思的工具,比如stable diffusion 中文prompt翻译、cv方向的模型推理,欢迎有想法的朋友关注,一起扩展这个项目 diff --git a/plugins/tool/tool.py b/plugins/tool/tool.py index 4f0fc17..a156961 100644 --- a/plugins/tool/tool.py +++ b/plugins/tool/tool.py @@ -3,7 +3,7 @@ import os from chatgpt_tool_hub.apps import load_app from chatgpt_tool_hub.apps.app import App - +from chatgpt_tool_hub.tools.all_tool_list import get_all_tool_names import plugins from bridge.bridge import Bridge from bridge.context import ContextType @@ -19,8 +19,6 @@ class Tool(Plugin): def __init__(self): super().__init__() self.handlers[Event.ON_HANDLE_CONTEXT] = self.on_handle_context - os.environ["OPENAI_API_KEY"] = conf().get("open_ai_api_key", "") - os.environ["PROXY"] = conf().get("proxy", "") self.app = self._reset_app() @@ -117,9 +115,42 @@ class Tool(Plugin): tool_config = json.load(f) return tool_config + def _build_tool_kwargs(self, kwargs: dict): + tool_model_name = kwargs.get("model_name") + + return { + "openai_api_key": conf().get("open_ai_api_key", ""), + "proxy": conf().get("proxy", ""), + # note: 目前tool暂未对其他模型测试,但这里仍对配置来源做了优先级区分,一般插件配置可覆盖全局配置 + "model_name": tool_model_name if tool_model_name else conf().get("model", "gpt-3.5-turbo"), + "no_default": kwargs.get("no_default", False), + "top_k_results": kwargs.get("top_k_results", 2), + # for news tool + "news_api_key": kwargs.get("news_api_key", ""), + # for bing-search tool + "bing_subscription_key": kwargs.get("bing_subscription_key", ""), + # for google-search tool + "google_api_key": kwargs.get("google_api_key", ""), + "google_cse_id": kwargs.get("google_cse_id", ""), + # for searxng-search tool + "searx_host": kwargs.get("searx_host", ""), + # for wolfram-alpha tool + "wolfram_alpha_appid": kwargs.get("wolfram_alpha_appid", ""), + } + + def _filter_tool_list(self, tool_list: list): + valid_list = [] + for tool in tool_list: + if tool in get_all_tool_names(): + valid_list.append(tool) + else: + logger.warning("[tool] filter invalid tool: " + repr(tool)) + return valid_list + def _reset_app(self) -> App: tool_config = self._read_json() - kwargs = tool_config.get("kwargs", {}) - if kwargs.get("model_name", "") == "": - kwargs["model_name"] = conf().get("model", "gpt-3.5-turbo") - return load_app(tools_list=tool_config.get("tools"), **tool_config.get("kwargs")) + + # filter not support tool + tool_list = self._filter_tool_list(tool_config.get("tools", [])) + + return load_app(tools_list=tool_list, **self._build_tool_kwargs(tool_config.get("kwargs", {})))