From 5418d8bfd6c57c8405bfb7429b90f38df258b311 Mon Sep 17 00:00:00 2001 From: Erick Friis Date: Mon, 11 Dec 2023 14:59:10 -0800 Subject: [PATCH] infra: import CI fix (#14562) TIL `**` globstar doesn't work in make Makefile changes fix that. `__getattr__` changes allow import of all files, but raise error when accessing anything from the module. file deletions were corresponding libs change from #14559 --- libs/community/Makefile | 2 +- .../openai_functions.py | 89 --------------- .../agent_toolkits/vectorstore/base.py | 106 ------------------ libs/core/Makefile | 2 +- libs/experimental/Makefile | 2 +- libs/langchain/Makefile | 2 +- .../langchain/chains/llm_bash/__init__.py | 5 +- .../chains/llm_symbolic_math/__init__.py | 5 +- .../langchain/tools/python/__init__.py | 9 +- 9 files changed, 10 insertions(+), 212 deletions(-) delete mode 100644 libs/community/langchain_community/agent_toolkits/conversational_retrieval/openai_functions.py delete mode 100644 libs/community/langchain_community/agent_toolkits/vectorstore/base.py diff --git a/libs/community/Makefile b/libs/community/Makefile index fe1509fe8dd..68d8feee954 100644 --- a/libs/community/Makefile +++ b/libs/community/Makefile @@ -15,7 +15,7 @@ tests: test_watch: poetry run ptw --snapshot-update --now . -- -vv -x tests/unit_tests -check_imports: langchain_community/**/*.py +check_imports: $(shell find langchain_community -name '*.py') for f in $^ ; do \ python -c "from importlib.machinery import SourceFileLoader; SourceFileLoader('x', '$$f').load_module()" || exit 1; \ done diff --git a/libs/community/langchain_community/agent_toolkits/conversational_retrieval/openai_functions.py b/libs/community/langchain_community/agent_toolkits/conversational_retrieval/openai_functions.py deleted file mode 100644 index 405ccd39357..00000000000 --- a/libs/community/langchain_community/agent_toolkits/conversational_retrieval/openai_functions.py +++ /dev/null @@ -1,89 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, List, Optional - -from langchain_core.language_models import BaseLanguageModel -from langchain_core.memory import BaseMemory -from langchain_core.messages import SystemMessage -from langchain_core.prompts.chat import MessagesPlaceholder -from langchain_core.tools import BaseTool - -if TYPE_CHECKING: - from langchain.agents.agent import AgentExecutor - - -def _get_default_system_message() -> SystemMessage: - return SystemMessage( - content=( - "Do your best to answer the questions. " - "Feel free to use any tools available to look up " - "relevant information, only if necessary" - ) - ) - - -def create_conversational_retrieval_agent( - llm: BaseLanguageModel, - tools: List[BaseTool], - remember_intermediate_steps: bool = True, - memory_key: str = "chat_history", - system_message: Optional[SystemMessage] = None, - verbose: bool = False, - max_token_limit: int = 2000, - **kwargs: Any, -) -> AgentExecutor: - """A convenience method for creating a conversational retrieval agent. - - Args: - llm: The language model to use, should be ChatOpenAI - tools: A list of tools the agent has access to - remember_intermediate_steps: Whether the agent should remember intermediate - steps or not. Intermediate steps refer to prior action/observation - pairs from previous questions. The benefit of remembering these is if - there is relevant information in there, the agent can use it to answer - follow up questions. The downside is it will take up more tokens. - memory_key: The name of the memory key in the prompt. - system_message: The system message to use. By default, a basic one will - be used. - verbose: Whether or not the final AgentExecutor should be verbose or not, - defaults to False. - max_token_limit: The max number of tokens to keep around in memory. - Defaults to 2000. - - Returns: - An agent executor initialized appropriately - """ - from langchain.agents.agent import AgentExecutor - from langchain.agents.openai_functions_agent.agent_token_buffer_memory import ( - AgentTokenBufferMemory, - ) - from langchain.agents.openai_functions_agent.base import OpenAIFunctionsAgent - from langchain.memory.token_buffer import ConversationTokenBufferMemory - - if remember_intermediate_steps: - memory: BaseMemory = AgentTokenBufferMemory( - memory_key=memory_key, llm=llm, max_token_limit=max_token_limit - ) - else: - memory = ConversationTokenBufferMemory( - memory_key=memory_key, - return_messages=True, - output_key="output", - llm=llm, - max_token_limit=max_token_limit, - ) - - _system_message = system_message or _get_default_system_message() - prompt = OpenAIFunctionsAgent.create_prompt( - system_message=_system_message, - extra_prompt_messages=[MessagesPlaceholder(variable_name=memory_key)], - ) - agent = OpenAIFunctionsAgent(llm=llm, tools=tools, prompt=prompt) - return AgentExecutor( - agent=agent, - tools=tools, - memory=memory, - verbose=verbose, - return_intermediate_steps=remember_intermediate_steps, - **kwargs, - ) diff --git a/libs/community/langchain_community/agent_toolkits/vectorstore/base.py b/libs/community/langchain_community/agent_toolkits/vectorstore/base.py deleted file mode 100644 index 7354dfb0df2..00000000000 --- a/libs/community/langchain_community/agent_toolkits/vectorstore/base.py +++ /dev/null @@ -1,106 +0,0 @@ -"""VectorStore agent.""" -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Dict, Optional - -from langchain_core.callbacks import BaseCallbackManager -from langchain_core.language_models import BaseLanguageModel - -from langchain_community.agent_toolkits.vectorstore.prompt import PREFIX, ROUTER_PREFIX -from langchain_community.agent_toolkits.vectorstore.toolkit import ( - VectorStoreRouterToolkit, - VectorStoreToolkit, -) - -if TYPE_CHECKING: - from langchain.agents.agent import AgentExecutor - - -def create_vectorstore_agent( - llm: BaseLanguageModel, - toolkit: VectorStoreToolkit, - callback_manager: Optional[BaseCallbackManager] = None, - prefix: str = PREFIX, - verbose: bool = False, - agent_executor_kwargs: Optional[Dict[str, Any]] = None, - **kwargs: Any, -) -> AgentExecutor: - """Construct a VectorStore agent from an LLM and tools. - - Args: - llm (BaseLanguageModel): LLM that will be used by the agent - toolkit (VectorStoreToolkit): Set of tools for the agent - callback_manager (Optional[BaseCallbackManager], optional): Object to handle the callback [ Defaults to None. ] - prefix (str, optional): The prefix prompt for the agent. If not provided uses default PREFIX. - verbose (bool, optional): If you want to see the content of the scratchpad. [ Defaults to False ] - agent_executor_kwargs (Optional[Dict[str, Any]], optional): If there is any other parameter you want to send to the agent. [ Defaults to None ] - **kwargs: Additional named parameters to pass to the ZeroShotAgent. - - Returns: - AgentExecutor: Returns a callable AgentExecutor object. Either you can call it or use run method with the query to get the response - """ # noqa: E501 - from langchain.agents.agent import AgentExecutor - from langchain.agents.mrkl.base import ZeroShotAgent - from langchain.chains.llm import LLMChain - - tools = toolkit.get_tools() - prompt = ZeroShotAgent.create_prompt(tools, prefix=prefix) - llm_chain = LLMChain( - llm=llm, - prompt=prompt, - callback_manager=callback_manager, - ) - tool_names = [tool.name for tool in tools] - agent = ZeroShotAgent(llm_chain=llm_chain, allowed_tools=tool_names, **kwargs) - return AgentExecutor.from_agent_and_tools( - agent=agent, - tools=tools, - callback_manager=callback_manager, - verbose=verbose, - **(agent_executor_kwargs or {}), - ) - - -def create_vectorstore_router_agent( - llm: BaseLanguageModel, - toolkit: VectorStoreRouterToolkit, - callback_manager: Optional[BaseCallbackManager] = None, - prefix: str = ROUTER_PREFIX, - verbose: bool = False, - agent_executor_kwargs: Optional[Dict[str, Any]] = None, - **kwargs: Any, -) -> AgentExecutor: - """Construct a VectorStore router agent from an LLM and tools. - - Args: - llm (BaseLanguageModel): LLM that will be used by the agent - toolkit (VectorStoreRouterToolkit): Set of tools for the agent which have routing capability with multiple vector stores - callback_manager (Optional[BaseCallbackManager], optional): Object to handle the callback [ Defaults to None. ] - prefix (str, optional): The prefix prompt for the router agent. If not provided uses default ROUTER_PREFIX. - verbose (bool, optional): If you want to see the content of the scratchpad. [ Defaults to False ] - agent_executor_kwargs (Optional[Dict[str, Any]], optional): If there is any other parameter you want to send to the agent. [ Defaults to None ] - **kwargs: Additional named parameters to pass to the ZeroShotAgent. - - Returns: - AgentExecutor: Returns a callable AgentExecutor object. Either you can call it or use run method with the query to get the response. - """ # noqa: E501 - from langchain.agents.agent import AgentExecutor - from langchain.agents.mrkl.base import ZeroShotAgent - from langchain.chains.llm import LLMChain - - tools = toolkit.get_tools() - prompt = ZeroShotAgent.create_prompt(tools, prefix=prefix) - llm_chain = LLMChain( - llm=llm, - prompt=prompt, - callback_manager=callback_manager, - ) - tool_names = [tool.name for tool in tools] - agent = ZeroShotAgent(llm_chain=llm_chain, allowed_tools=tool_names, **kwargs) - return AgentExecutor.from_agent_and_tools( - agent=agent, - tools=tools, - callback_manager=callback_manager, - verbose=verbose, - **(agent_executor_kwargs or {}), - ) diff --git a/libs/core/Makefile b/libs/core/Makefile index 6896d86fb6b..9e4c2a85259 100644 --- a/libs/core/Makefile +++ b/libs/core/Makefile @@ -15,7 +15,7 @@ tests: test_watch: poetry run ptw --snapshot-update --now . -- -vv -x tests/unit_tests -check_imports: langchain_core/**/*.py +check_imports: $(shell find langchain_core -name '*.py') for f in $^ ; do \ python -c "from importlib.machinery import SourceFileLoader; SourceFileLoader('x', '$$f').load_module()" || exit 1; \ done diff --git a/libs/experimental/Makefile b/libs/experimental/Makefile index 097a8a36fb5..eb20ffc13b4 100644 --- a/libs/experimental/Makefile +++ b/libs/experimental/Makefile @@ -21,7 +21,7 @@ extended_tests: integration_tests: poetry run pytest tests/integration_tests -check_imports: langchain_experimental/**/*.py +check_imports: $(shell find langchain_experimental -name '*.py') for f in $^ ; do \ python -c "from importlib.machinery import SourceFileLoader; SourceFileLoader('x', '$$f').load_module()" || exit 1; \ done diff --git a/libs/langchain/Makefile b/libs/langchain/Makefile index 3f92c2ee78e..3a1daeae974 100644 --- a/libs/langchain/Makefile +++ b/libs/langchain/Makefile @@ -40,7 +40,7 @@ docker_tests: docker build -t my-langchain-image:test . docker run --rm my-langchain-image:test -check_imports: langchain/**/*.py +check_imports: $(shell find langchain -name '*.py') for f in $^ ; do \ python -c "from importlib.machinery import SourceFileLoader; SourceFileLoader('x', '$$f').load_module()" || exit 1; \ done diff --git a/libs/langchain/langchain/chains/llm_bash/__init__.py b/libs/langchain/langchain/chains/llm_bash/__init__.py index 74f7c29d89f..cb6b48377d8 100644 --- a/libs/langchain/langchain/chains/llm_bash/__init__.py +++ b/libs/langchain/langchain/chains/llm_bash/__init__.py @@ -1,4 +1,4 @@ -def raise_on_import() -> None: +def __getattr__(name: str = "") -> None: """Raise an error on import since is deprecated.""" raise ImportError( "This module has been moved to langchain-experimental. " @@ -7,6 +7,3 @@ def raise_on_import() -> None: "`from langchain_experimental.llm_bash.base " "import LLMBashChain`" ) - - -raise_on_import() diff --git a/libs/langchain/langchain/chains/llm_symbolic_math/__init__.py b/libs/langchain/langchain/chains/llm_symbolic_math/__init__.py index 64f6c7ac200..640a8aa9095 100644 --- a/libs/langchain/langchain/chains/llm_symbolic_math/__init__.py +++ b/libs/langchain/langchain/chains/llm_symbolic_math/__init__.py @@ -1,4 +1,4 @@ -def raise_on_import() -> None: +def __getattr__(name: str = "") -> None: """Raise an error on import since is deprecated.""" raise ImportError( "This module has been moved to langchain-experimental. " @@ -7,6 +7,3 @@ def raise_on_import() -> None: "`from langchain_experimental.llm_symbolic_math.base " "import LLMSymbolicMathChain`" ) - - -raise_on_import() diff --git a/libs/langchain/langchain/tools/python/__init__.py b/libs/langchain/langchain/tools/python/__init__.py index 278ff9d4e48..a7f4082d30a 100644 --- a/libs/langchain/langchain/tools/python/__init__.py +++ b/libs/langchain/langchain/tools/python/__init__.py @@ -1,5 +1,7 @@ -def raise_on_import() -> None: - """Raise on import letting users know that underlying code is deprecated.""" +from typing import Any + + +def __getattr__(name: str = "") -> Any: raise ImportError( "This tool has been moved to langchain experiment. " "This tool has access to a python REPL. " @@ -8,6 +10,3 @@ def raise_on_import() -> None: "To keep using this code as is, install langchain experimental and " "update relevant imports replacing 'langchain' with 'langchain_experimental'" ) - - -raise_on_import()