From fa55c5a16b4739e92e9743ae12680b450b173dbb Mon Sep 17 00:00:00 2001 From: Santiago Delgado Date: Wed, 5 Jul 2023 14:46:21 -0500 Subject: [PATCH] Fixed Office365 tool __init__.py files, tests, and get_tools() function (#7046) ## Description Added Office365 tool modules to `__init__.py` files ## Issue As described in Issue https://github.com/hwchase17/langchain/issues/6936, the Office365 toolkit can't be loaded easily because it is not included in the `__init__.py` files. ## Reviewer @dev2049 --- langchain/agents/agent_toolkits/__init__.py | 2 ++ langchain/agents/agent_toolkits/office365/toolkit.py | 10 +++++----- langchain/tools/__init__.py | 12 ++++++++++++ tests/unit_tests/tools/test_public_api.py | 6 ++++++ tests/unit_tests/tools/test_signatures.py | 7 ++++++- 5 files changed, 31 insertions(+), 6 deletions(-) diff --git a/langchain/agents/agent_toolkits/__init__.py b/langchain/agents/agent_toolkits/__init__.py index f3b00d13ea..c0edc98f07 100644 --- a/langchain/agents/agent_toolkits/__init__.py +++ b/langchain/agents/agent_toolkits/__init__.py @@ -12,6 +12,7 @@ from langchain.agents.agent_toolkits.jira.toolkit import JiraToolkit from langchain.agents.agent_toolkits.json.base import create_json_agent from langchain.agents.agent_toolkits.json.toolkit import JsonToolkit from langchain.agents.agent_toolkits.nla.toolkit import NLAToolkit +from langchain.agents.agent_toolkits.office365.toolkit import O365Toolkit from langchain.agents.agent_toolkits.openapi.base import create_openapi_agent from langchain.agents.agent_toolkits.openapi.toolkit import OpenAPIToolkit from langchain.agents.agent_toolkits.pandas.base import create_pandas_dataframe_agent @@ -64,4 +65,5 @@ __all__ = [ "FileManagementToolkit", "PlayWrightBrowserToolkit", "AzureCognitiveServicesToolkit", + "O365Toolkit", ] diff --git a/langchain/agents/agent_toolkits/office365/toolkit.py b/langchain/agents/agent_toolkits/office365/toolkit.py index 471a674bcf..398847dbbe 100644 --- a/langchain/agents/agent_toolkits/office365/toolkit.py +++ b/langchain/agents/agent_toolkits/office365/toolkit.py @@ -30,9 +30,9 @@ class O365Toolkit(BaseToolkit): def get_tools(self) -> List[BaseTool]: """Get the tools in the toolkit.""" return [ - O365SearchEvents(account=self.account), - O365CreateDraftMessage(account=self.account), - O365SearchEmails(account=self.account), - O365SendEvent(account=self.account), - O365SendMessage(account=self.account), + O365SearchEvents(), + O365CreateDraftMessage(), + O365SearchEmails(), + O365SendEvent(), + O365SendMessage(), ] diff --git a/langchain/tools/__init__.py b/langchain/tools/__init__.py index 5a7064217c..3b58d99f02 100644 --- a/langchain/tools/__init__.py +++ b/langchain/tools/__init__.py @@ -38,6 +38,12 @@ from langchain.tools.interaction.tool import StdInInquireTool from langchain.tools.jira.tool import JiraAction from langchain.tools.json.tool import JsonGetValueTool, JsonListKeysTool from langchain.tools.metaphor_search import MetaphorSearchResults +from langchain.tools.office365.create_draft_message import O365CreateDraftMessage +from langchain.tools.office365.events_search import O365SearchEvents +from langchain.tools.office365.messages_search import O365SearchEmails +from langchain.tools.office365.send_event import O365SendEvent +from langchain.tools.office365.send_message import O365SendMessage +from langchain.tools.office365.utils import authenticate from langchain.tools.openapi.utils.api_models import APIOperation from langchain.tools.openapi.utils.openapi_utils import OpenAPISpec from langchain.tools.openweathermap.tool import OpenWeatherMapQueryRun @@ -148,6 +154,12 @@ __all__ = [ "MoveFileTool", "NavigateBackTool", "NavigateTool", + "O365SearchEmails", + "O365SearchEvents", + "O365CreateDraftMessage", + "O365SendMessage", + "O365SendEvent", + "authenticate", "OpenAPISpec", "OpenWeatherMapQueryRun", "PubmedQueryRun", diff --git a/tests/unit_tests/tools/test_public_api.py b/tests/unit_tests/tools/test_public_api.py index 049143f2da..2873f188c2 100644 --- a/tests/unit_tests/tools/test_public_api.py +++ b/tests/unit_tests/tools/test_public_api.py @@ -55,6 +55,12 @@ _EXPECTED = [ "MoveFileTool", "NavigateBackTool", "NavigateTool", + "O365SearchEmails", + "O365SearchEvents", + "O365CreateDraftMessage", + "O365SendMessage", + "O365SendEvent", + "authenticate", "OpenAPISpec", "OpenWeatherMapQueryRun", "PubmedQueryRun", diff --git a/tests/unit_tests/tools/test_signatures.py b/tests/unit_tests/tools/test_signatures.py index 09e4631d6c..c0930ee99f 100644 --- a/tests/unit_tests/tools/test_signatures.py +++ b/tests/unit_tests/tools/test_signatures.py @@ -9,11 +9,16 @@ import pytest from langchain.tools.base import BaseTool from langchain.tools.gmail.base import GmailBaseTool +from langchain.tools.office365.base import O365BaseTool from langchain.tools.playwright.base import BaseBrowserTool def get_non_abstract_subclasses(cls: Type[BaseTool]) -> List[Type[BaseTool]]: - to_skip = {BaseBrowserTool, GmailBaseTool} # Abstract but not recognized + to_skip = { + BaseBrowserTool, + GmailBaseTool, + O365BaseTool, + } # Abstract but not recognized subclasses = [] for subclass in cls.__subclasses__(): if (