From 375dafb6c64414d98f6986900dd72bcd10e2771f Mon Sep 17 00:00:00 2001 From: Elior Nataf Lackritz Date: Fri, 11 Sep 2026 15:34:45 -0400 Subject: [PATCH] feat(langgraph): type interrupt() return by response_schema, test dataclass schema --- libs/langgraph/langgraph/types.py | 10 ++++++++++ libs/langgraph/tests/test_interruption.py | 18 +++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/libs/langgraph/langgraph/types.py b/libs/langgraph/langgraph/types.py index 02e745fb7..335f63a8d 100644 --- a/libs/langgraph/langgraph/types.py +++ b/libs/langgraph/langgraph/types.py @@ -14,6 +14,7 @@ from typing import ( NamedTuple, TypeVar, final, + overload, ) from warnings import warn @@ -37,6 +38,7 @@ from langgraph.warnings import LangGraphDeprecatedSinceV10, LangGraphDeprecatedS # when used in standalone type aliases. StateT = TypeVar("StateT") OutputT = TypeVar("OutputT") +ResponseT = TypeVar("ResponseT") if TYPE_CHECKING: from langgraph.pregel.protocol import PregelProtocol @@ -861,6 +863,14 @@ class Command(Generic[N], ToolOutputMixin): PARENT: ClassVar[Literal["__parent__"]] = "__parent__" +@overload +def interrupt(value: Any, *, response_schema: type[ResponseT]) -> ResponseT: ... + + +@overload +def interrupt(value: Any, *, response_schema: dict[str, Any] | None = None) -> Any: ... + + def interrupt( value: Any, *, response_schema: dict[str, Any] | type[Any] | None = None ) -> Any: diff --git a/libs/langgraph/tests/test_interruption.py b/libs/langgraph/tests/test_interruption.py index 2e5e0a280..9578bd00b 100644 --- a/libs/langgraph/tests/test_interruption.py +++ b/libs/langgraph/tests/test_interruption.py @@ -1,3 +1,4 @@ +from dataclasses import dataclass from typing import Any import pytest @@ -105,6 +106,11 @@ class DecisionDict(TypedDict): approved: bool +@dataclass +class DecisionData: + approved: bool + + RAW_SCHEMA = {"type": "object", "properties": {"approved": {"type": "boolean"}}} @@ -124,8 +130,18 @@ RAW_SCHEMA = {"type": "object", "properties": {"approved": {"type": "boolean"}}} }, {"approved": True}, ), + ( + DecisionData, + { + "properties": {"approved": {"title": "Approved", "type": "boolean"}}, + "required": ["approved"], + "title": "DecisionData", + "type": "object", + }, + DecisionData(approved=True), + ), ], - ids=["none", "raw_dict", "pydantic", "typeddict"], + ids=["none", "raw_dict", "pydantic", "typeddict", "dataclass"], ) def test_interrupt_response_schema( sync_checkpointer: BaseCheckpointSaver,