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-07-09 22:20:27
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-langchain-core (Old)
 and      /work/SRC/openSUSE:Factory/.python-langchain-core.new.1991 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-langchain-core"

Thu Jul  9 22:20:27 2026 rev:2 rq:1364713 version:1.4.9

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-langchain-core/python-langchain-core.changes  
    2026-07-01 16:35:36.334905845 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-langchain-core.new.1991/python-langchain-core.changes
    2026-07-09 22:21:20.386131180 +0200
@@ -1,0 +2,18 @@
+Thu Jul  9 05:27:29 UTC 2026 - Martin Pluskal <[email protected]>
+
+- Update to 1.4.9:
+  * Fix Google-style docstring parsing in convert_to_openai_function
+    so multi-line argument descriptions are folded into the correct
+    argument instead of being lost or misattributed
+  * Pass the partial flag through PydanticOutputParser.parse_result
+    so partial parsing works correctly
+  * LangSmithLoader now raises clear errors when the configured
+    content key path is missing or points at a non-mapping value
+  * Raise descriptive error messages (instead of bare ValueError)
+    when loading prompts with an unsupported template file format
+    and when neither examples nor an example_selector is provided
+  * Use asyncio.get_running_loop() instead of the deprecated
+    get_event_loop() in the async callback manager and Mermaid
+    graph rendering
+
+-------------------------------------------------------------------

Old:
----
  langchain_core-1.4.8.tar.gz

New:
----
  langchain_core-1.4.9.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-langchain-core.spec ++++++
--- /var/tmp/diff_new_pack.TkGBj1/_old  2026-07-09 22:21:22.278195810 +0200
+++ /var/tmp/diff_new_pack.TkGBj1/_new  2026-07-09 22:21:22.278195810 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package python-langchain-core
 #
-# Copyright (c) 2026 SUSE LLC
+# Copyright (c) 2026 SUSE LLC and contributors
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -17,7 +17,7 @@
 
 
 Name:           python-langchain-core
-Version:        1.4.8
+Version:        1.4.9
 Release:        0
 Summary:        Building applications with LLMs through composability
 License:        MIT

++++++ langchain_core-1.4.8.tar.gz -> langchain_core-1.4.9.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/langchain_core-1.4.8/PKG-INFO 
new/langchain_core-1.4.9/PKG-INFO
--- old/langchain_core-1.4.8/PKG-INFO   2020-02-02 01:00:00.000000000 +0100
+++ new/langchain_core-1.4.9/PKG-INFO   2020-02-02 01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.4
 Name: langchain-core
-Version: 1.4.8
+Version: 1.4.9
 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.4.8/langchain_core/callbacks/manager.py 
new/langchain_core-1.4.9/langchain_core/callbacks/manager.py
--- old/langchain_core-1.4.8/langchain_core/callbacks/manager.py        
2020-02-02 01:00:00.000000000 +0100
+++ new/langchain_core-1.4.9/langchain_core/callbacks/manager.py        
2020-02-02 01:00:00.000000000 +0100
@@ -416,7 +416,7 @@
             elif handler.run_inline:
                 event(*args, **kwargs)
             else:
