From fbe9babb34a222b933766de625d8293f93e61298 Mon Sep 17 00:00:00 2001 From: Sydney Runkle <54324534+sydney-runkle@users.noreply.github.com> Date: Fri, 9 Jan 2026 13:00:51 -0500 Subject: [PATCH] fix: remove relative imports (#34680) standardizing on absolute imports rather than relative across the codebase --- libs/core/langchain_core/_api/__init__.py | 6 ++-- .../core/langchain_core/documents/__init__.py | 6 ++-- libs/core/pyproject.toml | 3 ++ .../langchain/agents/middleware/__init__.py | 33 +++++++++---------- libs/langchain_v1/pyproject.toml | 3 ++ .../tests/unit_tests/agents/conftest.py | 4 +-- .../agents/conftest_checkpointer.py | 4 +-- .../tests/unit_tests/agents/messages.py | 2 +- .../unit_tests/agents/test_agent_name.py | 3 +- .../test_create_agent_tool_validation.py | 3 +- .../test_injected_runtime_create_agent.py | 3 +- .../test_kwargs_tool_runtime_injection.py | 3 +- .../unit_tests/agents/test_react_agent.py | 6 ++-- .../agents/test_return_direct_graph.py | 3 +- .../unit_tests/agents/test_state_schema.py | 3 +- libs/langchain_v1/uv.lock | 2 +- .../integration_tests/__init__.py | 20 +++++++---- .../langchain_tests/unit_tests/__init__.py | 6 ++-- libs/standard-tests/pyproject.toml | 3 ++ libs/standard-tests/tests/__init__.py | 0 .../unit_tests/test_custom_chat_model.py | 3 +- libs/standard-tests/uv.lock | 2 +- 22 files changed, 62 insertions(+), 59 deletions(-) create mode 100644 libs/standard-tests/tests/__init__.py diff --git a/libs/core/langchain_core/_api/__init__.py b/libs/core/langchain_core/_api/__init__.py index 12296ca3630..6ba941f3d0f 100644 --- a/libs/core/langchain_core/_api/__init__.py +++ b/libs/core/langchain_core/_api/__init__.py @@ -13,20 +13,20 @@ from typing import TYPE_CHECKING from langchain_core._import_utils import import_attr if TYPE_CHECKING: - from .beta_decorator import ( + from langchain_core._api.beta_decorator import ( LangChainBetaWarning, beta, suppress_langchain_beta_warning, surface_langchain_beta_warnings, ) - from .deprecation import ( + from langchain_core._api.deprecation import ( LangChainDeprecationWarning, deprecated, suppress_langchain_deprecation_warning, surface_langchain_deprecation_warnings, warn_deprecated, ) - from .path import as_import_path, get_relative_path + from langchain_core._api.path import as_import_path, get_relative_path __all__ = ( "LangChainBetaWarning", diff --git a/libs/core/langchain_core/documents/__init__.py b/libs/core/langchain_core/documents/__init__.py index 1969f10935d..d7aa87f1943 100644 --- a/libs/core/langchain_core/documents/__init__.py +++ b/libs/core/langchain_core/documents/__init__.py @@ -30,9 +30,9 @@ from typing import TYPE_CHECKING from langchain_core._import_utils import import_attr if TYPE_CHECKING: - from .base import Document - from .compressor import BaseDocumentCompressor - from .transformers import BaseDocumentTransformer + from langchain_core.documents.base import Document + from langchain_core.documents.compressor import BaseDocumentCompressor + from langchain_core.documents.transformers import BaseDocumentTransformer __all__ = ("BaseDocumentCompressor", "BaseDocumentTransformer", "Document") diff --git a/libs/core/pyproject.toml b/libs/core/pyproject.toml index f2407f1f4eb..7afc3a89322 100644 --- a/libs/core/pyproject.toml +++ b/libs/core/pyproject.toml @@ -109,6 +109,9 @@ flake8-builtins.ignorelist = ["id", "input", "type"] flake8-type-checking.runtime-evaluated-base-classes = [ "pydantic.BaseModel", "langchain_core.load.serializable.Serializable", "langchain_core.runnables.base.RunnableSerializable", "langchain_core.language_models.base.BaseLanguageModel", "langchain_core.outputs.generation.Generation", "langchain_core.tools.base.BaseTool",] pep8-naming.classmethod-decorators = [ "classmethod", "langchain_core.utils.pydantic.pre_init", "pydantic.field_validator", "pydantic.v1.root_validator",] +[tool.ruff.lint.flake8-tidy-imports] +ban-relative-imports = "all" + [tool.ruff.lint.pydocstyle] convention = "google" ignore-var-parameters = true # ignore missing documentation for *args and **kwargs parameters diff --git a/libs/langchain_v1/langchain/agents/middleware/__init__.py b/libs/langchain_v1/langchain/agents/middleware/__init__.py index 94bd872d578..5faf0549f34 100644 --- a/libs/langchain_v1/langchain/agents/middleware/__init__.py +++ b/libs/langchain_v1/langchain/agents/middleware/__init__.py @@ -1,32 +1,29 @@ """Entrypoint to using [middleware](https://docs.langchain.com/oss/python/langchain/middleware) plugins with [Agents](https://docs.langchain.com/oss/python/langchain/agents).""" # noqa: E501 -from .context_editing import ( - ClearToolUsesEdit, - ContextEditingMiddleware, -) -from .file_search import FilesystemFileSearchMiddleware -from .human_in_the_loop import ( +from langchain.agents.middleware.context_editing import ClearToolUsesEdit, ContextEditingMiddleware +from langchain.agents.middleware.file_search import FilesystemFileSearchMiddleware +from langchain.agents.middleware.human_in_the_loop import ( HumanInTheLoopMiddleware, InterruptOnConfig, ) -from .model_call_limit import ModelCallLimitMiddleware -from .model_fallback import ModelFallbackMiddleware -from .model_retry import ModelRetryMiddleware -from .pii import PIIDetectionError, PIIMiddleware -from .shell_tool import ( +from langchain.agents.middleware.model_call_limit import ModelCallLimitMiddleware +from langchain.agents.middleware.model_fallback import ModelFallbackMiddleware +from langchain.agents.middleware.model_retry import ModelRetryMiddleware +from langchain.agents.middleware.pii import PIIDetectionError, PIIMiddleware +from langchain.agents.middleware.shell_tool import ( CodexSandboxExecutionPolicy, DockerExecutionPolicy, HostExecutionPolicy, RedactionRule, ShellToolMiddleware, ) -from .summarization import SummarizationMiddleware -from .todo import TodoListMiddleware -from .tool_call_limit import ToolCallLimitMiddleware -from .tool_emulator import LLMToolEmulator -from .tool_retry import ToolRetryMiddleware -from .tool_selection import LLMToolSelectorMiddleware -from .types import ( +from langchain.agents.middleware.summarization import SummarizationMiddleware +from langchain.agents.middleware.todo import TodoListMiddleware +from langchain.agents.middleware.tool_call_limit import ToolCallLimitMiddleware +from langchain.agents.middleware.tool_emulator import LLMToolEmulator +from langchain.agents.middleware.tool_retry import ToolRetryMiddleware +from langchain.agents.middleware.tool_selection import LLMToolSelectorMiddleware +from langchain.agents.middleware.types import ( AgentMiddleware, AgentState, ModelRequest, diff --git a/libs/langchain_v1/pyproject.toml b/libs/langchain_v1/pyproject.toml index 8a4b38d2ef5..21d0818d49b 100644 --- a/libs/langchain_v1/pyproject.toml +++ b/libs/langchain_v1/pyproject.toml @@ -127,6 +127,9 @@ unfixable = [ flake8-annotations.allow-star-arg-any = true allowed-confusables = ["–"] +[tool.ruff.lint.flake8-tidy-imports] +ban-relative-imports = "all" + [tool.ruff.lint.pydocstyle] convention = "google" ignore-var-parameters = true # ignore missing documentation for *args and **kwargs parameters diff --git a/libs/langchain_v1/tests/unit_tests/agents/conftest.py b/libs/langchain_v1/tests/unit_tests/agents/conftest.py index 14aad660921..95f7e32670f 100644 --- a/libs/langchain_v1/tests/unit_tests/agents/conftest.py +++ b/libs/langchain_v1/tests/unit_tests/agents/conftest.py @@ -7,7 +7,7 @@ from langgraph.checkpoint.base import BaseCheckpointSaver from langgraph.store.base import BaseStore from pytest_mock import MockerFixture -from .conftest_checkpointer import ( +from tests.unit_tests.agents.conftest_checkpointer import ( _checkpointer_memory, _checkpointer_postgres, _checkpointer_postgres_aio, @@ -18,7 +18,7 @@ from .conftest_checkpointer import ( _checkpointer_sqlite, _checkpointer_sqlite_aio, ) -from .conftest_store import ( +from tests.unit_tests.agents.conftest_store import ( _store_memory, _store_postgres, _store_postgres_aio, diff --git a/libs/langchain_v1/tests/unit_tests/agents/conftest_checkpointer.py b/libs/langchain_v1/tests/unit_tests/agents/conftest_checkpointer.py index 4505fb28ee3..44d19f3781d 100644 --- a/libs/langchain_v1/tests/unit_tests/agents/conftest_checkpointer.py +++ b/libs/langchain_v1/tests/unit_tests/agents/conftest_checkpointer.py @@ -1,8 +1,6 @@ from contextlib import asynccontextmanager, contextmanager -from .memory_assert import ( - MemorySaverAssertImmutable, -) +from tests.unit_tests.agents.memory_assert import MemorySaverAssertImmutable @contextmanager diff --git a/libs/langchain_v1/tests/unit_tests/agents/messages.py b/libs/langchain_v1/tests/unit_tests/agents/messages.py index b344b458051..5a8bb21efce 100644 --- a/libs/langchain_v1/tests/unit_tests/agents/messages.py +++ b/libs/langchain_v1/tests/unit_tests/agents/messages.py @@ -11,7 +11,7 @@ from typing import Any from langchain_core.messages import HumanMessage, ToolMessage -from .any_str import AnyStr +from tests.unit_tests.agents.any_str import AnyStr def _AnyIdHumanMessage(**kwargs: Any) -> HumanMessage: # noqa: N802 diff --git a/libs/langchain_v1/tests/unit_tests/agents/test_agent_name.py b/libs/langchain_v1/tests/unit_tests/agents/test_agent_name.py index 07ebdbbf6af..d1d932a5712 100644 --- a/libs/langchain_v1/tests/unit_tests/agents/test_agent_name.py +++ b/libs/langchain_v1/tests/unit_tests/agents/test_agent_name.py @@ -10,8 +10,7 @@ from langchain_core.messages import AIMessage, HumanMessage from langchain_core.tools import tool from langchain.agents import create_agent - -from .model import FakeToolCallingModel +from tests.unit_tests.agents.model import FakeToolCallingModel @tool diff --git a/libs/langchain_v1/tests/unit_tests/agents/test_create_agent_tool_validation.py b/libs/langchain_v1/tests/unit_tests/agents/test_create_agent_tool_validation.py index d903b22c9be..bfc5a21519d 100644 --- a/libs/langchain_v1/tests/unit_tests/agents/test_create_agent_tool_validation.py +++ b/libs/langchain_v1/tests/unit_tests/agents/test_create_agent_tool_validation.py @@ -10,8 +10,7 @@ from langgraph.store.memory import InMemoryStore from langchain.agents import AgentState, create_agent from langchain.tools import InjectedState from langchain.tools import tool as dec_tool - -from .model import FakeToolCallingModel +from tests.unit_tests.agents.model import FakeToolCallingModel @pytest.mark.skipif( diff --git a/libs/langchain_v1/tests/unit_tests/agents/test_injected_runtime_create_agent.py b/libs/langchain_v1/tests/unit_tests/agents/test_injected_runtime_create_agent.py index 96adf0c1107..93042629525 100644 --- a/libs/langchain_v1/tests/unit_tests/agents/test_injected_runtime_create_agent.py +++ b/libs/langchain_v1/tests/unit_tests/agents/test_injected_runtime_create_agent.py @@ -26,8 +26,7 @@ from langgraph.store.memory import InMemoryStore from langchain.agents import create_agent from langchain.agents.middleware.types import AgentMiddleware, AgentState from langchain.tools import InjectedState, ToolRuntime - -from .model import FakeToolCallingModel +from tests.unit_tests.agents.model import FakeToolCallingModel def test_tool_runtime_basic_injection() -> None: diff --git a/libs/langchain_v1/tests/unit_tests/agents/test_kwargs_tool_runtime_injection.py b/libs/langchain_v1/tests/unit_tests/agents/test_kwargs_tool_runtime_injection.py index 5352c832b78..1e6637fb6c3 100644 --- a/libs/langchain_v1/tests/unit_tests/agents/test_kwargs_tool_runtime_injection.py +++ b/libs/langchain_v1/tests/unit_tests/agents/test_kwargs_tool_runtime_injection.py @@ -9,8 +9,7 @@ from langchain_core.tools import StructuredTool from pydantic import BaseModel, Field from langchain.agents import create_agent - -from .model import FakeToolCallingModel +from tests.unit_tests.agents.model import FakeToolCallingModel class ArgsSchema(BaseModel): diff --git a/libs/langchain_v1/tests/unit_tests/agents/test_react_agent.py b/libs/langchain_v1/tests/unit_tests/agents/test_react_agent.py index ad3d9ca9a07..be561179cfd 100644 --- a/libs/langchain_v1/tests/unit_tests/agents/test_react_agent.py +++ b/libs/langchain_v1/tests/unit_tests/agents/test_react_agent.py @@ -44,9 +44,9 @@ # _infer_handled_types, # ) -# from .any_str import AnyStr -# from .messages import _AnyIdHumanMessage, _AnyIdToolMessage -# from .model import FakeToolCallingModel +# from tests.unit_tests.agents.any_str import AnyStr +# from tests.unit_tests.agents.messages import _AnyIdHumanMessage, _AnyIdToolMessage +# from tests.unit_tests.agents.model import FakeToolCallingModel # pytestmark = pytest.mark.anyio diff --git a/libs/langchain_v1/tests/unit_tests/agents/test_return_direct_graph.py b/libs/langchain_v1/tests/unit_tests/agents/test_return_direct_graph.py index 6907aa01a8c..a5705da6d3c 100644 --- a/libs/langchain_v1/tests/unit_tests/agents/test_return_direct_graph.py +++ b/libs/langchain_v1/tests/unit_tests/agents/test_return_direct_graph.py @@ -4,8 +4,7 @@ from langchain_core.tools import tool from syrupy.assertion import SnapshotAssertion from langchain.agents.factory import create_agent - -from .model import FakeToolCallingModel +from tests.unit_tests.agents.model import FakeToolCallingModel def test_agent_graph_without_return_direct_tools(snapshot: SnapshotAssertion) -> None: diff --git a/libs/langchain_v1/tests/unit_tests/agents/test_state_schema.py b/libs/langchain_v1/tests/unit_tests/agents/test_state_schema.py index 5e21103e9da..1da12fbb8d3 100644 --- a/libs/langchain_v1/tests/unit_tests/agents/test_state_schema.py +++ b/libs/langchain_v1/tests/unit_tests/agents/test_state_schema.py @@ -17,8 +17,7 @@ from langchain.agents.middleware.types import AgentMiddleware, AgentState # Cannot move ToolRuntime to TYPE_CHECKING as parameters of @tool annotated functions # are inspected at runtime. from langchain.tools import ToolRuntime # noqa: TC001 - -from .model import FakeToolCallingModel +from tests.unit_tests.agents.model import FakeToolCallingModel @tool diff --git a/libs/langchain_v1/uv.lock b/libs/langchain_v1/uv.lock index 23e058f3997..b298c499847 100644 --- a/libs/langchain_v1/uv.lock +++ b/libs/langchain_v1/uv.lock @@ -1863,7 +1863,7 @@ wheels = [ [[package]] name = "langchain" -version = "1.2.2" +version = "1.2.3" source = { editable = "." } dependencies = [ { name = "langchain-core" }, diff --git a/libs/standard-tests/langchain_tests/integration_tests/__init__.py b/libs/standard-tests/langchain_tests/integration_tests/__init__.py index 2a311bb8c9d..fe898c7860d 100644 --- a/libs/standard-tests/langchain_tests/integration_tests/__init__.py +++ b/libs/standard-tests/langchain_tests/integration_tests/__init__.py @@ -19,13 +19,19 @@ modules = [ for module in modules: pytest.register_assert_rewrite(f"langchain_tests.integration_tests.{module}") -from .base_store import BaseStoreAsyncTests, BaseStoreSyncTests -from .cache import AsyncCacheTestSuite, SyncCacheTestSuite -from .chat_models import ChatModelIntegrationTests -from .embeddings import EmbeddingsIntegrationTests -from .retrievers import RetrieversIntegrationTests -from .tools import ToolsIntegrationTests -from .vectorstores import VectorStoreIntegrationTests +from langchain_tests.integration_tests.base_store import ( + BaseStoreAsyncTests, + BaseStoreSyncTests, +) +from langchain_tests.integration_tests.cache import ( + AsyncCacheTestSuite, + SyncCacheTestSuite, +) +from langchain_tests.integration_tests.chat_models import ChatModelIntegrationTests +from langchain_tests.integration_tests.embeddings import EmbeddingsIntegrationTests +from langchain_tests.integration_tests.retrievers import RetrieversIntegrationTests +from langchain_tests.integration_tests.tools import ToolsIntegrationTests +from langchain_tests.integration_tests.vectorstores import VectorStoreIntegrationTests __all__ = [ "AsyncCacheTestSuite", diff --git a/libs/standard-tests/langchain_tests/unit_tests/__init__.py b/libs/standard-tests/langchain_tests/unit_tests/__init__.py index 5ba211de31e..5ece84b169e 100644 --- a/libs/standard-tests/langchain_tests/unit_tests/__init__.py +++ b/libs/standard-tests/langchain_tests/unit_tests/__init__.py @@ -15,8 +15,8 @@ modules = [ for module in modules: pytest.register_assert_rewrite(f"langchain_tests.unit_tests.{module}") -from .chat_models import ChatModelUnitTests -from .embeddings import EmbeddingsUnitTests -from .tools import ToolsUnitTests +from langchain_tests.unit_tests.chat_models import ChatModelUnitTests +from langchain_tests.unit_tests.embeddings import EmbeddingsUnitTests +from langchain_tests.unit_tests.tools import ToolsUnitTests __all__ = ["ChatModelUnitTests", "EmbeddingsUnitTests", "ToolsUnitTests"] diff --git a/libs/standard-tests/pyproject.toml b/libs/standard-tests/pyproject.toml index d44760c01f6..9bfb6ca4bc0 100644 --- a/libs/standard-tests/pyproject.toml +++ b/libs/standard-tests/pyproject.toml @@ -90,6 +90,9 @@ flake8-annotations.mypy-init-return = true flake8-type-checking.runtime-evaluated-base-classes = ["pydantic.BaseModel","langchain_core.load.serializable.Serializable","langchain_core.runnables.base.RunnableSerializable"] pep8-naming.classmethod-decorators = [ "classmethod", "langchain_core.utils.pydantic.pre_init", "pydantic.field_validator", "pydantic.v1.root_validator",] +[tool.ruff.lint.flake8-tidy-imports] +ban-relative-imports = "all" + [tool.ruff.lint.pydocstyle] convention = "google" ignore-var-parameters = true # ignore missing documentation for *args and **kwargs parameters diff --git a/libs/standard-tests/tests/__init__.py b/libs/standard-tests/tests/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/libs/standard-tests/tests/unit_tests/test_custom_chat_model.py b/libs/standard-tests/tests/unit_tests/test_custom_chat_model.py index c14b2ac8482..78434e9e095 100644 --- a/libs/standard-tests/tests/unit_tests/test_custom_chat_model.py +++ b/libs/standard-tests/tests/unit_tests/test_custom_chat_model.py @@ -8,8 +8,7 @@ import pytest from langchain_tests.integration_tests import ChatModelIntegrationTests from langchain_tests.unit_tests import ChatModelUnitTests - -from .custom_chat_model import ChatParrotLink +from tests.unit_tests.custom_chat_model import ChatParrotLink if TYPE_CHECKING: from langchain_core.language_models.chat_models import BaseChatModel diff --git a/libs/standard-tests/uv.lock b/libs/standard-tests/uv.lock index abd5765bb5d..65577adefd4 100644 --- a/libs/standard-tests/uv.lock +++ b/libs/standard-tests/uv.lock @@ -321,7 +321,7 @@ wheels = [ [[package]] name = "langchain-core" -version = "1.2.5" +version = "1.2.6" source = { editable = "../core" } dependencies = [ { name = "jsonpatch" },