diff --git a/.env.template b/.env.template index a972797..3f31e17 100644 --- a/.env.template +++ b/.env.template @@ -3,5 +3,4 @@ LLM_API_BASE_URL= MODEL_NAME= THINK_DEPTH= REQUEST_TIMEOUT= -PROXY=http://192.168.7.1:7890 DEBUG= diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..507e2f8 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.ipynb filter=strip-notebook-output \ No newline at end of file diff --git a/.gitignore b/.gitignore index d6f8367..35e6b19 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ **/dev/ +**/__pycache__/ *.tar.gz *.whl @@ -7,12 +8,13 @@ build/ *.egg-info/ dist/ log/ -**/.DS_Store .idea/ +.vscode/ *.pyc **.log .env +.DS_Store config.json # dev diff --git a/chatgpt_tool_hub/apps/app_factory.py b/chatgpt_tool_hub/apps/app_factory.py index 342d5d9..12b6a82 100644 --- a/chatgpt_tool_hub/apps/app_factory.py +++ b/chatgpt_tool_hub/apps/app_factory.py @@ -11,7 +11,7 @@ class AppFactory: - def __init__(self, console=Console()): + def __init__(self, console=Console(quiet=True)): self.default_tools_list = [] self.console = console @@ -20,16 +20,16 @@ def init_env(self, **kwargs): # set log level use_log = get_from_dict_or_env(kwargs, "log", "LOG", True) debug_flag = get_from_dict_or_env(kwargs, "debug", "DEBUG", False) - if not str(use_log).lower() in TRUE_VALUES_SET: + if str(use_log).lower() == "false": refresh(logging.CRITICAL) - elif str(debug_flag).lower() in TRUE_VALUES_SET: + elif str(debug_flag).lower() == "true": refresh(logging.DEBUG) else: refresh(logging.INFO) # default tools no_default_flag = get_from_dict_or_env(kwargs, "no_default", "NO_DEFAULT", False) - if str(no_default_flag).lower() in TRUE_VALUES_SET: + if str(no_default_flag).lower() == "true": self.default_tools_list = [] else: from ..tools.python.tool import default_tool_name as python_tool_name @@ -38,16 +38,10 @@ def init_env(self, **kwargs): from ..tools.meteo.tool import default_tool_name as meteo_name self.default_tools_list = [python_tool_name, terminal_tool_name, get_tool_name, meteo_name] - # set proxy - # _proxy = get_from_dict_or_env(kwargs, "proxy", "PROXY", "") - # if not _proxy: - # os.environ["http_proxy"] = str(_proxy) - # os.environ["https_proxy"] = str(_proxy) - # dynamic loading tool - dynamic_tool_loader() + dynamic_tool_loader(**kwargs) - def create_app(self, app_type: str = 'victorinox', tools_list: list = None, console=Console(quiet=True), **kwargs) -> App: + def create_app(self, app_type: str = 'victorinox', tools_list: list = None, **kwargs) -> App: tools_list = tools_list if tools_list else [] # todo remove it @@ -71,11 +65,11 @@ def create_app(self, app_type: str = 'victorinox', tools_list: list = None, cons if default_tool not in tools_list: tools_list.append(default_tool) - from ..tools.all_tool_list import main_tool_register + from ..tools.tool_register import main_tool_register if "browser" in main_tool_register.get_registered_tool_names(): tools_list = ["browser" if tool == "url-get" else tool for tool in tools_list] - app = Victorinox(console, **build_model_params(kwargs)) + app = Victorinox(self.console, **build_model_params(kwargs)) app.create(tools_list, **kwargs) return app else: diff --git a/chatgpt_tool_hub/apps/victorinox.py b/chatgpt_tool_hub/apps/victorinox.py index d8d3695..997c81d 100644 --- a/chatgpt_tool_hub/apps/victorinox.py +++ b/chatgpt_tool_hub/apps/victorinox.py @@ -11,7 +11,7 @@ from ..engine.initialize import init_tool_engine as init_engine from ..models import MEMORY_MAX_TOKENS_NUM from ..models.model_factory import ModelFactory -from ..tools.all_tool_list import main_tool_register +from ..tools.tool_register import main_tool_register from ..tools.base_tool import BaseTool from ..tools.load_tools import load_tools @@ -24,7 +24,7 @@ def __init__(self, console=Console(), **app_kwargs): self.memory = ConversationTokenBufferMemory(llm=self.llm, memory_key="chat_history", output_key='output', max_token_limit=MEMORY_MAX_TOKENS_NUM) - self.think_depth = get_from_dict_or_env(app_kwargs, "think_depth", "THINK_DEPTH", 3) + self.think_depth = get_from_dict_or_env(app_kwargs, "think_depth", "THINK_DEPTH", 2) self.console = console diff --git a/chatgpt_tool_hub/bots/chat_bot/base.py b/chatgpt_tool_hub/bots/chat_bot/base.py index c029ada..2d28b6c 100644 --- a/chatgpt_tool_hub/bots/chat_bot/base.py +++ b/chatgpt_tool_hub/bots/chat_bot/base.py @@ -166,13 +166,13 @@ def _extract_tool_and_input(self, llm_output: str) -> Optional[Tuple[str, str]]: except Exception as e: LOG.error(f"Error: {repr(e)}") - if action.lower() == "answer-user" and action_input in ['', '空', '无']: + if str(action).lower() == "answer-user" and action_input in ['', '空', '无']: action_input = llm_reply_json.get('thoughts', {}).get('speak', '') - if action.lower() not in self.allowed_tools: + if str(action).lower() not in self.allowed_tools: return "answer-user", action_input - if self.console and action.lower() != "answer-user": + if self.console and str(action).lower() != "answer-user": self.console.print(f"√ 我在用 [bold cyan]{action}[/] 工具...") LOG.info(f"执行Tool: {action}中...") diff --git a/chatgpt_tool_hub/engine/bot.py b/chatgpt_tool_hub/engine/bot.py index aec8b6c..d9cd95d 100644 --- a/chatgpt_tool_hub/engine/bot.py +++ b/chatgpt_tool_hub/engine/bot.py @@ -249,7 +249,7 @@ def return_stopped_response( if action: return ( BotFinish({"output": action_input}, full_output) - if action.lower() in ['answer-user'] + if str(action).lower() in ['answer-user'] else BotFinish({"output": "受think_depth限制,系统强制终止了LLM-OS"}, full_output) ) else: diff --git a/chatgpt_tool_hub/models/model_factory.py b/chatgpt_tool_hub/models/model_factory.py index 6a6fee7..649599b 100644 --- a/chatgpt_tool_hub/models/model_factory.py +++ b/chatgpt_tool_hub/models/model_factory.py @@ -30,7 +30,7 @@ def match_model(self, name: str) -> str: def create_llm_model(self, **llm_model_kwargs): _model = get_from_dict_or_env(llm_model_kwargs, "model_name", "MODEL_NAME", DEFAULT_MODEL_NAME) match_llm_model = self.match_model(_model) - if match_llm_model == "chatgpt": + if True or match_llm_model == "chatgpt": return ChatOpenAI(**llm_model_kwargs) else: raise NotImplementedError("implement me!") diff --git a/chatgpt_tool_hub/tools/__init__.py b/chatgpt_tool_hub/tools/__init__.py index 8dff508..8f959cc 100644 --- a/chatgpt_tool_hub/tools/__init__.py +++ b/chatgpt_tool_hub/tools/__init__.py @@ -13,7 +13,7 @@ def get_packages(path): return packages -def dynamic_tool_loader(): +def dynamic_tool_loader(**kwargs): try: all_tool_package_list = get_packages(f"{os.path.dirname(os.path.abspath(__file__))}") except Exception as e: @@ -26,20 +26,26 @@ def dynamic_tool_loader(): import importlib importlib.import_module(f".tools.{package_name}", package="chatgpt_tool_hub") except Exception as e: - LOG.info(f"[{package_name}] init failed, error_info: {repr(e)}") + LOG.debug(f"import [{package_name}] failed, error_info: {repr(e)}") + + from .tool_register import main_tool_register + registered_tool = main_tool_register.get_registered_tool() + invalid_tool_list = [] + for name, (func, _) in registered_tool.items(): + try: + _ = func(**kwargs) + except Exception as e: + invalid_tool_list.append(name) + LOG.info(f"[{name}] initialization failed, error_info: {repr(e)}") + for tool in invalid_tool_list: + main_tool_register.unregister_tool(tool) from .base_tool import BaseTool -from .python import PythonTool -from .web_requests import BrowserTool from .summary import SummaryTool -from .terminal import TerminalTool __all__ = [ "BaseTool", "SummaryTool", - "PythonTool", - "TerminalTool", - "BrowserTool", "ToolRegister", diff --git a/chatgpt_tool_hub/tools/all_tool_list.py b/chatgpt_tool_hub/tools/all_tool_list.py deleted file mode 100644 index f3847c7..0000000 --- a/chatgpt_tool_hub/tools/all_tool_list.py +++ /dev/null @@ -1,10 +0,0 @@ -from typing import List - -from .tool_register import ToolRegister - -main_tool_register = ToolRegister() - -# used by chatgpt-on-wechat now , don't move it -def get_all_tool_names() -> List[str]: - """Get a list of all possible tool names.""" - return main_tool_register.get_registered_tool_names() diff --git a/chatgpt_tool_hub/tools/arxiv_search/tool.py b/chatgpt_tool_hub/tools/arxiv_search/tool.py index 0b40877..791b664 100644 --- a/chatgpt_tool_hub/tools/arxiv_search/tool.py +++ b/chatgpt_tool_hub/tools/arxiv_search/tool.py @@ -7,7 +7,7 @@ from ...models import build_model_params from ...models.model_factory import ModelFactory from ...prompts import PromptTemplate -from ..all_tool_list import main_tool_register +from ..tool_register import main_tool_register from .api_prompt import ARXIV_PROMPT from .wrapper import ArxivAPIWrapper from .. import BaseTool diff --git a/chatgpt_tool_hub/tools/bing_search/tool.py b/chatgpt_tool_hub/tools/bing_search/tool.py index cab0387..633cf24 100644 --- a/chatgpt_tool_hub/tools/bing_search/tool.py +++ b/chatgpt_tool_hub/tools/bing_search/tool.py @@ -7,7 +7,7 @@ from ...models.model_factory import ModelFactory from ...common.utils import get_from_dict_or_env -from ..all_tool_list import main_tool_register +from ..tool_register import main_tool_register from .. import BaseTool from .wrapper import BingSearchAPIWrapper from .prompt import QUERY_PROMPT diff --git a/chatgpt_tool_hub/tools/email/tool.py b/chatgpt_tool_hub/tools/email/tool.py index 11c2528..8546303 100644 --- a/chatgpt_tool_hub/tools/email/tool.py +++ b/chatgpt_tool_hub/tools/email/tool.py @@ -14,7 +14,7 @@ from ...models.model_factory import ModelFactory from ...common.utils import get_from_dict_or_env -from ..all_tool_list import main_tool_register +from ..tool_register import main_tool_register from .. import BaseTool from .prompt import QUERY_PROMPT diff --git a/chatgpt_tool_hub/tools/google_search/tool.py b/chatgpt_tool_hub/tools/google_search/tool.py index 9b70a37..6a380ba 100644 --- a/chatgpt_tool_hub/tools/google_search/tool.py +++ b/chatgpt_tool_hub/tools/google_search/tool.py @@ -9,7 +9,7 @@ from ...common.utils import get_from_dict_or_env from ...common.log import LOG from .. import BaseTool -from ..all_tool_list import main_tool_register +from ..tool_register import main_tool_register from .wrapper import GoogleSearchAPIWrapper from .prompt import QUERY_PROMPT diff --git a/chatgpt_tool_hub/tools/hello_tool/tool.py b/chatgpt_tool_hub/tools/hello_tool/tool.py index a46793d..d594d39 100644 --- a/chatgpt_tool_hub/tools/hello_tool/tool.py +++ b/chatgpt_tool_hub/tools/hello_tool/tool.py @@ -3,7 +3,7 @@ from rich.console import Console from .. import BaseTool -from ..all_tool_list import main_tool_register +from ..tool_register import main_tool_register default_tool_name = "hello-tool" diff --git a/chatgpt_tool_hub/tools/load_tools.py b/chatgpt_tool_hub/tools/load_tools.py index 73d1040..cc7e19f 100644 --- a/chatgpt_tool_hub/tools/load_tools.py +++ b/chatgpt_tool_hub/tools/load_tools.py @@ -5,7 +5,6 @@ from ..common.callbacks import BaseCallbackManager from ..common.log import LOG -from ..common.utils import get_from_dict_or_env from . import BaseTool, ToolRegister from rich.console import Console diff --git a/chatgpt_tool_hub/tools/meteo/tool.py b/chatgpt_tool_hub/tools/meteo/tool.py index 6085543..be74136 100644 --- a/chatgpt_tool_hub/tools/meteo/tool.py +++ b/chatgpt_tool_hub/tools/meteo/tool.py @@ -5,7 +5,7 @@ from ...chains.api import APIChain from ...models import build_model_params from ...models.model_factory import ModelFactory -from ..all_tool_list import main_tool_register +from ..tool_register import main_tool_register from .. import BaseTool from .docs_prompt import OPEN_METEO_DOCS diff --git a/chatgpt_tool_hub/tools/news/__init__.py b/chatgpt_tool_hub/tools/news/__init__.py index 6cec42f..4652375 100644 --- a/chatgpt_tool_hub/tools/news/__init__.py +++ b/chatgpt_tool_hub/tools/news/__init__.py @@ -6,7 +6,7 @@ from .. import ToolRegister # news_tool_register = ToolRegister() -from ..all_tool_list import main_tool_register as news_tool_register +from ..tool_register import main_tool_register as news_tool_register try: all_tool_package_list = get_packages(f"{os.path.dirname(os.path.abspath(__file__))}") diff --git a/chatgpt_tool_hub/tools/news/tool.py b/chatgpt_tool_hub/tools/news/tool.py index 85cbc47..b77a37d 100644 --- a/chatgpt_tool_hub/tools/news/tool.py +++ b/chatgpt_tool_hub/tools/news/tool.py @@ -6,7 +6,7 @@ from ...engine.initialize import init_tool_engine from ...models import build_model_params from ...models.model_factory import ModelFactory -from ..all_tool_list import main_tool_register +from ..tool_register import main_tool_register from .. import BaseTool from ..load_tools import load_tools from . import news_tool_register diff --git a/chatgpt_tool_hub/tools/python/tool.py b/chatgpt_tool_hub/tools/python/tool.py index 92f3581..bfd13d1 100644 --- a/chatgpt_tool_hub/tools/python/tool.py +++ b/chatgpt_tool_hub/tools/python/tool.py @@ -15,7 +15,7 @@ from ...common.utils import get_from_dict_or_env from .. import BaseTool -from ..all_tool_list import main_tool_register +from ..tool_register import main_tool_register from .prompt import QUERY_PROMPT default_tool_name = "python" diff --git a/chatgpt_tool_hub/tools/searxng_search/tool.py b/chatgpt_tool_hub/tools/searxng_search/tool.py index f020602..beb3fa5 100644 --- a/chatgpt_tool_hub/tools/searxng_search/tool.py +++ b/chatgpt_tool_hub/tools/searxng_search/tool.py @@ -9,7 +9,7 @@ from ...common.utils import get_from_dict_or_env from ...common.log import LOG from .. import BaseTool -from ..all_tool_list import main_tool_register +from ..tool_register import main_tool_register from .wrapper import SearxSearchWrapper from .prompt import QUERY_PROMPT diff --git a/chatgpt_tool_hub/tools/searxng_search/wrapper.py b/chatgpt_tool_hub/tools/searxng_search/wrapper.py index 594c2ae..69af252 100644 --- a/chatgpt_tool_hub/tools/searxng_search/wrapper.py +++ b/chatgpt_tool_hub/tools/searxng_search/wrapper.py @@ -6,7 +6,7 @@ ----------- In order to use this utility you need to provide the searx host. This can be done -by passing the named parameter :attr:`searx_search_host ` +by passing the named parameter :attr:`searxng_search_host ` or exporting the environment variable SEARX_SEARCH_HOST. 1. https://docs.searxng.org/admin/installation-searxng.html#installation-basic @@ -81,7 +81,7 @@ class SearxSearchWrapper(BaseModel): """Wrapper for Searx API. To use you need to provide the searx host by passing the named parameter - ``searx_search_host`` or exporting the environment variable ``SEARX_SEARCH_HOST``. + ``searxng_search_host`` or exporting the environment variable ``SEARX_SEARCH_HOST``. In some situations you might want to disable SSL verification, for example if you are running searx locally. You can do this by passing the named parameter @@ -91,7 +91,7 @@ class SearxSearchWrapper(BaseModel): .. code-block:: python from chatgpt-tool-hub.tools.searxng_search.wrapper import SearxSearchWrapper - searx = SearxSearchWrapper(searx_search_host="http://localhost:8888") + searx = SearxSearchWrapper(searxng_search_host="http://localhost:8888") Example with SSL disabled: .. code-block:: python @@ -99,22 +99,22 @@ class SearxSearchWrapper(BaseModel): from chatgpt-tool-hub.tools.searxng_search.wrapper import SearxSearchWrapper # note the unsecure parameter is not needed if you pass the url scheme as # http - searx = SearxSearchWrapper(searx_search_host="http://localhost:8888", + searx = SearxSearchWrapper(searxng_search_host="http://localhost:8888", unsecure=True) """ _result: SearxResults = PrivateAttr() - searx_search_host: Optional[str] = None - searx_search_output_type: OutputType = OutputType.Text + searxng_search_host: Optional[str] = None + searxng_search_output_type: OutputType = OutputType.Text unsecure: bool = False params: dict = Field(default_factory=_get_default_params) headers: Optional[dict] = dict() engines: Optional[List[str]] = [] categories: Optional[List[str]] = [] query_suffix: Optional[str] = "" - searx_search_top_k_results: int = 2 + searxng_search_top_k_results: int = 2 aiosession: Optional[Any] = None @field_validator("unsecure") @@ -140,24 +140,24 @@ def validate_params(cls, values: Dict) -> Dict: if categories := values.get("categories"): values["params"]["categories"] = ",".join(categories) - searx_search_host = get_from_dict_or_env(values, "searx_search_host", "SEARX_SEARCH_HOST") - if not searx_search_host.startswith("http"): + searxng_search_host = get_from_dict_or_env(values, "searxng_search_host", "SEARXNG_SEARCH_HOST") + if not searxng_search_host.startswith("http"): print( f"Warning: missing the url scheme on host \ - ! assuming secure https://{searx_search_host} " + ! assuming secure https://{searxng_search_host} " ) - searx_search_host = f"https://{searx_search_host}" - elif searx_search_host.startswith("http://"): + searxng_search_host = f"https://{searxng_search_host}" + elif searxng_search_host.startswith("http://"): values["unsecure"] = True cls.disable_ssl_warnings(True) - values["searx_search_host"] = searx_search_host + values["searxng_search_host"] = searxng_search_host - values["searx_search_top_k_results"] = get_from_dict_or_env( - values, 'searx_search_top_k_results', "SEARX_SEARCH_TOP_K_RESULTS", 2 + values["searxng_search_top_k_results"] = get_from_dict_or_env( + values, 'searxng_search_top_k_results', "SEARXNG_SEARCH_TOP_K_RESULTS", 2 ) - values["searx_search_output_type"] = get_from_dict_or_env( - values, 'searx_search_output_type', "SEARX_SEARCH_OUTPUT_TYPE", OutputType.Text + values["searxng_search_output_type"] = get_from_dict_or_env( + values, 'searxng_search_output_type', "SEARXNG_SEARCH_OUTPUT_TYPE", OutputType.Text ) return values @@ -170,7 +170,7 @@ class Config: def _searx_api_query(self, params: dict) -> SearxResults: """Actual request to searx API.""" requests_wrapper = RequestsWrapper(headers=self.headers, proxy="") - raw_result = requests_wrapper.get(self.searx_search_host, params=params, + raw_result = requests_wrapper.get(self.searxng_search_host, params=params, raise_for_status=True, verify=not self.unsecure) # test if http result is ok res = SearxResults(raw_result) @@ -181,7 +181,7 @@ async def _asearx_api_query(self, params: dict) -> SearxResults: if not self.aiosession: async with aiohttp.ClientSession() as session: async with session.get( - self.searx_search_host, + self.searxng_search_host, headers=self.headers, params=params, ssl=(lambda: False if self.unsecure else None)(), @@ -192,7 +192,7 @@ async def _asearx_api_query(self, params: dict) -> SearxResults: self._result = result else: async with self.aiosession.get( - self.searx_search_host, + self.searxng_search_host, headers=self.headers, params=params, verify=not self.unsecure, @@ -236,14 +236,14 @@ def run( .. code-block:: python from chatgpt-tool-hub.tools.searxng_search.wrapper import SearxSearchWrapper - searx = SearxSearchWrapper(searx_search_host="http://my.searx.host") + searx = SearxSearchWrapper(searxng_search_host="http://my.searx.host") searx.run("what is the weather in France ?", engine="qwant") # the same result can be achieved using the `!` syntax of searx # to select the engine using `query_suffix` searx.run("what is the weather in France ?", query_suffix="!qwant") """ - if self.searx_search_output_type == OutputType.JSON: + if self.searxng_search_output_type == OutputType.JSON: return self.to_json(query, engines, categories, query_suffix, **kwargs) _params = { "q": query, @@ -270,7 +270,7 @@ def run( LOG.debug(f"[searxng-search] output: {res.results}") _contents = [] - for idx, result in enumerate(res.results[: self.searx_search_top_k_results]): + for idx, result in enumerate(res.results[: self.searxng_search_top_k_results]): _header = f"《{filter_text(result.get('title', ''))}》" _body = f"{filter_text(result.get('content', ''))}" _link = f"{result.get('url', '')}" @@ -309,7 +309,7 @@ async def arun( elif len(res.results) > 0: return "\n\n".join( - [r.get("content", "") for r in res.results[: self.searx_search_top_k_results]] + [r.get("content", "") for r in res.results[: self.searxng_search_top_k_results]] ) else: return "No good search result found" diff --git a/chatgpt_tool_hub/tools/sms/tool.py b/chatgpt_tool_hub/tools/sms/tool.py index 3257627..1b3e86b 100644 --- a/chatgpt_tool_hub/tools/sms/tool.py +++ b/chatgpt_tool_hub/tools/sms/tool.py @@ -11,7 +11,7 @@ from ...models.model_factory import ModelFactory from ...common.utils import get_from_dict_or_env -from ..all_tool_list import main_tool_register +from ..tool_register import main_tool_register from .. import BaseTool from .prompt import QUERY_PROMPT diff --git a/chatgpt_tool_hub/tools/stt_tts/stt.py b/chatgpt_tool_hub/tools/stt_tts/stt.py index 6949bc8..78a1bf0 100644 --- a/chatgpt_tool_hub/tools/stt_tts/stt.py +++ b/chatgpt_tool_hub/tools/stt_tts/stt.py @@ -10,7 +10,7 @@ from ...common.log import LOG from ...common.utils import get_from_dict_or_env from ...models import build_model_params -from ..all_tool_list import main_tool_register +from ..tool_register import main_tool_register from .. import BaseTool default_tool_name = "stt" @@ -21,9 +21,9 @@ class STTTool(BaseTool): "" ) - api_key: Optional[str] - api_region: Optional[str] - speech_config: Optional[speechsdk.SpeechConfig] + api_key: Optional[str] = None + api_region: Optional[str] = None + speech_config: Optional[speechsdk.SpeechConfig] = None def __init__(self, console: Console = Console(), **tool_kwargs: Any): super().__init__(console=console) diff --git a/chatgpt_tool_hub/tools/stt_tts/tts.py b/chatgpt_tool_hub/tools/stt_tts/tts.py index 9308f0b..108686b 100644 --- a/chatgpt_tool_hub/tools/stt_tts/tts.py +++ b/chatgpt_tool_hub/tools/stt_tts/tts.py @@ -11,7 +11,7 @@ from ...common.log import LOG from ...common.utils import get_from_dict_or_env from ...models import build_model_params -from ..all_tool_list import main_tool_register +from ..tool_register import main_tool_register from .. import BaseTool default_tool_name = "tts" diff --git a/chatgpt_tool_hub/tools/summary/tool.py b/chatgpt_tool_hub/tools/summary/tool.py index 989c79c..63d31a6 100644 --- a/chatgpt_tool_hub/tools/summary/tool.py +++ b/chatgpt_tool_hub/tools/summary/tool.py @@ -11,7 +11,7 @@ from ...common.utils import get_from_dict_or_env from ...models import build_model_params from ...models.model_factory import ModelFactory -from ..all_tool_list import main_tool_register +from ..tool_register import main_tool_register from .. import BaseTool from .prompt import MAP_QUERY_PROMPT, REDUCE_QUERY_PROMPT from .text_clipper import TextClipper @@ -108,7 +108,7 @@ def text(self, text: str) -> str: def _run(self, url: str) -> str: """run the tool""" - from chatgpt_tool_hub.tools.all_tool_list import main_tool_register + from chatgpt_tool_hub.tools.tool_register import main_tool_register try: _use_tool = "url-get" if main_tool_register.get_registered_tool().get('browser'): diff --git a/chatgpt_tool_hub/tools/system/answer_user.py b/chatgpt_tool_hub/tools/system/answer_user.py index a29ded5..ca8be18 100644 --- a/chatgpt_tool_hub/tools/system/answer_user.py +++ b/chatgpt_tool_hub/tools/system/answer_user.py @@ -3,7 +3,7 @@ from rich.console import Console from .. import BaseTool -from ..all_tool_list import main_tool_register +from ..tool_register import main_tool_register default_tool_name = "answer-user" diff --git a/chatgpt_tool_hub/tools/system/debug.py b/chatgpt_tool_hub/tools/system/debug.py index 0465918..bdf4f0d 100644 --- a/chatgpt_tool_hub/tools/system/debug.py +++ b/chatgpt_tool_hub/tools/system/debug.py @@ -5,7 +5,7 @@ from rich.console import Console from .. import BaseTool -from ..all_tool_list import main_tool_register +from ..tool_register import main_tool_register default_tool_name = "debug" diff --git a/chatgpt_tool_hub/tools/terminal/tool.py b/chatgpt_tool_hub/tools/terminal/tool.py index f127af4..4aedafd 100644 --- a/chatgpt_tool_hub/tools/terminal/tool.py +++ b/chatgpt_tool_hub/tools/terminal/tool.py @@ -12,7 +12,7 @@ from ...common.utils import get_from_dict_or_env from .. import BaseTool -from ..all_tool_list import main_tool_register +from ..tool_register import main_tool_register from .prompt import QUERY_PROMPT default_tool_name = "terminal" diff --git a/chatgpt_tool_hub/tools/tool_register.py b/chatgpt_tool_hub/tools/tool_register.py index 13a760b..85e0262 100644 --- a/chatgpt_tool_hub/tools/tool_register.py +++ b/chatgpt_tool_hub/tools/tool_register.py @@ -28,3 +28,6 @@ def get_registered_tool_names(self) -> List[str]: def get_registered_tool(self) -> dict: return self.REGISTER_TOOLS + + +main_tool_register = ToolRegister() diff --git a/chatgpt_tool_hub/tools/visual/tool.py b/chatgpt_tool_hub/tools/visual/tool.py index 4a1e496..05488e8 100644 --- a/chatgpt_tool_hub/tools/visual/tool.py +++ b/chatgpt_tool_hub/tools/visual/tool.py @@ -8,7 +8,7 @@ from ...common.log import LOG from ...common.utils import get_from_dict_or_env from .. import BaseTool -from ..all_tool_list import main_tool_register +from ..tool_register import main_tool_register default_tool_name = "visual" diff --git a/chatgpt_tool_hub/tools/web_requests/browser.py b/chatgpt_tool_hub/tools/web_requests/browser.py index 5f48239..97f75cd 100644 --- a/chatgpt_tool_hub/tools/web_requests/browser.py +++ b/chatgpt_tool_hub/tools/web_requests/browser.py @@ -6,7 +6,7 @@ from ...common.log import LOG from ...common.utils import get_from_dict_or_env -from ..all_tool_list import main_tool_register +from ..tool_register import main_tool_register from .. import BaseTool from . import filter_text @@ -132,7 +132,7 @@ def __init__(self, console: Console = Console(), **tool_kwargs: Any): self.browser = ChromeBrowser(**tool_kwargs) self.use_summary = get_from_dict_or_env( - tool_kwargs, 'use_summary', "USE_SUMMARY", "" + tool_kwargs, 'browser_use_summary', "BROWSER_USE_SUMMARY", True ) def _run(self, url: str) -> str: diff --git a/chatgpt_tool_hub/tools/web_requests/get.py b/chatgpt_tool_hub/tools/web_requests/get.py index e605800..71ce697 100644 --- a/chatgpt_tool_hub/tools/web_requests/get.py +++ b/chatgpt_tool_hub/tools/web_requests/get.py @@ -5,7 +5,7 @@ from ...common.log import LOG from ...common.utils import get_from_dict_or_env -from ..all_tool_list import main_tool_register +from ..tool_register import main_tool_register from .. import BaseTool from . import BaseRequestsTool, filter_text, RequestsWrapper @@ -28,7 +28,7 @@ def __init__(self, console: Console = Console(), **tool_kwargs: Any): super().__init__(console=console, requests_wrapper=RequestsWrapper(**tool_kwargs), return_direct=False) self.use_summary = get_from_dict_or_env( - tool_kwargs, 'use_summary', "USE_SUMMARY", "" + tool_kwargs, 'url_get_use_summary', "URL_GET_USE_SUMMARY", True ) def _run(self, url: str) -> str: diff --git a/chatgpt_tool_hub/tools/wechat/tool.py b/chatgpt_tool_hub/tools/wechat/tool.py index f9d9af0..8301798 100644 --- a/chatgpt_tool_hub/tools/wechat/tool.py +++ b/chatgpt_tool_hub/tools/wechat/tool.py @@ -7,7 +7,7 @@ from ...models.model_factory import ModelFactory from ...common.utils import get_from_dict_or_env -from ..all_tool_list import main_tool_register +from ..tool_register import main_tool_register from .. import BaseTool from .prompt import QUERY_PROMPT from .wrapper import WechatWrapper diff --git a/chatgpt_tool_hub/tools/wechat/wrapper.py b/chatgpt_tool_hub/tools/wechat/wrapper.py index b9fd0a5..bfc9c12 100644 --- a/chatgpt_tool_hub/tools/wechat/wrapper.py +++ b/chatgpt_tool_hub/tools/wechat/wrapper.py @@ -72,7 +72,7 @@ def validate_environment(cls, values: Dict) -> Dict: values["wechat_client"].receivingRetryCount = 600 # 修改断线超时时间 values["wechat_hot_reload"] = get_from_dict_or_env(values, "wechat_hot_reload", "WECHAT_HOT_RELOAD", False) - if values["wechat_hot_reload"] and values["wechat_hot_reload"].lower() == 'true': + if str(values["wechat_hot_reload"]).lower() == 'true': values["wechat_cpt_path"] = get_from_dict_or_env(values, "wechat_cpt_path", "WECHAT_CPT_PATH") load_result = values["wechat_client"].load_login_status(fileDir=values["wechat_cpt_path"]) # load_result: {'BaseResponse': {'ErrMsg': '请求成功', 'Ret': 0, 'RawMsg': 'loading login status succeeded.'}} @@ -89,7 +89,7 @@ def validate_environment(cls, values: Dict) -> Dict: values["wechat_cpt_path"] = temp_file.name LOG.debug(f"[wechat] use default path: {values['wechat_cpt_path']} to save.") values["wechat_send_group"] = get_from_dict_or_env(values, "wechat_send_group", "WECHAT_SEND_GROUP", False) - if values["wechat_send_group"] and values["wechat_send_group"].lower() == 'true': + if str(values["wechat_send_group"]).lower() == 'true': values["wechat_send_group"] = True values["wechat_nickname_mapping"] = json.loads(get_from_dict_or_env(values, "wechat_nickname_mapping", "WECHAT_NICKNAME_MAPPING", "{}")) @@ -101,14 +101,12 @@ def validate_environment(cls, values: Dict) -> Dict: return values def login(self): - from lib import itchat - itchat.auto_login( + self.wechat_client.auto_login( enableCmdQR=2, hotReload=True, # must be true to save cpt file statusStorageDir=self.wechat_cpt_path, qrCallback=qrCallback, ) - # self.wechat_client = itchat.instance def _default_json_config(self): return { diff --git a/chatgpt_tool_hub/tools/wikipedia/tool.py b/chatgpt_tool_hub/tools/wikipedia/tool.py index 02cab4b..e65f840 100644 --- a/chatgpt_tool_hub/tools/wikipedia/tool.py +++ b/chatgpt_tool_hub/tools/wikipedia/tool.py @@ -9,7 +9,7 @@ from ...models.model_factory import ModelFactory from ...common.utils import get_from_dict_or_env from .. import BaseTool -from ..all_tool_list import main_tool_register +from ..tool_register import main_tool_register from .wrapper import WikipediaAPIWrapper from .prompt import QUERY_PROMPT diff --git a/chatgpt_tool_hub/tools/wolfram_alpha/tool.py b/chatgpt_tool_hub/tools/wolfram_alpha/tool.py index ae4bcdf..c28e3a7 100644 --- a/chatgpt_tool_hub/tools/wolfram_alpha/tool.py +++ b/chatgpt_tool_hub/tools/wolfram_alpha/tool.py @@ -9,7 +9,7 @@ from ...models import build_model_params from ...models.model_factory import ModelFactory from ...common.utils import get_from_dict_or_env -from ..all_tool_list import main_tool_register +from ..tool_register import main_tool_register from .. import BaseTool from .wrapper import WolframAlphaAPIWrapper from .prompt import QUERY_PROMPT diff --git a/config.json.template b/config.json.template index c10b6ca..e55a4ff 100644 --- a/config.json.template +++ b/config.json.template @@ -1,7 +1,6 @@ { "tools": [], "kwargs": { - "no_default": false, - "top_k_results": 2 + "no_default": false } } \ No newline at end of file diff --git a/tests/init.ipynb b/tests/init.ipynb index acf21fb..16cd0e3 100644 --- a/tests/init.ipynb +++ b/tests/init.ipynb @@ -24,14 +24,14 @@ "metadata": {}, "outputs": [], "source": [ - "from chatgpt_tool_hub.tools.all_tool_list import main_tool_register\n", + "from chatgpt_tool_hub.tools.tool_register import main_tool_register\n", "\n", "# debug mode\n", "import logging\n", "from chatgpt_tool_hub.common.log import refresh\n", "refresh(logging.DEBUG)\n", "\n", - "print(f\"toolhub初始加载的工具列表: {main_tool_register.get_registered_tool_names()}\")" + "# print(f\"toolhub初始加载的工具列表: {main_tool_register.get_registered_tool_names()}\")" ] } ], diff --git a/tests/tool/arxiv_search.ipynb b/tests/tool/arxiv_search.ipynb index 720c4ea..0d7a7d7 100644 --- a/tests/tool/arxiv_search.ipynb +++ b/tests/tool/arxiv_search.ipynb @@ -9,7 +9,7 @@ "%run ../init.ipynb\n", "\n", "from chatgpt_tool_hub.tools import dynamic_tool_loader\n", - "from chatgpt_tool_hub.tools.all_tool_list import main_tool_register\n", + "from chatgpt_tool_hub.tools.tool_register import main_tool_register\n", "\n", "# 尽可能地加载tool\n", "dynamic_tool_loader()\n", diff --git a/tests/tool/bing_search.ipynb b/tests/tool/bing_search.ipynb index a448200..f0da3bc 100644 --- a/tests/tool/bing_search.ipynb +++ b/tests/tool/bing_search.ipynb @@ -9,7 +9,7 @@ "%run ../init.ipynb\n", "\n", "from chatgpt_tool_hub.tools import dynamic_tool_loader\n", - "from chatgpt_tool_hub.tools.all_tool_list import main_tool_register\n", + "from chatgpt_tool_hub.tools.tool_register import main_tool_register\n", "\n", "# 尽可能地加载tool\n", "dynamic_tool_loader()\n", @@ -102,7 +102,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.0" + "version": "3.10.0" } }, "nbformat": 4, diff --git a/tests/tool/email.ipynb b/tests/tool/email.ipynb index 7b68737..01b1a43 100644 --- a/tests/tool/email.ipynb +++ b/tests/tool/email.ipynb @@ -9,7 +9,7 @@ "%run ../init.ipynb\n", "\n", "from chatgpt_tool_hub.tools import dynamic_tool_loader\n", - "from chatgpt_tool_hub.tools.all_tool_list import main_tool_register\n", + "from chatgpt_tool_hub.tools.tool_register import main_tool_register\n", "\n", "# 尽可能地加载tool\n", "dynamic_tool_loader()\n", diff --git a/tests/tool/finance_news.ipynb b/tests/tool/finance_news.ipynb index 16340c7..82d364e 100644 --- a/tests/tool/finance_news.ipynb +++ b/tests/tool/finance_news.ipynb @@ -9,7 +9,7 @@ "%run ../init.ipynb\n", "\n", "from chatgpt_tool_hub.tools import dynamic_tool_loader\n", - "from chatgpt_tool_hub.tools.all_tool_list import main_tool_register\n", + "from chatgpt_tool_hub.tools.tool_register import main_tool_register\n", "\n", "# 尽可能地加载tool\n", "dynamic_tool_loader()\n", diff --git a/tests/tool/google_search.ipynb b/tests/tool/google_search.ipynb index 045e1d4..f6eeb22 100644 --- a/tests/tool/google_search.ipynb +++ b/tests/tool/google_search.ipynb @@ -9,7 +9,7 @@ "%run ../init.ipynb\n", "\n", "from chatgpt_tool_hub.tools import dynamic_tool_loader\n", - "from chatgpt_tool_hub.tools.all_tool_list import main_tool_register\n", + "from chatgpt_tool_hub.tools.tool_register import main_tool_register\n", "\n", "# 尽可能地加载tool\n", "dynamic_tool_loader()\n", diff --git a/tests/tool/meteo.ipynb b/tests/tool/meteo.ipynb index c86460f..36353d2 100644 --- a/tests/tool/meteo.ipynb +++ b/tests/tool/meteo.ipynb @@ -9,7 +9,7 @@ "%run ../init.ipynb\n", "\n", "from chatgpt_tool_hub.tools import dynamic_tool_loader\n", - "from chatgpt_tool_hub.tools.all_tool_list import main_tool_register\n", + "from chatgpt_tool_hub.tools.tool_register import main_tool_register\n", "\n", "# 尽可能地加载tool\n", "dynamic_tool_loader()\n", diff --git a/tests/tool/morning_news.ipynb b/tests/tool/morning_news.ipynb index e4c5d6a..219d9f8 100644 --- a/tests/tool/morning_news.ipynb +++ b/tests/tool/morning_news.ipynb @@ -9,7 +9,7 @@ "%run ../init.ipynb\n", "import time\n", "from chatgpt_tool_hub.tools import dynamic_tool_loader\n", - "from chatgpt_tool_hub.tools.all_tool_list import main_tool_register\n", + "from chatgpt_tool_hub.tools.tool_register import main_tool_register\n", "\n", "# 尽可能地加载tool\n", "dynamic_tool_loader()\n", diff --git a/tests/tool/news_api.ipynb b/tests/tool/news_api.ipynb index d89ce99..2e89980 100644 --- a/tests/tool/news_api.ipynb +++ b/tests/tool/news_api.ipynb @@ -9,7 +9,7 @@ "%run ../init.ipynb\n", "\n", "from chatgpt_tool_hub.tools import dynamic_tool_loader\n", - "from chatgpt_tool_hub.tools.all_tool_list import main_tool_register\n", + "from chatgpt_tool_hub.tools.tool_register import main_tool_register\n", "\n", "# 尽可能地加载tool\n", "dynamic_tool_loader()\n", diff --git a/tests/tool/python.ipynb b/tests/tool/python.ipynb index 9f774ed..ea9cade 100644 --- a/tests/tool/python.ipynb +++ b/tests/tool/python.ipynb @@ -9,7 +9,7 @@ "%run ../init.ipynb\n", "\n", "from chatgpt_tool_hub.tools import dynamic_tool_loader\n", - "from chatgpt_tool_hub.tools.all_tool_list import main_tool_register\n", + "from chatgpt_tool_hub.tools.tool_register import main_tool_register\n", "\n", "# 尽可能地加载tool\n", "dynamic_tool_loader()\n", diff --git a/tests/tool/searxng_search.ipynb b/tests/tool/searxng_search.ipynb index 129c5aa..82b90b6 100644 --- a/tests/tool/searxng_search.ipynb +++ b/tests/tool/searxng_search.ipynb @@ -9,7 +9,7 @@ "%run ../init.ipynb\n", "\n", "from chatgpt_tool_hub.tools import dynamic_tool_loader\n", - "from chatgpt_tool_hub.tools.all_tool_list import main_tool_register\n", + "from chatgpt_tool_hub.tools.tool_register import main_tool_register\n", "\n", "# 尽可能地加载tool\n", "dynamic_tool_loader()\n", diff --git a/tests/tool/sms.ipynb b/tests/tool/sms.ipynb index f603b77..3393748 100644 --- a/tests/tool/sms.ipynb +++ b/tests/tool/sms.ipynb @@ -9,7 +9,7 @@ "%run ../init.ipynb\n", "\n", "from chatgpt_tool_hub.tools import dynamic_tool_loader\n", - "from chatgpt_tool_hub.tools.all_tool_list import main_tool_register\n", + "from chatgpt_tool_hub.tools.tool_register import main_tool_register\n", "\n", "# 尽可能地加载tool\n", "dynamic_tool_loader()\n", diff --git a/tests/tool/stt_tts.ipynb b/tests/tool/stt_tts.ipynb index 2f017bd..a30fa9b 100644 --- a/tests/tool/stt_tts.ipynb +++ b/tests/tool/stt_tts.ipynb @@ -9,7 +9,7 @@ "%run ../init.ipynb\n", "\n", "from chatgpt_tool_hub.tools import dynamic_tool_loader\n", - "from chatgpt_tool_hub.tools.all_tool_list import main_tool_register\n", + "from chatgpt_tool_hub.tools.tool_register import main_tool_register\n", "\n", "# 尽可能地加载tool\n", "dynamic_tool_loader()" diff --git a/tests/tool/summary.ipynb b/tests/tool/summary.ipynb index cd91395..674d3a3 100644 --- a/tests/tool/summary.ipynb +++ b/tests/tool/summary.ipynb @@ -9,7 +9,7 @@ "%run ../init.ipynb\n", "\n", "from chatgpt_tool_hub.tools import dynamic_tool_loader\n", - "from chatgpt_tool_hub.tools.all_tool_list import main_tool_register\n", + "from chatgpt_tool_hub.tools.tool_register import main_tool_register\n", "\n", "# 尽可能地加载tool\n", "dynamic_tool_loader()\n", diff --git a/tests/tool/terminal.ipynb b/tests/tool/terminal.ipynb index ef3c5db..65bef3f 100644 --- a/tests/tool/terminal.ipynb +++ b/tests/tool/terminal.ipynb @@ -9,7 +9,7 @@ "%run ../init.ipynb\n", "\n", "from chatgpt_tool_hub.tools import dynamic_tool_loader\n", - "from chatgpt_tool_hub.tools.all_tool_list import main_tool_register\n", + "from chatgpt_tool_hub.tools.tool_register import main_tool_register\n", "\n", "# 尽可能地加载tool\n", "dynamic_tool_loader()\n", diff --git a/tests/tool/visual.ipynb b/tests/tool/visual.ipynb index 62f60ce..ef73493 100644 --- a/tests/tool/visual.ipynb +++ b/tests/tool/visual.ipynb @@ -9,7 +9,7 @@ "%run ../init.ipynb\n", "\n", "from chatgpt_tool_hub.tools import dynamic_tool_loader\n", - "from chatgpt_tool_hub.tools.all_tool_list import main_tool_register\n", + "from chatgpt_tool_hub.tools.tool_register import main_tool_register\n", "\n", "# 尽可能地加载tool\n", "dynamic_tool_loader()\n", diff --git a/tests/tool/web_requests.ipynb b/tests/tool/web_requests.ipynb index feb3acc..f700836 100644 --- a/tests/tool/web_requests.ipynb +++ b/tests/tool/web_requests.ipynb @@ -9,11 +9,11 @@ "%run ../init.ipynb\n", "\n", "from chatgpt_tool_hub.tools import dynamic_tool_loader\n", - "from chatgpt_tool_hub.tools.all_tool_list import main_tool_register\n", + "from chatgpt_tool_hub.tools.tool_register import main_tool_register\n", "\n", "# 尽可能地加载tool\n", "dynamic_tool_loader()\n", - "\n" + "print(f\"toolhub初始加载的工具列表: {main_tool_register.get_registered_tool_names()}\")" ] }, { @@ -78,7 +78,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.0" + "version": "3.10.0" } }, "nbformat": 4, diff --git a/tests/tool/wechat.ipynb b/tests/tool/wechat.ipynb index 01b4bbf..67a8350 100644 --- a/tests/tool/wechat.ipynb +++ b/tests/tool/wechat.ipynb @@ -9,7 +9,7 @@ "%run ../init.ipynb\n", "\n", "from chatgpt_tool_hub.tools import dynamic_tool_loader\n", - "from chatgpt_tool_hub.tools.all_tool_list import main_tool_register\n", + "from chatgpt_tool_hub.tools.tool_register import main_tool_register\n", "\n", "# 尽可能地加载tool\n", "dynamic_tool_loader()\n", diff --git a/tests/tool/wikipedia.ipynb b/tests/tool/wikipedia.ipynb index 1181e17..e95e2a0 100644 --- a/tests/tool/wikipedia.ipynb +++ b/tests/tool/wikipedia.ipynb @@ -9,7 +9,7 @@ "%run ../init.ipynb\n", "\n", "from chatgpt_tool_hub.tools import dynamic_tool_loader\n", - "from chatgpt_tool_hub.tools.all_tool_list import main_tool_register\n", + "from chatgpt_tool_hub.tools.tool_register import main_tool_register\n", "\n", "# 尽可能地加载tool\n", "dynamic_tool_loader()\n", diff --git a/tests/tool/wolfram-alpha.ipynb b/tests/tool/wolfram-alpha.ipynb index a454d15..b916ba2 100644 --- a/tests/tool/wolfram-alpha.ipynb +++ b/tests/tool/wolfram-alpha.ipynb @@ -9,7 +9,7 @@ "%run ../init.ipynb\n", "\n", "from chatgpt_tool_hub.tools import dynamic_tool_loader\n", - "from chatgpt_tool_hub.tools.all_tool_list import main_tool_register\n", + "from chatgpt_tool_hub.tools.tool_register import main_tool_register\n", "\n", "# 尽可能地加载tool\n", "dynamic_tool_loader()\n",