TestSyncAsyncInterop Class — langchain Architecture
Architecture documentation for the TestSyncAsyncInterop class in test_wrap_model_call.py from the langchain codebase.
Entity Profile
Dependency Diagram
graph TD 78211736_7c97_19d0_14c2_d2b492c194dd["TestSyncAsyncInterop"] 949c7cf4_56fe_f3b4_cd89_9631a7e9cb1e["AgentMiddleware"] 78211736_7c97_19d0_14c2_d2b492c194dd -->|extends| 949c7cf4_56fe_f3b4_cd89_9631a7e9cb1e 573473e5_eb93_a7d7_84ba_c975071c09af["test_wrap_model_call.py"] 78211736_7c97_19d0_14c2_d2b492c194dd -->|defined in| 573473e5_eb93_a7d7_84ba_c975071c09af 63b1c906_416a_cecb_4300_aac3c338b4fe["test_sync_invoke_with_only_async_middleware_raises_error()"] 78211736_7c97_19d0_14c2_d2b492c194dd -->|method| 63b1c906_416a_cecb_4300_aac3c338b4fe a19c0a5c_ca2b_3869_ab7a_70d066eca849["test_sync_invoke_with_mixed_middleware()"] 78211736_7c97_19d0_14c2_d2b492c194dd -->|method| a19c0a5c_ca2b_3869_ab7a_70d066eca849
Relationship Graph
Source Code
libs/langchain_v1/tests/unit_tests/agents/middleware/core/test_wrap_model_call.py lines 1466–1532
class TestSyncAsyncInterop:
"""Test sync/async interoperability."""
def test_sync_invoke_with_only_async_middleware_raises_error(self) -> None:
"""Test that sync invoke with only async middleware raises error."""
class AsyncOnlyMiddleware(AgentMiddleware):
async def awrap_model_call(
self,
request: ModelRequest,
handler: Callable[[ModelRequest], Awaitable[ModelResponse]],
) -> ModelCallResult:
return await handler(request)
agent = create_agent(
model=FakeToolCallingModel(),
tools=[],
system_prompt="You are a helpful assistant.",
middleware=[AsyncOnlyMiddleware()],
)
with pytest.raises(NotImplementedError):
agent.invoke({"messages": [HumanMessage("hello")]})
def test_sync_invoke_with_mixed_middleware(self) -> None:
"""Test that sync invoke works with mixed sync/async middleware when sync versions exist."""
calls = []
class MixedMiddleware(AgentMiddleware):
@override
def before_model(self, state: AgentState[Any], runtime: Runtime[Any]) -> None:
calls.append("MixedMiddleware.before_model")
@override
async def abefore_model(self, state: AgentState[Any], runtime: Runtime[Any]) -> None:
calls.append("MixedMiddleware.abefore_model")
def wrap_model_call(
self,
request: ModelRequest,
handler: Callable[[ModelRequest], ModelResponse],
) -> ModelCallResult:
calls.append("MixedMiddleware.wrap_model_call")
return handler(request)
async def awrap_model_call(
self,
request: ModelRequest,
handler: Callable[[ModelRequest], Awaitable[ModelResponse]],
) -> ModelCallResult:
calls.append("MixedMiddleware.awrap_model_call")
return await handler(request)
agent = create_agent(
model=FakeToolCallingModel(),
tools=[],
system_prompt="You are a helpful assistant.",
middleware=[MixedMiddleware()],
)
agent.invoke({"messages": [HumanMessage("hello")]})
# In sync mode, only sync methods should be called
assert calls == [
"MixedMiddleware.before_model",
"MixedMiddleware.wrap_model_call",
]
Extends
Source
Frequently Asked Questions
What is the TestSyncAsyncInterop class?
TestSyncAsyncInterop is a class in the langchain codebase, defined in libs/langchain_v1/tests/unit_tests/agents/middleware/core/test_wrap_model_call.py.
Where is TestSyncAsyncInterop defined?
TestSyncAsyncInterop is defined in libs/langchain_v1/tests/unit_tests/agents/middleware/core/test_wrap_model_call.py at line 1466.
What does TestSyncAsyncInterop extend?
TestSyncAsyncInterop extends AgentMiddleware.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free