-                await asyncio.get_event_loop().run_in_executor(
+                await asyncio.get_running_loop().run_in_executor(
                     None,
                     functools.partial(copy_context().run, event, *args, 
**kwargs),
                 )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/langchain_core-1.4.8/langchain_core/document_loaders/langsmith.py 
new/langchain_core-1.4.9/langchain_core/document_loaders/langsmith.py
--- old/langchain_core-1.4.8/langchain_core/document_loaders/langsmith.py       
2020-02-02 01:00:00.000000000 +0100
+++ new/langchain_core-1.4.9/langchain_core/document_loaders/langsmith.py       
2020-02-02 01:00:00.000000000 +0100
@@ -3,7 +3,7 @@
 import datetime
 import json
 import uuid
-from collections.abc import Callable, Iterator, Sequence
+from collections.abc import Callable, Iterator, Mapping, Sequence
 from typing import Any
 
 from langsmith import Client as LangSmithClient
@@ -94,7 +94,11 @@
             ValueError: If both `client` and `client_kwargs` are provided.
         """  # noqa: E501
         if client and client_kwargs:
-            raise ValueError
+            msg = (
+                "Received both `client` and `client_kwargs`. "
+                "Pass `client_kwargs` only when `client` is not provided."
+            )
+            raise ValueError(msg)
         self._client = client or LangSmithClient(**client_kwargs)
         self.content_key = list(content_key.split(".")) if content_key else []
         self.format_content = format_content or _stringify
@@ -123,9 +127,7 @@
             metadata=self.metadata,
             filter=self.filter,
         ):
-            content: Any = example.inputs
-            for key in self.content_key:
-                content = content[key]
+            content = _get_content_from_inputs(example.inputs, 
self.content_key)
             content_str = self.format_content(content)
             metadata = pydantic_to_dict(example)
             # Stringify datetime and UUID types.
@@ -134,6 +136,44 @@
             yield Document(content_str, metadata=metadata)
 
 
+def _get_content_from_inputs(inputs: Any, content_key: Sequence[str]) -> Any:
+    """Resolve nested example input content for `LangSmithLoader`.
+
+    Args:
+        inputs: Example input payload returned by LangSmith.
+        content_key: Ordered key path used to extract the document content.
+
+    Returns:
+        The extracted content value.
+
+    Raises:
+        ValueError: If a key in `content_key` is missing, or a value along the 
path
+            (including `inputs` itself) is not a mapping.
+    """
+    content = inputs
+    full_path = ".".join(content_key)
+
+    for i, key in enumerate(content_key):
+        current_path = ".".join(content_key[:i]) or "<root>"
+        if not isinstance(content, Mapping):
+            msg = (
+                f"Could not resolve content_key {full_path!r}: expected a 
mapping at "
+                f"{current_path!r}, but found {type(content).__name__}."
+            )
+            # A too-deep `content_key` is an invalid-argument error, not a 
runtime
+            # type bug, so it is unified with the missing-key case as 
`ValueError`.
+            raise ValueError(msg)  # noqa: TRY004
+        if key not in content:
+            msg = (
+                f"Could not resolve content_key {full_path!r}: missing key 
{key!r} "
+                f"under {current_path!r}."
+            )
+            raise ValueError(msg)
+        content = content[key]
+
+    return content
+
+
 def _stringify(x: str | dict[str, Any]) -> str:
     if isinstance(x, str):
         return x
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/langchain_core-1.4.8/langchain_core/language_models/_compat_bridge.py 
new/langchain_core-1.4.9/langchain_core/language_models/_compat_bridge.py
--- old/langchain_core-1.4.8/langchain_core/language_models/_compat_bridge.py   
2020-02-02 01:00:00.000000000 +0100
+++ new/langchain_core-1.4.9/langchain_core/language_models/_compat_bridge.py   
2020-02-02 01:00:00.000000000 +0100
@@ -270,7 +270,7 @@
     stripped: CompatBlock = {k: v for k, v in block.items() if k not in 
_HEAVY_FIELDS}
     # Restore required-but-heavy fields with minimal placeholders so the
     # start event still validates against the CDDL shape of the block type.
-    if btype in ("tool_call", "server_tool_call"):
+    if btype in {"tool_call", "server_tool_call"}:
         stripped["args"] = {}
     elif btype == "non_standard":
         stripped["value"] = {}
@@ -289,7 +289,7 @@
         return bool(block.get("text"))
     if btype == "reasoning":
         return bool(block.get("reasoning"))
-    if btype in ("tool_call_chunk", "server_tool_call_chunk"):
+    if btype in {"tool_call_chunk", "server_tool_call_chunk"}:
         return bool(
             block.get("args") or block.get("id") or block.get("name"),
         )
@@ -315,7 +315,7 @@
         # on later deltas. Merging (not replacing) keeps earlier keys
         # intact while picking up these late-arriving fields.
         for key, value in delta.items():
-            if key in ("type", "text") or value is None:
+            if key in {"type", "text"} or value is None:
                 continue
             if key == "extras" and isinstance(value, dict):
                 state["extras"] = {**(state.get("extras") or {}), **value}
@@ -328,13 +328,13 @@
         # as `extras.signature`; merging (not replacing) keeps earlier
         # keys intact.
         for key, value in delta.items():
-            if key in ("type", "reasoning") or value is None:
+            if key in {"type", "reasoning"} or value is None:
                 continue
             if key == "extras" and isinstance(value, dict):
                 state["extras"] = {**(state.get("extras") or {}), **value}
             else:
                 state[key] = value
-    elif btype in ("tool_call_chunk", "server_tool_call_chunk") and dtype == 
btype:
+    elif btype in {"tool_call_chunk", "server_tool_call_chunk"} and dtype == 
btype:
         state["args"] = (state.get("args", "") or "") + (delta.get("args") or 
"")
         if delta.get("id") is not None:
             state["id"] = delta["id"]
@@ -343,7 +343,7 @@
     elif btype == dtype and "data" in delta:
         state["data"] = (state.get("data", "") or "") + (delta.get("data") or 
"")
         for key, value in delta.items():
-            if key in ("type", "data") or value is None:
+            if key in {"type", "data"} or value is None:
                 continue
             if key == "extras" and isinstance(value, dict):
                 state["extras"] = {**(state.get("extras") or {}), **value}
@@ -432,7 +432,7 @@
     their terminal shape.
     """
     btype = block.get("type")
-    if btype in ("tool_call_chunk", "server_tool_call_chunk"):
+    if btype in {"tool_call_chunk", "server_tool_call_chunk"}:
         # Carry provider-specific fields from the accumulated chunk onto
         # the finalized block. Drop the chunk-only keys we rewrite
         # explicitly. `index` is stripped on client-side
@@ -445,7 +445,7 @@
         client_tool_call = btype == "tool_call_chunk"
         extras_drop = {"type", "id", "name", "args"}
         if client_tool_call:
-            extras_drop = extras_drop | {"index"}
+            extras_drop |= {"index"}
         extras = {
             k: v for k, v in block.items() if k not in extras_drop and v is 
not None
         }
@@ -666,10 +666,10 @@
                 blocks[key] = (wire_idx, _accumulate(existing, block))
             if _should_emit_delta(block):
                 wire_idx, current = blocks[key]
-                is_block_delta = block.get("type") in (
+                is_block_delta = block.get("type") in {
                     "tool_call_chunk",
                     "server_tool_call_chunk",
-                )
+                }
                 delta_source = current if is_block_delta else block
                 yield ContentBlockDeltaData(
                     event="content-block-delta",
@@ -746,10 +746,10 @@
                 blocks[key] = (wire_idx, _accumulate(existing, block))
             if _should_emit_delta(block):
                 wire_idx, current = blocks[key]
-                is_block_delta = block.get("type") in (
+                is_block_delta = block.get("type") in {
                     "tool_call_chunk",
                     "server_tool_call_chunk",
-                )
+                }
                 delta_source = current if is_block_delta else block
                 yield ContentBlockDeltaData(
                     event="content-block-delta",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/langchain_core-1.4.8/langchain_core/language_models/base.py 
new/langchain_core-1.4.9/langchain_core/language_models/base.py
--- old/langchain_core-1.4.8/langchain_core/language_models/base.py     
2020-02-02 01:00:00.000000000 +0100
+++ new/langchain_core-1.4.9/langchain_core/language_models/base.py     
2020-02-02 01:00:00.000000000 +0100
@@ -2,6 +2,7 @@
 
 from __future__ import annotations
 
+import builtins  # noqa: TC003  # runtime-evaluated; subclass `dict()` shadows 
the builtin
 import warnings
 from abc import ABC, abstractmethod
 from collections.abc import Callable, Mapping, Sequence
@@ -191,7 +192,7 @@
     tags: list[str] | None = Field(default=None, exclude=True)
     """Tags to add to the run trace."""
 
-    metadata: dict[str, Any] | None = Field(default=None, exclude=True)
+    metadata: builtins.dict[str, Any] | None = Field(default=None, 
exclude=True)
     """Metadata to add to the run trace."""
 
     custom_get_token_ids: Callable[[str], list[int]] | None = Field(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/langchain_core-1.4.8/langchain_core/language_models/chat_model_stream.py 
new/langchain_core-1.4.9/langchain_core/language_models/chat_model_stream.py
--- 
old/langchain_core-1.4.8/langchain_core/language_models/chat_model_stream.py    
    2020-02-02 01:00:00.000000000 +0100
+++ 
new/langchain_core-1.4.9/langchain_core/language_models/chat_model_stream.py    
    2020-02-02 01:00:00.000000000 +0100
@@ -140,7 +140,7 @@
         extras = {
             k: v
             for k, v in chunk.items()
-            if k not in ("type", "id", "name", "args") and v is not None
+            if k not in {"type", "id", "name", "args"} and v is not None
         }
         final_block = finalize_tool_call_chunk(
             raw_args=chunk.get("args"),
@@ -864,7 +864,7 @@
             if idx is not None and idx in self._server_tool_call_chunks:
                 del self._server_tool_call_chunks[idx]
             finalized = itc
-        elif btype in (
+        elif btype in {
             "server_tool_call",
             "server_tool_result",
             "image",
@@ -872,7 +872,7 @@
             "video",
             "file",
             "non_standard",
-        ):
+        }:
             if btype == "server_tool_call" and idx is not None:
                 self._server_tool_call_chunks.pop(idx, None)
             finalized = cast("FinalizedContentBlock", block)
@@ -888,7 +888,7 @@
             # `tool_call` / `invalid_tool_call` blocks are excluded: v1
             # finalization drops `index` on them so further deltas
             # cannot clobber already-parsed args, and v2 mirrors that.
-            if btype not in ("tool_call", "invalid_tool_call"):
+            if btype not in {"tool_call", "invalid_tool_call"}:
                 finalized.setdefault("index", idx)
             self._blocks[idx] = finalized
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/langchain_core-1.4.8/langchain_core/language_models/chat_models.py 
new/langchain_core-1.4.9/langchain_core/language_models/chat_models.py
--- old/langchain_core-1.4.8/langchain_core/language_models/chat_models.py      
2020-02-02 01:00:00.000000000 +0100
+++ new/langchain_core-1.4.9/langchain_core/language_models/chat_models.py      
2020-02-02 01:00:00.000000000 +0100
@@ -3,7 +3,7 @@
 from __future__ import annotations
 
 import asyncio
-import builtins  # noqa: TC003
+import builtins  # noqa: TC003  # runtime-evaluated; subclass `dict()` shadows 
the builtin
 import contextlib
 import inspect
 import json
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/langchain_core-1.4.8/langchain_core/output_parsers/pydantic.py 
new/langchain_core-1.4.9/langchain_core/output_parsers/pydantic.py
--- old/langchain_core-1.4.8/langchain_core/output_parsers/pydantic.py  
2020-02-02 01:00:00.000000000 +0100
+++ new/langchain_core-1.4.9/langchain_core/output_parsers/pydantic.py  
2020-02-02 01:00:00.000000000 +0100
@@ -74,7 +74,7 @@
             The parsed Pydantic object.
         """
         try:
-            json_object = super().parse_result(result)
+            json_object = super().parse_result(result, partial=partial)
             return self._parse_obj(json_object)
         except OutputParserException:
             if partial:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/langchain_core-1.4.8/langchain_core/output_parsers/xml.py 
new/langchain_core-1.4.9/langchain_core/output_parsers/xml.py
--- old/langchain_core-1.4.8/langchain_core/output_parsers/xml.py       
2020-02-02 01:00:00.000000000 +0100
+++ new/langchain_core-1.4.9/langchain_core/output_parsers/xml.py       
2020-02-02 01:00:00.000000000 +0100
@@ -63,8 +63,9 @@
             if not _HAS_DEFUSEDXML:
                 msg = (
                     "defusedxml is not installed. "
-                    "Please install it to use the defusedxml parser."
-                    "You can install it with `pip install defusedxml` "
+                    "Please install it to use the defusedxml parser. "
+                    "You can install it with `pip install defusedxml`. "
+                    "See https://github.com/tiran/defusedxml for more details"
                 )
                 raise ImportError(msg)
             parser_ = XMLParser(target=TreeBuilder())
@@ -214,8 +215,8 @@
 
         Raises:
             OutputParserException: If the XML is not well-formed.
-            ImportError: If defus`edxml is not installed and the `defusedxml` 
parser is
-                requested.
+            ImportError: If `defusedxml` is not installed and the `defusedxml` 
parser
+                is requested.
         """
         # Try to find XML string within triple backticks
         # Imports are temporarily placed here to avoid issue with caching on CI
@@ -224,8 +225,8 @@
             if not _HAS_DEFUSEDXML:
                 msg = (
                     "defusedxml is not installed. "
-                    "Please install it to use the defusedxml parser."
-                    "You can install it with `pip install defusedxml`"
+                    "Please install it to use the defusedxml parser. "
+                    "You can install it with `pip install defusedxml`. "
                     "See https://github.com/tiran/defusedxml for more details"
                 )
                 raise ImportError(msg)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/langchain_core-1.4.8/langchain_core/prompts/few_shot_with_templates.py 
new/langchain_core-1.4.9/langchain_core/prompts/few_shot_with_templates.py
--- old/langchain_core-1.4.8/langchain_core/prompts/few_shot_with_templates.py  
2020-02-02 01:00:00.000000000 +0100
+++ new/langchain_core-1.4.9/langchain_core/prompts/few_shot_with_templates.py  
2020-02-02 01:00:00.000000000 +0100
@@ -111,14 +111,16 @@
             return self.examples
         if self.example_selector is not None:
             return self.example_selector.select_examples(kwargs)
-        raise ValueError
+        msg = "One of 'examples' and 'example_selector' should be provided"
+        raise ValueError(msg)
 
     async def _aget_examples(self, **kwargs: Any) -> list[dict[str, Any]]:
         if self.examples is not None:
             return self.examples
         if self.example_selector is not None:
             return await self.example_selector.aselect_examples(kwargs)
-        raise ValueError
+        msg = "One of 'examples' and 'example_selector' should be provided"
+        raise ValueError(msg)
 
     def format(self, **kwargs: Any) -> str:
         """Format the prompt with the inputs.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/langchain_core-1.4.8/langchain_core/prompts/loading.py 
new/langchain_core-1.4.9/langchain_core/prompts/loading.py
--- old/langchain_core-1.4.8/langchain_core/prompts/loading.py  2020-02-02 
01:00:00.000000000 +0100
+++ new/langchain_core-1.4.9/langchain_core/prompts/loading.py  2020-02-02 
01:00:00.000000000 +0100
@@ -104,7 +104,11 @@
         if resolved_path.suffix == ".txt":
             template = resolved_path.read_text(encoding="utf-8")
         else:
-            raise ValueError
+            msg = (
+                f"Unsupported template file format: '{resolved_path.suffix}'. "
+                "Only '.txt' files are supported."
+            )
+            raise ValueError(msg)
         # Set the template variable to the extracted variable.
         config[var_name] = template
     return config
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/langchain_core-1.4.8/langchain_core/runnables/base.py 
new/langchain_core-1.4.9/langchain_core/runnables/base.py
--- old/langchain_core-1.4.8/langchain_core/runnables/base.py   2020-02-02 
01:00:00.000000000 +0100
+++ new/langchain_core-1.4.9/langchain_core/runnables/base.py   2020-02-02 
01:00:00.000000000 +0100
@@ -4276,8 +4276,7 @@
                 for future in completed_futures:
                     (step_name, generator) = futures.pop(future)
                     try:
-                        chunk = AddableDict({step_name: future.result()})
-                        yield chunk
+                        yield AddableDict({step_name: future.result()})
                         futures[executor.submit(next, generator)] = (
                             step_name,
                             generator,
@@ -4349,8 +4348,7 @@
             for task in completed_tasks:
                 (step_name, generator) = tasks.pop(task)
                 try:
-                    chunk = AddableDict({step_name: task.result()})
-                    yield chunk
+                    yield AddableDict({step_name: task.result()})
                     new_task = asyncio.create_task(get_next_chunk(generator))
                     tasks[new_task] = (step_name, generator)
                 except StopAsyncIteration:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/langchain_core-1.4.8/langchain_core/runnables/graph_mermaid.py 
new/langchain_core-1.4.9/langchain_core/runnables/graph_mermaid.py
--- old/langchain_core-1.4.8/langchain_core/runnables/graph_mermaid.py  
2020-02-02 01:00:00.000000000 +0100
+++ new/langchain_core-1.4.9/langchain_core/runnables/graph_mermaid.py  
2020-02-02 01:00:00.000000000 +0100
@@ -395,7 +395,7 @@
     await browser.close()
 
     if output_file_path is not None:
-        await asyncio.get_event_loop().run_in_executor(
+        await asyncio.get_running_loop().run_in_executor(
             None, Path(output_file_path).write_bytes, img_bytes
         )
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/langchain_core-1.4.8/langchain_core/utils/_merge.py 
new/langchain_core-1.4.9/langchain_core/utils/_merge.py
--- old/langchain_core-1.4.8/langchain_core/utils/_merge.py     2020-02-02 
01:00:00.000000000 +0100
+++ new/langchain_core-1.4.9/langchain_core/utils/_merge.py     2020-02-02 
01:00:00.000000000 +0100
@@ -121,8 +121,8 @@
                             "index" in e_left
                             and e_left["index"] == e["index"]  # index matches
                             and (  # IDs not inconsistent
-                                e_left.get("id") in (None, "")
-                                or e.get("id") in (None, "")
+                                e_left.get("id") in {None, ""}
+                                or e.get("id") in {None, ""}
                                 or e_left.get("id") == e.get("id")
                             )
                         )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/langchain_core-1.4.8/langchain_core/utils/function_calling.py 
new/langchain_core-1.4.9/langchain_core/utils/function_calling.py
--- old/langchain_core-1.4.8/langchain_core/utils/function_calling.py   
2020-02-02 01:00:00.000000000 +0100
+++ new/langchain_core-1.4.9/langchain_core/utils/function_calling.py   
2020-02-02 01:00:00.000000000 +0100
@@ -781,11 +781,27 @@
             raise ValueError(msg)
         description = ""
         args_block = None
-    arg_descriptions = {}
+    arg_descriptions: dict[str, str] = {}
     if args_block:
-        arg = None
+        arg: str | None = None
+        # Base indentation, latched once from the first argument line, lets us
+        # distinguish new argument definitions from continuation lines. This
+        # assumes Google-style uniform indentation of argument names: a line
+        # indented deeper than the first argument is treated as a continuation
+        # (even if it contains a colon), so a more-indented later `name:` line
+        # in a malformed, non-uniformly-indented block folds into the previous
+        # argument rather than starting a new one.
+        arg_indent: int | None = None
         for line in args_block.split("\n")[1:]:
-            if ":" in line:
+            if not line.strip():
+                continue
+            current_indent = len(line) - len(line.lstrip())
+            if arg_indent is None and ":" in line:
+                arg_indent = current_indent
+            is_continuation = arg_indent is not None and current_indent > 
arg_indent
+            if arg is not None and is_continuation:
+                arg_descriptions[arg] += " " + line.strip()
+            elif ":" in line:
                 arg, desc = line.split(":", maxsplit=1)
                 arg = arg.strip()
                 arg_name, _, annotations_ = arg.partition(" ")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/langchain_core-1.4.8/langchain_core/version.py 
new/langchain_core-1.4.9/langchain_core/version.py
--- old/langchain_core-1.4.8/langchain_core/version.py  2020-02-02 
01:00:00.000000000 +0100
+++ new/langchain_core-1.4.9/langchain_core/version.py  2020-02-02 
01:00:00.000000000 +0100
@@ -1,3 +1,3 @@
 """Version information for `langchain-core`."""
 
-VERSION = "1.4.8"
+VERSION = "1.4.9"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/langchain_core-1.4.8/pyproject.toml 
new/langchain_core-1.4.9/pyproject.toml
--- old/langchain_core-1.4.8/pyproject.toml     2020-02-02 01:00:00.000000000 
+0100
+++ new/langchain_core-1.4.9/pyproject.toml     2020-02-02 01:00:00.000000000 
+0100
@@ -21,7 +21,7 @@
     "Topic :: Software Development :: Libraries :: Python Modules",
 ]
 
-version = "1.4.8"
+version = "1.4.9"
 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.4.8/tests/unit_tests/document_loaders/test_langsmith.py 
new/langchain_core-1.4.9/tests/unit_tests/document_loaders/test_langsmith.py
--- 
old/langchain_core-1.4.8/tests/unit_tests/document_loaders/test_langsmith.py    
    2020-02-02 01:00:00.000000000 +0100
+++ 
new/langchain_core-1.4.9/tests/unit_tests/document_loaders/test_langsmith.py    
    2020-02-02 01:00:00.000000000 +0100
@@ -1,10 +1,14 @@
 import datetime
+import json
 import uuid
+from typing import Any
 from unittest.mock import MagicMock, patch
 
+import pytest
 from langsmith.schemas import Example
 
 from langchain_core.document_loaders import LangSmithLoader
+from langchain_core.document_loaders.langsmith import _get_content_from_inputs
 from langchain_core.documents import Document
 from langchain_core.tracers._compat import pydantic_to_dict
 
@@ -13,6 +17,22 @@
     LangSmithLoader(api_key="secret")
 
 
+def test_init_with_client_and_client_kwargs_raises() -> None:
+    client = MagicMock()
+
+    with pytest.raises(ValueError, match="Received both `client` and 
`client_kwargs`"):
+        LangSmithLoader(client=client, api_key="secret")
+
+
+def test_init_with_client_only() -> None:
+    """A bare `client` (no `client_kwargs`) should be accepted."""
+    client = MagicMock()
+
+    loader = LangSmithLoader(client=client)
+
+    assert loader._client is client
+
+
 EXAMPLES = [
     Example(
         inputs={"first": {"second": "foo"}},
@@ -60,3 +80,79 @@
         )
     actual = list(loader.lazy_load())
     assert expected == actual
+
+
+@patch("langsmith.Client.list_examples", 
MagicMock(return_value=iter(EXAMPLES[:1])))
+def test_lazy_load_with_empty_content_key_returns_whole_inputs() -> None:
+    """An empty `content_key` (the default) yields the full inputs payload."""
+    loader = LangSmithLoader(api_key="dummy", dataset_id="mock")
+
+    docs = list(loader.lazy_load())
+
+    assert len(docs) == 1
+    assert docs[0].page_content == json.dumps({"first": {"second": "foo"}}, 
indent=2)
+
+
+@patch("langsmith.Client.list_examples", 
MagicMock(return_value=iter(EXAMPLES[:1])))
+def test_lazy_load_with_missing_content_key_raises() -> None:
+    loader = LangSmithLoader(
+        api_key="dummy",
+        dataset_id="mock",
+        content_key="first.third",
+    )
+
+    with pytest.raises(
+        ValueError,
+        match=r"Could not resolve content_key 'first\.third': "
+        r"missing key 'third' under 'first'",
+    ):
+        list(loader.lazy_load())
+
+
[email protected](
+    ("inputs", "content_key", "expected"),
+    [
+        # Empty key path (the default) returns the whole payload.
+        ({"first": {"second": "foo"}}, [], {"first": {"second": "foo"}}),
+        # Partial path resolves to an intermediate mapping.
+        ({"first": {"second": "foo"}}, ["first"], {"second": "foo"}),
+        # Full path resolves to a leaf value.
+        ({"first": {"second": "foo"}}, ["first", "second"], "foo"),
+    ],
+)
+def test_get_content_from_inputs_resolves_path(
+    inputs: Any, content_key: list[str], expected: Any
+) -> None:
+    assert _get_content_from_inputs(inputs, content_key) == expected
+
+
[email protected](
+    ("inputs", "content_key", "match"),
+    [
+        # Missing key at the root level reports the "<root>" context.
+        (
+            {"first": {"second": "foo"}},
+            ["missing"],
+            r"missing key 'missing' under '<root>'",
+        ),
+        # Missing key nested under an existing mapping.
+        (
+            {"first": {"second": "foo"}},
+            ["first", "third"],
+            r"missing key 'third' under 'first'",
+        ),
+        # Path traverses past a leaf value that is not a mapping.
+        (
+            {"first": {"second": "foo"}},
+            ["first", "second", "third"],
+            r"expected a mapping at 'first\.second', but found str",
+        ),
+        # The root inputs payload itself is not a mapping.
+        (None, ["first"], r"expected a mapping at '<root>', but found 
NoneType"),
+    ],
+)
+def test_get_content_from_inputs_raises(
+    inputs: Any, content_key: list[str], match: str
+) -> None:
+    with pytest.raises(ValueError, match=match):
+        _get_content_from_inputs(inputs, content_key)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/langchain_core-1.4.8/tests/unit_tests/language_models/test_chat_model_streamer.py
 
new/langchain_core-1.4.9/tests/unit_tests/language_models/test_chat_model_streamer.py
--- 
old/langchain_core-1.4.8/tests/unit_tests/language_models/test_chat_model_streamer.py
       2020-02-02 01:00:00.000000000 +0100
+++ 
new/langchain_core-1.4.9/tests/unit_tests/language_models/test_chat_model_streamer.py
       2020-02-02 01:00:00.000000000 +0100
@@ -364,8 +364,8 @@
         """
         model = FakeListChatModel(responses=["abcdefghij"], sleep=0.05)
         stream = await model.astream_events("test", version="v3")
-        aiter_ = stream.text.__aiter__()
-        await aiter_.__anext__()
+        aiter_ = aiter(stream.text)
+        await anext(aiter_)
         task = stream._producer_task
         assert task is not None
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/langchain_core-1.4.8/tests/unit_tests/language_models/test_chat_model_v3_stream.py
 
new/langchain_core-1.4.9/tests/unit_tests/language_models/test_chat_model_v3_stream.py
--- 
old/langchain_core-1.4.8/tests/unit_tests/language_models/test_chat_model_v3_stream.py
      2020-02-02 01:00:00.000000000 +0100
+++ 
new/langchain_core-1.4.9/tests/unit_tests/language_models/test_chat_model_v3_stream.py
      2020-02-02 01:00:00.000000000 +0100
@@ -854,8 +854,8 @@
         stream = await model.astream_events("test", version="v3")
 
         # Pull the first delta so the producer enters the gated section.
-        aiter_ = stream.text.__aiter__()
-        first = await aiter_.__anext__()
+        aiter_ = aiter(stream.text)
+        first = await anext(aiter_)
         assert first == "first"
         assert stream._producer_task is not None
         assert not stream._producer_task.done()
@@ -870,8 +870,8 @@
         gate = asyncio.Event()
         model = _GatedStreamModel(gate=gate)
         stream = await model.astream_events("test", version="v3")
-        aiter_ = stream.text.__aiter__()
-        await aiter_.__anext__()
+        aiter_ = aiter(stream.text)
+        await anext(aiter_)
 
         await stream.aclose()
         await stream.aclose()  # second call must not raise
@@ -884,8 +884,8 @@
 
         async with stream as s:
             assert s is stream
-            aiter_ = stream.text.__aiter__()
-            await aiter_.__anext__()
+            aiter_ = aiter(stream.text)
+            await anext(aiter_)
 
         assert stream._producer_task is not None
         assert stream._producer_task.done()
@@ -907,8 +907,8 @@
 
         # Prime the producer so it enters `_astream`'s forever-blocking
         # await.
-        aiter_ = stream.text.__aiter__()
-        await aiter_.__anext__()
+        aiter_ = aiter(stream.text)
+        await anext(aiter_)
 
         closer_returned_normally = False
 
@@ -1015,8 +1015,8 @@
             "test", config={"callbacks": [handler]}, version="v3"
         )
 
-        aiter_ = stream.text.__aiter__()
-        await aiter_.__anext__()
+        aiter_ = aiter(stream.text)
+        await anext(aiter_)
 
         await stream.aclose()
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/langchain_core-1.4.8/tests/unit_tests/language_models/test_compat_bridge.py 
new/langchain_core-1.4.9/tests/unit_tests/language_models/test_compat_bridge.py
--- 
old/langchain_core-1.4.8/tests/unit_tests/language_models/test_compat_bridge.py 
    2020-02-02 01:00:00.000000000 +0100
+++ 
new/langchain_core-1.4.9/tests/unit_tests/language_models/test_compat_bridge.py 
    2020-02-02 01:00:00.000000000 +0100
@@ -252,7 +252,7 @@
     lifecycle = [
         (e["event"], e["index"])
         for e in events_any
-        if e["event"] in ("content-block-start", "content-block-finish")
+        if e["event"] in {"content-block-start", "content-block-finish"}
     ]
     assert lifecycle == [
         ("content-block-start", 0),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/langchain_core-1.4.8/tests/unit_tests/language_models/test_imports.py 
new/langchain_core-1.4.9/tests/unit_tests/language_models/test_imports.py
--- old/langchain_core-1.4.8/tests/unit_tests/language_models/test_imports.py   
2020-02-02 01:00:00.000000000 +0100
+++ new/langchain_core-1.4.9/tests/unit_tests/language_models/test_imports.py   
2020-02-02 01:00:00.000000000 +0100
@@ -1,4 +1,9 @@
-from langchain_core.language_models import __all__
+from typing import Any
+
+from langchain_core.callbacks import Callbacks
+from langchain_core.language_models import BaseLanguageModel, __all__
+from langchain_core.outputs import LLMResult
+from langchain_core.prompt_values import PromptValue
 
 EXPECTED_ALL = [
     "BaseLanguageModel",
@@ -26,3 +31,41 @@
 
 def test_all_imports() -> None:
     assert set(__all__) == set(EXPECTED_ALL)
+
+
+def test_pydantic_rebuild_handles_subclass_dict_method_shadowing_builtin() -> 
None:
+    """Regression for Pydantic field collection with subclasses that define 
`dict()`.
+
+    Pydantic 2.14.0a1 evaluates inherited field annotations during subclass
+    rebuilds. If `BaseLanguageModel.metadata` uses a plain `dict[...]`
+    annotation, the subclass `dict()` method can shadow the builtin and make
+    annotation evaluation fail with `'function' object is not subscriptable`.
+    """
+
+    class DictMethodLanguageModel(BaseLanguageModel[str]):
+        name: str = "test"
+
+        def generate_prompt(
+            self,
+            prompts: list[PromptValue],
+            stop: list[str] | None = None,
+            callbacks: Callbacks = None,
+            **kwargs: Any,
+        ) -> LLMResult:
+            raise NotImplementedError
+
+        async def agenerate_prompt(
+            self,
+            prompts: list[PromptValue],
+            stop: list[str] | None = None,
+            callbacks: Callbacks = None,
+            **kwargs: Any,
+        ) -> LLMResult:
+            raise NotImplementedError
+
+        def dict(self, **_kwargs: Any) -> dict[str, Any]:
+            return {}
+
+    DictMethodLanguageModel.model_rebuild(force=True)
+
+    assert "metadata" in DictMethodLanguageModel.model_fields
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/langchain_core-1.4.8/tests/unit_tests/language_models/test_v1_parity.py 
new/langchain_core-1.4.9/tests/unit_tests/language_models/test_v1_parity.py
--- old/langchain_core-1.4.8/tests/unit_tests/language_models/test_v1_parity.py 
2020-02-02 01:00:00.000000000 +0100
+++ new/langchain_core-1.4.9/tests/unit_tests/language_models/test_v1_parity.py 
2020-02-02 01:00:00.000000000 +0100
@@ -46,7 +46,7 @@
     def _merged(self) -> AIMessageChunk:
         merged = self.scripted_chunks[0]
         for c in self.scripted_chunks[1:]:
-            merged = merged + c
+            merged += c
         return merged
 
     @override
@@ -117,7 +117,7 @@
         raise RuntimeError(msg)
     merged = chunks[0]
     for c in chunks[1:]:
-        merged = merged + c
+        merged += c
     return AIMessage(
         content=merged.content,
         id=merged.id,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/langchain_core-1.4.8/tests/unit_tests/prompts/test_few_shot_with_templates.py
 
new/langchain_core-1.4.9/tests/unit_tests/prompts/test_few_shot_with_templates.py
--- 
old/langchain_core-1.4.8/tests/unit_tests/prompts/test_few_shot_with_templates.py
   2020-02-02 01:00:00.000000000 +0100
+++ 
new/langchain_core-1.4.9/tests/unit_tests/prompts/test_few_shot_with_templates.py
   2020-02-02 01:00:00.000000000 +0100
@@ -81,3 +81,26 @@
         example_prompt=EXAMPLE_PROMPT,
         example_separator="\n",
     ).input_variables == ["content", "new_content"]
+
+
+async def test_get_examples_requires_examples_or_selector() -> None:
+    """Both `_get_examples` and `_aget_examples` raise when neither is set.
+
+    The constructor validator forbids the neither-provided case, so the fields
+    are cleared after construction to reach the guard inside the getters.
+    """
+    suffix = PromptTemplate(input_variables=[], template="end")
+    prompt = FewShotPromptWithTemplates(
+        suffix=suffix,
+        input_variables=[],
+        examples=[{"question": "foo", "answer": "bar"}],
+        example_prompt=EXAMPLE_PROMPT,
+    )
+    prompt.examples = None
+    prompt.example_selector = None
+
+    match = "One of 'examples' and 'example_selector' should be provided"
+    with pytest.raises(ValueError, match=match):
+        prompt._get_examples()
+    with pytest.raises(ValueError, match=match):
+        await prompt._aget_examples()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/langchain_core-1.4.8/tests/unit_tests/prompts/test_loading.py 
new/langchain_core-1.4.9/tests/unit_tests/prompts/test_loading.py
--- old/langchain_core-1.4.8/tests/unit_tests/prompts/test_loading.py   
2020-02-02 01:00:00.000000000 +0100
+++ new/langchain_core-1.4.9/tests/unit_tests/prompts/test_loading.py   
2020-02-02 01:00:00.000000000 +0100
@@ -316,7 +316,7 @@
         os.chdir(tmp_path)
         with (
             suppress_langchain_deprecation_warning(),
-            pytest.raises(ValueError),  # noqa: PT011
+            pytest.raises(ValueError, match="files are supported"),
         ):
             load_prompt_from_config(config)
     finally:
@@ -341,7 +341,7 @@
     }
     with (
         suppress_langchain_deprecation_warning(),
-        pytest.raises(ValueError),  # noqa: PT011
+        pytest.raises(ValueError, match="files are supported"),
     ):
         load_prompt_from_config(config, allow_dangerous_paths=True)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/langchain_core-1.4.8/tests/unit_tests/prompts/test_structured.py 
new/langchain_core-1.4.9/tests/unit_tests/prompts/test_structured.py
--- old/langchain_core-1.4.8/tests/unit_tests/prompts/test_structured.py        
2020-02-02 01:00:00.000000000 +0100
+++ new/langchain_core-1.4.9/tests/unit_tests/prompts/test_structured.py        
2020-02-02 01:00:00.000000000 +0100
@@ -21,7 +21,7 @@
     if isclass(schema) and issubclass(schema, BaseModel):
         return schema(name="yo", value=value)
     params = cast("dict[str, Any]", schema)["parameters"]
-    return {k: 1 if k != "value" else value for k, v in params.items()}
+    return {k: 1 if k != "value" else value for k in params}
 
 
 class FakeStructuredChatModel(FakeListChatModel):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/langchain_core-1.4.8/tests/unit_tests/runnables/__snapshots__/test_fallbacks.ambr
 
new/langchain_core-1.4.9/tests/unit_tests/runnables/__snapshots__/test_fallbacks.ambr
--- 
old/langchain_core-1.4.8/tests/unit_tests/runnables/__snapshots__/test_fallbacks.ambr
       2020-02-02 01:00:00.000000000 +0100
+++ 
new/langchain_core-1.4.9/tests/unit_tests/runnables/__snapshots__/test_fallbacks.ambr
       2020-02-02 01:00:00.000000000 +0100
@@ -84,7 +84,7 @@
                   "fake",
                   "FakeListLLM"
                 ],
-                "repr": "FakeListLLM(metadata={'lc_versions': 
{'langchain-core': '1.4.8'}}, responses=['foo'], i=1)",
+                "repr": "FakeListLLM(metadata={'lc_versions': 
{'langchain-core': '1.4.9'}}, responses=['foo'], i=1)",
                 "name": "FakeListLLM"
               }
             },
@@ -128,7 +128,7 @@
                     "fake",
                     "FakeListLLM"
                   ],
-                  "repr": "FakeListLLM(metadata={'lc_versions': 
{'langchain-core': '1.4.8'}}, responses=['bar'])",
+                  "repr": "FakeListLLM(metadata={'lc_versions': 
{'langchain-core': '1.4.9'}}, responses=['bar'])",
                   "name": "FakeListLLM"
                 }
               },
@@ -268,7 +268,7 @@
           "fake",
           "FakeListLLM"
         ],
-        "repr": "FakeListLLM(metadata={'lc_versions': {'langchain-core': 
'1.4.8'}}, responses=['foo'], i=1)",
+        "repr": "FakeListLLM(metadata={'lc_versions': {'langchain-core': 
'1.4.9'}}, responses=['foo'], i=1)",
         "name": "FakeListLLM"
       },
       "fallbacks": [
@@ -281,7 +281,7 @@
             "fake",
             "FakeListLLM"
           ],
-          "repr": "FakeListLLM(metadata={'lc_versions': {'langchain-core': 
'1.4.8'}}, responses=['bar'])",
+          "repr": "FakeListLLM(metadata={'lc_versions': {'langchain-core': 
'1.4.9'}}, responses=['bar'])",
           "name": "FakeListLLM"
         }
       ],
@@ -322,7 +322,7 @@
           "fake",
           "FakeListLLM"
         ],
-        "repr": "FakeListLLM(metadata={'lc_versions': {'langchain-core': 
'1.4.8'}}, responses=['foo'], i=1)",
+        "repr": "FakeListLLM(metadata={'lc_versions': {'langchain-core': 
'1.4.9'}}, responses=['foo'], i=1)",
         "name": "FakeListLLM"
       },
       "fallbacks": [
@@ -335,7 +335,7 @@
             "fake",
             "FakeListLLM"
           ],
-          "repr": "FakeListLLM(metadata={'lc_versions': {'langchain-core': 
'1.4.8'}}, responses=['baz'], i=1)",
+          "repr": "FakeListLLM(metadata={'lc_versions': {'langchain-core': 
'1.4.9'}}, responses=['baz'], i=1)",
           "name": "FakeListLLM"
         },
         {
@@ -347,7 +347,7 @@
             "fake",
             "FakeListLLM"
           ],
-          "repr": "FakeListLLM(metadata={'lc_versions': {'langchain-core': 
'1.4.8'}}, responses=['bar'])",
+          "repr": "FakeListLLM(metadata={'lc_versions': {'langchain-core': 
'1.4.9'}}, responses=['bar'])",
           "name": "FakeListLLM"
         }
       ],
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/langchain_core-1.4.8/tests/unit_tests/runnables/__snapshots__/test_runnable.ambr
 
new/langchain_core-1.4.9/tests/unit_tests/runnables/__snapshots__/test_runnable.ambr
--- 
old/langchain_core-1.4.8/tests/unit_tests/runnables/__snapshots__/test_runnable.ambr
        2020-02-02 01:00:00.000000000 +0100
+++ 
new/langchain_core-1.4.9/tests/unit_tests/runnables/__snapshots__/test_runnable.ambr
        2020-02-02 01:00:00.000000000 +0100
@@ -97,7 +97,7 @@
             "fake_chat_models",
             "FakeListChatModel"
           ],
-          "repr": "FakeListChatModel(metadata={'lc_versions': 
{'langchain-core': '1.4.8'}}, responses=['foo, bar'])",
+          "repr": "FakeListChatModel(metadata={'lc_versions': 
{'langchain-core': '1.4.9'}}, responses=['foo, bar'])",
           "name": "FakeListChatModel"
         }
       ],
@@ -227,7 +227,7 @@
             "fake_chat_models",
             "FakeListChatModel"
           ],
-          "repr": "FakeListChatModel(metadata={'lc_versions': 
{'langchain-core': '1.4.8'}}, responses=['baz, qux'])",
+          "repr": "FakeListChatModel(metadata={'lc_versions': 
{'langchain-core': '1.4.9'}}, responses=['baz, qux'])",
           "name": "FakeListChatModel"
         }
       ],
@@ -346,7 +346,7 @@
             "fake_chat_models",
             "FakeListChatModel"
           ],
-          "repr": "FakeListChatModel(metadata={'lc_versions': 
{'langchain-core': '1.4.8'}}, responses=['foo, bar'])",
+          "repr": "FakeListChatModel(metadata={'lc_versions': 
{'langchain-core': '1.4.9'}}, responses=['foo, bar'])",
           "name": "FakeListChatModel"
         },
         {
@@ -457,7 +457,7 @@
             "fake_chat_models",
             "FakeListChatModel"
           ],
-          "repr": "FakeListChatModel(metadata={'lc_versions': 
{'langchain-core': '1.4.8'}}, responses=['baz, qux'])",
+          "repr": "FakeListChatModel(metadata={'lc_versions': 
{'langchain-core': '1.4.9'}}, responses=['baz, qux'])",
           "name": "FakeListChatModel"
         }
       ],
@@ -848,7 +848,7 @@
             "fake",
             "FakeStreamingListLLM"
           ],
-          "repr": "FakeStreamingListLLM(metadata={'lc_versions': 
{'langchain-core': '1.4.8'}}, responses=['first item, second item, third 
item'])",
+          "repr": "FakeStreamingListLLM(metadata={'lc_versions': 
{'langchain-core': '1.4.9'}}, responses=['first item, second item, third 
item'])",
           "name": "FakeStreamingListLLM"
         },
         {
@@ -884,7 +884,7 @@
               "fake",
               "FakeStreamingListLLM"
             ],
-            "repr": "FakeStreamingListLLM(metadata={'lc_versions': 
{'langchain-core': '1.4.8'}}, responses=['this', 'is', 'a', 'test'])",
+            "repr": "FakeStreamingListLLM(metadata={'lc_versions': 
{'langchain-core': '1.4.9'}}, responses=['this', 'is', 'a', 'test'])",
             "name": "FakeStreamingListLLM"
           }
         },
@@ -1009,7 +1009,7 @@
 # name: test_prompt_with_chat_model
   '''
   ChatPromptTemplate(input_variables=['question'], input_types={}, 
partial_variables={}, 
messages=[SystemMessagePromptTemplate(prompt=PromptTemplate(input_variables=[], 
input_types={}, partial_variables={}, template='You are a nice assistant.'), 
additional_kwargs={}), 
HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['question'], 
input_types={}, partial_variables={}, template='{question}'), 
additional_kwargs={})])
-  | FakeListChatModel(metadata={'lc_versions': {'langchain-core': '1.4.8'}}, 
responses=['foo'])
+  | FakeListChatModel(metadata={'lc_versions': {'langchain-core': '1.4.9'}}, 
responses=['foo'])
   '''
 # ---
 # name: test_prompt_with_chat_model.1
@@ -1109,7 +1109,7 @@
           "fake_chat_models",
           "FakeListChatModel"
         ],
-        "repr": "FakeListChatModel(metadata={'lc_versions': {'langchain-core': 
'1.4.8'}}, responses=['foo'])",
+        "repr": "FakeListChatModel(metadata={'lc_versions': {'langchain-core': 
'1.4.9'}}, responses=['foo'])",
         "name": "FakeListChatModel"
       }
     },
@@ -1220,7 +1220,7 @@
             "fake_chat_models",
             "FakeListChatModel"
           ],
-          "repr": "FakeListChatModel(metadata={'lc_versions': 
{'langchain-core': '1.4.8'}}, responses=['foo, bar'])",
+          "repr": "FakeListChatModel(metadata={'lc_versions': 
{'langchain-core': '1.4.9'}}, responses=['foo, bar'])",
           "name": "FakeListChatModel"
         }
       ],
@@ -1249,7 +1249,7 @@
 # name: test_prompt_with_chat_model_async
   '''
   ChatPromptTemplate(input_variables=['question'], input_types={}, 
partial_variables={}, 
messages=[SystemMessagePromptTemplate(prompt=PromptTemplate(input_variables=[], 
input_types={}, partial_variables={}, template='You are a nice assistant.'), 
additional_kwargs={}), 
HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['question'], 
input_types={}, partial_variables={}, template='{question}'), 
additional_kwargs={})])
-  | FakeListChatModel(metadata={'lc_versions': {'langchain-core': '1.4.8'}}, 
responses=['foo'])
+  | FakeListChatModel(metadata={'lc_versions': {'langchain-core': '1.4.9'}}, 
responses=['foo'])
   '''
 # ---
 # name: test_prompt_with_chat_model_async.1
@@ -1349,7 +1349,7 @@
           "fake_chat_models",
           "FakeListChatModel"
         ],
-        "repr": "FakeListChatModel(metadata={'lc_versions': {'langchain-core': 
'1.4.8'}}, responses=['foo'])",
+        "repr": "FakeListChatModel(metadata={'lc_versions': {'langchain-core': 
'1.4.9'}}, responses=['foo'])",
         "name": "FakeListChatModel"
       }
     },
@@ -1459,7 +1459,7 @@
           "fake",
           "FakeListLLM"
         ],
-        "repr": "FakeListLLM(metadata={'lc_versions': {'langchain-core': 
'1.4.8'}}, responses=['foo', 'bar'])",
+        "repr": "FakeListLLM(metadata={'lc_versions': {'langchain-core': 
'1.4.9'}}, responses=['foo', 'bar'])",
         "name": "FakeListLLM"
       }
     },
@@ -1576,7 +1576,7 @@
             "fake",
             "FakeListLLM"
           ],
-          "repr": "FakeListLLM(metadata={'lc_versions': {'langchain-core': 
'1.4.8'}}, responses=['foo', 'bar'])",
+          "repr": "FakeListLLM(metadata={'lc_versions': {'langchain-core': 
'1.4.9'}}, responses=['foo', 'bar'])",
           "name": "FakeListLLM"
         }
       ],
@@ -1699,7 +1699,7 @@
             "fake",
             "FakeStreamingListLLM"
           ],
-          "repr": "FakeStreamingListLLM(metadata={'lc_versions': 
{'langchain-core': '1.4.8'}}, responses=['bear, dog, cat', 'tomato, lettuce, 
onion'])",
+          "repr": "FakeStreamingListLLM(metadata={'lc_versions': 
{'langchain-core': '1.4.9'}}, responses=['bear, dog, cat', 'tomato, lettuce, 
onion'])",
           "name": "FakeStreamingListLLM"
         }
       ],
@@ -1867,7 +1867,7 @@
                     "fake",
                     "FakeListLLM"
                   ],
-                  "repr": "FakeListLLM(metadata={'lc_versions': 
{'langchain-core': '1.4.8'}}, responses=['4'])",
+                  "repr": "FakeListLLM(metadata={'lc_versions': 
{'langchain-core': '1.4.9'}}, responses=['4'])",
                   "name": "FakeListLLM"
                 }
               },
@@ -1940,7 +1940,7 @@
                     "fake",
                     "FakeListLLM"
                   ],
-                  "repr": "FakeListLLM(metadata={'lc_versions': 
{'langchain-core': '1.4.8'}}, responses=['2'])",
+                  "repr": "FakeListLLM(metadata={'lc_versions': 
{'langchain-core': '1.4.9'}}, responses=['2'])",
                   "name": "FakeListLLM"
                 }
               },
@@ -13407,7 +13407,7 @@
     just_to_test_lambda: RunnableLambda(...)
   }
   | ChatPromptTemplate(input_variables=['documents', 'question'], 
input_types={}, partial_variables={}, 
messages=[SystemMessagePromptTemplate(prompt=PromptTemplate(input_variables=[], 
input_types={}, partial_variables={}, template='You are a nice assistant.'), 
additional_kwargs={}), 
HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['documents', 
'question'], input_types={}, partial_variables={}, 
template='Context:\n{documents}\n\nQuestion:\n{question}'), 
additional_kwargs={})])
-  | FakeListChatModel(metadata={'lc_versions': {'langchain-core': '1.4.8'}}, 
responses=['foo, bar'])
+  | FakeListChatModel(metadata={'lc_versions': {'langchain-core': '1.4.9'}}, 
responses=['foo, bar'])
   | CommaSeparatedListOutputParser()
   '''
 # ---
@@ -13610,7 +13610,7 @@
             "fake_chat_models",
             "FakeListChatModel"
           ],
-          "repr": "FakeListChatModel(metadata={'lc_versions': 
{'langchain-core': '1.4.8'}}, responses=['foo, bar'])",
+          "repr": "FakeListChatModel(metadata={'lc_versions': 
{'langchain-core': '1.4.9'}}, responses=['foo, bar'])",
           "name": "FakeListChatModel"
         }
       ],
@@ -13636,8 +13636,8 @@
   ChatPromptTemplate(input_variables=['question'], input_types={}, 
partial_variables={}, 
messages=[SystemMessagePromptTemplate(prompt=PromptTemplate(input_variables=[], 
input_types={}, partial_variables={}, template='You are a nice assistant.'), 
additional_kwargs={}), 
HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['question'], 
input_types={}, partial_variables={}, template='{question}'), 
additional_kwargs={})])
   | RunnableLambda(...)
   | {
-      chat: FakeListChatModel(metadata={'lc_versions': {'langchain-core': 
'1.4.8'}}, responses=["i'm a chatbot"]),
-      llm: FakeListLLM(metadata={'lc_versions': {'langchain-core': '1.4.8'}}, 
responses=["i'm a textbot"])
+      chat: FakeListChatModel(metadata={'lc_versions': {'langchain-core': 
'1.4.9'}}, responses=["i'm a chatbot"]),
+      llm: FakeListLLM(metadata={'lc_versions': {'langchain-core': '1.4.9'}}, 
responses=["i'm a textbot"])
     }
   '''
 # ---
@@ -13762,7 +13762,7 @@
                 "fake_chat_models",
                 "FakeListChatModel"
               ],
-              "repr": "FakeListChatModel(metadata={'lc_versions': 
{'langchain-core': '1.4.8'}}, responses=[\"i'm a chatbot\"])",
+              "repr": "FakeListChatModel(metadata={'lc_versions': 
{'langchain-core': '1.4.9'}}, responses=[\"i'm a chatbot\"])",
               "name": "FakeListChatModel"
             },
             "llm": {
@@ -13774,7 +13774,7 @@
                 "fake",
                 "FakeListLLM"
               ],
-              "repr": "FakeListLLM(metadata={'lc_versions': {'langchain-core': 
'1.4.8'}}, responses=[\"i'm a textbot\"])",
+              "repr": "FakeListLLM(metadata={'lc_versions': {'langchain-core': 
'1.4.9'}}, responses=[\"i'm a textbot\"])",
               "name": "FakeListLLM"
             }
           }
@@ -13917,7 +13917,7 @@
                     "fake_chat_models",
                     "FakeListChatModel"
                   ],
-                  "repr": "FakeListChatModel(metadata={'lc_versions': 
{'langchain-core': '1.4.8'}}, responses=[\"i'm a chatbot\"])",
+                  "repr": "FakeListChatModel(metadata={'lc_versions': 
{'langchain-core': '1.4.9'}}, responses=[\"i'm a chatbot\"])",
                   "name": "FakeListChatModel"
                 },
                 "kwargs": {
@@ -13938,7 +13938,7 @@
                 "fake",
                 "FakeListLLM"
               ],
-              "repr": "FakeListLLM(metadata={'lc_versions': {'langchain-core': 
'1.4.8'}}, responses=[\"i'm a textbot\"])",
+              "repr": "FakeListLLM(metadata={'lc_versions': {'langchain-core': 
'1.4.9'}}, responses=[\"i'm a textbot\"])",
               "name": "FakeListLLM"
             },
             "passthrough": {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/langchain_core-1.4.8/tests/unit_tests/test_tools.py 
new/langchain_core-1.4.9/tests/unit_tests/test_tools.py
--- old/langchain_core-1.4.8/tests/unit_tests/test_tools.py     2020-02-02 
01:00:00.000000000 +0100
+++ new/langchain_core-1.4.9/tests/unit_tests/test_tools.py     2020-02-02 
01:00:00.000000000 +0100
@@ -853,7 +853,12 @@
 
     tool_ = _FakeExceptionTool(handle_tool_error=handling)
     actual = tool_.invoke(
-        {"type": "tool_call", "args": {}, "name": "exception", "id": "call_1"}
+        {
+            "type": "tool_call",
+            "args": {},
+            "name": "exception",
+            "id": "call_1",
+        }
     )
 
     assert isinstance(actual, ToolMessage)
@@ -870,7 +875,12 @@
 
     tool_ = _FakeExceptionTool(handle_tool_error=handling)
     actual = tool_.invoke(
-        {"type": "tool_call", "args": {}, "name": "exception", "id": "call_1"}
+        {
+            "type": "tool_call",
+            "args": {},
+            "name": "exception",
+            "id": "call_1",
+        }
     )
 
     assert isinstance(actual, ToolMessage)
@@ -887,7 +897,12 @@
 
     tool_ = _FakeExceptionTool(handle_tool_error=handling)
     actual = tool_.invoke(
-        {"type": "tool_call", "args": {}, "name": "exception", "id": "call_1"}
+        {
+            "type": "tool_call",
+            "args": {},
+            "name": "exception",
+            "id": "call_1",
+        }
     )
 
     assert isinstance(actual, ToolMessage)
@@ -935,7 +950,12 @@
 
     tool_ = _FakeExceptionTool(handle_tool_error=handling)
     actual = await tool_.ainvoke(
-        {"type": "tool_call", "args": {}, "name": "exception", "id": "call_1"}
+        {
+            "type": "tool_call",
+            "args": {},
+            "name": "exception",
+            "id": "call_1",
+        }
     )
 
     assert isinstance(actual, ToolMessage)
@@ -954,7 +974,12 @@
 
     tool_ = _FakeExceptionTool(handle_tool_error=handling)
     actual = await tool_.ainvoke(
-        {"type": "tool_call", "args": {}, "name": "exception", "id": "call_1"}
+        {
+            "type": "tool_call",
+            "args": {},
+            "name": "exception",
+            "id": "call_1",
+        }
     )
 
     assert isinstance(actual, ToolMessage)
@@ -3928,7 +3953,12 @@
         ]
 
     result = multi.invoke(
-        {"type": "tool_call", "args": {"x": 3}, "name": "multi", "id": "outer"}
+        {
+            "type": "tool_call",
+            "args": {"x": 3},
+            "name": "multi",
+            "id": "outer",
+        }
     )
     assert isinstance(result, list)
     assert len(result) == 3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/langchain_core-1.4.8/tests/unit_tests/utils/test_function_calling.py 
