mirror of
https://github.com/langchain-ai/langgraph.git
synced 2026-09-29 04:55:09 +02:00
raise on update input
This commit is contained in:
@@ -637,6 +637,14 @@ class PregelLoop:
|
||||
|
||||
# map command to writes
|
||||
if isinstance(self.input, Command):
|
||||
if self.input.resume is not None and self.input.update:
|
||||
raise ValueError(
|
||||
"Command(resume=..., update=...) is not allowed as graph input. "
|
||||
"Use Command(resume=...) to resume execution, or use "
|
||||
"graph.update_state(...) to update state before resuming. "
|
||||
"Note: Command(update=...) can still be used as a return "
|
||||
"value from a node to update graph state."
|
||||
)
|
||||
if (resume := self.input.resume) is not None:
|
||||
if not self.checkpointer:
|
||||
raise RuntimeError(
|
||||
|
||||
@@ -5850,6 +5850,30 @@ def test_task_before_interrupt_resume(
|
||||
assert result == {"answers": ["answer1", "answer2"]}
|
||||
|
||||
|
||||
def test_command_resume_with_update_raises(
|
||||
sync_checkpointer: BaseCheckpointSaver,
|
||||
) -> None:
|
||||
"""Test that Command(resume=..., update=...) raises InvalidUpdateError
|
||||
when used as graph input."""
|
||||
|
||||
@entrypoint(checkpointer=sync_checkpointer)
|
||||
def workflow(inputs: str) -> str:
|
||||
answer = interrupt("question")
|
||||
return answer
|
||||
|
||||
config = {"configurable": {"thread_id": "1"}}
|
||||
|
||||
# First invocation triggers interrupt
|
||||
result = workflow.invoke("start", config=config)
|
||||
assert "__interrupt__" in result
|
||||
|
||||
# Resuming with both resume and update should raise
|
||||
with pytest.raises(ValueError, match="Command\\(resume=.*update="):
|
||||
workflow.invoke(
|
||||
Command(resume="answer", update={"foo": "bar"}), config=config
|
||||
)
|
||||
|
||||
|
||||
def test_multiple_tasks_before_interrupt_resume(
|
||||
sync_checkpointer: BaseCheckpointSaver,
|
||||
) -> None:
|
||||
|
||||
Reference in New Issue
Block a user