diff --git a/libs/langchain/langchain/chains/openai_functions/openapi.py b/libs/langchain/langchain/chains/openai_functions/openapi.py index 6f606ee5c86..ad6597e4a17 100644 --- a/libs/langchain/langchain/chains/openai_functions/openapi.py +++ b/libs/langchain/langchain/chains/openai_functions/openapi.py @@ -5,14 +5,12 @@ import re from collections import defaultdict from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Tuple, Union -import requests from langchain_core._api import deprecated from langchain_core.callbacks import CallbackManagerForChainRun from langchain_core.language_models import BaseLanguageModel from langchain_core.output_parsers.openai_functions import JsonOutputFunctionsParser from langchain_core.prompts import BasePromptTemplate, ChatPromptTemplate from langchain_core.utils.input import get_colored_text -from requests import Response from langchain.chains.base import Chain from langchain.chains.llm import LLMChain @@ -21,6 +19,7 @@ from langchain.chains.sequential import SequentialChain if TYPE_CHECKING: from langchain_community.utilities.openapi import OpenAPISpec from openapi_pydantic import Parameter + from requests import Response def _get_description(o: Any, prefer_short: bool) -> Optional[str]: @@ -175,6 +174,12 @@ def openapi_spec_to_openai_fn( params: Optional[dict] = None, **kwargs: Any, ) -> Any: + try: + import requests + except ImportError as e: + raise ImportError( + "Could not import requests, please install with `pip install requests`." + ) from e method = _name_to_call_map[name]["method"] url = _name_to_call_map[name]["url"] path_params = fn_args.pop("path_params", {}) diff --git a/libs/langchain/langchain/smith/evaluation/runner_utils.py b/libs/langchain/langchain/smith/evaluation/runner_utils.py index 344e9638f36..15ed313b43c 100644 --- a/libs/langchain/langchain/smith/evaluation/runner_utils.py +++ b/libs/langchain/langchain/smith/evaluation/runner_utils.py @@ -46,7 +46,6 @@ from langsmith.evaluation import ( from langsmith.run_helpers import as_runnable, is_traceable_function from langsmith.schemas import Dataset, DataType, Example, Run, TracerSession from langsmith.utils import LangSmithError -from requests import HTTPError from typing_extensions import TypedDict from langchain.chains.base import Chain @@ -972,6 +971,12 @@ def _prepare_eval_run( tags: Optional[List[str]] = None, dataset_version: Optional[Union[str, datetime]] = None, ) -> Tuple[MCF, TracerSession, Dataset, List[Example]]: + try: + from requests import HTTPError + except ImportError as e: + raise ImportError( + "Could not import requests, please install with `pip install requests`." + ) from e wrapped_model = _wrap_in_chain_factory(llm_or_chain_factory, dataset_name) dataset = client.read_dataset(dataset_name=dataset_name) diff --git a/libs/langchain/pyproject.toml b/libs/langchain/pyproject.toml index 2b181170089..1385c974fae 100644 --- a/libs/langchain/pyproject.toml +++ b/libs/langchain/pyproject.toml @@ -12,7 +12,6 @@ dependencies = [ "langsmith<0.4,>=0.1.17", "pydantic<3.0.0,>=2.7.4", "SQLAlchemy<3,>=1.4", - "requests<3,>=2", "PyYAML>=5.3", "numpy<2,>=1.26.4; python_version < \"3.12\"", "numpy<3,>=1.26.2; python_version >= \"3.12\"", @@ -74,6 +73,7 @@ test = [ "langchain-openai", "toml>=0.10.2", "packaging>=24.2", + "requests<3,>=2", ] codespell = ["codespell<3.0.0,>=2.2.0"] test_integration = [ @@ -102,6 +102,7 @@ typing = [ "mypy-protobuf<4.0.0,>=3.0.0", "langchain-core", "langchain-text-splitters", + "requests<3,>=2", ] dev = [ "jupyter<2.0.0,>=1.0.0", diff --git a/libs/langchain/uv.lock b/libs/langchain/uv.lock index 8fb43b3cd29..b4cb7620fde 100644 --- a/libs/langchain/uv.lock +++ b/libs/langchain/uv.lock @@ -2251,7 +2251,6 @@ dependencies = [ { name = "numpy", version = "2.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "pydantic" }, { name = "pyyaml" }, - { name = "requests" }, { name = "sqlalchemy" }, ] @@ -2339,6 +2338,7 @@ test = [ { name = "pytest-socket" }, { name = "pytest-watcher" }, { name = "pytest-xdist" }, + { name = "requests" }, { name = "requests-mock" }, { name = "responses" }, { name = "syrupy" }, @@ -2359,6 +2359,7 @@ typing = [ { name = "langchain-text-splitters" }, { name = "mypy" }, { name = "mypy-protobuf" }, + { name = "requests" }, { name = "types-chardet" }, { name = "types-pytz" }, { name = "types-pyyaml" }, @@ -2393,7 +2394,6 @@ requires-dist = [ { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.2,<3" }, { name = "pydantic", specifier = ">=2.7.4,<3.0.0" }, { name = "pyyaml", specifier = ">=5.3" }, - { name = "requests", specifier = ">=2,<3" }, { name = "sqlalchemy", specifier = ">=1.4,<3" }, ] @@ -2432,6 +2432,7 @@ test = [ { name = "pytest-socket", specifier = ">=0.6.0,<1.0.0" }, { name = "pytest-watcher", specifier = ">=0.2.6,<1.0.0" }, { name = "pytest-xdist", specifier = ">=3.6.1,<4.0.0" }, + { name = "requests", specifier = ">=2,<3" }, { name = "requests-mock", specifier = ">=1.11.0,<2.0.0" }, { name = "responses", specifier = ">=0.22.0,<1.0.0" }, { name = "syrupy", specifier = ">=4.0.2,<5.0.0" }, @@ -2452,6 +2453,7 @@ typing = [ { name = "langchain-text-splitters", editable = "../text-splitters" }, { name = "mypy", specifier = ">=1.10,<2.0" }, { name = "mypy-protobuf", specifier = ">=3.0.0,<4.0.0" }, + { name = "requests", specifier = ">=2,<3" }, { name = "types-chardet", specifier = ">=5.0.4.6,<6.0.0.0" }, { name = "types-pytz", specifier = ">=2023.3.0.0,<2024.0.0.0" }, { name = "types-pyyaml", specifier = ">=6.0.12.2,<7.0.0.0" },