new/langchain_core-1.4.9/tests/unit_tests/utils/test_function_calling.py
--- old/langchain_core-1.4.8/tests/unit_tests/utils/test_function_calling.py    
2020-02-02 01:00:00.000000000 +0100
+++ new/langchain_core-1.4.9/tests/unit_tests/utils/test_function_calling.py    
2020-02-02 01:00:00.000000000 +0100
@@ -30,6 +30,7 @@
 from langchain_core.tools import BaseTool, StructuredTool, Tool, tool
 from langchain_core.utils.function_calling import (
     _convert_typed_dict_to_openai_function,
+    _parse_google_docstring,
     convert_to_json_schema,
     convert_to_openai_function,
     convert_to_openai_tool,
@@ -1250,6 +1251,126 @@
         convert_to_openai_function(schema_without_title)
 
 
+class TestParseGoogleDocstring:
+    """Tests for _parse_google_docstring continuation-line handling."""
+
+    def test_continuation_line_with_colon(self) -> None:
+        """Continuation lines containing colons should not be treated as new 
args."""
+        # inspect.getdoc() returns dedented docstrings, so match that format
+        docstring = (
+            "Search the knowledge base.\n"
+            "\n"
+            "Args:\n"
+            "    query: The search query to use\n"
+            "        for finding things: important ones\n"
+            "    top_k: Number of results to return"
+        )
+        _desc, args = _parse_google_docstring(docstring, ["query", "top_k"])
+        assert "query" in args
+        assert "top_k" in args
+        assert len(args) == 2
+        assert "for finding things: important ones" in args["query"]
+
+    def test_simple_args_still_work(self) -> None:
+        """Basic single-line argument descriptions should still parse 
correctly."""
+        docstring = "Do something.\n\nArgs:\n    x: The x value\n    y: The y 
value"
+        _desc, args = _parse_google_docstring(docstring, ["x", "y"])
+        assert args == {"x": "The x value", "y": "The y value"}
+
+    def test_continuation_line_without_colon(self) -> None:
+        """Colon-free continuation lines append to the current arg.
+
+        Documents preserved behavior: this case parsed correctly before the
+        continuation-detection fix (via the colon-free fallback branch) and
+        must continue to.
+        """
+        docstring = (
+            "Do something.\n"
+            "\n"
+            "Args:\n"
+            "    name: A very long description that\n"
+            "        spans multiple lines\n"
+            "    age: The age"
+        )
+        _desc, args = _parse_google_docstring(docstring, ["name", "age"])
+        assert "spans multiple lines" in args["name"]
+        assert args["age"] == "The age"
+
+    def test_multiple_continuation_lines_with_colons(self) -> None:
+        """Multiple continuation lines with colons should all be appended."""
+        docstring = (
+            "Process data.\n"
+            "\n"
+            "Args:\n"
+            "    config: Configuration string in format\n"
+            "        key1: value1\n"
+            "        key2: value2\n"
+            "    verbose: Enable verbose output"
+        )
+        _desc, args = _parse_google_docstring(docstring, ["config", "verbose"])
+        assert "key1: value1" in args["config"]
+        assert "key2: value2" in args["config"]
+        assert args["verbose"] == "Enable verbose output"
+
+    def test_annotated_arg_with_colon_continuation(self) -> None:
+        """A `(type)` annotation strips correctly alongside a colon 
continuation.
+
+        Exercises both code paths the fix touches at once: the parenthesized
+        type annotation is stripped from the arg name, and the colon-bearing
+        continuation line folds into that arg rather than creating a phantom
+        key (the original bug).
+        """
+        docstring = (
+            "Run a query.\n"
+            "\n"
+            "Args:\n"
+            "    query (str): The query to run\n"
+            "        details: extra info\n"
+            "    k (int): Number of results"
+        )
+        _desc, args = _parse_google_docstring(docstring, ["query", "k"])
+        assert set(args) == {"query", "k"}
+        assert "details: extra info" in args["query"]
+        assert args["k"] == "Number of results"
+
+    def test_returns_section_after_args_excluded(self) -> None:
+        """A well-formed Returns: block after Args: must not leak in as an arg.
+
+        The blank line separating the sections terminates the Args block, so
+        `Returns`/`Raises` and their indented bodies stay out of
+        `arg_descriptions`.
+        """
+        docstring = (
+            "Do work.\n\nArgs:\n    x: The x value\n\nReturns:\n    result: 
yes\n"
+        )
+        _desc, args = _parse_google_docstring(docstring, ["x"])
+        assert args == {"x": "The x value"}
+
+    def test_same_indent_colon_line_is_new_arg(self) -> None:
+        """A colon line at the base arg indent starts a new arg, not a 
continuation.
+
+        Pins the `current_indent > arg_indent` boundary: only deeper-indented
+        lines are continuations.
+        """
+        docstring = "Do work.\n\nArgs:\n    a: first\n    b: second"
+        _desc, args = _parse_google_docstring(docstring, ["a", "b"])
+        assert args == {"a": "first", "b": "second"}
+
+    def test_more_indented_second_arg_folds_into_previous(self) -> None:
+        """Non-uniform indentation: a deeper second arg folds into the 
previous one.
+
+        Documents the intentional trade-off of indentation-based detection.
+        Google style requires uniform argument indentation; when a later arg is
+        indented deeper than the first, it is indistinguishable from a
+        colon-bearing continuation and is merged into the prior arg. This pins
+        that behavior so it stays intentional rather than incidental.
+        """
+        docstring = "Do work.\n\nArgs:\n    x: the x value\n        y: the y 
value"
+        _desc, args = _parse_google_docstring(docstring, ["x", "y"])
+        assert set(args) == {"x"}
+        assert "y: the y value" in args["x"]
+
+
 def test_convert_to_openai_tool_apply_patch_passthrough() -> None:
     """Test apply_patch is passed through as an OpenAI built-in tool."""
     tool = {"type": "apply_patch"}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/langchain_core-1.4.8/uv.lock 
new/langchain_core-1.4.9/uv.lock
--- old/langchain_core-1.4.8/uv.lock    2020-02-02 01:00:00.000000000 +0100
+++ new/langchain_core-1.4.9/uv.lock    2020-02-02 01:00:00.000000000 +0100
@@ -978,7 +978,7 @@
 
 [[package]]
 name = "jupyterlab"
-version = "4.5.7"
+version = "4.5.9"
 source = { registry = "https://pypi.org/simple"; }
 dependencies = [
     { name = "async-lru" },
@@ -996,9 +996,9 @@
     { name = "tornado" },
     { name = "traitlets" },
 ]
-sdist = { url = 
"https://files.pythonhosted.org/packages/2b/22/8440ec827762146e7cdecf04335bd348795899d29dc6ae82238707353a2c/jupyterlab-4.5.7.tar.gz";,
 hash = 
"sha256:55a9822c4754da305f41e113452c68383e214dcf96de760146af89ce5d5117b0", size 
= 23992763, upload-time = "2026-04-29T16:43:51.328Z" }
+sdist = { url = 
"https://files.pythonhosted.org/packages/e8/52/a8d4895bef501ffeb6af448e8bf7079541c7772978211963aa653518c2d9/jupyterlab-4.5.9.tar.gz";,
 hash = 
"sha256:dd79a073fecae7a39066ea99e4627ed6c76269ac926e95a810e1e1df6358d865", size 
= 23994445, upload-time = "2026-06-17T15:42:16.406Z" }
 wheels = [
-    { url = 
"https://files.pythonhosted.org/packages/3d/aa/537b8f7d80e799af19af35fb3ddfc970b951088a13c57dd9387dcfbb7f61/jupyterlab-4.5.7-py3-none-any.whl";,
 hash = 
"sha256:fba4cb0e2c44a52859669d8c98b45de029d5e515f8407bf8534d2a8fc5f0964d", size 
= 12450123, upload-time = "2026-04-29T16:43:46.639Z" },
+    { url = 
"https://files.pythonhosted.org/packages/c6/bb/2f9b425062416fba58f580c9b89c3b07277ccdf0a292501fedbca8ea00ea/jupyterlab-4.5.9-py3-none-any.whl";,
 hash = 
"sha256:5ff0f908e8ac0afbed32b106fdef360f101c0a6654d1bf4a81e98a293ae1b336", size 
= 12449803, upload-time = "2026-06-17T15:42:12.18Z" },
 ]
 
 [[package]]
@@ -1039,7 +1039,7 @@
 
 [[package]]
 name = "langchain-core"
-version = "1.4.8"
+version = "1.4.9"
 source = { editable = "." }
 dependencies = [
     { name = "jsonpatch" },
@@ -1221,16 +1221,19 @@
     { name = "transformers", specifier = ">=4.51.3,<6.0.0" },
 ]
 typing = [
-    { name = "beautifulsoup4", specifier = ">=4.13.5,<5.0.0" },
     { name = "lxml-stubs", specifier = ">=0.5.1,<1.0.0" },
-    { name = "mypy", specifier = ">=2.1.0,<2.2.0" },
+    { name = "nltk", specifier = ">=3.9.1,<4.0.0" },
+    { name = "sentence-transformers", specifier = ">=5.3.0,<6.0.0" },
+    { name = "spacy", specifier = ">=3.8.13,<4.0.0" },
     { name = "tiktoken", specifier = ">=0.8.0,<1.0.0" },
+    { name = "transformers", specifier = ">=4.51.3,<6.0.0" },
+    { name = "ty", specifier = ">=0.0.56,<0.1.0" },
     { name = "types-requests", specifier = ">=2.31.0.20240218,<3.0.0.0" },
 ]
 
 [[package]]
 name = "langsmith"
-version = "0.8.0"
+version = "0.8.18"
 source = { registry = "https://pypi.org/simple"; }
 dependencies = [
     { name = "httpx" },
@@ -1240,12 +1243,13 @@
     { name = "requests" },
     { name = "requests-toolbelt" },
     { name = "uuid-utils" },
+    { name = "websockets" },
     { name = "xxhash" },
     { name = "zstandard" },
 ]
-sdist = { url = 
"https://files.pythonhosted.org/packages/a8/64/95f1f013531395f4e8ed73caeee780f65c7c58fe028cb543f8937b45611b/langsmith-0.8.0.tar.gz";,
 hash = 
"sha256:59fe5b2a56bbbe14a08aa76691f84b49e8675dd21e11b57d80c6db8c08bac2e3", size 
= 4432996, upload-time = "2026-04-30T22:13:07.341Z" }
+sdist = { url = 
"https://files.pythonhosted.org/packages/9a/d9/a6681aa9847bbbc5ec21abe20a5e233b94e5edcfe39624db607ac7e8ccb4/langsmith-0.8.18.tar.gz";,
 hash = 
"sha256:32dde9c0e67e053e0fb738921fc8ced768af7b8fa83d7a0e3fd63597cf8776dd", size 
= 4526988, upload-time = "2026-06-19T13:12:17.123Z" }
 wheels = [
-    { url = 
"https://files.pythonhosted.org/packages/f3/e1/a4be2e696c9473bb53298df398237da5674704d781d4b748ed35aeef592a/langsmith-0.8.0-py3-none-any.whl";,
 hash = 
"sha256:12cc4bc5622b835a6d841964d6034df3617bdb912dae0c1381fd0a68a9b3a3ef", size 
= 393268, upload-time = "2026-04-30T22:13:05.56Z" },
+    { url = 
"https://files.pythonhosted.org/packages/03/70/0e0cc80a3b064c8d6c8d697c3125ed86e39d5a7393ec6dc8b07cb1cf13c4/langsmith-0.8.18-py3-none-any.whl";,
 hash = 
"sha256:3940183349993faef48e6c7d08e4822ee9cefd906b362d0e3c2d650314d2f282", size 
= 508108, upload-time = "2026-06-19T13:12:15.348Z" },
 ]
 
 [[package]]
@@ -3090,15 +3094,15 @@
 
 [[package]]
 name = "vcrpy"
-version = "8.1.1"
+version = "8.2.1"
 source = { registry = "https://pypi.org/simple"; }
 dependencies = [
     { name = "pyyaml" },
     { name = "wrapt" },
 ]
-sdist = { url = 
"https://files.pythonhosted.org/packages/b3/07/bcfd5ebd7cb308026ab78a353e091bd699593358be49197d39d004e5ad83/vcrpy-8.1.1.tar.gz";,
 hash = 
"sha256:58e3053e33b423f3594031cb758c3f4d1df931307f1e67928e30cf352df7709f", size 
= 85770, upload-time = "2026-01-04T19:22:03.886Z" }
+sdist = { url = 
"https://files.pythonhosted.org/packages/08/db/08183b845b0040bb877dad2bd7e4e0976fc232bb3476d7ee369c6c4f8b5a/vcrpy-8.2.1.tar.gz";,
 hash = 
"sha256:d73a6e4eb6dae8148e659764b7a00e68cc51ba29ba9e6a85e1f0790ad96b97df", size 
= 90511, upload-time = "2026-06-16T13:20:52.906Z" }
 wheels = [
-    { url = 
"https://files.pythonhosted.org/packages/3a/d7/f79b05a5d728f8786876a7d75dfb0c5cae27e428081b2d60152fb52f155f/vcrpy-8.1.1-py3-none-any.whl";,
 hash = 
"sha256:2d16f31ad56493efb6165182dd99767207031b0da3f68b18f975545ede8ac4b9", size 
= 42445, upload-time = "2026-01-04T19:22:02.532Z" },
+    { url = 
"https://files.pythonhosted.org/packages/f8/7c/0e812ab83f5289404c674f3461ba783250b967d34b5ab034d361236ec042/vcrpy-8.2.1-py3-none-any.whl";,
 hash = 
"sha256:7ce58c9e2792b246f79d6f4b3e9660676cc6f853be17e1547305b4437ab1ff85", size 
= 44925, upload-time = "2026-06-16T13:20:51.734Z" },
 ]
 
 [[package]]
@@ -3170,6 +3174,74 @@
 ]
 
 [[package]]
