From 0c8c768d3c3d3be2d3b33a8ee32632c0ba2a63ba Mon Sep 17 00:00:00 2001 From: minhna4 Date: Fri, 5 Jan 2024 17:21:36 +0700 Subject: [PATCH 1/9] community: add API key into huggingface TGI validation --- .../llms/huggingface_text_gen_inference.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/libs/community/langchain_community/llms/huggingface_text_gen_inference.py b/libs/community/langchain_community/llms/huggingface_text_gen_inference.py index b23aaa6e9bdbf..3ad654733b0df 100644 --- a/libs/community/langchain_community/llms/huggingface_text_gen_inference.py +++ b/libs/community/langchain_community/llms/huggingface_text_gen_inference.py @@ -8,7 +8,7 @@ from langchain_core.language_models.llms import LLM from langchain_core.outputs import GenerationChunk from langchain_core.pydantic_v1 import Extra, Field, root_validator -from langchain_core.utils import get_pydantic_field_names +from langchain_core.utils import get_pydantic_field_names, get_from_dict_or_env logger = logging.getLogger(__name__) @@ -95,6 +95,8 @@ class HuggingFaceTextGenInference(LLM): """Holds any model parameters valid for `call` not explicitly specified""" client: Any async_client: Any + """Keyword arguments to pass to the model.""" + huggingfacehub_api_token: Optional[str] = None class Config: """Configuration for this pydantic object.""" @@ -129,8 +131,14 @@ def build_extra(cls, values: Dict[str, Any]) -> Dict[str, Any]: @root_validator() def validate_environment(cls, values: Dict) -> Dict: - """Validate that python package exists in environment.""" - + """Validate that api key and python package exists in environment.""" + huggingfacehub_api_token = get_from_dict_or_env( + values, "huggingfacehub_api_token", "HUGGINGFACEHUB_API_TOKEN" + ) + # When TGI make requests to Huggingface's Inference Enpoints, a bearer token must be included into the request header for authorization + # https://github.com/huggingface/text-generation-inference/issues/747 + if huggingfacehub_api_token: + values["server_kwargs"]["headers"] = {"Authorization": f"Bearer {huggingfacehub_api_token}"} try: import text_generation From 4695323241e0f2d9f729974046318c314a6d844f Mon Sep 17 00:00:00 2001 From: minhna4 Date: Fri, 5 Jan 2024 17:22:36 +0700 Subject: [PATCH 2/9] community: Ignore `_resolve_model_id()` when calling a self-hosted HF TGI --- .../langchain_community/chat_models/huggingface.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libs/community/langchain_community/chat_models/huggingface.py b/libs/community/langchain_community/chat_models/huggingface.py index b83184ac6e5fd..735fe97759e38 100644 --- a/libs/community/langchain_community/chat_models/huggingface.py +++ b/libs/community/langchain_community/chat_models/huggingface.py @@ -50,8 +50,10 @@ def __init__(self, **kwargs: Any): super().__init__(**kwargs) from transformers import AutoTokenizer - - self._resolve_model_id() + # `self.model_id` should only be resolved when not explicitly defined + # If `llm` is a HuggingFaceTextGenInference, there would exist cases in which the TGI server is not a HuggingFace-deployed Inference Endpoint that has an explicit model ID, but a self-hosted version + if not self.model_id: + self._resolve_model_id() self.tokenizer = ( AutoTokenizer.from_pretrained(self.model_id) if self.tokenizer is None From bc5b9518022cebcf4c907ee7e69bd9928766c238 Mon Sep 17 00:00:00 2001 From: minhna4 Date: Fri, 5 Jan 2024 18:39:35 +0700 Subject: [PATCH 3/9] format and linting --- .../langchain_community/chat_models/huggingface.py | 5 ++++- .../llms/huggingface_text_gen_inference.py | 11 +++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/libs/community/langchain_community/chat_models/huggingface.py b/libs/community/langchain_community/chat_models/huggingface.py index 735fe97759e38..7e934aae616aa 100644 --- a/libs/community/langchain_community/chat_models/huggingface.py +++ b/libs/community/langchain_community/chat_models/huggingface.py @@ -50,8 +50,11 @@ def __init__(self, **kwargs: Any): super().__init__(**kwargs) from transformers import AutoTokenizer + # `self.model_id` should only be resolved when not explicitly defined - # If `llm` is a HuggingFaceTextGenInference, there would exist cases in which the TGI server is not a HuggingFace-deployed Inference Endpoint that has an explicit model ID, but a self-hosted version + # If `llm` is a HuggingFaceTextGenInference, there would exist cases + # in which the TGI server is not a HuggingFace-deployed Inference Endpoint + # that has an explicit model ID, but a self-hosted version if not self.model_id: self._resolve_model_id() self.tokenizer = ( diff --git a/libs/community/langchain_community/llms/huggingface_text_gen_inference.py b/libs/community/langchain_community/llms/huggingface_text_gen_inference.py index 3ad654733b0df..1a0eeea10a0cb 100644 --- a/libs/community/langchain_community/llms/huggingface_text_gen_inference.py +++ b/libs/community/langchain_community/llms/huggingface_text_gen_inference.py @@ -8,7 +8,7 @@ from langchain_core.language_models.llms import LLM from langchain_core.outputs import GenerationChunk from langchain_core.pydantic_v1 import Extra, Field, root_validator -from langchain_core.utils import get_pydantic_field_names, get_from_dict_or_env +from langchain_core.utils import get_from_dict_or_env, get_pydantic_field_names logger = logging.getLogger(__name__) @@ -135,10 +135,13 @@ def validate_environment(cls, values: Dict) -> Dict: huggingfacehub_api_token = get_from_dict_or_env( values, "huggingfacehub_api_token", "HUGGINGFACEHUB_API_TOKEN" ) - # When TGI make requests to Huggingface's Inference Enpoints, a bearer token must be included into the request header for authorization - # https://github.com/huggingface/text-generation-inference/issues/747 + # When TGI make requests to Huggingface's Inference Enpoints, + # a bearer token must be included into the request header for authorization + # https://github.com/huggingface/text-generation-inference/issues/747 if huggingfacehub_api_token: - values["server_kwargs"]["headers"] = {"Authorization": f"Bearer {huggingfacehub_api_token}"} + values["server_kwargs"]["headers"] = { + "Authorization": f"Bearer {huggingfacehub_api_token}" + } try: import text_generation From 02f6745e71e2a4262b7b596e26728aa2e9db2e0e Mon Sep 17 00:00:00 2001 From: minhna4 Date: Fri, 5 Jan 2024 18:42:43 +0700 Subject: [PATCH 4/9] Add integration test for HuggingFace TGI --- .../test_huggingface_text_gen_inference.py | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/libs/community/tests/integration_tests/llms/test_huggingface_text_gen_inference.py b/libs/community/tests/integration_tests/llms/test_huggingface_text_gen_inference.py index fb2b68268b056..4f4637ea8ff27 100644 --- a/libs/community/tests/integration_tests/llms/test_huggingface_text_gen_inference.py +++ b/libs/community/tests/integration_tests/llms/test_huggingface_text_gen_inference.py @@ -1,3 +1,5 @@ +from text_generation import AsyncClient, Client + from langchain_community.llms import HuggingFaceTextGenInference @@ -17,3 +19,23 @@ def test_invocation_params_stop_sequences() -> None: runtime_stop = ["stop"] assert llm._invocation_params(runtime_stop)["stop_sequences"] == [".", "stop"] assert llm._default_params["stop_sequences"] == ["."] + + +def test_client_type() -> None: + llm = HuggingFaceTextGenInference() + + assert isinstance(llm.client, Client) + assert isinstance(llm.async_client, AsyncClient) + + +def test_bearer_api() -> None: + llm = HuggingFaceTextGenInference() + # If called from a self-hosted TGI server, + assert not llm.client.headers + assert not llm.async_client.headers + + BEARER_TOKEN = "abcdef1230" + llm = HuggingFaceTextGenInference(huggingfacehub_api_token=BEARER_TOKEN) + # If called from a self-hosted TGI server, + assert llm.client.headers["Authorization"] == f"Bearer {BEARER_TOKEN}" + assert llm.async_client.headers["Authorization"] == f"Bearer {BEARER_TOKEN}" From d685cd90801c81d81e6f9a97df7f40ed8a6faac3 Mon Sep 17 00:00:00 2001 From: minhna4 Date: Wed, 17 Jan 2024 14:11:32 +0700 Subject: [PATCH 5/9] Fix: Spelling error in --- .../langchain_community/llms/huggingface_text_gen_inference.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/community/langchain_community/llms/huggingface_text_gen_inference.py b/libs/community/langchain_community/llms/huggingface_text_gen_inference.py index 1a0eeea10a0cb..f60ae85cd3c5c 100644 --- a/libs/community/langchain_community/llms/huggingface_text_gen_inference.py +++ b/libs/community/langchain_community/llms/huggingface_text_gen_inference.py @@ -135,7 +135,7 @@ def validate_environment(cls, values: Dict) -> Dict: huggingfacehub_api_token = get_from_dict_or_env( values, "huggingfacehub_api_token", "HUGGINGFACEHUB_API_TOKEN" ) - # When TGI make requests to Huggingface's Inference Enpoints, + # When TGI make requests to Huggingface's Inference Endpoints, # a bearer token must be included into the request header for authorization # https://github.com/huggingface/text-generation-inference/issues/747 if huggingfacehub_api_token: From cb0e6878ede2400aa5c4a4fe236f7b7331021319 Mon Sep 17 00:00:00 2001 From: Anh Minh Nguyen Date: Wed, 24 Jan 2024 13:32:19 +0700 Subject: [PATCH 6/9] Update libs/community/langchain_community/llms/huggingface_text_gen_inference.py Co-authored-by: Bagatur <22008038+baskaryan@users.noreply.github.com> --- .../langchain_community/llms/huggingface_text_gen_inference.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/community/langchain_community/llms/huggingface_text_gen_inference.py b/libs/community/langchain_community/llms/huggingface_text_gen_inference.py index f60ae85cd3c5c..c6d9784d53338 100644 --- a/libs/community/langchain_community/llms/huggingface_text_gen_inference.py +++ b/libs/community/langchain_community/llms/huggingface_text_gen_inference.py @@ -133,7 +133,7 @@ def build_extra(cls, values: Dict[str, Any]) -> Dict[str, Any]: def validate_environment(cls, values: Dict) -> Dict: """Validate that api key and python package exists in environment.""" huggingfacehub_api_token = get_from_dict_or_env( - values, "huggingfacehub_api_token", "HUGGINGFACEHUB_API_TOKEN" + values, "huggingfacehub_api_token", "HUGGINGFACEHUB_API_TOKEN", default="" ) # When TGI make requests to Huggingface's Inference Endpoints, # a bearer token must be included into the request header for authorization From 0f9784c94309953da4c88000f5a7493494b41b6e Mon Sep 17 00:00:00 2001 From: minhna4 Date: Tue, 30 Jan 2024 21:59:57 +0700 Subject: [PATCH 7/9] Introduce `text_generation` dependency: - Re-lock the `libs/community/poetry.lock` file - Add `text-generation` to `libs/community/pyproject.toml` - Add `pytest` for `libs/community/tests/integration_tests/llms/test_huggingface_text_gen_inference.py` - Re-lint and format --- libs/community/poetry.lock | 25 ++++++++++++++++--- libs/community/pyproject.toml | 2 ++ .../test_huggingface_text_gen_inference.py | 15 +++++++++++ 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/libs/community/poetry.lock b/libs/community/poetry.lock index f674b1d20a60b..6416939a6301a 100644 --- a/libs/community/poetry.lock +++ b/libs/community/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "aenum" @@ -3433,7 +3433,6 @@ files = [ {file = "jq-1.6.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:227b178b22a7f91ae88525810441791b1ca1fc71c86f03190911793be15cec3d"}, {file = "jq-1.6.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:780eb6383fbae12afa819ef676fc93e1548ae4b076c004a393af26a04b460742"}, {file = "jq-1.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:08ded6467f4ef89fec35b2bf310f210f8cd13fbd9d80e521500889edf8d22441"}, - {file = "jq-1.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:49e44ed677713f4115bd5bf2dbae23baa4cd503be350e12a1c1f506b0687848f"}, {file = "jq-1.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:984f33862af285ad3e41e23179ac4795f1701822473e1a26bf87ff023e5a89ea"}, {file = "jq-1.6.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f42264fafc6166efb5611b5d4cb01058887d050a6c19334f6a3f8a13bb369df5"}, {file = "jq-1.6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a67154f150aaf76cc1294032ed588436eb002097dd4fd1e283824bf753a05080"}, @@ -6223,6 +6222,7 @@ files = [ {file = "pymongo-4.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8729dbf25eb32ad0dc0b9bd5e6a0d0b7e5c2dc8ec06ad171088e1896b522a74"}, {file = "pymongo-4.6.1-cp312-cp312-win32.whl", hash = "sha256:3177f783ae7e08aaf7b2802e0df4e4b13903520e8380915e6337cdc7a6ff01d8"}, {file = "pymongo-4.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:00c199e1c593e2c8b033136d7a08f0c376452bac8a896c923fcd6f419e07bdd2"}, + {file = "pymongo-4.6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6dcc95f4bb9ed793714b43f4f23a7b0c57e4ef47414162297d6f650213512c19"}, {file = "pymongo-4.6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:13552ca505366df74e3e2f0a4f27c363928f3dff0eef9f281eb81af7f29bc3c5"}, {file = "pymongo-4.6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:77e0df59b1a4994ad30c6d746992ae887f9756a43fc25dec2db515d94cf0222d"}, {file = "pymongo-4.6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3a7f02a58a0c2912734105e05dedbee4f7507e6f1bd132ebad520be0b11d46fd"}, @@ -6773,6 +6773,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -8056,6 +8057,22 @@ docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] +[[package]] +name = "text-generation" +version = "0.6.1" +description = "Hugging Face Text Generation Python Client" +optional = true +python-versions = ">=3.7,<4.0" +files = [ + {file = "text_generation-0.6.1-py3-none-any.whl", hash = "sha256:ebca00587eeabc0f5118f66ee1048bf690bd7735a9a10361c533c31c8c0bf994"}, + {file = "text_generation-0.6.1.tar.gz", hash = "sha256:730e662aa7812f73c08ab953e008e90455f3d046f81efa0ef3de462bd4cf63d9"}, +] + +[package.dependencies] +aiohttp = ">=3.8,<4.0" +huggingface-hub = ">=0.12,<1.0" +pydantic = ">1.10,<3" + [[package]] name = "threadpoolctl" version = "3.2.0" @@ -9247,9 +9264,9 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [extras] cli = ["typer"] -extended-testing = ["aiosqlite", "aleph-alpha-client", "anthropic", "arxiv", "assemblyai", "atlassian-python-api", "azure-ai-documentintelligence", "beautifulsoup4", "bibtexparser", "cassio", "chardet", "cohere", "dashvector", "databricks-vectorsearch", "datasets", "dgml-utils", "elasticsearch", "esprima", "faiss-cpu", "feedparser", "fireworks-ai", "geopandas", "gitpython", "google-cloud-documentai", "gql", "gradientai", "hdbcli", "hologres-vector", "html2text", "httpx", "javelin-sdk", "jinja2", "jq", "jsonschema", "lxml", "markdownify", "motor", "msal", "mwparserfromhell", "mwxml", "newspaper3k", "numexpr", "oci", "openai", "openapi-pydantic", "oracle-ads", "pandas", "pdfminer-six", "pgvector", "praw", "psychicapi", "py-trello", "pymupdf", "pypdf", "pypdfium2", "pyspark", "rank-bm25", "rapidfuzz", "rapidocr-onnxruntime", "rdflib", "requests-toolbelt", "rspace_client", "scikit-learn", "sqlite-vss", "streamlit", "sympy", "telethon", "timescale-vector", "tqdm", "upstash-redis", "xata", "xmltodict", "zhipuai"] +extended-testing = ["aiosqlite", "aleph-alpha-client", "anthropic", "arxiv", "assemblyai", "atlassian-python-api", "azure-ai-documentintelligence", "beautifulsoup4", "bibtexparser", "cassio", "chardet", "cohere", "dashvector", "databricks-vectorsearch", "datasets", "dgml-utils", "elasticsearch", "esprima", "faiss-cpu", "feedparser", "fireworks-ai", "geopandas", "gitpython", "google-cloud-documentai", "gql", "gradientai", "hdbcli", "hologres-vector", "html2text", "httpx", "javelin-sdk", "jinja2", "jq", "jsonschema", "lxml", "markdownify", "motor", "msal", "mwparserfromhell", "mwxml", "newspaper3k", "numexpr", "oci", "openai", "openapi-pydantic", "oracle-ads", "pandas", "pdfminer-six", "pgvector", "praw", "psychicapi", "py-trello", "pymupdf", "pypdf", "pypdfium2", "pyspark", "rank-bm25", "rapidfuzz", "rapidocr-onnxruntime", "rdflib", "requests-toolbelt", "rspace_client", "scikit-learn", "sqlite-vss", "streamlit", "sympy", "telethon", "text-generation", "timescale-vector", "tqdm", "upstash-redis", "xata", "xmltodict", "zhipuai"] [metadata] lock-version = "2.0" python-versions = ">=3.8.1,<4.0" -content-hash = "6e1aabbf689bf7294ffc3f9215559157b95868275421d776862ddb1499969c79" +content-hash = "b58356f4baad5cf89cb7e1caf7c07db137a12e601ec0c1b8a9a2f575fac9f24d" diff --git a/libs/community/pyproject.toml b/libs/community/pyproject.toml index e048b7b304bce..b03d10eb9bd8b 100644 --- a/libs/community/pyproject.toml +++ b/libs/community/pyproject.toml @@ -92,6 +92,7 @@ elasticsearch = {version = "^8.12.0", optional = true} hdbcli = {version = "^2.19.21", optional = true} oci = {version = "^2.119.1", optional = true} rdflib = {version = "7.0.0", optional = true} +text-generation = {version = "^0.6.1", optional = true} [tool.poetry.group.test] optional = true @@ -259,6 +260,7 @@ extended_testing = [ "hdbcli", "oci", "rdflib", + "text_generation", ] [tool.ruff] diff --git a/libs/community/tests/integration_tests/llms/test_huggingface_text_gen_inference.py b/libs/community/tests/integration_tests/llms/test_huggingface_text_gen_inference.py index 4f4637ea8ff27..338226cbe72d0 100644 --- a/libs/community/tests/integration_tests/llms/test_huggingface_text_gen_inference.py +++ b/libs/community/tests/integration_tests/llms/test_huggingface_text_gen_inference.py @@ -1,8 +1,22 @@ +from importlib import import_module + +import pytest from text_generation import AsyncClient, Client from langchain_community.llms import HuggingFaceTextGenInference +@pytest.mark.requires("text_generation") +def test_import_class() -> None: + """Test that the class can be imported.""" + module_name = "langchain_community.llms.huggingface_text_gen_inference" + class_name = "HuggingFaceTextGenInference" + + module = import_module(module_name) + assert hasattr(module, class_name) + + +@pytest.mark.requires("text_generation") def test_invocation_params_stop_sequences() -> None: llm = HuggingFaceTextGenInference() assert llm._default_params["stop_sequences"] == [] @@ -21,6 +35,7 @@ def test_invocation_params_stop_sequences() -> None: assert llm._default_params["stop_sequences"] == ["."] +@pytest.mark.requires("text_generation") def test_client_type() -> None: llm = HuggingFaceTextGenInference() From 6d0938f72939c19e210809a38571a058d607e169 Mon Sep 17 00:00:00 2001 From: minhna1112 Date: Tue, 30 Jan 2024 22:21:18 +0700 Subject: [PATCH 8/9] Minor fix in `libs/community/pyproject.toml` --- libs/community/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/community/pyproject.toml b/libs/community/pyproject.toml index b03d10eb9bd8b..25110142ed83b 100644 --- a/libs/community/pyproject.toml +++ b/libs/community/pyproject.toml @@ -260,7 +260,7 @@ extended_testing = [ "hdbcli", "oci", "rdflib", - "text_generation", + "text-generation", ] [tool.ruff] From c1f62776f65a837bb049df1de1fd2e4d470685b0 Mon Sep 17 00:00:00 2001 From: minhna1112 Date: Thu, 15 Feb 2024 10:38:30 +0700 Subject: [PATCH 9/9] Re-lock poetry --- libs/community/poetry.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/community/poetry.lock b/libs/community/poetry.lock index 15cad83b2f5b1..b1eac22cc8d5c 100644 --- a/libs/community/poetry.lock +++ b/libs/community/poetry.lock @@ -3650,7 +3650,7 @@ files = [ [[package]] name = "langchain-core" -version = "0.1.22" +version = "0.1.23" description = "Building applications with LLMs through composability" optional = false python-versions = ">=3.8.1,<4.0" @@ -9178,4 +9178,4 @@ extended-testing = ["aiosqlite", "aleph-alpha-client", "anthropic", "arxiv", "as [metadata] lock-version = "2.0" python-versions = ">=3.8.1,<4.0" -content-hash = "e98000541a4991b1d41c9e995a4153ca24745e880afe75af6516574e3fb8b4a2" +content-hash = "bdbec7d4c986302db2ec4da7ee4891be3965f281f54dff3aea6885494e39a27b"