diff --git a/libs/core/tests/unit_tests/callbacks/test_sync_callback_manager.py b/libs/core/tests/unit_tests/callbacks/test_sync_callback_manager.py index d8b3aab6001..0cdabea9cc4 100644 --- a/libs/core/tests/unit_tests/callbacks/test_sync_callback_manager.py +++ b/libs/core/tests/unit_tests/callbacks/test_sync_callback_manager.py @@ -1,3 +1,5 @@ +import pytest + from langchain_core.callbacks.base import BaseCallbackHandler, BaseCallbackManager @@ -13,3 +15,29 @@ def test_remove_handler() -> None: manager = BaseCallbackManager([handler1], inheritable_handlers=[handler2]) manager.remove_handler(handler1) manager.remove_handler(handler2) + + +@pytest.mark.xfail( + reason="TODO: #32028 merge() incorrectly mixes handlers and inheritable_handlers" +) +def test_merge_preserves_handler_distinction() -> None: + """Test that merging managers preserves the distinction between handlers. + + This test verifies the correct behavior of the BaseCallbackManager.merge() + method. When two managers are merged, their handlers and + inheritable_handlers should be combined independently. + + Currently, it is expected to xfail until the issue is resolved. + """ + h1 = BaseCallbackHandler() + h2 = BaseCallbackHandler() + ih1 = BaseCallbackHandler() + ih2 = BaseCallbackHandler() + + m1 = BaseCallbackManager(handlers=[h1], inheritable_handlers=[ih1]) + m2 = BaseCallbackManager(handlers=[h2], inheritable_handlers=[ih2]) + + merged = m1.merge(m2) + + assert set(merged.handlers) == {h1, h2} + assert set(merged.inheritable_handlers) == {ih1, ih2} diff --git a/uv.lock b/uv.lock index b6a5e789af1..71a061a6fc1 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 3 requires-python = ">=3.9" resolution-markers = [ "python_full_version >= '3.13' and platform_python_implementation == 'PyPy'", @@ -922,7 +922,6 @@ dependencies = [ { name = "numpy", version = "2.2.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13'" }, { name = "packaging" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/91/1b/6fe5dbe5be0240cfd82b52bd7c186655c578d935c0ce2e713c100e6f8cce/faiss_cpu-1.10.0.tar.gz", hash = "sha256:5bdca555f24bc036f4d67f8a5a4d6cc91b8d2126d4e78de496ca23ccd46e479d", size = 69159, upload-time = "2025-01-31T07:45:49.305Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/8b/56/87eb506d8634f08fc7c63d1ca5631aeec7d6b9afbfabedf2cb7a2a804b13/faiss_cpu-1.10.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:6693474be296a7142ade1051ea18e7d85cedbfdee4b7eac9c52f83fed0467855", size = 7693034, upload-time = "2025-01-31T07:44:31.908Z" }, { url = "https://files.pythonhosted.org/packages/51/46/f4d9de34ed1b06300b1a75b824d4857963216f5826de33f291af78088e39/faiss_cpu-1.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:70ebe60a560414dc8dd6cfe8fed105c8f002c0d11f765f5adfe8d63d42c0467f", size = 3234656, upload-time = "2025-01-31T07:44:34.418Z" }, @@ -2478,7 +2477,7 @@ wheels = [ [[package]] name = "langchain-core" -version = "0.3.75" +version = "0.3.76" source = { editable = "libs/core" } dependencies = [ { name = "jsonpatch" }, @@ -2613,7 +2612,7 @@ dependencies = [ [[package]] name = "langchain-groq" -version = "0.3.7" +version = "0.3.8" source = { editable = "libs/partners/groq" } dependencies = [ { name = "groq" }, @@ -2814,7 +2813,7 @@ typing = [] [[package]] name = "langchain-openai" -version = "0.3.32" +version = "0.3.33" source = { editable = "libs/partners/openai" } dependencies = [ { name = "langchain-core" }, @@ -2825,7 +2824,7 @@ dependencies = [ [package.metadata] requires-dist = [ { name = "langchain-core", editable = "libs/core" }, - { name = "openai", specifier = ">=1.99.9,<2.0.0" }, + { name = "openai", specifier = ">=1.104.2,<2.0.0" }, { name = "tiktoken", specifier = ">=0.7,<1" }, ] @@ -2880,18 +2879,14 @@ wheels = [ [[package]] name = "langchain-text-splitters" -version = "0.3.10" +version = "0.3.11" source = { editable = "libs/text-splitters" } dependencies = [ { name = "langchain-core" }, - { name = "pip" }, ] [package.metadata] -requires-dist = [ - { name = "langchain-core", editable = "libs/core" }, - { name = "pip", specifier = ">=25.2" }, -] +requires-dist = [{ name = "langchain-core", editable = "libs/core" }] [package.metadata.requires-dev] dev = [ @@ -2913,6 +2908,7 @@ test = [ { name = "pytest-xdist", specifier = ">=3.6.1,<4.0.0" }, ] test-integration = [ + { name = "en-core-web-sm", url = "https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.8.0/en_core_web_sm-3.8.0-py3-none-any.whl" }, { name = "nltk", specifier = ">=3.9.1,<4.0.0" }, { name = "sentence-transformers", specifier = ">=3.0.1" }, { name = "spacy", specifier = ">=3.8.7,<4.0.0" }, @@ -2921,9 +2917,10 @@ test-integration = [ { name = "transformers", specifier = ">=4.51.3,<5.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 = ">=1.17.1,<1.18" }, - { name = "tiktoken", specifier = ">=0.8.0,<1.0.0" }, + { name = "tiktoken", specifier = ">=0.11.0,<1.0.0" }, { name = "types-requests", specifier = ">=2.31.0.20240218,<3.0.0.0" }, ] @@ -3971,7 +3968,7 @@ wheels = [ [[package]] name = "openai" -version = "1.99.9" +version = "1.107.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -3983,9 +3980,9 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8a/d2/ef89c6f3f36b13b06e271d3cc984ddd2f62508a0972c1cbcc8485a6644ff/openai-1.99.9.tar.gz", hash = "sha256:f2082d155b1ad22e83247c3de3958eb4255b20ccf4a1de2e6681b6957b554e92", size = 506992, upload-time = "2025-08-12T02:31:10.054Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/e0/a62daa7ff769df969cc1b782852cace79615039630b297005356f5fb46fb/openai-1.107.1.tar.gz", hash = "sha256:7c51b6b8adadfcf5cada08a613423575258b180af5ad4bc2954b36ebc0d3ad48", size = 563671, upload-time = "2025-09-10T15:04:40.288Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/fb/df274ca10698ee77b07bff952f302ea627cc12dac6b85289485dd77db6de/openai-1.99.9-py3-none-any.whl", hash = "sha256:9dbcdb425553bae1ac5d947147bebbd630d91bbfc7788394d4c4f3a35682ab3a", size = 786816, upload-time = "2025-08-12T02:31:08.34Z" }, + { url = "https://files.pythonhosted.org/packages/d4/12/32c19999a58eec4a695e8ce334442b6135df949f0bb61b2ceaa4fa60d3a9/openai-1.107.1-py3-none-any.whl", hash = "sha256:168f9885b1b70d13ada0868a0d0adfd538c16a02f7fd9fe063851a2c9a025e72", size = 945177, upload-time = "2025-09-10T15:04:37.782Z" }, ] [[package]] @@ -4438,15 +4435,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/41/67/936f9814bdd74b2dfd4822f1f7725ab5d8ff4103919a1664eb4874c58b2f/pillow-11.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4637b88343166249fe8aa94e7c4a62a180c4b3898283bb5d3d2fd5fe10d8e4e0", size = 2626353, upload-time = "2025-01-02T08:13:52.725Z" }, ] -[[package]] -name = "pip" -version = "25.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/16/650289cd3f43d5a2fadfd98c68bd1e1e7f2550a1a5326768cddfbcedb2c5/pip-25.2.tar.gz", hash = "sha256:578283f006390f85bb6282dffb876454593d637f5d1be494b5202ce4877e71f2", size = 1840021, upload-time = "2025-07-30T21:50:15.401Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/3f/945ef7ab14dc4f9d7f40288d2df998d1837ee0888ec3659c813487572faa/pip-25.2-py3-none-any.whl", hash = "sha256:6d67a2b4e7f14d8b31b8b52648866fa717f45a1eb70e83002f4331d07e953717", size = 1752557, upload-time = "2025-07-30T21:50:13.323Z" }, -] - [[package]] name = "platformdirs" version = "4.3.6"