diff --git a/libs/core/langchain_core/callbacks/base.py b/libs/core/langchain_core/callbacks/base.py index 98fd824ec18..1c0fd19de59 100644 --- a/libs/core/langchain_core/callbacks/base.py +++ b/libs/core/langchain_core/callbacks/base.py @@ -3,13 +3,14 @@ from __future__ import annotations import logging -from collections.abc import Sequence from typing import TYPE_CHECKING, Any, Optional, TypeVar, Union -from uuid import UUID - -from tenacity import RetryCallState if TYPE_CHECKING: + from collections.abc import Sequence + from uuid import UUID + + from tenacity import RetryCallState + from langchain_core.agents import AgentAction, AgentFinish from langchain_core.documents import Document from langchain_core.messages import BaseMessage diff --git a/libs/core/langchain_core/callbacks/file.py b/libs/core/langchain_core/callbacks/file.py index 961b0c9bc24..f7fe7e09595 100644 --- a/libs/core/langchain_core/callbacks/file.py +++ b/libs/core/langchain_core/callbacks/file.py @@ -2,12 +2,14 @@ from __future__ import annotations -from typing import Any, Optional, TextIO, cast +from typing import TYPE_CHECKING, Any, Optional, TextIO, cast -from langchain_core.agents import AgentAction, AgentFinish from langchain_core.callbacks import BaseCallbackHandler from langchain_core.utils.input import print_text +if TYPE_CHECKING: + from langchain_core.agents import AgentAction, AgentFinish + class FileCallbackHandler(BaseCallbackHandler): """Callback Handler that writes to a file. diff --git a/libs/core/langchain_core/callbacks/manager.py b/libs/core/langchain_core/callbacks/manager.py index f675b230c87..689003de3e6 100644 --- a/libs/core/langchain_core/callbacks/manager.py +++ b/libs/core/langchain_core/callbacks/manager.py @@ -5,7 +5,6 @@ import functools import logging import uuid from abc import ABC, abstractmethod -from collections.abc import AsyncGenerator, Coroutine, Generator, Sequence from concurrent.futures import ThreadPoolExecutor from contextlib import asynccontextmanager, contextmanager from contextvars import copy_context @@ -21,7 +20,6 @@ from typing import ( from uuid import UUID from langsmith.run_helpers import get_tracing_context -from tenacity import RetryCallState from langchain_core.callbacks.base import ( BaseCallbackHandler, @@ -39,6 +37,10 @@ from langchain_core.tracers.schemas import Run from langchain_core.utils.env import env_var_is_set if TYPE_CHECKING: + from collections.abc import AsyncGenerator, Coroutine, Generator, Sequence + + from tenacity import RetryCallState + from langchain_core.agents import AgentAction, AgentFinish from langchain_core.documents import Document from langchain_core.outputs import ChatGenerationChunk, GenerationChunk, LLMResult diff --git a/libs/core/langchain_core/chat_history.py b/libs/core/langchain_core/chat_history.py index 1b5c1e7f782..9e74dfca2bb 100644 --- a/libs/core/langchain_core/chat_history.py +++ b/libs/core/langchain_core/chat_history.py @@ -17,8 +17,7 @@ from __future__ import annotations from abc import ABC, abstractmethod -from collections.abc import Sequence -from typing import Union +from typing import TYPE_CHECKING, Union from pydantic import BaseModel, Field @@ -29,6 +28,9 @@ from langchain_core.messages import ( get_buffer_string, ) +if TYPE_CHECKING: + from collections.abc import Sequence + class BaseChatMessageHistory(ABC): """Abstract base class for storing chat message history. diff --git a/libs/core/langchain_core/document_loaders/base.py b/libs/core/langchain_core/document_loaders/base.py index b2cd20038eb..d889fbec8f9 100644 --- a/libs/core/langchain_core/document_loaders/base.py +++ b/libs/core/langchain_core/document_loaders/base.py @@ -3,16 +3,17 @@ from __future__ import annotations from abc import ABC, abstractmethod -from collections.abc import AsyncIterator, Iterator from typing import TYPE_CHECKING, Optional -from langchain_core.documents import Document from langchain_core.runnables import run_in_executor if TYPE_CHECKING: + from collections.abc import AsyncIterator, Iterator + from langchain_text_splitters import TextSplitter -from langchain_core.documents.base import Blob + from langchain_core.documents import Document + from langchain_core.documents.base import Blob class BaseLoader(ABC): # noqa: B024 diff --git a/libs/core/langchain_core/document_loaders/blob_loaders.py b/libs/core/langchain_core/document_loaders/blob_loaders.py index 3c0d1986f73..098c325a50b 100644 --- a/libs/core/langchain_core/document_loaders/blob_loaders.py +++ b/libs/core/langchain_core/document_loaders/blob_loaders.py @@ -8,12 +8,15 @@ In addition, content loading code should provide a lazy loading interface by def from __future__ import annotations from abc import ABC, abstractmethod -from collections.abc import Iterable +from typing import TYPE_CHECKING # Re-export Blob and PathLike for backwards compatibility from langchain_core.documents.base import Blob as Blob from langchain_core.documents.base import PathLike as PathLike +if TYPE_CHECKING: + from collections.abc import Iterable + class BlobLoader(ABC): """Abstract interface for blob loaders implementation. diff --git a/libs/core/langchain_core/documents/base.py b/libs/core/langchain_core/documents/base.py index 2adfe1a7183..fb4fcd0987e 100644 --- a/libs/core/langchain_core/documents/base.py +++ b/libs/core/langchain_core/documents/base.py @@ -2,15 +2,17 @@ from __future__ import annotations import contextlib import mimetypes -from collections.abc import Generator from io import BufferedReader, BytesIO from pathlib import PurePath -from typing import Any, Literal, Optional, Union, cast +from typing import TYPE_CHECKING, Any, Literal, Optional, Union, cast from pydantic import ConfigDict, Field, field_validator, model_validator from langchain_core.load.serializable import Serializable +if TYPE_CHECKING: + from collections.abc import Generator + PathLike = Union[str, PurePath] diff --git a/libs/core/langchain_core/documents/compressor.py b/libs/core/langchain_core/documents/compressor.py index 31ae2901a7b..3c9217e4f7e 100644 --- a/libs/core/langchain_core/documents/compressor.py +++ b/libs/core/langchain_core/documents/compressor.py @@ -1,15 +1,18 @@ from __future__ import annotations from abc import ABC, abstractmethod -from collections.abc import Sequence -from typing import Optional +from typing import TYPE_CHECKING, Optional from pydantic import BaseModel -from langchain_core.callbacks import Callbacks -from langchain_core.documents import Document from langchain_core.runnables import run_in_executor +if TYPE_CHECKING: + from collections.abc import Sequence + + from langchain_core.callbacks import Callbacks + from langchain_core.documents import Document + class BaseDocumentCompressor(BaseModel, ABC): """Base class for document compressors. diff --git a/libs/core/langchain_core/documents/transformers.py b/libs/core/langchain_core/documents/transformers.py index 12167f820f9..5be5e98c060 100644 --- a/libs/core/langchain_core/documents/transformers.py +++ b/libs/core/langchain_core/documents/transformers.py @@ -1,12 +1,13 @@ from __future__ import annotations from abc import ABC, abstractmethod -from collections.abc import Sequence from typing import TYPE_CHECKING, Any from langchain_core.runnables.config import run_in_executor if TYPE_CHECKING: + from collections.abc import Sequence + from langchain_core.documents import Document diff --git a/libs/core/langchain_core/example_selectors/semantic_similarity.py b/libs/core/langchain_core/example_selectors/semantic_similarity.py index b27122ec36d..cd6f82bc8c0 100644 --- a/libs/core/langchain_core/example_selectors/semantic_similarity.py +++ b/libs/core/langchain_core/example_selectors/semantic_similarity.py @@ -7,11 +7,11 @@ from typing import TYPE_CHECKING, Any, Optional from pydantic import BaseModel, ConfigDict -from langchain_core.documents import Document from langchain_core.example_selectors.base import BaseExampleSelector from langchain_core.vectorstores import VectorStore if TYPE_CHECKING: + from langchain_core.documents import Document from langchain_core.embeddings import Embeddings diff --git a/libs/core/langchain_core/indexing/base.py b/libs/core/langchain_core/indexing/base.py index d2a7d09e58a..62e0a720c0a 100644 --- a/libs/core/langchain_core/indexing/base.py +++ b/libs/core/langchain_core/indexing/base.py @@ -3,14 +3,17 @@ from __future__ import annotations import abc import time from abc import ABC, abstractmethod -from collections.abc import Sequence -from typing import Any, Optional, TypedDict +from typing import TYPE_CHECKING, Any, Optional, TypedDict from langchain_core._api import beta -from langchain_core.documents import Document from langchain_core.retrievers import BaseRetriever from langchain_core.runnables import run_in_executor +if TYPE_CHECKING: + from collections.abc import Sequence + + from langchain_core.documents import Document + class RecordManager(ABC): """Abstract base class representing the interface for a record manager. diff --git a/libs/core/langchain_core/language_models/chat_models.py b/libs/core/langchain_core/language_models/chat_models.py index 1bba3ffd5c8..d380833ae46 100644 --- a/libs/core/langchain_core/language_models/chat_models.py +++ b/libs/core/langchain_core/language_models/chat_models.py @@ -4,7 +4,6 @@ import asyncio import inspect import json import typing -import uuid import warnings from abc import ABC, abstractmethod from collections.abc import AsyncIterator, Iterator, Sequence @@ -70,6 +69,8 @@ from langchain_core.utils.function_calling import convert_to_openai_tool from langchain_core.utils.pydantic import TypeBaseModel, is_basemodel_subclass if TYPE_CHECKING: + import uuid + from langchain_core.output_parsers.base import OutputParserLike from langchain_core.runnables import Runnable, RunnableConfig from langchain_core.tools import BaseTool diff --git a/libs/core/langchain_core/language_models/llms.py b/libs/core/langchain_core/language_models/llms.py index 4ba16f51696..9af4d4e9ac5 100644 --- a/libs/core/langchain_core/language_models/llms.py +++ b/libs/core/langchain_core/language_models/llms.py @@ -7,12 +7,12 @@ import functools import inspect import json import logging -import uuid import warnings from abc import ABC, abstractmethod from collections.abc import AsyncIterator, Iterator, Sequence from pathlib import Path from typing import ( + TYPE_CHECKING, Any, Callable, Optional, @@ -61,6 +61,9 @@ from langchain_core.prompt_values import ChatPromptValue, PromptValue, StringPro from langchain_core.runnables import RunnableConfig, ensure_config, get_config_list from langchain_core.runnables.config import run_in_executor +if TYPE_CHECKING: + import uuid + logger = logging.getLogger(__name__) diff --git a/libs/core/langchain_core/messages/base.py b/libs/core/langchain_core/messages/base.py index 5614f6fb7dd..a4693e48c32 100644 --- a/libs/core/langchain_core/messages/base.py +++ b/libs/core/langchain_core/messages/base.py @@ -1,6 +1,5 @@ from __future__ import annotations -from collections.abc import Sequence from typing import TYPE_CHECKING, Any, Optional, Union, cast from pydantic import ConfigDict, Field, field_validator @@ -11,6 +10,8 @@ from langchain_core.utils._merge import merge_dicts, merge_lists from langchain_core.utils.interactive_env import is_interactive_env if TYPE_CHECKING: + from collections.abc import Sequence + from langchain_core.prompts.chat import ChatPromptTemplate diff --git a/libs/core/langchain_core/output_parsers/list.py b/libs/core/langchain_core/output_parsers/list.py index bedbdf47b7a..6977079f5ae 100644 --- a/libs/core/langchain_core/output_parsers/list.py +++ b/libs/core/langchain_core/output_parsers/list.py @@ -4,14 +4,16 @@ import csv import re from abc import abstractmethod from collections import deque -from collections.abc import AsyncIterator, Iterator from io import StringIO +from typing import TYPE_CHECKING, TypeVar, Union from typing import Optional as Optional -from typing import TypeVar, Union from langchain_core.messages import BaseMessage from langchain_core.output_parsers.transform import BaseTransformOutputParser +if TYPE_CHECKING: + from collections.abc import AsyncIterator, Iterator + T = TypeVar("T") diff --git a/libs/core/langchain_core/output_parsers/transform.py b/libs/core/langchain_core/output_parsers/transform.py index 0636d2d661b..d484b6d06cd 100644 --- a/libs/core/langchain_core/output_parsers/transform.py +++ b/libs/core/langchain_core/output_parsers/transform.py @@ -1,6 +1,5 @@ from __future__ import annotations -from collections.abc import AsyncIterator, Iterator from typing import ( TYPE_CHECKING, Any, @@ -19,6 +18,8 @@ from langchain_core.outputs import ( from langchain_core.runnables.config import run_in_executor if TYPE_CHECKING: + from collections.abc import AsyncIterator, Iterator + from langchain_core.runnables import RunnableConfig diff --git a/libs/core/langchain_core/outputs/chat_generation.py b/libs/core/langchain_core/outputs/chat_generation.py index d40e1fd5362..9eac7514d4e 100644 --- a/libs/core/langchain_core/outputs/chat_generation.py +++ b/libs/core/langchain_core/outputs/chat_generation.py @@ -1,14 +1,16 @@ from __future__ import annotations -from typing import Literal, Union +from typing import TYPE_CHECKING, Literal, Union from pydantic import model_validator -from typing_extensions import Self from langchain_core.messages import BaseMessage, BaseMessageChunk from langchain_core.outputs.generation import Generation from langchain_core.utils._merge import merge_dicts +if TYPE_CHECKING: + from typing_extensions import Self + class ChatGeneration(Generation): """A single chat generation output. diff --git a/libs/core/langchain_core/prompts/chat.py b/libs/core/langchain_core/prompts/chat.py index 80d427c8be6..c819bbe06d7 100644 --- a/libs/core/langchain_core/prompts/chat.py +++ b/libs/core/langchain_core/prompts/chat.py @@ -3,9 +3,8 @@ from __future__ import annotations from abc import ABC, abstractmethod -from collections.abc import Sequence -from pathlib import Path from typing import ( + TYPE_CHECKING, Annotated, Any, Optional, @@ -47,6 +46,10 @@ from langchain_core.prompts.string import ( from langchain_core.utils import get_colored_text from langchain_core.utils.interactive_env import is_interactive_env +if TYPE_CHECKING: + from collections.abc import Sequence + from pathlib import Path + class BaseMessagePromptTemplate(Serializable, ABC): """Base class for message prompt templates.""" diff --git a/libs/core/langchain_core/prompts/few_shot.py b/libs/core/langchain_core/prompts/few_shot.py index 5794a913325..f14699b47bf 100644 --- a/libs/core/langchain_core/prompts/few_shot.py +++ b/libs/core/langchain_core/prompts/few_shot.py @@ -2,8 +2,7 @@ from __future__ import annotations -from pathlib import Path -from typing import Any, Literal, Optional, Union +from typing import TYPE_CHECKING, Any, Literal, Optional, Union from pydantic import ( BaseModel, @@ -11,7 +10,6 @@ from pydantic import ( Field, model_validator, ) -from typing_extensions import Self from langchain_core.example_selectors import BaseExampleSelector from langchain_core.messages import BaseMessage, get_buffer_string @@ -27,6 +25,11 @@ from langchain_core.prompts.string import ( get_template_variables, ) +if TYPE_CHECKING: + from pathlib import Path + + from typing_extensions import Self + class _FewShotPromptTemplateMixin(BaseModel): """Prompt template that contains few shot examples.""" diff --git a/libs/core/langchain_core/prompts/prompt.py b/libs/core/langchain_core/prompts/prompt.py index 37f7eda64ac..888fc9ccbc9 100644 --- a/libs/core/langchain_core/prompts/prompt.py +++ b/libs/core/langchain_core/prompts/prompt.py @@ -3,8 +3,7 @@ from __future__ import annotations import warnings -from pathlib import Path -from typing import Any, Optional, Union +from typing import TYPE_CHECKING, Any, Optional, Union from pydantic import BaseModel, model_validator @@ -16,7 +15,11 @@ from langchain_core.prompts.string import ( get_template_variables, mustache_schema, ) -from langchain_core.runnables.config import RunnableConfig + +if TYPE_CHECKING: + from pathlib import Path + + from langchain_core.runnables.config import RunnableConfig class PromptTemplate(StringPromptTemplate): diff --git a/libs/core/langchain_core/runnables/base.py b/libs/core/langchain_core/runnables/base.py index 1840e3dbe7b..33f12137776 100644 --- a/libs/core/langchain_core/runnables/base.py +++ b/libs/core/langchain_core/runnables/base.py @@ -60,7 +60,6 @@ from langchain_core.runnables.config import ( run_in_executor, ) from langchain_core.runnables.graph import Graph -from langchain_core.runnables.schema import StreamEvent from langchain_core.runnables.utils import ( AddableDict, AnyConfigurableField, @@ -94,6 +93,7 @@ if TYPE_CHECKING: from langchain_core.runnables.fallbacks import ( RunnableWithFallbacks as RunnableWithFallbacksT, ) + from langchain_core.runnables.schema import StreamEvent from langchain_core.tools import BaseTool from langchain_core.tracers.log_stream import ( RunLog, diff --git a/libs/core/langchain_core/runnables/configurable.py b/libs/core/langchain_core/runnables/configurable.py index b59d0239fb1..79473e5d268 100644 --- a/libs/core/langchain_core/runnables/configurable.py +++ b/libs/core/langchain_core/runnables/configurable.py @@ -7,6 +7,7 @@ from collections.abc import AsyncIterator, Iterator, Sequence from collections.abc import Mapping as Mapping from functools import wraps from typing import ( + TYPE_CHECKING, Any, Callable, Optional, @@ -26,7 +27,6 @@ from langchain_core.runnables.config import ( get_executor_for_config, merge_configs, ) -from langchain_core.runnables.graph import Graph from langchain_core.runnables.utils import ( AnyConfigurableField, ConfigurableField, @@ -39,6 +39,9 @@ from langchain_core.runnables.utils import ( get_unique_config_specs, ) +if TYPE_CHECKING: + from langchain_core.runnables.graph import Graph + class DynamicRunnable(RunnableSerializable[Input, Output]): """Serializable Runnable that can be dynamically configured. diff --git a/libs/core/langchain_core/runnables/graph.py b/libs/core/langchain_core/runnables/graph.py index 84b86994dbf..99bcae5abf3 100644 --- a/libs/core/langchain_core/runnables/graph.py +++ b/libs/core/langchain_core/runnables/graph.py @@ -2,7 +2,6 @@ from __future__ import annotations import inspect from collections import defaultdict -from collections.abc import Sequence from dataclasses import dataclass, field from enum import Enum from typing import ( @@ -18,11 +17,13 @@ from typing import ( ) from uuid import UUID, uuid4 -from pydantic import BaseModel - from langchain_core.utils.pydantic import _IgnoreUnserializable, is_basemodel_subclass if TYPE_CHECKING: + from collections.abc import Sequence + + from pydantic import BaseModel + from langchain_core.runnables.base import Runnable as RunnableType diff --git a/libs/core/langchain_core/runnables/passthrough.py b/libs/core/langchain_core/runnables/passthrough.py index b0da175ae32..95c27e7bcc6 100644 --- a/libs/core/langchain_core/runnables/passthrough.py +++ b/libs/core/langchain_core/runnables/passthrough.py @@ -5,7 +5,7 @@ from __future__ import annotations import asyncio import inspect import threading -from collections.abc import AsyncIterator, Awaitable, Iterator, Mapping +from collections.abc import Awaitable from typing import ( TYPE_CHECKING, Any, @@ -32,7 +32,6 @@ from langchain_core.runnables.config import ( get_executor_for_config, patch_config, ) -from langchain_core.runnables.graph import Graph from langchain_core.runnables.utils import ( AddableDict, ConfigurableFieldSpec, @@ -42,10 +41,13 @@ from langchain_core.utils.iter import safetee from langchain_core.utils.pydantic import create_model_v2 if TYPE_CHECKING: + from collections.abc import AsyncIterator, Iterator, Mapping + from langchain_core.callbacks.manager import ( AsyncCallbackManagerForChainRun, CallbackManagerForChainRun, ) + from langchain_core.runnables.graph import Graph def identity(x: Other) -> Other: diff --git a/libs/core/langchain_core/runnables/router.py b/libs/core/langchain_core/runnables/router.py index 29c6359c69a..8d679ad35c9 100644 --- a/libs/core/langchain_core/runnables/router.py +++ b/libs/core/langchain_core/runnables/router.py @@ -1,8 +1,9 @@ from __future__ import annotations -from collections.abc import AsyncIterator, Iterator, Mapping +from collections.abc import Mapping from itertools import starmap from typing import ( + TYPE_CHECKING, Any, Callable, Optional, @@ -31,6 +32,9 @@ from langchain_core.runnables.utils import ( get_unique_config_specs, ) +if TYPE_CHECKING: + from collections.abc import AsyncIterator, Iterator + class RouterInput(TypedDict): """Router input. diff --git a/libs/core/langchain_core/runnables/schema.py b/libs/core/langchain_core/runnables/schema.py index dcfd32b8b39..20ad580070a 100644 --- a/libs/core/langchain_core/runnables/schema.py +++ b/libs/core/langchain_core/runnables/schema.py @@ -2,11 +2,13 @@ from __future__ import annotations -from collections.abc import Sequence -from typing import Any, Literal, Union +from typing import TYPE_CHECKING, Any, Literal, Union from typing_extensions import NotRequired, TypedDict +if TYPE_CHECKING: + from collections.abc import Sequence + class EventData(TypedDict, total=False): """Data associated with a streaming event.""" diff --git a/libs/core/langchain_core/runnables/utils.py b/libs/core/langchain_core/runnables/utils.py index 75063c7db58..6ed4e7d6816 100644 --- a/libs/core/langchain_core/runnables/utils.py +++ b/libs/core/langchain_core/runnables/utils.py @@ -6,19 +6,11 @@ import ast import asyncio import inspect import textwrap -from collections.abc import ( - AsyncIterable, - AsyncIterator, - Awaitable, - Coroutine, - Iterable, - Mapping, - Sequence, -) from functools import lru_cache from inspect import signature from itertools import groupby from typing import ( + TYPE_CHECKING, Any, Callable, NamedTuple, @@ -30,11 +22,22 @@ from typing import ( from typing_extensions import TypeGuard, override -from langchain_core.runnables.schema import StreamEvent - # Re-export create-model for backwards compatibility from langchain_core.utils.pydantic import create_model as create_model +if TYPE_CHECKING: + from collections.abc import ( + AsyncIterable, + AsyncIterator, + Awaitable, + Coroutine, + Iterable, + Mapping, + Sequence, + ) + + from langchain_core.runnables.schema import StreamEvent + Input = TypeVar("Input", contravariant=True) # Output type should implement __concat__, as eg str, list, dict do Output = TypeVar("Output", covariant=True) diff --git a/libs/core/langchain_core/structured_query.py b/libs/core/langchain_core/structured_query.py index 8aacbfbcc60..c0c502da005 100644 --- a/libs/core/langchain_core/structured_query.py +++ b/libs/core/langchain_core/structured_query.py @@ -3,12 +3,14 @@ from __future__ import annotations from abc import ABC, abstractmethod -from collections.abc import Sequence from enum import Enum -from typing import Any, Optional, Union +from typing import TYPE_CHECKING, Any, Optional, Union from pydantic import BaseModel +if TYPE_CHECKING: + from collections.abc import Sequence + class Visitor(ABC): """Defines interface for IR translation using a visitor pattern.""" diff --git a/libs/core/langchain_core/tools/base.py b/libs/core/langchain_core/tools/base.py index 5a618f6a160..5e1a8a47523 100644 --- a/libs/core/langchain_core/tools/base.py +++ b/libs/core/langchain_core/tools/base.py @@ -4,13 +4,12 @@ import asyncio import functools import inspect import json -import uuid import warnings from abc import ABC, abstractmethod -from collections.abc import Sequence from contextvars import copy_context from inspect import signature from typing import ( + TYPE_CHECKING, Annotated, Any, Callable, @@ -68,6 +67,10 @@ from langchain_core.utils.pydantic import ( is_pydantic_v2_subclass, ) +if TYPE_CHECKING: + import uuid + from collections.abc import Sequence + FILTERED_ARGS = ("run_manager", "callbacks") diff --git a/libs/core/langchain_core/tools/retriever.py b/libs/core/langchain_core/tools/retriever.py index b1036058ca5..0bc26ce2a77 100644 --- a/libs/core/langchain_core/tools/retriever.py +++ b/libs/core/langchain_core/tools/retriever.py @@ -1,21 +1,23 @@ from __future__ import annotations from functools import partial -from typing import Literal, Optional, Union +from typing import TYPE_CHECKING, Literal, Optional, Union from pydantic import BaseModel, Field -from langchain_core.callbacks import Callbacks -from langchain_core.documents import Document from langchain_core.prompts import ( BasePromptTemplate, PromptTemplate, aformat_document, format_document, ) -from langchain_core.retrievers import BaseRetriever from langchain_core.tools.simple import Tool +if TYPE_CHECKING: + from langchain_core.callbacks import Callbacks + from langchain_core.documents import Document + from langchain_core.retrievers import BaseRetriever + class RetrieverInput(BaseModel): """Input to the retriever.""" diff --git a/libs/core/langchain_core/tools/simple.py b/libs/core/langchain_core/tools/simple.py index 370d2091a68..d9806c3e94b 100644 --- a/libs/core/langchain_core/tools/simple.py +++ b/libs/core/langchain_core/tools/simple.py @@ -3,6 +3,7 @@ from __future__ import annotations from collections.abc import Awaitable from inspect import signature from typing import ( + TYPE_CHECKING, Any, Callable, Optional, @@ -13,7 +14,6 @@ from langchain_core.callbacks import ( AsyncCallbackManagerForToolRun, CallbackManagerForToolRun, ) -from langchain_core.messages import ToolCall from langchain_core.runnables import RunnableConfig, run_in_executor from langchain_core.tools.base import ( ArgsSchema, @@ -22,6 +22,9 @@ from langchain_core.tools.base import ( _get_runnable_config_param, ) +if TYPE_CHECKING: + from langchain_core.messages import ToolCall + class Tool(BaseTool): """Tool that takes in function or coroutine directly.""" diff --git a/libs/core/langchain_core/tools/structured.py b/libs/core/langchain_core/tools/structured.py index f168289ecde..6d7620e7627 100644 --- a/libs/core/langchain_core/tools/structured.py +++ b/libs/core/langchain_core/tools/structured.py @@ -4,6 +4,7 @@ import textwrap from collections.abc import Awaitable from inspect import signature from typing import ( + TYPE_CHECKING, Annotated, Any, Callable, @@ -18,7 +19,6 @@ from langchain_core.callbacks import ( AsyncCallbackManagerForToolRun, CallbackManagerForToolRun, ) -from langchain_core.messages import ToolCall from langchain_core.runnables import RunnableConfig, run_in_executor from langchain_core.tools.base import ( FILTERED_ARGS, @@ -29,6 +29,9 @@ from langchain_core.tools.base import ( ) from langchain_core.utils.pydantic import is_basemodel_subclass +if TYPE_CHECKING: + from langchain_core.messages import ToolCall + class StructuredTool(BaseTool): """Tool that can operate on any number of inputs.""" diff --git a/libs/core/langchain_core/tracers/base.py b/libs/core/langchain_core/tracers/base.py index f3ae965f602..f452d586f50 100644 --- a/libs/core/langchain_core/tracers/base.py +++ b/libs/core/langchain_core/tracers/base.py @@ -5,26 +5,27 @@ from __future__ import annotations import asyncio import logging from abc import ABC, abstractmethod -from collections.abc import Sequence from typing import ( TYPE_CHECKING, Any, Optional, Union, ) -from uuid import UUID - -from tenacity import RetryCallState from langchain_core.callbacks.base import AsyncCallbackHandler, BaseCallbackHandler from langchain_core.exceptions import TracerException # noqa -from langchain_core.messages import BaseMessage -from langchain_core.outputs import ChatGenerationChunk, GenerationChunk, LLMResult from langchain_core.tracers.core import _TracerCore -from langchain_core.tracers.schemas import Run if TYPE_CHECKING: + from collections.abc import Sequence + from uuid import UUID + + from tenacity import RetryCallState + from langchain_core.documents import Document + from langchain_core.messages import BaseMessage + from langchain_core.outputs import ChatGenerationChunk, GenerationChunk, LLMResult + from langchain_core.tracers.schemas import Run logger = logging.getLogger(__name__) diff --git a/libs/core/langchain_core/tracers/context.py b/libs/core/langchain_core/tracers/context.py index d36adc9bc8e..a947f162fcd 100644 --- a/libs/core/langchain_core/tracers/context.py +++ b/libs/core/langchain_core/tracers/context.py @@ -1,6 +1,5 @@ from __future__ import annotations -from collections.abc import Generator from contextlib import contextmanager from contextvars import ContextVar from typing import ( @@ -18,13 +17,15 @@ from langsmith import utils as ls_utils from langchain_core.tracers.langchain import LangChainTracer from langchain_core.tracers.run_collector import RunCollectorCallbackHandler -from langchain_core.tracers.schemas import TracerSessionV1 if TYPE_CHECKING: + from collections.abc import Generator + from langsmith import Client as LangSmithClient from langchain_core.callbacks.base import BaseCallbackHandler, Callbacks from langchain_core.callbacks.manager import AsyncCallbackManager, CallbackManager + from langchain_core.tracers.schemas import TracerSessionV1 # for backwards partial compatibility if this is imported by users but unused tracing_callback_var: Any = None diff --git a/libs/core/langchain_core/tracers/core.py b/libs/core/langchain_core/tracers/core.py index d3544df04e3..599c4000cd6 100644 --- a/libs/core/langchain_core/tracers/core.py +++ b/libs/core/langchain_core/tracers/core.py @@ -6,7 +6,6 @@ import logging import sys import traceback from abc import ABC, abstractmethod -from collections.abc import Coroutine, Sequence from datetime import datetime, timezone from typing import ( TYPE_CHECKING, @@ -16,13 +15,9 @@ from typing import ( Union, cast, ) -from uuid import UUID - -from tenacity import RetryCallState from langchain_core.exceptions import TracerException from langchain_core.load import dumpd -from langchain_core.messages import BaseMessage from langchain_core.outputs import ( ChatGeneration, ChatGenerationChunk, @@ -32,7 +27,13 @@ from langchain_core.outputs import ( from langchain_core.tracers.schemas import Run if TYPE_CHECKING: + from collections.abc import Coroutine, Sequence + from uuid import UUID + + from tenacity import RetryCallState + from langchain_core.documents import Document + from langchain_core.messages import BaseMessage logger = logging.getLogger(__name__) diff --git a/libs/core/langchain_core/tracers/evaluation.py b/libs/core/langchain_core/tracers/evaluation.py index 425c1c01222..0a918cd2e9d 100644 --- a/libs/core/langchain_core/tracers/evaluation.py +++ b/libs/core/langchain_core/tracers/evaluation.py @@ -5,9 +5,8 @@ from __future__ import annotations import logging import threading import weakref -from collections.abc import Sequence from concurrent.futures import Future, ThreadPoolExecutor, wait -from typing import Any, Optional, Union, cast +from typing import TYPE_CHECKING, Any, Optional, Union, cast from uuid import UUID import langsmith @@ -17,7 +16,11 @@ from langchain_core.tracers import langchain as langchain_tracer from langchain_core.tracers.base import BaseTracer from langchain_core.tracers.context import tracing_v2_enabled from langchain_core.tracers.langchain import _get_executor -from langchain_core.tracers.schemas import Run + +if TYPE_CHECKING: + from collections.abc import Sequence + + from langchain_core.tracers.schemas import Run logger = logging.getLogger(__name__) diff --git a/libs/core/langchain_core/tracers/event_stream.py b/libs/core/langchain_core/tracers/event_stream.py index b7f3db8595d..2a5f6b5f840 100644 --- a/libs/core/langchain_core/tracers/event_stream.py +++ b/libs/core/langchain_core/tracers/event_stream.py @@ -5,7 +5,6 @@ from __future__ import annotations import asyncio import contextlib import logging -from collections.abc import AsyncIterator, Iterator, Sequence from typing import ( TYPE_CHECKING, Any, @@ -37,13 +36,15 @@ from langchain_core.runnables.utils import ( _RootEventFilter, ) from langchain_core.tracers._streaming import _StreamingCallbackHandler -from langchain_core.tracers.log_stream import LogEntry from langchain_core.tracers.memory_stream import _MemoryStream from langchain_core.utils.aiter import aclosing, py_anext if TYPE_CHECKING: + from collections.abc import AsyncIterator, Iterator, Sequence + from langchain_core.documents import Document from langchain_core.runnables import Runnable, RunnableConfig + from langchain_core.tracers.log_stream import LogEntry logger = logging.getLogger(__name__) diff --git a/libs/core/langchain_core/tracers/langchain.py b/libs/core/langchain_core/tracers/langchain.py index 56981bc81d8..7cdf5c92a32 100644 --- a/libs/core/langchain_core/tracers/langchain.py +++ b/libs/core/langchain_core/tracers/langchain.py @@ -22,12 +22,12 @@ from tenacity import ( from langchain_core.env import get_runtime_environment from langchain_core.load import dumpd -from langchain_core.outputs import ChatGenerationChunk, GenerationChunk from langchain_core.tracers.base import BaseTracer from langchain_core.tracers.schemas import Run if TYPE_CHECKING: from langchain_core.messages import BaseMessage + from langchain_core.outputs import ChatGenerationChunk, GenerationChunk logger = logging.getLogger(__name__) _LOGGED = set() diff --git a/libs/core/langchain_core/tracers/log_stream.py b/libs/core/langchain_core/tracers/log_stream.py index 2284ff7022f..1e0c26aa795 100644 --- a/libs/core/langchain_core/tracers/log_stream.py +++ b/libs/core/langchain_core/tracers/log_stream.py @@ -5,8 +5,8 @@ import contextlib import copy import threading from collections import defaultdict -from collections.abc import AsyncIterator, Iterator, Sequence from typing import ( + TYPE_CHECKING, Any, Literal, Optional, @@ -14,7 +14,6 @@ from typing import ( Union, overload, ) -from uuid import UUID import jsonpatch # type: ignore[import] from typing_extensions import NotRequired, TypedDict @@ -23,11 +22,16 @@ from langchain_core.load import dumps from langchain_core.load.load import load from langchain_core.outputs import ChatGenerationChunk, GenerationChunk from langchain_core.runnables import Runnable, RunnableConfig, ensure_config -from langchain_core.runnables.utils import Input, Output from langchain_core.tracers._streaming import _StreamingCallbackHandler from langchain_core.tracers.base import BaseTracer from langchain_core.tracers.memory_stream import _MemoryStream -from langchain_core.tracers.schemas import Run + +if TYPE_CHECKING: + from collections.abc import AsyncIterator, Iterator, Sequence + from uuid import UUID + + from langchain_core.runnables.utils import Input, Output + from langchain_core.tracers.schemas import Run class LogEntry(TypedDict): diff --git a/libs/core/langchain_core/tracers/root_listeners.py b/libs/core/langchain_core/tracers/root_listeners.py index 1530598fb75..c08861164ac 100644 --- a/libs/core/langchain_core/tracers/root_listeners.py +++ b/libs/core/langchain_core/tracers/root_listeners.py @@ -1,6 +1,5 @@ from collections.abc import Awaitable -from typing import Callable, Optional, Union -from uuid import UUID +from typing import TYPE_CHECKING, Callable, Optional, Union from langchain_core.runnables.config import ( RunnableConfig, @@ -10,6 +9,9 @@ from langchain_core.runnables.config import ( from langchain_core.tracers.base import AsyncBaseTracer, BaseTracer from langchain_core.tracers.schemas import Run +if TYPE_CHECKING: + from uuid import UUID + Listener = Union[Callable[[Run], None], Callable[[Run, RunnableConfig], None]] AsyncListener = Union[ Callable[[Run], Awaitable[None]], Callable[[Run, RunnableConfig], Awaitable[None]] diff --git a/libs/core/langchain_core/utils/json_schema.py b/libs/core/langchain_core/utils/json_schema.py index 38fab589909..72f20c38d22 100644 --- a/libs/core/langchain_core/utils/json_schema.py +++ b/libs/core/langchain_core/utils/json_schema.py @@ -1,8 +1,10 @@ from __future__ import annotations -from collections.abc import Sequence from copy import deepcopy -from typing import Any, Optional +from typing import TYPE_CHECKING, Any, Optional + +if TYPE_CHECKING: + from collections.abc import Sequence def _retrieve_ref(path: str, schema: dict) -> dict: diff --git a/libs/core/langchain_core/utils/mustache.py b/libs/core/langchain_core/utils/mustache.py index ee2ed8f2528..4c42c47fed9 100644 --- a/libs/core/langchain_core/utils/mustache.py +++ b/libs/core/langchain_core/utils/mustache.py @@ -8,6 +8,7 @@ import logging from collections.abc import Iterator, Mapping, Sequence from types import MappingProxyType from typing import ( + TYPE_CHECKING, Any, Literal, Optional, @@ -15,7 +16,8 @@ from typing import ( cast, ) -from typing_extensions import TypeAlias +if TYPE_CHECKING: + from typing_extensions import TypeAlias logger = logging.getLogger(__name__) diff --git a/libs/core/langchain_core/utils/pydantic.py b/libs/core/langchain_core/utils/pydantic.py index 6c4b4cb8c2f..0aff29c1bb1 100644 --- a/libs/core/langchain_core/utils/pydantic.py +++ b/libs/core/langchain_core/utils/pydantic.py @@ -9,6 +9,7 @@ from contextlib import nullcontext from functools import lru_cache, wraps from types import GenericAlias from typing import ( + TYPE_CHECKING, Any, Callable, Optional, @@ -29,13 +30,16 @@ from pydantic import ( from pydantic import ( create_model as _create_model_base, ) +from pydantic.fields import FieldInfo as FieldInfoV2 from pydantic.json_schema import ( DEFAULT_REF_TEMPLATE, GenerateJsonSchema, JsonSchemaMode, JsonSchemaValue, ) -from pydantic_core import core_schema + +if TYPE_CHECKING: + from pydantic_core import core_schema def get_pydantic_major_version() -> int: @@ -71,8 +75,8 @@ elif PYDANTIC_MAJOR_VERSION == 2: from pydantic.v1.fields import FieldInfo as FieldInfoV1 # type: ignore[assignment] # Union type needs to be last assignment to PydanticBaseModel to make mypy happy. - PydanticBaseModel = Union[BaseModel, pydantic.BaseModel] # type: ignore - TypeBaseModel = Union[type[BaseModel], type[pydantic.BaseModel]] # type: ignore + PydanticBaseModel = Union[BaseModel, pydantic.BaseModel] # type: ignore[assignment,misc] + TypeBaseModel = Union[type[BaseModel], type[pydantic.BaseModel]] # type: ignore[misc] else: msg = f"Unsupported Pydantic version: {PYDANTIC_MAJOR_VERSION}" raise ValueError(msg) @@ -357,7 +361,6 @@ def _create_subset_model( if PYDANTIC_MAJOR_VERSION == 2: from pydantic import BaseModel as BaseModelV2 - from pydantic.fields import FieldInfo as FieldInfoV2 from pydantic.v1 import BaseModel as BaseModelV1 @overload diff --git a/libs/core/langchain_core/vectorstores/base.py b/libs/core/langchain_core/vectorstores/base.py index b154a14b981..1cf1fd529fb 100644 --- a/libs/core/langchain_core/vectorstores/base.py +++ b/libs/core/langchain_core/vectorstores/base.py @@ -25,7 +25,6 @@ import logging import math import warnings from abc import ABC, abstractmethod -from collections.abc import Collection, Iterable, Iterator, Sequence from itertools import cycle from typing import ( TYPE_CHECKING, @@ -43,6 +42,8 @@ from langchain_core.retrievers import BaseRetriever, LangSmithRetrieverParams from langchain_core.runnables.config import run_in_executor if TYPE_CHECKING: + from collections.abc import Collection, Iterable, Iterator, Sequence + from langchain_core.callbacks.manager import ( AsyncCallbackManagerForRetrieverRun, CallbackManagerForRetrieverRun, diff --git a/libs/core/langchain_core/vectorstores/in_memory.py b/libs/core/langchain_core/vectorstores/in_memory.py index 5fb385a21c3..daf1dcdfc69 100644 --- a/libs/core/langchain_core/vectorstores/in_memory.py +++ b/libs/core/langchain_core/vectorstores/in_memory.py @@ -2,7 +2,6 @@ from __future__ import annotations import json import uuid -from collections.abc import Iterator, Sequence from pathlib import Path from typing import ( TYPE_CHECKING, @@ -13,13 +12,15 @@ from typing import ( from langchain_core._api import deprecated from langchain_core.documents import Document -from langchain_core.embeddings import Embeddings from langchain_core.load import dumpd, load from langchain_core.vectorstores import VectorStore from langchain_core.vectorstores.utils import _cosine_similarity as cosine_similarity from langchain_core.vectorstores.utils import maximal_marginal_relevance if TYPE_CHECKING: + from collections.abc import Iterator, Sequence + + from langchain_core.embeddings import Embeddings from langchain_core.indexing import UpsertResponse diff --git a/libs/core/pyproject.toml b/libs/core/pyproject.toml index bfd3eec1d40..dc4a8bbc473 100644 --- a/libs/core/pyproject.toml +++ b/libs/core/pyproject.toml @@ -77,8 +77,9 @@ target-version = "py39" [tool.ruff.lint] -select = [ "ANN", "ASYNC", "B", "C4", "COM", "DJ", "E", "EM", "EXE", "F", "FLY", "FURB", "I", "ICN", "INT", "LOG", "N", "NPY", "PD", "PIE", "Q", "RSE", "S", "SIM", "SLOT", "T10", "T201", "TID", "TRY", "UP", "W", "YTT",] -ignore = [ "ANN401", "COM812", "UP007", "S110", "S112",] +select = [ "ANN", "ASYNC", "B", "C4", "COM", "DJ", "E", "EM", "EXE", "F", "FLY", "FURB", "I", "ICN", "INT", "LOG", "N", "NPY", "PD", "PIE", "Q", "RSE", "S", "SIM", "SLOT", "T10", "T201", "TC", "TID", "TRY", "UP", "W", "YTT",] +ignore = [ "ANN401", "COM812", "UP007", "S110", "S112", "TC001", "TC002", "TC003"] +flake8-type-checking.runtime-evaluated-base-classes = ["pydantic.BaseModel","langchain_core.load.serializable.Serializable","langchain_core.runnables.base.RunnableSerializable"] flake8-annotations.allow-star-arg-any = true flake8-annotations.mypy-init-return = true diff --git a/libs/core/tests/unit_tests/language_models/chat_models/test_base.py b/libs/core/tests/unit_tests/language_models/chat_models/test_base.py index 420b60cebf3..284ffb23d18 100644 --- a/libs/core/tests/unit_tests/language_models/chat_models/test_base.py +++ b/libs/core/tests/unit_tests/language_models/chat_models/test_base.py @@ -2,7 +2,7 @@ import uuid from collections.abc import AsyncIterator, Iterator -from typing import Any, Literal, Optional, Union +from typing import TYPE_CHECKING, Any, Literal, Optional, Union import pytest @@ -30,6 +30,9 @@ from tests.unit_tests.fake.callbacks import ( ) from tests.unit_tests.stubs import _any_id_ai_message, _any_id_ai_message_chunk +if TYPE_CHECKING: + from langchain_core.outputs.llm_result import LLMResult + @pytest.fixture def messages() -> list: diff --git a/libs/core/tests/unit_tests/vectorstores/test_vectorstore.py b/libs/core/tests/unit_tests/vectorstores/test_vectorstore.py index c9c6592545b..2ebee79cf9d 100644 --- a/libs/core/tests/unit_tests/vectorstores/test_vectorstore.py +++ b/libs/core/tests/unit_tests/vectorstores/test_vectorstore.py @@ -7,8 +7,7 @@ the relevant methods. from __future__ import annotations import uuid -from collections.abc import Iterable, Sequence -from typing import Any, Optional +from typing import TYPE_CHECKING, Any, Optional import pytest @@ -16,6 +15,9 @@ from langchain_core.documents import Document from langchain_core.embeddings import Embeddings, FakeEmbeddings from langchain_core.vectorstores import VectorStore +if TYPE_CHECKING: + from collections.abc import Iterable, Sequence + class CustomAddTextsVectorstore(VectorStore): """A vectorstore that only implements add texts."""