diff --git a/libs/standard-tests/langchain_tests/__init__.py b/libs/standard-tests/langchain_tests/__init__.py index e69de29bb2d..1ebd42cf789 100644 --- a/libs/standard-tests/langchain_tests/__init__.py +++ b/libs/standard-tests/langchain_tests/__init__.py @@ -0,0 +1,7 @@ +""" +Base Test classes for standard testing. + +To learn how to use these classes, see the +`Integration standard testing `_ +guide +""" diff --git a/libs/standard-tests/langchain_tests/base.py b/libs/standard-tests/langchain_tests/base.py index f2b7ca1f7e9..7c01639db51 100644 --- a/libs/standard-tests/langchain_tests/base.py +++ b/libs/standard-tests/langchain_tests/base.py @@ -3,6 +3,10 @@ from typing import Type class BaseStandardTests(ABC): + """ + :private: + """ + def test_no_overrides_DO_NOT_OVERRIDE(self) -> None: """ Test that no standard tests are overridden. diff --git a/libs/standard-tests/langchain_tests/unit_tests/tools.py b/libs/standard-tests/langchain_tests/unit_tests/tools.py index 93701437da3..d674dfe4f48 100644 --- a/libs/standard-tests/langchain_tests/unit_tests/tools.py +++ b/libs/standard-tests/langchain_tests/unit_tests/tools.py @@ -1,3 +1,8 @@ +""" +.. autosummary:: + :exclude-members: ToolsTests +""" + import os from abc import abstractmethod from typing import Tuple, Type, Union @@ -11,12 +16,25 @@ from langchain_tests.base import BaseStandardTests class ToolsTests(BaseStandardTests): + """ + :private: + Base class for testing tools. This won't show in the documentation, but + the docstrings will be inherited by subclasses. + """ + @property @abstractmethod - def tool_constructor(self) -> Union[Type[BaseTool], BaseTool]: ... + def tool_constructor(self) -> Union[Type[BaseTool], BaseTool]: + """ + Returns a class or instance of a tool to be tested. + """ + ... @property def tool_constructor_params(self) -> dict: + """ + Returns a dictionary of parameters to pass to the tool constructor. + """ return {} @property @@ -24,13 +42,16 @@ class ToolsTests(BaseStandardTests): """ Returns a dictionary representing the "args" of an example tool call. - This should NOT be a ToolCall dict - i.e. it should not + This should NOT be a ToolCall dict - it should not have {"name", "id", "args"} keys. """ return {} @pytest.fixture def tool(self) -> BaseTool: + """ + :private: + """ if isinstance(self.tool_constructor, BaseTool): if self.tool_constructor_params != {}: msg = ( @@ -43,19 +64,24 @@ class ToolsTests(BaseStandardTests): class ToolsUnitTests(ToolsTests): - def test_init(self) -> None: - if isinstance(self.tool_constructor, BaseTool): - tool = self.tool_constructor - else: - tool = self.tool_constructor(**self.tool_constructor_params) - assert tool is not None - @property def init_from_env_params(self) -> Tuple[dict, dict, dict]: """Return env vars, init args, and expected instance attrs for initializing from env vars.""" return {}, {}, {} + def test_init(self) -> None: + """ + Test that the tool can be initialized with :attr:`tool_constructor` and + :attr:`tool_constructor_params`. If this fails, check that the + keyword args defined in :attr:`tool_constructor_params` are valid. + """ + if isinstance(self.tool_constructor, BaseTool): + tool = self.tool_constructor + else: + tool = self.tool_constructor(**self.tool_constructor_params) + assert tool is not None + def test_init_from_env(self) -> None: env_params, tools_params, expected_attrs = self.init_from_env_params if env_params: @@ -69,14 +95,32 @@ class ToolsUnitTests(ToolsTests): assert actual == expected def test_has_name(self, tool: BaseTool) -> None: + """ + Tests that the tool has a name attribute to pass to chat models. + + If this fails, add a `name` parameter to your tool. + """ assert tool.name def test_has_input_schema(self, tool: BaseTool) -> None: + """ + Tests that the tool has an input schema. + + If this fails, add an `args_schema` to your tool. + + See + `this guide `_ + and see how `CalculatorInput` is configured in the + `CustomCalculatorTool.args_schema` attribute + """ assert tool.get_input_schema() def test_input_schema_matches_invoke_params(self, tool: BaseTool) -> None: """ - Tests that the provided example params match the declared input schema + Tests that the provided example params match the declared input schema. + + If this fails, update the `tool_invoke_params_example` attribute to match + the input schema (`args_schema`) of the tool. """ # this will be a pydantic object input_schema = tool.get_input_schema() diff --git a/libs/standard-tests/langchain_tests/utils/pydantic.py b/libs/standard-tests/langchain_tests/utils/pydantic.py index 6aa0408a092..52720bbd081 100644 --- a/libs/standard-tests/langchain_tests/utils/pydantic.py +++ b/libs/standard-tests/langchain_tests/utils/pydantic.py @@ -1,4 +1,8 @@ -"""Utilities for working with pydantic models.""" +""" +Utilities for working with pydantic models. + +:private: +""" def get_pydantic_major_version() -> int: