From 40efc2bdf339cece97860280302554be53dede9b Mon Sep 17 00:00:00 2001 From: Mason Daugherty Date: Wed, 18 Feb 2026 02:41:02 -0500 Subject: [PATCH] perf(core): defer specific `langsmith` imports to reduce import time --- libs/core/langchain_core/callbacks/manager.py | 25 +++++++++++-------- libs/core/langchain_core/runnables/config.py | 11 ++++++-- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/libs/core/langchain_core/callbacks/manager.py b/libs/core/langchain_core/callbacks/manager.py index 5a3433ef7e6..cd26f49f5b6 100644 --- a/libs/core/langchain_core/callbacks/manager.py +++ b/libs/core/langchain_core/callbacks/manager.py @@ -13,7 +13,6 @@ from contextlib import asynccontextmanager, contextmanager from contextvars import copy_context from typing import TYPE_CHECKING, Any, TypeVar, cast -from langsmith.run_helpers import get_tracing_context from typing_extensions import Self, override from langchain_core.callbacks.base import ( @@ -29,15 +28,6 @@ from langchain_core.callbacks.base import ( from langchain_core.callbacks.stdout import StdOutCallbackHandler from langchain_core.globals import get_debug from langchain_core.messages import BaseMessage, get_buffer_string -from langchain_core.tracers.context import ( - _configure_hooks, - _get_trace_callbacks, - _get_tracer_project, - _tracing_v2_is_enabled, - tracing_v2_callback_var, -) -from langchain_core.tracers.langchain import LangChainTracer -from langchain_core.tracers.stdout import ConsoleCallbackHandler from langchain_core.utils.env import env_var_is_set from langchain_core.utils.uuid import uuid7 @@ -104,6 +94,8 @@ def trace_as_chain_group( manager.on_chain_end({"output": res}) ``` """ + from langchain_core.tracers.context import _get_trace_callbacks # noqa: PLC0415 + cb = _get_trace_callbacks( project_name, example_id, callback_manager=callback_manager ) @@ -183,6 +175,8 @@ async def atrace_as_chain_group( await manager.on_chain_end({"output": res}) ``` """ + from langchain_core.tracers.context import _get_trace_callbacks # noqa: PLC0415 + cb = _get_trace_callbacks( project_name, example_id, callback_manager=callback_manager ) @@ -2325,6 +2319,17 @@ def _configure( Returns: The configured callback manager. """ + from langsmith.run_helpers import get_tracing_context # noqa: PLC0415 + + from langchain_core.tracers.context import ( # noqa: PLC0415 + _configure_hooks, + _get_tracer_project, + _tracing_v2_is_enabled, + tracing_v2_callback_var, + ) + from langchain_core.tracers.langchain import LangChainTracer # noqa: PLC0415 + from langchain_core.tracers.stdout import ConsoleCallbackHandler # noqa: PLC0415 + tracing_context = get_tracing_context() tracing_metadata = tracing_context["metadata"] tracing_tags = tracing_context["tags"] diff --git a/libs/core/langchain_core/runnables/config.py b/libs/core/langchain_core/runnables/config.py index f24f5603170..2a19dea8e21 100644 --- a/libs/core/langchain_core/runnables/config.py +++ b/libs/core/langchain_core/runnables/config.py @@ -20,7 +20,6 @@ from typing import ( cast, ) -from langsmith.run_helpers import _set_tracing_context, get_tracing_context from typing_extensions import TypedDict from langchain_core.callbacks.manager import AsyncCallbackManager, CallbackManager @@ -30,7 +29,6 @@ from langchain_core.runnables.utils import ( accepts_config, accepts_run_manager, ) -from langchain_core.tracers.langchain import LangChainTracer if TYPE_CHECKING: from langchain_core.callbacks.base import BaseCallbackManager, Callbacks @@ -160,6 +158,13 @@ def _set_config_context( Returns: The token to reset the config and the previous tracing context. """ + from langsmith.run_helpers import ( # noqa: PLC0415 + _set_tracing_context, + get_tracing_context, + ) + + from langchain_core.tracers.langchain import LangChainTracer # noqa: PLC0415 + config_token = var_child_runnable_config.set(config) current_context = None if ( @@ -194,6 +199,8 @@ def set_config_context(config: RunnableConfig) -> Generator[Context, None, None] Yields: The config context. """ + from langsmith.run_helpers import _set_tracing_context # noqa: PLC0415 + ctx = copy_context() config_token, _ = ctx.run(_set_config_context, config) try: