Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-langchain-core for
openSUSE:Factory checked in at 2026-10-08 11:59:30
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-langchain-core (Old)
and /work/SRC/openSUSE:Factory/.python-langchain-core.new.3698736 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-langchain-core"
Thu Oct 8 11:59:30 2026 rev:18 rq:1383213 version:1.6.7
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-langchain-core/python-langchain-core.changes
2026-10-01 16:45:33.106285415 +0200
+++
/work/SRC/openSUSE:Factory/.python-langchain-core.new.3698736/python-langchain-core.changes
2026-10-08 12:00:19.634322775 +0200
@@ -1,0 +2,7 @@
+Thu Oct 8 06:24:34 UTC 2026 - Martin Pluskal <[email protected]>
+
+- Update to version 1.6.7:
+ * Include OpenAI redacted_content in v1 output for Bedrock Converse
+ * Python 3.14 hardening around `inspect.signature`
+
+-------------------------------------------------------------------
Old:
----
langchain_core-1.6.6.tar.gz
New:
----
langchain_core-1.6.7.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-langchain-core.spec ++++++
--- /var/tmp/diff_new_pack.tyJ6TI/_old 2026-10-08 12:00:20.511359511 +0200
+++ /var/tmp/diff_new_pack.tyJ6TI/_new 2026-10-08 12:00:20.514359637 +0200
@@ -17,7 +17,7 @@
Name: python-langchain-core
-Version: 1.6.6
+Version: 1.6.7
Release: 0
Summary: Building applications with LLMs through composability
License: MIT
++++++ langchain_core-1.6.6.tar.gz -> langchain_core-1.6.7.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langchain_core-1.6.6/PKG-INFO
new/langchain_core-1.6.7/PKG-INFO
--- old/langchain_core-1.6.6/PKG-INFO 2020-02-02 01:00:00.000000000 +0100
+++ new/langchain_core-1.6.7/PKG-INFO 2020-02-02 01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.5
Name: langchain-core
-Version: 1.6.6
+Version: 1.6.7
Summary: Building applications with LLMs through composability
Project-URL: Homepage, https://docs.langchain.com/
Project-URL: Documentation,
https://reference.langchain.com/python/langchain_core/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/langchain_core-1.6.6/langchain_core/_api/deprecation.py
new/langchain_core-1.6.7/langchain_core/_api/deprecation.py
--- old/langchain_core-1.6.6/langchain_core/_api/deprecation.py 2020-02-02
01:00:00.000000000 +0100
+++ new/langchain_core-1.6.7/langchain_core/_api/deprecation.py 2020-02-02
01:00:00.000000000 +0100
@@ -36,10 +36,9 @@
def _is_pydantic_v1_field_info(obj: Any) -> TypeGuard["FieldInfoV1"]:
"""Check if `obj` is a `pydantic.v1.fields.FieldInfo` without forcing
import.
- Importing `pydantic.v1` emits a `UserWarning` on Python 3.14+. Skipping the
- import entirely when no caller has constructed a v1 `FieldInfo` keeps that
- warning out of `langchain_core`'s import path. If a caller did construct
one,
- `pydantic.v1.fields` is already in `sys.modules` and isinstance is safe.
+ Avoids importing `pydantic.v1`, which emits a `UserWarning` on Python 3.14+
+ with Pydantic 2.12. A v1 `FieldInfo` can only exist once a caller has
imported
+ `pydantic.v1.fields`, so this check consults it only if it is already
loaded.
"""
mod = sys.modules.get("pydantic.v1.fields")
if mod is None:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/langchain_core-1.6.6/langchain_core/language_models/chat_models.py
new/langchain_core-1.6.7/langchain_core/language_models/chat_models.py
--- old/langchain_core-1.6.6/langchain_core/language_models/chat_models.py
2020-02-02 01:00:00.000000000 +0100
+++ new/langchain_core-1.6.7/langchain_core/language_models/chat_models.py
2020-02-02 01:00:00.000000000 +0100
@@ -5,7 +5,6 @@
import asyncio
import builtins # noqa: TC003 # runtime-evaluated; subclass `dict()` shadows
the builtin
import contextlib
-import inspect
import json
from abc import ABC, abstractmethod
from collections.abc import AsyncIterator, Callable, Iterator, Sequence
@@ -91,6 +90,7 @@
GATEWAY_METADATA_RESPONSE_KEY,
_parse_gateway_metadata,
)
+from langchain_core.utils._signature import _signature_parameters
from langchain_core.utils.function_calling import (
convert_to_json_schema,
convert_to_openai_tool,
@@ -2018,7 +2018,7 @@
run_manager.on_llm_new_token("", chunk=chunk)
chunks.append(chunk)
result = generate_from_stream(iter(chunks))
- elif inspect.signature(self._generate).parameters.get("run_manager"):
+ elif _signature_parameters(self._generate).get("run_manager"):
result = self._generate(
messages, stop=stop, run_manager=run_manager, **kwargs
)
@@ -2175,7 +2175,7 @@
await run_manager.on_llm_new_token("", chunk=chunk)
chunks.append(chunk)
result = generate_from_stream(iter(chunks))
- elif inspect.signature(self._agenerate).parameters.get("run_manager"):
+ elif _signature_parameters(self._agenerate).get("run_manager"):
result = await self._agenerate(
messages, stop=stop, run_manager=run_manager, **kwargs
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/langchain_core-1.6.6/langchain_core/language_models/llms.py
new/langchain_core-1.6.7/langchain_core/language_models/llms.py
--- old/langchain_core-1.6.6/langchain_core/language_models/llms.py
2020-02-02 01:00:00.000000000 +0100
+++ new/langchain_core-1.6.7/langchain_core/language_models/llms.py
2020-02-02 01:00:00.000000000 +0100
@@ -8,7 +8,6 @@
import asyncio
import builtins
import functools
-import inspect
import json
import logging
from abc import ABC, abstractmethod
@@ -58,6 +57,7 @@
from langchain_core.prompt_values import ChatPromptValue, PromptValue,
StringPromptValue
from langchain_core.runnables import RunnableConfig, ensure_config,
get_config_list
from langchain_core.runnables.config import run_in_executor
+from langchain_core.utils._signature import _signature_parameters
if TYPE_CHECKING:
import builtins
@@ -1006,9 +1006,7 @@
missing_prompt_idxs,
missing_prompts,
) = get_prompts(params, prompts, self.cache)
- new_arg_supported = inspect.signature(self._generate).parameters.get(
- "run_manager"
- )
+ new_arg_supported =
_signature_parameters(self._generate).get("run_manager")
if (self.cache is None and get_llm_cache() is None) or self.cache is
False:
run_managers = [
callback_manager.on_llm_start(
@@ -1281,9 +1279,7 @@
# Verify whether the cache is set, and if the cache is set,
# verify whether the cache is available.
- new_arg_supported = inspect.signature(self._agenerate).parameters.get(
- "run_manager"
- )
+ new_arg_supported =
_signature_parameters(self._agenerate).get("run_manager")
if (self.cache is None and get_llm_cache() is None) or self.cache is
False:
run_managers = await asyncio.gather(
*[
@@ -1540,7 +1536,7 @@
) -> LLMResult:
# TODO: add caching here.
generations = []
- new_arg_supported =
inspect.signature(self._call).parameters.get("run_manager")
+ new_arg_supported =
_signature_parameters(self._call).get("run_manager")
for prompt in prompts:
text = (
self._call(prompt, stop=stop, run_manager=run_manager,
**kwargs)
@@ -1558,7 +1554,7 @@
**kwargs: Any,
) -> LLMResult:
generations = []
- new_arg_supported =
inspect.signature(self._acall).parameters.get("run_manager")
+ new_arg_supported =
_signature_parameters(self._acall).get("run_manager")
for prompt in prompts:
text = (
await self._acall(prompt, stop=stop, run_manager=run_manager,
**kwargs)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/langchain_core-1.6.6/langchain_core/messages/block_translators/bedrock_converse.py
new/langchain_core-1.6.7/langchain_core/messages/block_translators/bedrock_converse.py
---
old/langchain_core-1.6.6/langchain_core/messages/block_translators/bedrock_converse.py
2020-02-02 01:00:00.000000000 +0100
+++
new/langchain_core-1.6.7/langchain_core/messages/block_translators/bedrock_converse.py
2020-02-02 01:00:00.000000000 +0100
@@ -195,6 +195,10 @@
if "extras" not in reasoning_block:
reasoning_block["extras"] = {}
reasoning_block["extras"]["signature"] = signature
+ if redacted := reasoning_content.get("redacted_content"):
+ if "extras" not in reasoning_block:
+ reasoning_block["extras"] = {}
+ reasoning_block["extras"]["redacted_content"] =
redacted
if "index" in block:
reasoning_block["index"] = block["index"]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langchain_core-1.6.6/langchain_core/retrievers.py
new/langchain_core-1.6.7/langchain_core/retrievers.py
--- old/langchain_core-1.6.6/langchain_core/retrievers.py 2020-02-02
01:00:00.000000000 +0100
+++ new/langchain_core-1.6.7/langchain_core/retrievers.py 2020-02-02
01:00:00.000000000 +0100
@@ -8,7 +8,6 @@
from __future__ import annotations
from abc import ABC, abstractmethod
-from inspect import signature
from typing import TYPE_CHECKING, Any
from pydantic import ConfigDict
@@ -23,6 +22,7 @@
ensure_config,
)
from langchain_core.runnables.config import run_in_executor
+from langchain_core.utils._signature import _signature_parameters
if TYPE_CHECKING:
from langchain_core.callbacks.manager import (
@@ -145,7 +145,7 @@
@override
def __init_subclass__(cls, **kwargs: Any) -> None:
super().__init_subclass__(**kwargs)
- parameters = signature(cls._get_relevant_documents).parameters
+ parameters = _signature_parameters(cls._get_relevant_documents)
cls._new_arg_supported = parameters.get("run_manager") is not None
if (
not cls._new_arg_supported
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/langchain_core-1.6.6/langchain_core/runnables/base.py
new/langchain_core-1.6.7/langchain_core/runnables/base.py
--- old/langchain_core-1.6.6/langchain_core/runnables/base.py 2020-02-02
01:00:00.000000000 +0100
+++ new/langchain_core-1.6.7/langchain_core/runnables/base.py 2020-02-02
01:00:00.000000000 +0100
@@ -96,6 +96,7 @@
AsyncRootListenersTracer,
RootListenersTracer,
)
+from langchain_core.utils._signature import _signature_parameters
from langchain_core.utils.aiter import aclosing, atee
from langchain_core.utils.iter import safetee
from langchain_core.utils.pydantic import (
@@ -6550,7 +6551,7 @@
attr = getattr(self.bound, name)
if callable(attr) and (
- config_param := inspect.signature(attr).parameters.get("config")
+ config_param := _signature_parameters(attr).get("config")
):
if config_param.kind == inspect.Parameter.KEYWORD_ONLY:
@@ -6564,7 +6565,7 @@
return wrapper
if config_param.kind == inspect.Parameter.POSITIONAL_OR_KEYWORD:
- idx = list(inspect.signature(attr).parameters).index("config")
+ idx = list(_signature_parameters(attr)).index("config")
@wraps(attr)
def wrapper(*args: Any, **kwargs: Any) -> Any:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/langchain_core-1.6.6/langchain_core/runnables/history.py
new/langchain_core-1.6.7/langchain_core/runnables/history.py
--- old/langchain_core-1.6.6/langchain_core/runnables/history.py
2020-02-02 01:00:00.000000000 +0100
+++ new/langchain_core-1.6.7/langchain_core/runnables/history.py
2020-02-02 01:00:00.000000000 +0100
@@ -24,6 +24,7 @@
Output,
get_unique_config_specs,
)
+from langchain_core.utils._signature import _signature_parameters
from langchain_core.utils.pydantic import create_model_v2
if TYPE_CHECKING:
@@ -627,5 +628,4 @@
def _get_parameter_names(callable_: GetSessionHistoryCallable) -> list[str]:
"""Get the parameter names of the `Callable`."""
- sig = inspect.signature(callable_)
- return list(sig.parameters.keys())
+ return list(_signature_parameters(callable_))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/langchain_core-1.6.6/langchain_core/runnables/utils.py
new/langchain_core-1.6.7/langchain_core/runnables/utils.py
--- old/langchain_core-1.6.6/langchain_core/runnables/utils.py 2020-02-02
01:00:00.000000000 +0100
+++ new/langchain_core-1.6.7/langchain_core/runnables/utils.py 2020-02-02
01:00:00.000000000 +0100
@@ -12,7 +12,6 @@
# RunnableConfigurableFields.
from collections.abc import Mapping, Sequence # noqa: TC003
from functools import lru_cache
-from inspect import signature
from itertools import groupby
from typing import (
TYPE_CHECKING,
@@ -25,6 +24,8 @@
from typing_extensions import override
+from langchain_core.utils._signature import _signature_parameters
+
# Re-export create-model for backwards compatibility
from langchain_core.utils.pydantic import create_model # noqa: F401
@@ -92,7 +93,7 @@
`True` if the callable accepts a run_manager argument, `False`
otherwise.
"""
try:
- return signature(callable).parameters.get("run_manager") is not None
+ return _signature_parameters(callable).get("run_manager") is not None
except ValueError:
return False
@@ -107,7 +108,7 @@
`True` if the callable accepts a config argument, `False` otherwise.
"""
try:
- return signature(callable).parameters.get("config") is not None
+ return _signature_parameters(callable).get("config") is not None
except ValueError:
return False
@@ -122,7 +123,7 @@
`True` if the callable accepts a context argument, `False` otherwise.
"""
try:
- return signature(callable).parameters.get("context") is not None
+ return _signature_parameters(callable).get("context") is not None
except ValueError:
return False
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langchain_core-1.6.6/langchain_core/tools/base.py
new/langchain_core-1.6.7/langchain_core/tools/base.py
--- old/langchain_core-1.6.6/langchain_core/tools/base.py 2020-02-02
01:00:00.000000000 +0100
+++ new/langchain_core-1.6.7/langchain_core/tools/base.py 2020-02-02
01:00:00.000000000 +0100
@@ -10,7 +10,6 @@
import warnings
from abc import ABC, abstractmethod
from collections.abc import Callable, Mapping, Sequence
-from inspect import signature
from typing import (
TYPE_CHECKING,
Annotated,
@@ -54,6 +53,7 @@
)
from langchain_core.runnables.config import set_config_context
from langchain_core.runnables.utils import coro_with_context
+from langchain_core.utils._signature import _signature_parameters
from langchain_core.utils.function_calling import (
_parse_google_docstring,
_py_38_safe_origin,
@@ -925,7 +925,7 @@
Returns:
The result of the tool execution.
"""
- if kwargs.get("run_manager") and signature(self._run).parameters.get(
+ if kwargs.get("run_manager") and _signature_parameters(self._run).get(
"run_manager"
):
kwargs["run_manager"] = kwargs["run_manager"].get_sync()
@@ -1091,7 +1091,7 @@
tool_args, tool_kwargs = self._to_args_and_kwargs(
tool_input, tool_call_id
)
- if signature(self._run).parameters.get("run_manager"):
+ if _signature_parameters(self._run).get("run_manager"):
tool_kwargs |= {"run_manager": run_manager}
if config_param := _get_runnable_config_param(self._run):
tool_kwargs |= {config_param: config}
@@ -1219,7 +1219,7 @@
func_to_check = (
self._run if self.__class__._arun is BaseTool._arun else
self._arun # noqa: SLF001
)
- if signature(func_to_check).parameters.get("run_manager"):
+ if _signature_parameters(func_to_check).get("run_manager"):
tool_kwargs["run_manager"] = run_manager
if config_param := _get_runnable_config_param(func_to_check):
tool_kwargs[config_param] = config
@@ -1639,7 +1639,7 @@
Returns:
`frozenset` of parameter names annotated as injected arguments.
"""
- params = signature(func).parameters
+ params = _signature_parameters(func)
hint_source = _get_type_hints_source(func)
hints = (
_get_type_hints(hint_source, include_extras=True)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langchain_core-1.6.6/langchain_core/tools/simple.py
new/langchain_core-1.6.7/langchain_core/tools/simple.py
--- old/langchain_core-1.6.6/langchain_core/tools/simple.py 2020-02-02
01:00:00.000000000 +0100
+++ new/langchain_core-1.6.7/langchain_core/tools/simple.py 2020-02-02
01:00:00.000000000 +0100
@@ -3,7 +3,6 @@
from __future__ import annotations
from collections.abc import Awaitable, Callable
-from inspect import signature
from typing import (
TYPE_CHECKING,
Any,
@@ -23,6 +22,7 @@
ToolException,
_get_runnable_config_param,
)
+from langchain_core.utils._signature import _signature_parameters
if TYPE_CHECKING:
from langchain_core.messages import ToolCall
@@ -115,7 +115,7 @@
The result of the tool execution
"""
if self.func:
- if run_manager and
signature(self.func).parameters.get("callbacks"):
+ if run_manager and
_signature_parameters(self.func).get("callbacks"):
kwargs["callbacks"] = run_manager.get_child()
if config_param := _get_runnable_config_param(self.func):
kwargs[config_param] = config
@@ -142,7 +142,7 @@
The result of the tool execution
"""
if self.coroutine:
- if run_manager and
signature(self.coroutine).parameters.get("callbacks"):
+ if run_manager and
_signature_parameters(self.coroutine).get("callbacks"):
kwargs["callbacks"] = run_manager.get_child()
if config_param := _get_runnable_config_param(self.coroutine):
kwargs[config_param] = config
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/langchain_core-1.6.6/langchain_core/tools/structured.py
new/langchain_core-1.6.7/langchain_core/tools/structured.py
--- old/langchain_core-1.6.6/langchain_core/tools/structured.py 2020-02-02
01:00:00.000000000 +0100
+++ new/langchain_core-1.6.7/langchain_core/tools/structured.py 2020-02-02
01:00:00.000000000 +0100
@@ -5,7 +5,6 @@
import functools
import textwrap
from collections.abc import Awaitable, Callable
-from inspect import signature
from typing import (
TYPE_CHECKING,
Annotated,
@@ -31,6 +30,7 @@
_get_runnable_config_param,
create_schema_from_function,
)
+from langchain_core.utils._signature import _signature_parameters
from langchain_core.utils.pydantic import is_basemodel_subclass,
model_json_schema
if TYPE_CHECKING:
@@ -145,7 +145,7 @@
The result of the tool execution
"""
if self.func:
- if run_manager and
signature(self.func).parameters.get("callbacks"):
+ if run_manager and
_signature_parameters(self.func).get("callbacks"):
kwargs["callbacks"] = run_manager.get_child()
if config_param := _get_runnable_config_param(self.func):
kwargs[config_param] = config
@@ -172,7 +172,7 @@
The result of the tool execution
"""
if self.coroutine:
- if run_manager and
signature(self.coroutine).parameters.get("callbacks"):
+ if run_manager and
_signature_parameters(self.coroutine).get("callbacks"):
kwargs["callbacks"] = run_manager.get_child()
if config_param := _get_runnable_config_param(self.coroutine):
kwargs[config_param] = config
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/langchain_core-1.6.6/langchain_core/utils/_signature.py
new/langchain_core-1.6.7/langchain_core/utils/_signature.py
--- old/langchain_core-1.6.6/langchain_core/utils/_signature.py 1970-01-01
01:00:00.000000000 +0100
+++ new/langchain_core-1.6.7/langchain_core/utils/_signature.py 2020-02-02
01:00:00.000000000 +0100
@@ -0,0 +1,29 @@
+"""Signature inspection that does not evaluate annotations."""
+
+import inspect
+import sys
+from collections.abc import Callable, Mapping
+from typing import Any
+
+if sys.version_info >= (3, 14):
+ from annotationlib import Format
+
+
+def _signature_parameters(obj: Callable[..., Any]) -> Mapping[str,
inspect.Parameter]:
+ """Get the parameters of a callable without evaluating its annotations.
+
+ On Python 3.14+, annotations are evaluated lazily, so `inspect.signature`
raises
+ `NameError` for annotations that reference names imported only under
+ `TYPE_CHECKING`. Use this when only parameter names or kinds are needed.
+
+ Args:
+ obj: The callable to inspect.
+
+ Returns:
+ The callable's parameters, keyed by name.
+ """
+ if sys.version_info >= (3, 14):
+ signature = inspect.signature(obj, annotation_format=Format.FORWARDREF)
+ else:
+ signature = inspect.signature(obj)
+ return signature.parameters
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langchain_core-1.6.6/langchain_core/version.py
new/langchain_core-1.6.7/langchain_core/version.py
--- old/langchain_core-1.6.6/langchain_core/version.py 2020-02-02
01:00:00.000000000 +0100
+++ new/langchain_core-1.6.7/langchain_core/version.py 2020-02-02
01:00:00.000000000 +0100
@@ -1,3 +1,3 @@
"""Version information for `langchain-core`."""
-VERSION = "1.6.6"
+VERSION = "1.6.7"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langchain_core-1.6.6/pyproject.toml
new/langchain_core-1.6.7/pyproject.toml
--- old/langchain_core-1.6.6/pyproject.toml 2020-02-02 01:00:00.000000000
+0100
+++ new/langchain_core-1.6.7/pyproject.toml 2020-02-02 01:00:00.000000000
+0100
@@ -21,7 +21,7 @@
"Topic :: Software Development :: Libraries :: Python Modules",
]
-version = "1.6.6"
+version = "1.6.7"
requires-python = ">=3.10.0,<4.0.0"
dependencies = [
"langsmith>=0.3.45,<1.0.0",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/langchain_core-1.6.6/tests/unit_tests/messages/block_translators/test_bedrock_converse.py
new/langchain_core-1.6.7/tests/unit_tests/messages/block_translators/test_bedrock_converse.py
---
old/langchain_core-1.6.6/tests/unit_tests/messages/block_translators/test_bedrock_converse.py
2020-02-02 01:00:00.000000000 +0100
+++
new/langchain_core-1.6.7/tests/unit_tests/messages/block_translators/test_bedrock_converse.py
2020-02-02 01:00:00.000000000 +0100
@@ -132,6 +132,49 @@
assert message.content == original_content
+def test_convert_to_v1_from_converse_redacted_reasoning() -> None:
+ message = AIMessage(
+ [
+ {
+ "type": "reasoning_content",
+ "reasoning_content": {"redacted_content": b"rsn_opaque"},
+ },
+ {"type": "text", "text": "391"},
+ ],
+ response_metadata={"model_provider": "bedrock_converse"},
+ )
+ expected_content: list[types.ContentBlock] = [
+ {"type": "reasoning", "extras": {"redacted_content": b"rsn_opaque"}},
+ {"type": "text", "text": "391"},
+ ]
+ original_content = deepcopy(message.content)
+
+ assert message.content_blocks == expected_content
+ assert message.content == original_content
+
+
+def test_convert_to_v1_from_converse_redacted_reasoning_chunk() -> None:
+ chunk = AIMessageChunk(
+ content=[
+ {
+ "type": "reasoning_content",
+ "reasoning_content": {"redacted_content": b"rsn_opaque"},
+ "index": 0,
+ }
+ ],
+ response_metadata={"model_provider": "bedrock_converse"},
+ )
+ expected_content: list[types.ContentBlock] = [
+ {
+ "type": "reasoning",
+ "extras": {"redacted_content": b"rsn_opaque"},
+ "index": 0,
+ }
+ ]
+
+ assert chunk.content_blocks == expected_content
+
+
def test_convert_to_v1_from_converse_chunk() -> None:
chunks = [
AIMessageChunk(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/langchain_core-1.6.6/tests/unit_tests/utils/_type_checking_annotations.py
new/langchain_core-1.6.7/tests/unit_tests/utils/_type_checking_annotations.py
---
old/langchain_core-1.6.6/tests/unit_tests/utils/_type_checking_annotations.py
1970-01-01 01:00:00.000000000 +0100
+++
new/langchain_core-1.6.7/tests/unit_tests/utils/_type_checking_annotations.py
2020-02-02 01:00:00.000000000 +0100
@@ -0,0 +1,127 @@
+"""Callables annotated with names that are only imported for type checking.
+
+Deliberately omits `from __future__ import annotations`, so on Python 3.14+
these
+annotations are evaluated lazily and raise `NameError` when evaluated.
Importing
+this module requires Python 3.14+.
+"""
+
+# ruff: noqa: TC004
+
+from typing import TYPE_CHECKING, Any
+
+from pydantic import BaseModel
+from typing_extensions import override
+
+from langchain_core.chat_history import InMemoryChatMessageHistory
+from langchain_core.documents import Document
+from langchain_core.language_models import LLM, BaseChatModel
+from langchain_core.messages import AIMessage
+from langchain_core.outputs import ChatGeneration, ChatResult
+from langchain_core.retrievers import BaseRetriever
+from langchain_core.tools import BaseTool
+
+if TYPE_CHECKING:
+ from collections.abc import AsyncIterator, Iterator
+
+ from langchain_core.callbacks import (
+ CallbackManagerForLLMRun,
+ CallbackManagerForRetrieverRun,
+ CallbackManagerForToolRun,
+ )
+ from langchain_core.chat_history import BaseChatMessageHistory
+ from langchain_core.messages import BaseMessage
+ from langchain_core.runnables import RunnableConfig
+
+
+def add_one(x: int, config: RunnableConfig) -> int: # noqa: ARG001
+ return x + 1
+
+
+async def aadd_one(x: int, config: RunnableConfig) -> int: # noqa: ARG001
+ return x + 1
+
+
+def get_content(message: AIMessage) -> str:
+ return message.text
+
+
+def upper(chunks: Iterator[str]) -> Iterator[str]:
+ for chunk in chunks:
+ yield chunk.upper()
+
+
+async def aupper(chunks: AsyncIterator[str]) -> AsyncIterator[str]:
+ async for chunk in chunks:
+ yield chunk.upper()
+
+
+_histories: dict[str, InMemoryChatMessageHistory] = {}
+
+
+def get_session_history(session_id: str) -> BaseChatMessageHistory:
+ return _histories.setdefault(session_id, InMemoryChatMessageHistory())
+
+
+class FakeChatModel(BaseChatModel):
+ @override
+ def _generate(
+ self,
+ messages: list[BaseMessage],
+ stop: list[str] | None = None,
+ run_manager: CallbackManagerForLLMRun | None = None,
+ **kwargs: Any,
+ ) -> ChatResult:
+ return
ChatResult(generations=[ChatGeneration(message=AIMessage("hello"))])
+
+ @property
+ @override
+ def _llm_type(self) -> str:
+ return "fake"
+
+ def describe(self, *, config: RunnableConfig) -> list[str]:
+ return config.get("tags", [])
+
+
+class FakeLLM(LLM):
+ @override
+ def _call(
+ self,
+ prompt: str,
+ stop: list[str] | None = None,
+ run_manager: CallbackManagerForLLMRun | None = None,
+ **kwargs: Any,
+ ) -> str:
+ return "hello"
+
+ @property
+ @override
+ def _llm_type(self) -> str:
+ return "fake"
+
+
+def define_retriever() -> type[BaseRetriever]:
+ # `BaseRetriever` inspects `_get_relevant_documents` on subclass
definition.
+ class FakeRetriever(BaseRetriever):
+ @override
+ def _get_relevant_documents(
+ self, query: str, *, run_manager: CallbackManagerForRetrieverRun
+ ) -> list[Document]:
+ return [Document(page_content=query)]
+
+ return FakeRetriever
+
+
+class EchoInput(BaseModel):
+ text: str
+
+
+class EchoTool(BaseTool):
+ name: str = "echo"
+ description: str = "Echo the input."
+ args_schema: type[BaseModel] = EchoInput
+
+ @override
+ def _run(
+ self, text: str, run_manager: CallbackManagerForToolRun | None = None
+ ) -> str:
+ return text
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/langchain_core-1.6.6/tests/unit_tests/utils/test_signature.py
new/langchain_core-1.6.7/tests/unit_tests/utils/test_signature.py
--- old/langchain_core-1.6.6/tests/unit_tests/utils/test_signature.py
1970-01-01 01:00:00.000000000 +0100
+++ new/langchain_core-1.6.7/tests/unit_tests/utils/test_signature.py
2020-02-02 01:00:00.000000000 +0100
@@ -0,0 +1,84 @@
+"""Public APIs accept callables annotated with names imported under
`TYPE_CHECKING`."""
+
+import inspect
+import sys
+from typing import TYPE_CHECKING
+
+import pytest
+
+from langchain_core.messages import AIMessage, BaseMessage, HumanMessage
+from langchain_core.runnables import RunnableGenerator, RunnableLambda
+from langchain_core.runnables.history import RunnableWithMessageHistory
+
+pytestmark = pytest.mark.skipif(
+ sys.version_info < (3, 14), reason="Requires lazily evaluated annotations."
+)
+
+if TYPE_CHECKING or sys.version_info >= (3, 14):
+ from tests.unit_tests.utils import _type_checking_annotations as annotated
+
+
+def test_annotations_are_unresolvable() -> None:
+ with pytest.raises(NameError):
+ inspect.signature(annotated.add_one)
+
+
+def test_runnable_lambda() -> None:
+ runnable = RunnableLambda(annotated.add_one)
+ assert runnable.invoke(1) == 2
+ assert runnable.batch([1, 2]) == [2, 3]
+ assert list(runnable.stream(1)) == [2]
+
+
+async def test_runnable_lambda_async() -> None:
+ runnable = RunnableLambda(annotated.add_one, afunc=annotated.aadd_one)
+ assert await runnable.ainvoke(1) == 2
+
+
+def test_runnable_generator() -> None:
+ runnable = RunnableGenerator(annotated.upper)
+ assert "".join(runnable.stream("ab")) == "AB"
+
+
+async def test_runnable_generator_async() -> None:
+ runnable = RunnableGenerator(annotated.upper, annotated.aupper)
+ assert "".join([chunk async for chunk in runnable.astream("ab")]) == "AB"
+
+
+def test_chat_model() -> None:
+ model = annotated.FakeChatModel()
+ assert model.invoke("hi").content == "hello"
+ chain = model | RunnableLambda(annotated.get_content)
+ assert chain.invoke("hi") == "hello"
+
+
+def test_runnable_binding_injects_config() -> None:
+ model = annotated.FakeChatModel().with_config(tags=["a"])
+ assert model.describe() == ["a"] # type: ignore[attr-defined]
+
+
+def test_llm() -> None:
+ assert annotated.FakeLLM().invoke("hi") == "hello"
+
+
+def test_retriever() -> None:
+ docs = annotated.define_retriever()().invoke("query")
+ assert [doc.page_content for doc in docs] == ["query"]
+
+
+def test_tool() -> None:
+ assert annotated.EchoTool().invoke({"text": "hi"}) == "hi"
+
+
[email protected](
+ "ignore::langchain_core._api.deprecation.LangChainDeprecationWarning"
+)
+def test_runnable_with_message_history() -> None:
+ def respond(_: list[BaseMessage]) -> AIMessage:
+ return AIMessage("hello")
+
+ runnable = RunnableWithMessageHistory(
+ RunnableLambda(respond), annotated.get_session_history
+ )
+ runnable.invoke([HumanMessage("hi")], config={"configurable":
{"session_id": "1"}})
+ assert len(annotated.get_session_history("1").messages) == 2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langchain_core-1.6.6/uv.lock
new/langchain_core-1.6.7/uv.lock
--- old/langchain_core-1.6.6/uv.lock 2020-02-02 01:00:00.000000000 +0100
+++ new/langchain_core-1.6.7/uv.lock 2020-02-02 01:00:00.000000000 +0100
@@ -887,6 +887,20 @@
]
[[package]]
+name = "jupyter-builder"
+version = "1.2.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "jupyter-core" },
+ { name = "tomli", marker = "python_full_version < '3.11'" },
+ { name = "traitlets" },
+]
+sdist = { url =
"https://files.pythonhosted.org/packages/75/3e/56f593e6a664cd14d441724654ce8243f3cac7d3e45867cf084749c8bc75/jupyter_builder-1.2.3.tar.gz",
hash =
"sha256:01aba6794eb9b19e0e29ae21137ca60ba4135c70347d4b9f664a586822b8c809", size
= 1024218, upload-time = "2026-09-04T18:54:09.411Z" }
+wheels = [
+ { url =
"https://files.pythonhosted.org/packages/84/aa/be79e87c50698673f196d0633fc1664607da2289f9688d1de7a1c9db9e71/jupyter_builder-1.2.3-py3-none-any.whl",
hash =
"sha256:c5ea5a7190c2a7b082494abade98eece1b2b5bd5dbd7d610606cbcd10a1d08b3", size
= 947541, upload-time = "2026-09-04T18:54:07.644Z" },
+]
+
+[[package]]
name = "jupyter-client"
version = "8.6.3"
source = { registry = "https://pypi.org/simple" }
@@ -1011,28 +1025,28 @@
[[package]]
name = "jupyterlab"
-version = "4.5.10"
+version = "4.6.4"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "async-lru" },
{ name = "httpx" },
{ name = "ipykernel" },
{ name = "jinja2" },
+ { name = "jupyter-builder" },
{ name = "jupyter-core" },
{ name = "jupyter-lsp" },
{ name = "jupyter-server" },
{ name = "jupyterlab-server" },
{ name = "notebook-shim" },
{ name = "packaging" },
- { name = "setuptools" },
{ name = "tomli", marker = "python_full_version < '3.11'" },
{ name = "tornado" },
{ name = "traitlets" },
{ name = "typing-extensions", marker = "python_full_version < '3.12'" },
]
-sdist = { url =
"https://files.pythonhosted.org/packages/74/24/621aa20ec0d2fe72f52095bda0fc1be7738ac21aabe4129ff623140d5cdf/jupyterlab-4.5.10.tar.gz",
hash =
"sha256:77e8d80b78be59b2eaba2154562e21caa6e79c2f1281d6f486584f7144ee2f47", size
= 23998879, upload-time = "2026-07-21T12:43:27.324Z" }
+sdist = { url =
"https://files.pythonhosted.org/packages/33/8d/995cc142f6083346b35e7d3eadc5a6717ee89ce64ea53577010ac493bc3c/jupyterlab-4.6.4.tar.gz",
hash =
"sha256:404f49b081819378524886c9db66dba57a5565981eff885830df1baba3a17df5", size
= 28335647, upload-time = "2026-09-21T15:25:18.779Z" }
wheels = [
- { url =
"https://files.pythonhosted.org/packages/9f/c9/940f95f17ee4e413ad252bf8d4f2ee9a341f18cfeda87775fef3d7847321/jupyterlab-4.5.10-py3-none-any.whl",
hash =
"sha256:5967ca61e692e67a2f30b5a2b901c941dc6ce56c0b0e357bc6d34fed5ec095f6", size
= 12452502, upload-time = "2026-07-21T12:43:23.542Z" },
+ { url =
"https://files.pythonhosted.org/packages/3b/e4/072bc0d3c6d45d414062a06af7ee81c02a2c12d769c358ec9919f9995ffd/jupyterlab-4.6.4-py3-none-any.whl",
hash =
"sha256:15b13f991d3985129c797eb84d9949eeb8b6615e14b444868e642411f2c418b2", size
= 17171596, upload-time = "2026-09-21T15:25:14.123Z" },
]
[[package]]
@@ -1073,7 +1087,7 @@
[[package]]
name = "langchain-core"
-version = "1.6.6"
+version = "1.6.7"
source = { editable = "." }
dependencies = [
{ name = "httpx" },
@@ -1227,7 +1241,7 @@
[[package]]
name = "langchain-text-splitters"
-version = "1.1.2"
+version = "1.1.3"
source = { directory = "../text-splitters" }
dependencies = [
{ name = "langchain-core" },
@@ -1695,18 +1709,19 @@
[[package]]
name = "notebook"
-version = "7.5.6"
+version = "7.6.3"
source = { registry = "https://pypi.org/simple" }
dependencies = [
+ { name = "jupyter-builder" },
{ name = "jupyter-server" },
{ name = "jupyterlab" },
{ name = "jupyterlab-server" },
{ name = "notebook-shim" },
{ name = "tornado" },
]
-sdist = { url =
"https://files.pythonhosted.org/packages/2a/c2/cf59bd2e6f2c8b976b52477e3e53bf6f97bc714ed046a51821afb428eaee/notebook-7.5.6.tar.gz",
hash =
"sha256:621174aade80108f0020b0f00738000b215f75fa3cd90771ad7aa0f24536a4e1", size
= 14170814, upload-time = "2026-04-30T11:46:26.613Z" }
+sdist = { url =
"https://files.pythonhosted.org/packages/42/ac/aedb759dc683dcd129f6c75271bab5eb23020b0f7969163c726343718e1e/notebook-7.6.3.tar.gz",
hash =
"sha256:e2c08e469c0ae20bb0b3214f0ab77e79653317a2f8e5b34c10361c66874a5b50", size
= 5501618, upload-time = "2026-09-21T18:07:24.261Z" }
wheels = [
- { url =
"https://files.pythonhosted.org/packages/e9/d6/1fd0646b9bbd9efbb0b8ae21b2325fbef515769a5621c03e31d8eb8da587/notebook-7.5.6-py3-none-any.whl",
hash =
"sha256:4dde3f8fb55fa8fb7946d58c6e869ce9baf46d00fc070664f62604569d0faca0", size
= 14581730, upload-time = "2026-04-30T11:46:22.342Z" },
+ { url =
"https://files.pythonhosted.org/packages/a1/f7/907b98438cf00bdc4e296570058f29a347214bb42338a48e3b7eae58ae2a/notebook-7.6.3-py3-none-any.whl",
hash =
"sha256:ad7e0eb765fba836cd4a2ab0c7a3a26cde1d91665fbf6f533b6ae7b2de6d88d2", size
= 5548452, upload-time = "2026-09-21T18:07:21.563Z" },
]
[[package]]
@@ -2978,19 +2993,19 @@
[[package]]
name = "tornado"
-version = "6.5.8"
+version = "6.5.9"
source = { registry = "https://pypi.org/simple" }
-sdist = { url =
"https://files.pythonhosted.org/packages/10/d3/343e5bb989d6515b1646cf3d40135d73f3d5e45339bded401b56cdac24dd/tornado-6.5.8.tar.gz",
hash =
"sha256:9452e1b208a8bd771e2cb1f2ff564985b9b214bdebbe622793e1799e0a6bd23f", size
= 520493, upload-time = "2026-08-07T02:12:42.971Z" }
+sdist = { url =
"https://files.pythonhosted.org/packages/22/15/ca7aaebb77f850493cba71ace508aeffb896d1ad8976417b48b79823dbd2/tornado-6.5.9.tar.gz",
hash =
"sha256:4d868544ebdf2fc155239a74397f65ebfea9b4d3635296c96b5dfb0701c354f5", size
= 536145, upload-time = "2026-09-14T18:08:37.434Z" }
wheels = [
- { url =
"https://files.pythonhosted.org/packages/f2/d5/007086fd8df5489338e204f65adce33fd4f21a4999dbb2b9cff2f897b5f4/tornado-6.5.8-cp39-abi3-macosx_10_9_universal2.whl",
hash =
"sha256:cc6aa787d7cfab7c3d35189dc7a56fbd2399a569624c730c6b55b3d6531d0403", size
= 449487, upload-time = "2026-08-07T02:12:28.682Z" },
- { url =
"https://files.pythonhosted.org/packages/70/c8/5a24a99495903f594f6a199dd7beead1cbc0a13e2cb9102727bcaaf2a997/tornado-6.5.8-cp39-abi3-macosx_10_9_x86_64.whl",
hash =
"sha256:9715b5eb79735b2bcd454ce216a9275b7c0470e64ea1bf5742f78b2f72b26eeb", size
= 447649, upload-time = "2026-08-07T02:12:30.306Z" },
- { url =
"https://files.pythonhosted.org/packages/6e/de/f2e733f386b85962d1b1dc82cd63d169b5b4580062b35397eac9244a41fe/tornado-6.5.8-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
hash =
"sha256:547d63f450d570c14fe0e8db2cfb14c9bbd1c2503b4a6612586267955aa47b58", size
= 450707, upload-time = "2026-08-07T02:12:31.95Z" },
- { url =
"https://files.pythonhosted.org/packages/0b/94/20efeee9a01c141e9ac47c397f81679dfda24b32768fc4fff24e76d36c2c/tornado-6.5.8-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
hash =
"sha256:7e2360a0ffbe145eca8af0b19cb7203d79b1a98dd4cccdd6b368f6f49c2e3808", size
= 451677, upload-time = "2026-08-07T02:12:33.512Z" },
- { url =
"https://files.pythonhosted.org/packages/42/ec/a96ccb8ccf0de2b7bc2c5fa1608a4803735018242e90c4882365a9fd418f/tornado-6.5.8-cp39-abi3-musllinux_1_2_aarch64.whl",
hash =
"sha256:5d242290bdf7ab3151bc1065fdd75c0dcc21cbc7b49f22a4c56329c2d6566d22", size
= 451510, upload-time = "2026-08-07T02:12:35.346Z" },
- { url =
"https://files.pythonhosted.org/packages/29/b5/93185859245ad3f00e62175f29607346788b696369347f0146e0421286bb/tornado-6.5.8-cp39-abi3-musllinux_1_2_x86_64.whl",
hash =
"sha256:7b94ff0e128fe0542f3bd331fb44d06260fc4ac16881545159f34ef08aad4195", size
= 450917, upload-time = "2026-08-07T02:12:36.963Z" },
- { url =
"https://files.pythonhosted.org/packages/97/cf/fe33cf062834487d34d1559746a4a12521033c22645b6d74d4bca702e018/tornado-6.5.8-cp39-abi3-win32.whl",
hash =
"sha256:67832909c4779c64942380cb5f044a5c6163d00831472d80e25e115de9917836", size
= 451952, upload-time = "2026-08-07T02:12:38.512Z" },
- { url =
"https://files.pythonhosted.org/packages/cb/e1/468ad54333e92ccb62627e62cb88e5fc14a2171daa67ed47b1b8542d5b86/tornado-6.5.8-cp39-abi3-win_amd64.whl",
hash =
"sha256:11881db6b7c168494be2c2d12e65931451bdf7ee718535418ae1d8855dd5a0ee", size
= 452391, upload-time = "2026-08-07T02:12:39.971Z" },
- { url =
"https://files.pythonhosted.org/packages/ad/3e/cd5e4f06e34cde33b8ef66cf36aa2b5ad46354cc1af7d2136bbe365fee1d/tornado-6.5.8-cp39-abi3-win_arm64.whl",
hash =
"sha256:68a7468c7e289f8514d7d664101753903217eff1bb6822c6b5994a0b5f5bcb26", size
= 451411, upload-time = "2026-08-07T02:12:41.469Z" },
+ { url =
"https://files.pythonhosted.org/packages/a0/4a/4d3459fd2f360dd99233f69f22b36012a42856ace526da2c6da3cb0e6df2/tornado-6.5.9-cp39-abi3-macosx_10_9_universal2.whl",
hash =
"sha256:dea3bee433b73d6312d993ce89ad5f2b8d3ed9fde56e79ba5342b9edb78d342a", size
= 464279, upload-time = "2026-09-14T18:08:20.909Z" },
+ { url =
"https://files.pythonhosted.org/packages/26/4b/5af2f7dcd674e2f1cacef763456f79823404f50954789d6e1ec7a70cd58a/tornado-6.5.9-cp39-abi3-macosx_10_9_x86_64.whl",
hash =
"sha256:22bed49cdb55292d1d58f46008ba2cc3020e5b84995ef6ae749676c8b5309514", size
= 462440, upload-time = "2026-09-14T18:08:22.711Z" },
+ { url =
"https://files.pythonhosted.org/packages/9e/0f/38f8d16011de3b1ce2babb4c3bcefb126d2dc47d04878ae3ad5c39a00caa/tornado-6.5.9-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl",
hash =
"sha256:0cc0876a58eee9143476f24901b1b8eb4d52443283ade2b6bca650dd1da04f84", size
= 465496, upload-time = "2026-09-14T18:08:24.407Z" },
+ { url =
"https://files.pythonhosted.org/packages/8c/e9/3888f265d1e287fc63cd61a6696f96a650024e32f9e89c0b1817ac5c40f4/tornado-6.5.9-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl",
hash =
"sha256:dc0d703cc7ec92b47ebfe236c97cd765c1f2e45744a2e156e6677e54c948274d", size
= 466468, upload-time = "2026-09-14T18:08:25.928Z" },
+ { url =
"https://files.pythonhosted.org/packages/d6/8b/d2bcf417981fa6f7698ab84a52394a76cf608e6704d266e2e0e29f1fd9d0/tornado-6.5.9-cp39-abi3-musllinux_1_2_aarch64.whl",
hash =
"sha256:93f9ab0226ef625b94cacb7981a5af104f1735ea02f92282abe5c389109fb31d", size
= 466303, upload-time = "2026-09-14T18:08:27.566Z" },
+ { url =
"https://files.pythonhosted.org/packages/7e/a5/c5cfab11420c3f908238a6c861b8f3864fdbd2b2b87e30c9c16f36a11512/tornado-6.5.9-cp39-abi3-musllinux_1_2_x86_64.whl",
hash =
"sha256:5801bbf94dfde8d21087b6aa0b17f3a5dab6110dfe44e7e4492df5de393ac15b", size
= 465706, upload-time = "2026-09-14T18:08:29.182Z" },
+ { url =
"https://files.pythonhosted.org/packages/ab/36/5a5da0aa15b7afdd46ece09c004a75af7d00f6a96b692bf696ff94bc2a55/tornado-6.5.9-cp39-abi3-win32.whl",
hash =
"sha256:dca9f377e80efe5dd4d52a2776b67492a81a39b2d931de169b6b36d0c1da444c", size
= 466750, upload-time = "2026-09-14T18:08:30.836Z" },
+ { url =
"https://files.pythonhosted.org/packages/34/d7/2446cf3125372e2b4be6483b4b93f360dc50ce2493864755484b23bb50f2/tornado-6.5.9-cp39-abi3-win_amd64.whl",
hash =
"sha256:f810730ac71eadf009e6e5cb6d534d096887310f5649cff19d7e0d19c0bf4ee7", size
= 467191, upload-time = "2026-09-14T18:08:32.521Z" },
+ { url =
"https://files.pythonhosted.org/packages/39/70/f1024364bf78fa921c63ef2883d36a3b3b705750c98ae174593afaab7a65/tornado-6.5.9-cp39-abi3-win_arm64.whl",
hash =
"sha256:b5f4d92798337260c6d9f9f0e400c7539dd5e55cf93479a3f8508c9aa09c2b3b", size
= 466211, upload-time = "2026-09-14T18:08:35.18Z" },
]
[[package]]
@@ -3064,11 +3079,11 @@
[[package]]
name = "urllib3"
-version = "2.7.0"
+version = "2.8.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url =
"https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz",
hash =
"sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size
= 433602, upload-time = "2026-05-07T16:13:18.596Z" }
+sdist = { url =
"https://files.pythonhosted.org/packages/e3/05/b17359e1cefb4f909b5e40b1b90a496d987258916dbbf88e842c729f510e/urllib3-2.8.0.tar.gz",
hash =
"sha256:63bf2ead4c879426ebf22ef2a781eeb4aa3b4ae798a0435506f8687fd5bb9b63", size
= 458972, upload-time = "2026-09-15T19:29:36.253Z" }
wheels = [
- { url =
"https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl",
hash =
"sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size
= 131087, upload-time = "2026-05-07T16:13:17.151Z" },
+ { url =
"https://files.pythonhosted.org/packages/92/9d/c4e665119135114480843e7ab388fa94d8480650450e6f8e26b70d323a4c/urllib3-2.8.0-py3-none-any.whl",
hash =
"sha256:0cf3cae568d36aa9576b28dfb35f11328f1cb974ca7647d9475ebb86c75ac6e3", size
= 135717, upload-time = "2026-09-15T19:29:34.577Z" },
]
[[package]]