Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-langchain-openai for
openSUSE:Factory checked in at 2026-08-14 22:06:56
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-langchain-openai (Old)
and /work/SRC/openSUSE:Factory/.python-langchain-openai.new.1258 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-langchain-openai"
Fri Aug 14 22:06:56 2026 rev:8 rq:1371166 version:1.5.0
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-langchain-openai/python-langchain-openai.changes
2026-08-11 17:16:09.243550127 +0200
+++
/work/SRC/openSUSE:Factory/.python-langchain-openai.new.1258/python-langchain-openai.changes
2026-08-14 22:07:18.750729026 +0200
@@ -1,0 +2,18 @@
+Fri Aug 14 07:30:32 UTC 2026 - Martin Pluskal <[email protected]>
+
+- Update to 1.5.0:
+ * Support the openai 3.0 SDK: a new internal compatibility module
+ resolves the httpx library the installed SDK is built on (httpx2
+ on openai 3.x, httpx on 2.x), so the transport, connection-limit
+ and proxy objects handed to the client always come from the same
+ library as the client itself; the accepted openai range widens
+ to < 4.0.0 accordingly
+ * Report a clearer import error when the httpx used by the OpenAI
+ SDK is unavailable while configuring an embeddings proxy
+- Declare the certifi dependency (>= 2024.6.2) that upstream now
+ requires explicitly; it was already imported to build the default
+ SSL context
+- Follow upstream and raise the langchain-core requirement floor to
+ 1.5.4
+
+-------------------------------------------------------------------
Old:
----
langchain_openai-1.4.3.tar.gz
New:
----
langchain_openai-1.5.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-langchain-openai.spec ++++++
--- /var/tmp/diff_new_pack.cXI5O3/_old 2026-08-14 22:07:19.493756079 +0200
+++ /var/tmp/diff_new_pack.cXI5O3/_new 2026-08-14 22:07:19.494756116 +0200
@@ -17,7 +17,7 @@
Name: python-langchain-openai
-Version: 1.4.3
+Version: 1.5.0
Release: 0
Summary: An integration package connecting OpenAI and LangChain
License: MIT
@@ -27,13 +27,15 @@
BuildRequires: %{python_module pip}
BuildRequires: fdupes
BuildRequires: python-rpm-macros
-Requires: python-langchain-core >= 1.5.3
+Requires: python-certifi >= 2024.6.2
+Requires: python-langchain-core >= 1.5.4
Requires: python-openai >= 2.45.0
Requires: python-tiktoken >= 0.7.0
BuildArch: noarch
# SECTION test requirements
+BuildRequires: %{python_module certifi >= 2024.6.2}
BuildRequires: %{python_module httpx}
-BuildRequires: %{python_module langchain-core >= 1.5.3}
+BuildRequires: %{python_module langchain-core >= 1.5.4}
BuildRequires: %{python_module openai >= 2.45.0}
BuildRequires: %{python_module pytest-asyncio}
BuildRequires: %{python_module tiktoken >= 0.7.0}
++++++ langchain_openai-1.4.3.tar.gz -> langchain_openai-1.5.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langchain_openai-1.4.3/Makefile
new/langchain_openai-1.5.0/Makefile
--- old/langchain_openai-1.4.3/Makefile 2020-02-02 01:00:00.000000000 +0100
+++ new/langchain_openai-1.5.0/Makefile 2020-02-02 01:00:00.000000000 +0100
@@ -10,6 +10,10 @@
TEST_FILE ?= tests/unit_tests/
PYTEST_EXTRA ?=
+# A single canonical live request, reused to smoke both supported openai
+# majors in `integration_test` (see below).
+SDK_SMOKE_TEST =
tests/integration_tests/chat_models/test_responses_standard.py::TestOpenAIResponses::test_invoke
+
integration_test integration_tests: TEST_FILE=tests/integration_tests/
# unit tests are run with the --disable-socket flag to prevent network calls
@@ -24,7 +28,13 @@
fi
TIKTOKEN_CACHE_DIR=tiktoken_cache uv run --group test pytest
$(PYTEST_EXTRA) --disable-socket --allow-unix-socket $(TEST_FILE)
+# Runs the full integration suite against the locked SDK, then smokes a single
+# live request on each supported openai major so the httpx (2.x) and httpx2
+# (3.x) transport paths are always covered, regardless of which openai version
+# uv.lock currently resolves.
integration_test integration_tests:
+ uv run --with 'openai>=2.45.0,<3.0.0' --group test --group
test_integration pytest -v --tb=short $(SDK_SMOKE_TEST)
+ uv run --with 'openai>=3.0.0,<4.0.0' --group test --group
test_integration pytest -v --tb=short $(SDK_SMOKE_TEST)
uv run --group test --group test_integration pytest -v --tb=short -n
auto --benchmark-disable $(TEST_FILE)
# Run VCR cassette-backed integration tests in playback-only mode (no API keys
needed).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langchain_openai-1.4.3/PKG-INFO
new/langchain_openai-1.5.0/PKG-INFO
--- old/langchain_openai-1.4.3/PKG-INFO 2020-02-02 01:00:00.000000000 +0100
+++ new/langchain_openai-1.5.0/PKG-INFO 2020-02-02 01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
-Metadata-Version: 2.4
+Metadata-Version: 2.5
Name: langchain-openai
-Version: 1.4.3
+Version: 1.5.0
Summary: An integration package connecting OpenAI and LangChain
Project-URL: Homepage,
https://docs.langchain.com/oss/python/integrations/providers/openai
Project-URL: Documentation,
https://reference.langchain.com/python/integrations/langchain_openai/
@@ -23,8 +23,9 @@
Classifier: Programming Language :: Python :: 3.14
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Requires-Python: <4.0.0,>=3.10.0
-Requires-Dist: langchain-core<2.0.0,>=1.5.3
-Requires-Dist: openai<3.0.0,>=2.45.0
+Requires-Dist: certifi>=2024.6.2
+Requires-Dist: langchain-core<2.0.0,>=1.5.4
+Requires-Dist: openai<4.0.0,>=2.45.0
Requires-Dist: tiktoken<1.0.0,>=0.7.0
Description-Content-Type: text/markdown
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langchain_openai-1.4.3/langchain_openai/_compat.py
new/langchain_openai-1.5.0/langchain_openai/_compat.py
--- old/langchain_openai-1.4.3/langchain_openai/_compat.py 1970-01-01
01:00:00.000000000 +0100
+++ new/langchain_openai-1.5.0/langchain_openai/_compat.py 2020-02-02
01:00:00.000000000 +0100
@@ -0,0 +1,45 @@
+"""Resolve the `httpx` library matching the installed `openai` SDK.
+
+`openai>=3` is backed by `httpx2` (an API-identical drop-in for `httpx`),
+`openai<3` by `httpx`. Transport/config objects injected into the SDK client
+are built from the same library, so this module re-exports whichever one the
+installed SDK version defaults to.
+
+Import `httpx` from here **only** for objects handed to the OpenAI SDK client
+(e.g. a custom transport, `Limits`, `Proxy`, or `http_client=`). Standalone
HTTP
+code should import `httpx` directly.
+
+Note: the SDK's `DefaultHttpxClient`/`DefaultAsyncHttpxClient` classes are
*not*
+re-exported here — they are subclassable in both SDK versions (backed by
+`httpx2` on `openai>=3`), so subclass `openai.DefaultHttpxClient` directly. The
+`DefaultHttpx2Client` names are factory functions, not classes, and cannot be
+subclassed.
+"""
+
+from __future__ import annotations
+
+import re
+from typing import TYPE_CHECKING
+
+import openai
+
+
+def _sdk_uses_httpx2() -> bool:
+ """Whether the installed `openai` SDK defaults to `httpx2` (openai>=3)."""
+ # First integer run, so tag-derived strings like `v3.0.0` still parse;
+ # unparseable falls back to classic httpx (always present).
+ match = re.match(r"\D*(\d+)", str(getattr(openai, "__version__", "")))
+ return match is not None and int(match.group(1)) >= 3
+
+
+if TYPE_CHECKING:
+ # Type-check against `httpx`, whose API `httpx2` mirrors. This keeps mypy
+ # working in the lint environment (which installs `httpx`, not `httpx2`)
+ # while the runtime selection below picks the correct module.
+ import httpx
+elif _sdk_uses_httpx2():
+ import httpx2 as httpx # type: ignore[import-not-found]
+else:
+ import httpx
+
+__all__ = ["httpx"]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langchain_openai-1.4.3/langchain_openai/_version.py
new/langchain_openai-1.5.0/langchain_openai/_version.py
--- old/langchain_openai-1.4.3/langchain_openai/_version.py 2020-02-02
01:00:00.000000000 +0100
+++ new/langchain_openai-1.5.0/langchain_openai/_version.py 2020-02-02
01:00:00.000000000 +0100
@@ -1,3 +1,3 @@
"""Version information for `langchain-openai`."""
-__version__ = "1.4.3"
+__version__ = "1.5.0"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/langchain_openai-1.4.3/langchain_openai/chat_models/_client_utils.py
new/langchain_openai-1.5.0/langchain_openai/chat_models/_client_utils.py
--- old/langchain_openai-1.4.3/langchain_openai/chat_models/_client_utils.py
2020-02-02 01:00:00.000000000 +0100
+++ new/langchain_openai-1.5.0/langchain_openai/chat_models/_client_utils.py
2020-02-02 01:00:00.000000000 +0100
@@ -22,10 +22,11 @@
from functools import lru_cache
from typing import Any, TypeVar, cast
-import httpx
import openai
from pydantic import SecretStr
+from langchain_openai._compat import httpx
+
logger = logging.getLogger(__name__)
SocketOption = tuple[int, int, int]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/langchain_openai-1.4.3/langchain_openai/embeddings/base.py
new/langchain_openai-1.5.0/langchain_openai/embeddings/base.py
--- old/langchain_openai-1.4.3/langchain_openai/embeddings/base.py
2020-02-02 01:00:00.000000000 +0100
+++ new/langchain_openai-1.5.0/langchain_openai/embeddings/base.py
2020-02-02 01:00:00.000000000 +0100
@@ -421,11 +421,12 @@
else:
if self.openai_proxy and not self.http_client:
try:
- import httpx
+ from langchain_openai._compat import httpx
except ImportError as e:
msg = (
- "Could not import httpx python package. "
- "Please install it with `pip install httpx`."
+ "Could not import the httpx package used by the "
+ "OpenAI SDK. It is normally installed alongside "
+ "`openai`; reinstall with `pip install openai`."
)
raise ImportError(msg) from e
self.http_client = httpx.Client(proxy=self.openai_proxy)
@@ -437,11 +438,12 @@
if not self.async_client:
if self.openai_proxy and not self.http_async_client:
try:
- import httpx
+ from langchain_openai._compat import httpx
except ImportError as e:
msg = (
- "Could not import httpx python package. "
- "Please install it with `pip install httpx`."
+ "Could not import the httpx package used by the "
+ "OpenAI SDK. It is normally installed alongside "
+ "`openai`; reinstall with `pip install openai`."
)
raise ImportError(msg) from e
self.http_async_client =
httpx.AsyncClient(proxy=self.openai_proxy)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langchain_openai-1.4.3/pyproject.toml
new/langchain_openai-1.5.0/pyproject.toml
--- old/langchain_openai-1.4.3/pyproject.toml 2020-02-02 01:00:00.000000000
+0100
+++ new/langchain_openai-1.5.0/pyproject.toml 2020-02-02 01:00:00.000000000
+0100
@@ -20,11 +20,12 @@
"Topic :: Scientific/Engineering :: Artificial Intelligence",
]
-version = "1.4.3"
+version = "1.5.0"
requires-python = ">=3.10.0,<4.0.0"
dependencies = [
- "langchain-core>=1.5.3,<2.0.0",
- "openai>=2.45.0,<3.0.0",
+ "langchain-core>=1.5.4,<2.0.0",
+ "certifi>=2024.6.2",
+ "openai>=2.45.0,<4.0.0",
"tiktoken>=0.7.0,<1.0.0",
]
@@ -50,7 +51,7 @@
"pytest-retry>=1.7.0,<1.8.0",
"pytest-socket>=0.6.0,<1.0.0",
"pytest-xdist>=3.6.1,<4.0.0",
- "vcrpy>=8.0.0,<9.0.0",
+ "vcrpy>=8.2.0,<9.0.0",
"numpy>=1.26.4; python_version<'3.13'",
"numpy>=2.1.0; python_version>='3.13'",
"langchain>=1.0.0,<2.0.0",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/langchain_openai-1.4.3/tests/unit_tests/chat_models/test_client_utils.py
new/langchain_openai-1.5.0/tests/unit_tests/chat_models/test_client_utils.py
---
old/langchain_openai-1.4.3/tests/unit_tests/chat_models/test_client_utils.py
2020-02-02 01:00:00.000000000 +0100
+++
new/langchain_openai-1.5.0/tests/unit_tests/chat_models/test_client_utils.py
2020-02-02 01:00:00.000000000 +0100
@@ -456,7 +456,7 @@
verify=True,
socket_options=(),
)
- assert isinstance(client, httpx.AsyncClient)
+ assert isinstance(client, _client_utils.httpx.AsyncClient)
def test_build_proxied_async_httpx_client_wraps_transport() -> None:
@@ -470,7 +470,7 @@
verify=True,
socket_options=((SOL_SOCKET, SO_KEEPALIVE, 1),),
)
- assert isinstance(client, httpx.AsyncClient)
+ assert isinstance(client, _client_utils.httpx.AsyncClient)
def test_build_proxied_sync_httpx_client_opt_out_returns_plain_client() ->
None:
@@ -479,7 +479,7 @@
verify=True,
socket_options=(),
)
- assert isinstance(client, httpx.Client)
+ assert isinstance(client, _client_utils.httpx.Client)
def test_build_proxied_sync_httpx_client_wraps_transport() -> None:
@@ -488,7 +488,7 @@
verify=True,
socket_options=((SOL_SOCKET, SO_KEEPALIVE, 1),),
)
- assert isinstance(client, httpx.Client)
+ assert isinstance(client, _client_utils.httpx.Client)
def test_warn_if_proxy_env_shadowed_emits_once(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/langchain_openai-1.4.3/tests/unit_tests/test_compat.py
new/langchain_openai-1.5.0/tests/unit_tests/test_compat.py
--- old/langchain_openai-1.4.3/tests/unit_tests/test_compat.py 1970-01-01
01:00:00.000000000 +0100
+++ new/langchain_openai-1.5.0/tests/unit_tests/test_compat.py 2020-02-02
01:00:00.000000000 +0100
@@ -0,0 +1,95 @@
+"""Tests for the `httpx` / `httpx2` compatibility shim (`_compat`)."""
+
+import inspect
+
+import openai
+import pytest
+
+from langchain_openai import _compat
+from langchain_openai.chat_models import _client_utils
+
+
+def test_module_httpx_matches_helper() -> None:
+ """The module-level `httpx` binding agrees with the version check."""
+ expected = "httpx2" if _compat._sdk_uses_httpx2() else "httpx"
+ assert _compat.httpx.__name__ == expected
+
+
+def test_only_httpx_is_exported() -> None:
+ """The default client classes are intentionally not re-exported."""
+ assert _compat.__all__ == ["httpx"]
+
+
+def test_default_clients_are_subclassable_classes() -> None:
+ """`DefaultHttpxClient`/`DefaultAsyncHttpxClient` must be classes, not
factories.
+
+ Regression guard: on openai>=3, `DefaultHttpx2Client` is a *factory
+ function* (returns an `httpx2.Client`) and cannot be subclassed, while the
+ legacy `DefaultHttpxClient` name remains a subclassable class. The wrappers
+ below depend on subclassing the latter.
+ """
+ assert inspect.isclass(openai.DefaultHttpxClient)
+ assert inspect.isclass(openai.DefaultAsyncHttpxClient)
+
+
+def test_wrappers_subclass_openai_default_clients() -> None:
+ """The client wrappers extend the SDK's version-appropriate base
classes."""
+ assert issubclass(_client_utils._SyncHttpxClientWrapper,
openai.DefaultHttpxClient)
+ assert issubclass(
+ _client_utils._AsyncHttpxClientWrapper, openai.DefaultAsyncHttpxClient
+ )
+
+
+def test_client_utils_transport_objects_use_shim_httpx() -> None:
+ """Transport/config objects come from the same module the SDK client uses.
+
+ Handing the SDK an `httpx` object when it expects `httpx2` (or vice
+ versa) happens to work today because the two libraries are drop-in
+ equivalents. Matching them anyway keeps type annotations and `isinstance`
+ checks honest.
+ """
+ assert _client_utils.httpx is _compat.httpx
+ assert isinstance(_client_utils._DEFAULT_CONNECTION_LIMITS,
_compat.httpx.Limits)
+
+
[email protected](
+ ("version", "expected"),
+ [
+ ("2.45.0", False),
+ ("2.54.0", False),
+ ("3.0.0", True),
+ ("3.1.2", True),
+ ("4.0.0", True),
+ # Tag-derived / pre-release strings a plain `int()` parse choked on.
+ ("v3.0.0", True),
+ ("3.0.0rc1", True),
+ ("3.0.0.dev1", True),
+ ],
+)
+def test_sdk_uses_httpx2_reads_major_version(
+ monkeypatch: pytest.MonkeyPatch, version: str, expected: bool
+) -> None:
+ """Selection keys on the openai major version (httpx2 default landed in
3.0)."""
+ monkeypatch.setattr(openai, "__version__", version)
+ assert _compat._sdk_uses_httpx2() is expected
+
+
+def test_httpx2_factory_presence_does_not_flip_selection(
+ monkeypatch: pytest.MonkeyPatch,
+) -> None:
+ """Late openai 2.x exposes a `DefaultHttpx2Client` factory but stays
classic.
+
+ Regression guard for the case where a 2.x SDK backports the httpx2 factory:
+ the major version (2) must win, so the shim stays on classic `httpx`.
+ """
+ monkeypatch.setattr(openai, "__version__", "2.54.0")
+ monkeypatch.setattr(openai, "DefaultHttpx2Client", object(), raising=False)
+ assert _compat._sdk_uses_httpx2() is False
+
+
+def test_sdk_uses_httpx2_unparseable_version_falls_back_to_classic(
+ monkeypatch: pytest.MonkeyPatch,
+) -> None:
+ """An unparseable version must not raise at import; fall back to
classic."""
+ monkeypatch.setattr(openai, "__version__", "not-a-version")
+ assert _compat._sdk_uses_httpx2() is False
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langchain_openai-1.4.3/uv.lock
new/langchain_openai-1.5.0/uv.lock
--- old/langchain_openai-1.4.3/uv.lock 2020-02-02 01:00:00.000000000 +0100
+++ new/langchain_openai-1.5.0/uv.lock 2020-02-02 01:00:00.000000000 +0100
@@ -6,8 +6,10 @@
"python_full_version >= '3.13' and python_full_version < '3.15' and
platform_python_implementation == 'PyPy'",
"python_full_version >= '3.15' and platform_python_implementation !=
'PyPy'",
"python_full_version >= '3.13' and python_full_version < '3.15' and
platform_python_implementation != 'PyPy'",
- "python_full_version >= '3.11' and python_full_version < '3.13' and
platform_python_implementation == 'PyPy'",
- "python_full_version >= '3.11' and python_full_version < '3.13' and
platform_python_implementation != 'PyPy'",
+ "python_full_version == '3.12.*' and platform_python_implementation ==
'PyPy' and sys_platform == 'emscripten'",
+ "(python_full_version >= '3.11' and python_full_version < '3.13' and
platform_python_implementation == 'PyPy' and sys_platform != 'emscripten') or
(python_full_version == '3.11.*' and platform_python_implementation == 'PyPy'
and sys_platform == 'emscripten')",
+ "python_full_version == '3.12.*' and platform_python_implementation !=
'PyPy' and sys_platform == 'emscripten'",
+ "(python_full_version >= '3.11' and python_full_version < '3.13' and
platform_python_implementation != 'PyPy' and sys_platform != 'emscripten') or
(python_full_version == '3.11.*' and platform_python_implementation != 'PyPy'
and sys_platform == 'emscripten')",
"python_full_version < '3.11' and platform_python_implementation ==
'PyPy'",
"python_full_version < '3.11' and platform_python_implementation !=
'PyPy'",
]
@@ -449,6 +451,19 @@
]
[[package]]
+name = "httpcore2"
+version = "2.10.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "h11", marker = "python_full_version != '3.12.*' or sys_platform
!= 'emscripten'" },
+ { name = "truststore", marker = "python_full_version != '3.12.*' or
sys_platform != 'emscripten'" },
+]
+sdist = { url =
"https://files.pythonhosted.org/packages/a9/83/a896fc59940fc5a6e2aff3a4be1d92fa890112936803b331cae75a993c34/httpcore2-2.10.0.tar.gz",
hash =
"sha256:13c0cc3d1919d4f28457f60cd2c2abe04113a8af184ccf1142811beba936f9dc", size
= 67427, upload-time = "2026-08-09T09:11:32.123Z" }
+wheels = [
+ { url =
"https://files.pythonhosted.org/packages/e5/4f/d149104195a35e2853a2fc203a8e3477747e58c80e17dda686dace174383/httpcore2-2.10.0-py3-none-any.whl",
hash =
"sha256:7df06cfb34070cae4f7c89be69dc1095eca138e9704ceffb98d25c1912ab6f01", size
= 83000, upload-time = "2026-08-09T09:11:29.555Z" },
+]
+
+[[package]]
name = "httpx"
version = "0.28.1"
source = { registry = "https://pypi.org/simple" }
@@ -464,12 +479,38 @@
]
[[package]]
+name = "httpx2"
+version = "2.10.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "anyio", marker = "sys_platform != 'emscripten'" },
+ { name = "httpcore2", marker = "sys_platform != 'emscripten'" },
+ { name = "httpx2-jsfetch", marker = "python_full_version >= '3.12' and
sys_platform == 'emscripten'" },
+ { name = "idna" },
+ { name = "truststore", marker = "sys_platform != 'emscripten'" },
+ { name = "typing-extensions", marker = "python_full_version < '3.13'" },
+]
+sdist = { url =
"https://files.pythonhosted.org/packages/bd/3d/f9a8c07a3884f3e5b26205e8436a18b3af61c5d53192c3bea235574dbbec/httpx2-2.10.0.tar.gz",
hash =
"sha256:8741d7329fe2c7885fc9ceb61c8217acfb87a85f75723714b89ebf7ad7196338", size
= 98749, upload-time = "2026-08-09T09:11:33.24Z" }
+wheels = [
+ { url =
"https://files.pythonhosted.org/packages/b9/6d/a637d52449d98a6892d9a4dc0262587afdb6a66f201871842dce5a97b1c1/httpx2-2.10.0-py3-none-any.whl",
hash =
"sha256:5e3194a432701e1cc6f69a8b1b2fa199ef907013fede8d9a09a2c5b7b8141a18", size
= 94355, upload-time = "2026-08-09T09:11:30.882Z" },
+]
+
+[[package]]
+name = "httpx2-jsfetch"
+version = "1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url =
"https://files.pythonhosted.org/packages/cd/c4/0e5636363151a2a1795e0a77617168b9ca438e1748ec05fc9b5687f93d64/httpx2_jsfetch-1.0.tar.gz",
hash =
"sha256:70a0e3eabfef7cce5ad9c629f7d01ca05e418f586646f4ddf14782e4c1454c60", size
= 6872, upload-time = "2026-08-07T00:13:07.492Z" }
+wheels = [
+ { url =
"https://files.pythonhosted.org/packages/9b/43/832f631d32e4f1211caa2ba368317739fe71f0b8530e4c9d15dc454bac2a/httpx2_jsfetch-1.0-py3-none-any.whl",
hash =
"sha256:cb916b707601e69a07721aabc8f3f6659be3a6893bc1ff5c6f9e02241df2da32", size
= 6382, upload-time = "2026-08-07T00:13:06.567Z" },
+]
+
+[[package]]
name = "idna"
-version = "3.15"
+version = "3.18"
source = { registry = "https://pypi.org/simple" }
-sdist = { url =
"https://files.pythonhosted.org/packages/82/77/7b3966d0b9d1d31a36ddf1746926a11dface89a83409bf1483f0237aa758/idna-3.15.tar.gz",
hash =
"sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc", size
= 199245, upload-time = "2026-05-12T22:45:57.011Z" }
+sdist = { url =
"https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz",
hash =
"sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size
= 196711, upload-time = "2026-06-02T14:34:07.794Z" }
wheels = [
- { url =
"https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl",
hash =
"sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", size
= 72340, upload-time = "2026-05-12T22:45:55.733Z" },
+ { url =
"https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl",
hash =
"sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size
= 65455, upload-time = "2026-06-02T14:34:06.319Z" },
]
[[package]]
@@ -601,7 +642,7 @@
[[package]]
name = "langchain"
-version = "1.3.14"
+version = "1.3.15"
source = { editable = "../../langchain_v1" }
dependencies = [
{ name = "langchain-core" },
@@ -630,7 +671,7 @@
{ name = "langchain-perplexity", marker = "extra == 'perplexity'" },
{ name = "langchain-together", marker = "extra == 'together'" },
{ name = "langchain-xai", marker = "extra == 'xai'" },
- { name = "langgraph", specifier = ">=1.2.5,<1.3.0" },
+ { name = "langgraph", specifier = ">=1.2.11,<1.3.0" },
{ name = "pydantic", specifier = ">=2.7.4,<3.0.0" },
]
provides-extras = ["community", "anthropic", "openai", "azure-ai",
"google-vertexai", "google-genai", "fireworks", "ollama", "together",
"mistralai", "huggingface", "groq", "aws", "baseten", "deepseek", "xai",
"perplexity", "meta"]
@@ -666,9 +707,10 @@
[[package]]
name = "langchain-core"
-version = "1.5.3"
+version = "1.5.4"
source = { editable = "../../core" }
dependencies = [
+ { name = "httpx" },
{ name = "jsonpatch" },
{ name = "langchain-protocol" },
{ name = "langsmith" },
@@ -682,6 +724,7 @@
[package.metadata]
requires-dist = [
+ { name = "httpx", specifier = ">=0.23.0,<1.0.0" },
{ name = "jsonpatch", specifier = ">=1.33.0,<2.0.0" },
{ name = "langchain-protocol", specifier = ">=0.0.17" },
{ name = "langsmith", specifier = ">=0.3.45,<1.0.0" },
@@ -728,9 +771,10 @@
[[package]]
name = "langchain-openai"
-version = "1.4.3"
+version = "1.5.0"
source = { editable = "." }
dependencies = [
+ { name = "certifi" },
{ name = "langchain-core" },
{ name = "openai" },
{ name = "tiktoken" },
@@ -770,8 +814,9 @@
[package.metadata]
requires-dist = [
+ { name = "certifi", specifier = ">=2024.6.2" },
{ name = "langchain-core", editable = "../../core" },
- { name = "openai", specifier = ">=2.45.0,<3.0.0" },
+ { name = "openai", specifier = ">=2.45.0,<4.0.0" },
{ name = "tiktoken", specifier = ">=0.7.0,<1.0.0" },
]
@@ -793,7 +838,7 @@
{ name = "pytest-watcher", specifier = ">=0.3.4,<1.0.0" },
{ name = "pytest-xdist", specifier = ">=3.6.1,<4.0.0" },
{ name = "syrupy", specifier = ">=5.0.0,<6.0.0" },
- { name = "vcrpy", specifier = ">=8.0.0,<9.0.0" },
+ { name = "vcrpy", specifier = ">=8.2.0,<9.0.0" },
]
test-integration = [
{ name = "httpx", specifier = ">=0.27.0,<1.0.0" },
@@ -864,7 +909,7 @@
[[package]]
name = "langgraph"
-version = "1.2.5"
+version = "1.2.11"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "langchain-core" },
@@ -874,9 +919,9 @@
{ name = "pydantic" },
{ name = "xxhash" },
]
-sdist = { url =
"https://files.pythonhosted.org/packages/77/9d/7c9ebd17b95569122e2d2e641f535cf086c870d66bb8e59be33cdba856b3/langgraph-1.2.5.tar.gz",
hash =
"sha256:09a3bdec6fdb3228623fc78b6f69a1400d383f66348d0b04d0efb692022cc6ef", size
= 712532, upload-time = "2026-06-12T20:30:58.498Z" }
+sdist = { url =
"https://files.pythonhosted.org/packages/56/0d/c8e7ee98896659e1b6555db0ab115a9ca899844744645d5d894032bab1d7/langgraph-1.2.11.tar.gz",
hash =
"sha256:9ecfe11e50d338b34b15cf4d8a442642de103e8ae6971320efba84e4542eb363", size
= 725753, upload-time = "2026-08-11T14:00:36.945Z" }
wheels = [
- { url =
"https://files.pythonhosted.org/packages/a2/03/187281cf61845c5a9c397ae6cd9cd73bb54b39435e5575a7b83c853e5b76/langgraph-1.2.5-py3-none-any.whl",
hash =
"sha256:9286bb5def82fc865959c14378fe473518dc097d586225f622f029637a2a4bb9", size
= 246150, upload-time = "2026-06-12T20:30:57.018Z" },
+ { url =
"https://files.pythonhosted.org/packages/0a/7f/c5c30e4be99ff821029c7ac872a480676bb179c9f3df85ea3f38d13f86d4/langgraph-1.2.11-py3-none-any.whl",
hash =
"sha256:8bab70de7b2d00b5300fb289bcf38d8b241400f3184c1e95e8ce706fb0e8686b", size
= 248854, upload-time = "2026-08-11T14:00:35.494Z" },
]
[[package]]
@@ -1191,8 +1236,10 @@
"python_full_version >= '3.13' and python_full_version < '3.15' and
platform_python_implementation == 'PyPy'",
"python_full_version >= '3.15' and platform_python_implementation !=
'PyPy'",
"python_full_version >= '3.13' and python_full_version < '3.15' and
platform_python_implementation != 'PyPy'",
- "python_full_version >= '3.11' and python_full_version < '3.13' and
platform_python_implementation == 'PyPy'",
- "python_full_version >= '3.11' and python_full_version < '3.13' and
platform_python_implementation != 'PyPy'",
+ "python_full_version == '3.12.*' and platform_python_implementation ==
'PyPy' and sys_platform == 'emscripten'",
+ "(python_full_version >= '3.11' and python_full_version < '3.13' and
platform_python_implementation == 'PyPy' and sys_platform != 'emscripten') or
(python_full_version == '3.11.*' and platform_python_implementation == 'PyPy'
and sys_platform == 'emscripten')",
+ "python_full_version == '3.12.*' and platform_python_implementation !=
'PyPy' and sys_platform == 'emscripten'",
+ "(python_full_version >= '3.11' and python_full_version < '3.13' and
platform_python_implementation != 'PyPy' and sys_platform != 'emscripten') or
(python_full_version == '3.11.*' and platform_python_implementation != 'PyPy'
and sys_platform == 'emscripten')",
]
sdist = { url =
"https://files.pythonhosted.org/packages/b5/f4/098d2270d52b41f1bd7db9fc288aaa0400cb48c2a3e2af6fa365d9720947/numpy-2.3.4.tar.gz",
hash =
"sha256:a7d018bfedb375a8d979ac758b120ba846a7fe764911a64465fd87b8729f4a6a", size
= 20582187, upload-time = "2025-10-15T16:18:11.77Z" }
wheels = [
@@ -1273,21 +1320,21 @@
[[package]]
name = "openai"
-version = "2.45.0"
+version = "3.0.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "anyio" },
{ name = "distro" },
- { name = "httpx" },
+ { name = "httpx2" },
{ name = "jiter" },
{ name = "pydantic" },
{ name = "sniffio" },
{ name = "tqdm" },
{ name = "typing-extensions" },
]
-sdist = { url =
"https://files.pythonhosted.org/packages/78/60/d4219875289b11d2c2f7da93c36283da224a2e55865ed865ab64e0ce9217/openai-2.45.0.tar.gz",
hash =
"sha256:10d34ca9c5643bce775852fddbfc172505cb1d4de1ccd101696c3ecff358765d", size
= 1109653, upload-time = "2026-07-09T18:02:44.091Z" }
+sdist = { url =
"https://files.pythonhosted.org/packages/54/8c/2f500e8be09d1ae98c530467962535198b02cd4550cd418bbbaedc8b2910/openai-3.0.0.tar.gz",
hash =
"sha256:ffd00ef1678d70957e1f1ed98d5bfcf1d661f41ea4482f22e7d0144a66435a49", size
= 1123740, upload-time = "2026-08-12T01:55:50.849Z" }
wheels = [
- { url =
"https://files.pythonhosted.org/packages/f1/b0/2291689e3ec4723fbf5bbf3b54afcd7b160f9ddc98ca7aedfd0132af5677/openai-2.45.0-py3-none-any.whl",
hash =
"sha256:5df105f5f8c9b711fcb9d06d2d3888cebc82506db216484c14a4e53cdf651777", size
= 1629470, upload-time = "2026-07-09T18:02:42.21Z" },
+ { url =
"https://files.pythonhosted.org/packages/7b/0d/9850e7eddb5e66da4439ed503e78e09ad1fd0195e6df51e4236c75763581/openai-3.0.0-py3-none-any.whl",
hash =
"sha256:8d32ac3a6647a66910d6cb8a64f0fa5a6c823604b6e82db83d9d055c6709bd51", size
= 1665775, upload-time = "2026-08-12T01:55:48.678Z" },
]
[[package]]
@@ -2270,6 +2317,15 @@
]
[[package]]
+name = "truststore"
+version = "0.10.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url =
"https://files.pythonhosted.org/packages/53/a3/1585216310e344e8102c22482f6060c7a6ea0322b63e026372e6dcefcfd6/truststore-0.10.4.tar.gz",
hash =
"sha256:9d91bd436463ad5e4ee4aba766628dd6cd7010cf3e2461756b3303710eebc301", size
= 26169, upload-time = "2025-08-12T18:49:02.73Z" }
+wheels = [
+ { url =
"https://files.pythonhosted.org/packages/19/97/56608b2249fe206a67cd573bc93cd9896e1efb9e98bce9c163bcdc704b88/truststore-0.10.4-py3-none-any.whl",
hash =
"sha256:adaeaecf1cbb5f4de3b1959b42d41f6fab57b2b1666adb59e89cb0b53361d981", size
= 18660, upload-time = "2025-08-12T18:49:01.46Z" },
+]
+
+[[package]]
name = "types-requests"
version = "2.31.0.6"
source = { registry = "https://pypi.org/simple" }