mirror of
https://github.com/hwchase17/langchain.git
synced 2025-09-12 12:59:07 +00:00
test: Add failing test for BaseCallbackManager.merge
(#32040)
This pull request introduces a failing unit test to reproduce the bug reported in issue #32028. The test asserts the expected behavior: `BaseCallbackManager.merge()` should combine `handlers` and `inheritable_handlers` independently, without mixing them. This test will fail on the current codebase and is intended to guide the fix and prevent future regressions. --------- Co-authored-by: Eugene Yurtsev <eyurtsev@gmail.com> Co-authored-by: Mason Daugherty <mason@langchain.dev>
This commit is contained in:
@@ -1,3 +1,5 @@
|
|||||||
|
import pytest
|
||||||
|
|
||||||
from langchain_core.callbacks.base import BaseCallbackHandler, BaseCallbackManager
|
from langchain_core.callbacks.base import BaseCallbackHandler, BaseCallbackManager
|
||||||
|
|
||||||
|
|
||||||
@@ -13,3 +15,29 @@ def test_remove_handler() -> None:
|
|||||||
manager = BaseCallbackManager([handler1], inheritable_handlers=[handler2])
|
manager = BaseCallbackManager([handler1], inheritable_handlers=[handler2])
|
||||||
manager.remove_handler(handler1)
|
manager.remove_handler(handler1)
|
||||||
manager.remove_handler(handler2)
|
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}
|
||||||
|
38
uv.lock
generated
38
uv.lock
generated
@@ -1,5 +1,5 @@
|
|||||||
version = 1
|
version = 1
|
||||||
revision = 2
|
revision = 3
|
||||||
requires-python = ">=3.9"
|
requires-python = ">=3.9"
|
||||||
resolution-markers = [
|
resolution-markers = [
|
||||||
"python_full_version >= '3.13' and platform_python_implementation == 'PyPy'",
|
"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 = "numpy", version = "2.2.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13'" },
|
||||||
{ name = "packaging" },
|
{ 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 = [
|
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/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" },
|
{ 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]]
|
[[package]]
|
||||||
name = "langchain-core"
|
name = "langchain-core"
|
||||||
version = "0.3.75"
|
version = "0.3.76"
|
||||||
source = { editable = "libs/core" }
|
source = { editable = "libs/core" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "jsonpatch" },
|
{ name = "jsonpatch" },
|
||||||
@@ -2613,7 +2612,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "langchain-groq"
|
name = "langchain-groq"
|
||||||
version = "0.3.7"
|
version = "0.3.8"
|
||||||
source = { editable = "libs/partners/groq" }
|
source = { editable = "libs/partners/groq" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "groq" },
|
{ name = "groq" },
|
||||||
@@ -2814,7 +2813,7 @@ typing = []
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "langchain-openai"
|
name = "langchain-openai"
|
||||||
version = "0.3.32"
|
version = "0.3.33"
|
||||||
source = { editable = "libs/partners/openai" }
|
source = { editable = "libs/partners/openai" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "langchain-core" },
|
{ name = "langchain-core" },
|
||||||
@@ -2825,7 +2824,7 @@ dependencies = [
|
|||||||
[package.metadata]
|
[package.metadata]
|
||||||
requires-dist = [
|
requires-dist = [
|
||||||
{ name = "langchain-core", editable = "libs/core" },
|
{ 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" },
|
{ name = "tiktoken", specifier = ">=0.7,<1" },
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -2880,18 +2879,14 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "langchain-text-splitters"
|
name = "langchain-text-splitters"
|
||||||
version = "0.3.10"
|
version = "0.3.11"
|
||||||
source = { editable = "libs/text-splitters" }
|
source = { editable = "libs/text-splitters" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "langchain-core" },
|
{ name = "langchain-core" },
|
||||||
{ name = "pip" },
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.metadata]
|
[package.metadata]
|
||||||
requires-dist = [
|
requires-dist = [{ name = "langchain-core", editable = "libs/core" }]
|
||||||
{ name = "langchain-core", editable = "libs/core" },
|
|
||||||
{ name = "pip", specifier = ">=25.2" },
|
|
||||||
]
|
|
||||||
|
|
||||||
[package.metadata.requires-dev]
|
[package.metadata.requires-dev]
|
||||||
dev = [
|
dev = [
|
||||||
@@ -2913,6 +2908,7 @@ test = [
|
|||||||
{ name = "pytest-xdist", specifier = ">=3.6.1,<4.0.0" },
|
{ name = "pytest-xdist", specifier = ">=3.6.1,<4.0.0" },
|
||||||
]
|
]
|
||||||
test-integration = [
|
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 = "nltk", specifier = ">=3.9.1,<4.0.0" },
|
||||||
{ name = "sentence-transformers", specifier = ">=3.0.1" },
|
{ name = "sentence-transformers", specifier = ">=3.0.1" },
|
||||||
{ name = "spacy", specifier = ">=3.8.7,<4.0.0" },
|
{ name = "spacy", specifier = ">=3.8.7,<4.0.0" },
|
||||||
@@ -2921,9 +2917,10 @@ test-integration = [
|
|||||||
{ name = "transformers", specifier = ">=4.51.3,<5.0.0" },
|
{ name = "transformers", specifier = ">=4.51.3,<5.0.0" },
|
||||||
]
|
]
|
||||||
typing = [
|
typing = [
|
||||||
|
{ name = "beautifulsoup4", specifier = ">=4.13.5,<5.0.0" },
|
||||||
{ name = "lxml-stubs", specifier = ">=0.5.1,<1.0.0" },
|
{ name = "lxml-stubs", specifier = ">=0.5.1,<1.0.0" },
|
||||||
{ name = "mypy", specifier = ">=1.17.1,<1.18" },
|
{ 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" },
|
{ name = "types-requests", specifier = ">=2.31.0.20240218,<3.0.0.0" },
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -3971,7 +3968,7 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "openai"
|
name = "openai"
|
||||||
version = "1.99.9"
|
version = "1.107.1"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "anyio" },
|
{ name = "anyio" },
|
||||||
@@ -3983,9 +3980,9 @@ dependencies = [
|
|||||||
{ name = "tqdm" },
|
{ name = "tqdm" },
|
||||||
{ name = "typing-extensions" },
|
{ 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 = [
|
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]]
|
[[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" },
|
{ 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]]
|
[[package]]
|
||||||
name = "platformdirs"
|
name = "platformdirs"
|
||||||
version = "4.3.6"
|
version = "4.3.6"
|
||||||
|
Reference in New Issue
Block a user