+name = "websockets"
+version = "16.0"
+source = { registry = "https://pypi.org/simple"; }
+sdist = { url = 
"https://files.pythonhosted.org/packages/04/24/4b2031d72e840ce4c1ccb255f693b15c334757fc50023e4db9537080b8c4/websockets-16.0.tar.gz";,
 hash = 
"sha256:5f6261a5e56e8d5c42a4497b364ea24d94d9563e8fbd44e78ac40879c60179b5", size 
= 179346, upload-time = "2026-01-10T09:23:47.181Z" }
+wheels = [
+    { url = 
"https://files.pythonhosted.org/packages/20/74/221f58decd852f4b59cc3354cccaf87e8ef695fede361d03dc9a7396573b/websockets-16.0-cp310-cp310-macosx_10_9_universal2.whl";,
 hash = 
"sha256:04cdd5d2d1dacbad0a7bf36ccbcd3ccd5a30ee188f2560b7a62a30d14107b31a", size 
= 177343, upload-time = "2026-01-10T09:22:21.28Z" },
+    { url = 
"https://files.pythonhosted.org/packages/19/0f/22ef6107ee52ab7f0b710d55d36f5a5d3ef19e8a205541a6d7ffa7994e5a/websockets-16.0-cp310-cp310-macosx_10_9_x86_64.whl";,
 hash = 
"sha256:8ff32bb86522a9e5e31439a58addbb0166f0204d64066fb955265c4e214160f0", size 
= 175021, upload-time = "2026-01-10T09:22:22.696Z" },
+    { url = 
"https://files.pythonhosted.org/packages/10/40/904a4cb30d9b61c0e278899bf36342e9b0208eb3c470324a9ecbaac2a30f/websockets-16.0-cp310-cp310-macosx_11_0_arm64.whl";,
 hash = 
"sha256:583b7c42688636f930688d712885cf1531326ee05effd982028212ccc13e5957", size 
= 175320, upload-time = "2026-01-10T09:22:23.94Z" },
+    { url = 
"https://files.pythonhosted.org/packages/9d/2f/4b3ca7e106bc608744b1cdae041e005e446124bebb037b18799c2d356864/websockets-16.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl";,
 hash = 
"sha256:7d837379b647c0c4c2355c2499723f82f1635fd2c26510e1f587d89bc2199e72", size 
= 183815, upload-time = "2026-01-10T09:22:25.469Z" },
+    { url = 
"https://files.pythonhosted.org/packages/86/26/d40eaa2a46d4302becec8d15b0fc5e45bdde05191e7628405a19cf491ccd/websockets-16.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl";,
 hash = 
"sha256:df57afc692e517a85e65b72e165356ed1df12386ecb879ad5693be08fac65dde", size 
= 185054, upload-time = "2026-01-10T09:22:27.101Z" },
+    { url = 
"https://files.pythonhosted.org/packages/b0/ba/6500a0efc94f7373ee8fefa8c271acdfd4dca8bd49a90d4be7ccabfc397e/websockets-16.0-cp310-cp310-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:2b9f1e0d69bc60a4a87349d50c09a037a2607918746f07de04df9e43252c77a3", size 
= 184565, upload-time = "2026-01-10T09:22:28.293Z" },
+    { url = 
"https://files.pythonhosted.org/packages/04/b4/96bf2cee7c8d8102389374a2616200574f5f01128d1082f44102140344cc/websockets-16.0-cp310-cp310-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:335c23addf3d5e6a8633f9f8eda77efad001671e80b95c491dd0924587ece0b3", size 
= 183848, upload-time = "2026-01-10T09:22:30.394Z" },
+    { url = 
"https://files.pythonhosted.org/packages/02/8e/81f40fb00fd125357814e8c3025738fc4ffc3da4b6b4a4472a82ba304b41/websockets-16.0-cp310-cp310-win32.whl";,
 hash = 
"sha256:37b31c1623c6605e4c00d466c9d633f9b812ea430c11c8a278774a1fde1acfa9", size 
= 178249, upload-time = "2026-01-10T09:22:32.083Z" },
+    { url = 
"https://files.pythonhosted.org/packages/b4/5f/7e40efe8df57db9b91c88a43690ac66f7b7aa73a11aa6a66b927e44f26fa/websockets-16.0-cp310-cp310-win_amd64.whl";,
 hash = 
"sha256:8e1dab317b6e77424356e11e99a432b7cb2f3ec8c5ab4dabbcee6add48f72b35", size 
= 178685, upload-time = "2026-01-10T09:22:33.345Z" },
+    { url = 
"https://files.pythonhosted.org/packages/f2/db/de907251b4ff46ae804ad0409809504153b3f30984daf82a1d84a9875830/websockets-16.0-cp311-cp311-macosx_10_9_universal2.whl";,
 hash = 
"sha256:31a52addea25187bde0797a97d6fc3d2f92b6f72a9370792d65a6e84615ac8a8", size 
= 177340, upload-time = "2026-01-10T09:22:34.539Z" },
+    { url = 
"https://files.pythonhosted.org/packages/f3/fa/abe89019d8d8815c8781e90d697dec52523fb8ebe308bf11664e8de1877e/websockets-16.0-cp311-cp311-macosx_10_9_x86_64.whl";,
 hash = 
"sha256:417b28978cdccab24f46400586d128366313e8a96312e4b9362a4af504f3bbad", size 
= 175022, upload-time = "2026-01-10T09:22:36.332Z" },
+    { url = 
"https://files.pythonhosted.org/packages/58/5d/88ea17ed1ded2079358b40d31d48abe90a73c9e5819dbcde1606e991e2ad/websockets-16.0-cp311-cp311-macosx_11_0_arm64.whl";,
 hash = 
"sha256:af80d74d4edfa3cb9ed973a0a5ba2b2a549371f8a741e0800cb07becdd20f23d", size 
= 175319, upload-time = "2026-01-10T09:22:37.602Z" },
+    { url = 
"https://files.pythonhosted.org/packages/d2/ae/0ee92b33087a33632f37a635e11e1d99d429d3d323329675a6022312aac2/websockets-16.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl";,
 hash = 
"sha256:08d7af67b64d29823fed316505a89b86705f2b7981c07848fb5e3ea3020c1abe", size 
= 184631, upload-time = "2026-01-10T09:22:38.789Z" },
+    { url = 
"https://files.pythonhosted.org/packages/c8/c5/27178df583b6c5b31b29f526ba2da5e2f864ecc79c99dae630a85d68c304/websockets-16.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl";,
 hash = 
"sha256:7be95cfb0a4dae143eaed2bcba8ac23f4892d8971311f1b06f3c6b78952ee70b", size 
= 185870, upload-time = "2026-01-10T09:22:39.893Z" },
+    { url = 
"https://files.pythonhosted.org/packages/87/05/536652aa84ddc1c018dbb7e2c4cbcd0db884580bf8e95aece7593fde526f/websockets-16.0-cp311-cp311-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:d6297ce39ce5c2e6feb13c1a996a2ded3b6832155fcfc920265c76f24c7cceb5", size 
= 185361, upload-time = "2026-01-10T09:22:41.016Z" },
+    { url = 
"https://files.pythonhosted.org/packages/6d/e2/d5332c90da12b1e01f06fb1b85c50cfc489783076547415bf9f0a659ec19/websockets-16.0-cp311-cp311-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:1c1b30e4f497b0b354057f3467f56244c603a79c0d1dafce1d16c283c25f6e64", size 
= 184615, upload-time = "2026-01-10T09:22:42.442Z" },
+    { url = 
"https://files.pythonhosted.org/packages/77/fb/d3f9576691cae9253b51555f841bc6600bf0a983a461c79500ace5a5b364/websockets-16.0-cp311-cp311-win32.whl";,
 hash = 
"sha256:5f451484aeb5cafee1ccf789b1b66f535409d038c56966d6101740c1614b86c6", size 
= 178246, upload-time = "2026-01-10T09:22:43.654Z" },
+    { url = 
"https://files.pythonhosted.org/packages/54/67/eaff76b3dbaf18dcddabc3b8c1dba50b483761cccff67793897945b37408/websockets-16.0-cp311-cp311-win_amd64.whl";,
 hash = 
"sha256:8d7f0659570eefb578dacde98e24fb60af35350193e4f56e11190787bee77dac", size 
= 178684, upload-time = "2026-01-10T09:22:44.941Z" },
+    { url = 
"https://files.pythonhosted.org/packages/84/7b/bac442e6b96c9d25092695578dda82403c77936104b5682307bd4deb1ad4/websockets-16.0-cp312-cp312-macosx_10_13_universal2.whl";,
 hash = 
"sha256:71c989cbf3254fbd5e84d3bff31e4da39c43f884e64f2551d14bb3c186230f00", size 
= 177365, upload-time = "2026-01-10T09:22:46.787Z" },
+    { url = 
"https://files.pythonhosted.org/packages/b0/fe/136ccece61bd690d9c1f715baaeefd953bb2360134de73519d5df19d29ca/websockets-16.0-cp312-cp312-macosx_10_13_x86_64.whl";,
 hash = 
"sha256:8b6e209ffee39ff1b6d0fa7bfef6de950c60dfb91b8fcead17da4ee539121a79", size 
= 175038, upload-time = "2026-01-10T09:22:47.999Z" },
+    { url = 
"https://files.pythonhosted.org/packages/40/1e/9771421ac2286eaab95b8575b0cb701ae3663abf8b5e1f64f1fd90d0a673/websockets-16.0-cp312-cp312-macosx_11_0_arm64.whl";,
 hash = 
"sha256:86890e837d61574c92a97496d590968b23c2ef0aeb8a9bc9421d174cd378ae39", size 
= 175328, upload-time = "2026-01-10T09:22:49.809Z" },
+    { url = 
"https://files.pythonhosted.org/packages/18/29/71729b4671f21e1eaa5d6573031ab810ad2936c8175f03f97f3ff164c802/websockets-16.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl";,
 hash = 
"sha256:9b5aca38b67492ef518a8ab76851862488a478602229112c4b0d58d63a7a4d5c", size 
= 184915, upload-time = "2026-01-10T09:22:51.071Z" },
+    { url = 
"https://files.pythonhosted.org/packages/97/bb/21c36b7dbbafc85d2d480cd65df02a1dc93bf76d97147605a8e27ff9409d/websockets-16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl";,
 hash = 
"sha256:e0334872c0a37b606418ac52f6ab9cfd17317ac26365f7f65e203e2d0d0d359f", size 
= 186152, upload-time = "2026-01-10T09:22:52.224Z" },
+    { url = 
"https://files.pythonhosted.org/packages/4a/34/9bf8df0c0cf88fa7bfe36678dc7b02970c9a7d5e065a3099292db87b1be2/websockets-16.0-cp312-cp312-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:a0b31e0b424cc6b5a04b8838bbaec1688834b2383256688cf47eb97412531da1", size 
= 185583, upload-time = "2026-01-10T09:22:53.443Z" },
+    { url = 
"https://files.pythonhosted.org/packages/47/88/4dd516068e1a3d6ab3c7c183288404cd424a9a02d585efbac226cb61ff2d/websockets-16.0-cp312-cp312-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:485c49116d0af10ac698623c513c1cc01c9446c058a4e61e3bf6c19dff7335a2", size 
= 184880, upload-time = "2026-01-10T09:22:55.033Z" },
+    { url = 
"https://files.pythonhosted.org/packages/91/d6/7d4553ad4bf1c0421e1ebd4b18de5d9098383b5caa1d937b63df8d04b565/websockets-16.0-cp312-cp312-win32.whl";,
 hash = 
"sha256:eaded469f5e5b7294e2bdca0ab06becb6756ea86894a47806456089298813c89", size 
= 178261, upload-time = "2026-01-10T09:22:56.251Z" },
+    { url = 
"https://files.pythonhosted.org/packages/c3/f0/f3a17365441ed1c27f850a80b2bc680a0fa9505d733fe152fdf5e98c1c0b/websockets-16.0-cp312-cp312-win_amd64.whl";,
 hash = 
"sha256:5569417dc80977fc8c2d43a86f78e0a5a22fee17565d78621b6bb264a115d4ea", size 
= 178693, upload-time = "2026-01-10T09:22:57.478Z" },
+    { url = 
"https://files.pythonhosted.org/packages/cc/9c/baa8456050d1c1b08dd0ec7346026668cbc6f145ab4e314d707bb845bf0d/websockets-16.0-cp313-cp313-macosx_10_13_universal2.whl";,
 hash = 
"sha256:878b336ac47938b474c8f982ac2f7266a540adc3fa4ad74ae96fea9823a02cc9", size 
= 177364, upload-time = "2026-01-10T09:22:59.333Z" },
+    { url = 
"https://files.pythonhosted.org/packages/7e/0c/8811fc53e9bcff68fe7de2bcbe75116a8d959ac699a3200f4847a8925210/websockets-16.0-cp313-cp313-macosx_10_13_x86_64.whl";,
 hash = 
"sha256:52a0fec0e6c8d9a784c2c78276a48a2bdf099e4ccc2a4cad53b27718dbfd0230", size 
= 175039, upload-time = "2026-01-10T09:23:01.171Z" },
+    { url = 
"https://files.pythonhosted.org/packages/aa/82/39a5f910cb99ec0b59e482971238c845af9220d3ab9fa76dd9162cda9d62/websockets-16.0-cp313-cp313-macosx_11_0_arm64.whl";,
 hash = 
"sha256:e6578ed5b6981005df1860a56e3617f14a6c307e6a71b4fff8c48fdc50f3ed2c", size 
= 175323, upload-time = "2026-01-10T09:23:02.341Z" },
+    { url = 
"https://files.pythonhosted.org/packages/bd/28/0a25ee5342eb5d5f297d992a77e56892ecb65e7854c7898fb7d35e9b33bd/websockets-16.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl";,
 hash = 
"sha256:95724e638f0f9c350bb1c2b0a7ad0e83d9cc0c9259f3ea94e40d7b02a2179ae5", size 
= 184975, upload-time = "2026-01-10T09:23:03.756Z" },
+    { url = 
"https://files.pythonhosted.org/packages/f9/66/27ea52741752f5107c2e41fda05e8395a682a1e11c4e592a809a90c6a506/websockets-16.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl";,
 hash = 
"sha256:c0204dc62a89dc9d50d682412c10b3542d748260d743500a85c13cd1ee4bde82", size 
= 186203, upload-time = "2026-01-10T09:23:05.01Z" },
+    { url = 
"https://files.pythonhosted.org/packages/37/e5/8e32857371406a757816a2b471939d51c463509be73fa538216ea52b792a/websockets-16.0-cp313-cp313-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:52ac480f44d32970d66763115edea932f1c5b1312de36df06d6b219f6741eed8", size 
= 185653, upload-time = "2026-01-10T09:23:06.301Z" },
+    { url = 
"https://files.pythonhosted.org/packages/9b/67/f926bac29882894669368dc73f4da900fcdf47955d0a0185d60103df5737/websockets-16.0-cp313-cp313-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:6e5a82b677f8f6f59e8dfc34ec06ca6b5b48bc4fcda346acd093694cc2c24d8f", size 
= 184920, upload-time = "2026-01-10T09:23:07.492Z" },
+    { url = 
"https://files.pythonhosted.org/packages/3c/a1/3d6ccdcd125b0a42a311bcd15a7f705d688f73b2a22d8cf1c0875d35d34a/websockets-16.0-cp313-cp313-win32.whl";,
 hash = 
"sha256:abf050a199613f64c886ea10f38b47770a65154dc37181bfaff70c160f45315a", size 
= 178255, upload-time = "2026-01-10T09:23:09.245Z" },
+    { url = 
"https://files.pythonhosted.org/packages/6b/ae/90366304d7c2ce80f9b826096a9e9048b4bb760e44d3b873bb272cba696b/websockets-16.0-cp313-cp313-win_amd64.whl";,
 hash = 
"sha256:3425ac5cf448801335d6fdc7ae1eb22072055417a96cc6b31b3861f455fbc156", size 
= 178689, upload-time = "2026-01-10T09:23:10.483Z" },
+    { url = 
"https://files.pythonhosted.org/packages/f3/1d/e88022630271f5bd349ed82417136281931e558d628dd52c4d8621b4a0b2/websockets-16.0-cp314-cp314-macosx_10_15_universal2.whl";,
 hash = 
"sha256:8cc451a50f2aee53042ac52d2d053d08bf89bcb31ae799cb4487587661c038a0", size 
= 177406, upload-time = "2026-01-10T09:23:12.178Z" },
+    { url = 
"https://files.pythonhosted.org/packages/f2/78/e63be1bf0724eeb4616efb1ae1c9044f7c3953b7957799abb5915bffd38e/websockets-16.0-cp314-cp314-macosx_10_15_x86_64.whl";,
 hash = 
"sha256:daa3b6ff70a9241cf6c7fc9e949d41232d9d7d26fd3522b1ad2b4d62487e9904", size 
= 175085, upload-time = "2026-01-10T09:23:13.511Z" },
+    { url = 
"https://files.pythonhosted.org/packages/bb/f4/d3c9220d818ee955ae390cf319a7c7a467beceb24f05ee7aaaa2414345ba/websockets-16.0-cp314-cp314-macosx_11_0_arm64.whl";,
 hash = 
"sha256:fd3cb4adb94a2a6e2b7c0d8d05cb94e6f1c81a0cf9dc2694fb65c7e8d94c42e4", size 
= 175328, upload-time = "2026-01-10T09:23:14.727Z" },
+    { url = 
"https://files.pythonhosted.org/packages/63/bc/d3e208028de777087e6fb2b122051a6ff7bbcca0d6df9d9c2bf1dd869ae9/websockets-16.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl";,
 hash = 
"sha256:781caf5e8eee67f663126490c2f96f40906594cb86b408a703630f95550a8c3e", size 
= 185044, upload-time = "2026-01-10T09:23:15.939Z" },
+    { url = 
"https://files.pythonhosted.org/packages/ad/6e/9a0927ac24bd33a0a9af834d89e0abc7cfd8e13bed17a86407a66773cc0e/websockets-16.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl";,
 hash = 
"sha256:caab51a72c51973ca21fa8a18bd8165e1a0183f1ac7066a182ff27107b71e1a4", size 
= 186279, upload-time = "2026-01-10T09:23:17.148Z" },
+    { url = 
"https://files.pythonhosted.org/packages/b9/ca/bf1c68440d7a868180e11be653c85959502efd3a709323230314fda6e0b3/websockets-16.0-cp314-cp314-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:19c4dc84098e523fd63711e563077d39e90ec6702aff4b5d9e344a60cb3c0cb1", size 
= 185711, upload-time = "2026-01-10T09:23:18.372Z" },
+    { url = 
"https://files.pythonhosted.org/packages/c4/f8/fdc34643a989561f217bb477cbc47a3a07212cbda91c0e4389c43c296ebf/websockets-16.0-cp314-cp314-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:a5e18a238a2b2249c9a9235466b90e96ae4795672598a58772dd806edc7ac6d3", size 
= 184982, upload-time = "2026-01-10T09:23:19.652Z" },
+    { url = 
"https://files.pythonhosted.org/packages/dd/d1/574fa27e233764dbac9c52730d63fcf2823b16f0856b3329fc6268d6ae4f/websockets-16.0-cp314-cp314-win32.whl";,
 hash = 
"sha256:a069d734c4a043182729edd3e9f247c3b2a4035415a9172fd0f1b71658a320a8", size 
= 177915, upload-time = "2026-01-10T09:23:21.458Z" },
+    { url = 
"https://files.pythonhosted.org/packages/8a/f1/ae6b937bf3126b5134ce1f482365fde31a357c784ac51852978768b5eff4/websockets-16.0-cp314-cp314-win_amd64.whl";,
 hash = 
"sha256:c0ee0e63f23914732c6d7e0cce24915c48f3f1512ec1d079ed01fc629dab269d", size 
= 178381, upload-time = "2026-01-10T09:23:22.715Z" },
+    { url = 
"https://files.pythonhosted.org/packages/06/9b/f791d1db48403e1f0a27577a6beb37afae94254a8c6f08be4a23e4930bc0/websockets-16.0-cp314-cp314t-macosx_10_15_universal2.whl";,
 hash = 
"sha256:a35539cacc3febb22b8f4d4a99cc79b104226a756aa7400adc722e83b0d03244", size 
= 177737, upload-time = "2026-01-10T09:23:24.523Z" },
+    { url = 
"https://files.pythonhosted.org/packages/bd/40/53ad02341fa33b3ce489023f635367a4ac98b73570102ad2cdd770dacc9a/websockets-16.0-cp314-cp314t-macosx_10_15_x86_64.whl";,
 hash = 
"sha256:b784ca5de850f4ce93ec85d3269d24d4c82f22b7212023c974c401d4980ebc5e", size 
= 175268, upload-time = "2026-01-10T09:23:25.781Z" },
+    { url = 
"https://files.pythonhosted.org/packages/74/9b/6158d4e459b984f949dcbbb0c5d270154c7618e11c01029b9bbd1bb4c4f9/websockets-16.0-cp314-cp314t-macosx_11_0_arm64.whl";,
 hash = 
"sha256:569d01a4e7fba956c5ae4fc988f0d4e187900f5497ce46339c996dbf24f17641", size 
= 175486, upload-time = "2026-01-10T09:23:27.033Z" },
+    { url = 
"https://files.pythonhosted.org/packages/e5/2d/7583b30208b639c8090206f95073646c2c9ffd66f44df967981a64f849ad/websockets-16.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl";,
 hash = 
"sha256:50f23cdd8343b984957e4077839841146f67a3d31ab0d00e6b824e74c5b2f6e8", size 
= 185331, upload-time = "2026-01-10T09:23:28.259Z" },
+    { url = 
"https://files.pythonhosted.org/packages/45/b0/cce3784eb519b7b5ad680d14b9673a31ab8dcb7aad8b64d81709d2430aa8/websockets-16.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl";,
 hash = 
"sha256:152284a83a00c59b759697b7f9e9cddf4e3c7861dd0d964b472b70f78f89e80e", size 
= 186501, upload-time = "2026-01-10T09:23:29.449Z" },
+    { url = 
"https://files.pythonhosted.org/packages/19/60/b8ebe4c7e89fb5f6cdf080623c9d92789a53636950f7abacfc33fe2b3135/websockets-16.0-cp314-cp314t-musllinux_1_2_aarch64.whl";,
 hash = 
"sha256:bc59589ab64b0022385f429b94697348a6a234e8ce22544e3681b2e9331b5944", size 
= 186062, upload-time = "2026-01-10T09:23:31.368Z" },
+    { url = 
"https://files.pythonhosted.org/packages/88/a8/a080593f89b0138b6cba1b28f8df5673b5506f72879322288b031337c0b8/websockets-16.0-cp314-cp314t-musllinux_1_2_x86_64.whl";,
 hash = 
"sha256:32da954ffa2814258030e5a57bc73a3635463238e797c7375dc8091327434206", size 
= 185356, upload-time = "2026-01-10T09:23:32.627Z" },
+    { url = 
"https://files.pythonhosted.org/packages/c2/b6/b9afed2afadddaf5ebb2afa801abf4b0868f42f8539bfe4b071b5266c9fe/websockets-16.0-cp314-cp314t-win32.whl";,
 hash = 
"sha256:5a4b4cc550cb665dd8a47f868c8d04c8230f857363ad3c9caf7a0c3bf8c61ca6", size 
= 178085, upload-time = "2026-01-10T09:23:33.816Z" },
+    { url = 
"https://files.pythonhosted.org/packages/9f/3e/28135a24e384493fa804216b79a6a6759a38cc4ff59118787b9fb693df93/websockets-16.0-cp314-cp314t-win_amd64.whl";,
 hash = 
"sha256:b14dc141ed6d2dde437cddb216004bcac6a1df0935d79656387bd41632ba0bbd", size 
= 178531, upload-time = "2026-01-10T09:23:35.016Z" },
+    { url = 
"https://files.pythonhosted.org/packages/72/07/c98a68571dcf256e74f1f816b8cc5eae6eb2d3d5cfa44d37f801619d9166/websockets-16.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl";,
 hash = 
"sha256:349f83cd6c9a415428ee1005cadb5c2c56f4389bc06a9af16103c3bc3dcc8b7d", size 
= 174947, upload-time = "2026-01-10T09:23:36.166Z" },
+    { url = 
"https://files.pythonhosted.org/packages/7e/52/93e166a81e0305b33fe416338be92ae863563fe7bce446b0f687b9df5aea/websockets-16.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl";,
 hash = 
"sha256:4a1aba3340a8dca8db6eb5a7986157f52eb9e436b74813764241981ca4888f03", size 
= 175260, upload-time = "2026-01-10T09:23:37.409Z" },
+    { url = 
"https://files.pythonhosted.org/packages/56/0c/2dbf513bafd24889d33de2ff0368190a0e69f37bcfa19009ef819fe4d507/websockets-16.0-pp311-pypy311_pp73-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl";,
 hash = 
"sha256:f4a32d1bd841d4bcbffdcb3d2ce50c09c3909fbead375ab28d0181af89fd04da", size 
= 176071, upload-time = "2026-01-10T09:23:39.158Z" },
+    { url = 
"https://files.pythonhosted.org/packages/a5/8f/aea9c71cc92bf9b6cc0f7f70df8f0b420636b6c96ef4feee1e16f80f75dd/websockets-16.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl";,
 hash = 
"sha256:0298d07ee155e2e9fda5be8a9042200dd2e3bb0b8a38482156576f863a9d457c", size 
= 176968, upload-time = "2026-01-10T09:23:41.031Z" },
+    { url = 
"https://files.pythonhosted.org/packages/9a/3f/f70e03f40ffc9a30d817eef7da1be72ee4956ba8d7255c399a01b135902a/websockets-16.0-pp311-pypy311_pp73-win_amd64.whl";,
 hash = 
"sha256:a653aea902e0324b52f1613332ddf50b00c06fdaf7e92624fbf8c77c78fa5767", size 
= 178735, upload-time = "2026-01-10T09:23:42.259Z" },
+    { url = 
"https://files.pythonhosted.org/packages/6f/28/258ebab549c2bf3e64d2b0217b973467394a9cea8c42f70418ca2c5d0d2e/websockets-16.0-py3-none-any.whl";,
 hash = 
"sha256:1637db62fad1dc833276dded54215f2c7fa46912301a24bd94d45d46a011ceec", size 
= 171598, upload-time = "2026-01-10T09:23:45.395Z" },
+]
+
+[[package]]
 name = "widgetsnbextension"
 version = "4.0.15"
 source = { registry = "https://pypi.org/simple"; }

Reply via email to