feat(api): add node_title to HumanInputFormFilled events

This commit is contained in:
QuantumGhost 2026-01-06 16:48:31 +08:00
parent fb01b91b06
commit 24362ce59e
10 changed files with 11 additions and 0 deletions

View File

@ -329,6 +329,7 @@ class WorkflowResponseConverter:
workflow_run_id=run_id,
data=HumanInputFormFilledResponse.Data(
node_id=event.node_id,
node_title=event.node_title,
rendered_content=event.rendered_content,
action_id=event.action_id,
action_text=event.action_text,

View File

@ -388,6 +388,7 @@ class WorkflowBasedAppRunner:
node_execution_id=event.id,
node_id=event.node_id,
node_type=event.node_type,
node_title=event.node_title,
rendered_content=event.rendered_content,
action_id=event.action_id,
action_text=event.action_text,

View File

@ -502,6 +502,7 @@ class QueueHumanInputFormFilledEvent(AppQueueEvent):
node_execution_id: str
node_id: str
node_type: NodeType
node_title: str
rendered_content: str
action_id: str
action_text: str

View File

@ -292,6 +292,7 @@ class HumanInputFormFilledResponse(StreamResponse):
"""
node_id: str
node_title: str
rendered_content: str
action_id: str
action_text: str

View File

@ -58,6 +58,7 @@ class NodeRunRetryEvent(NodeRunStartedEvent):
class NodeRunHumanInputFormFilledEvent(GraphNodeEventBase):
"""Emitted when a HumanInput form is submitted and before the node finishes."""
node_title: str = Field(..., description="HumanInput node title")
rendered_content: str = Field(..., description="Markdown content rendered with user inputs.")
action_id: str = Field(..., description="User action identifier chosen in the form.")
action_text: str = Field(..., description="Display text of the chosen action button.")

View File

@ -52,6 +52,7 @@ class PauseRequestedEvent(NodeEventBase):
class HumanInputFormFilledEvent(NodeEventBase):
"""Event emitted when a human input form is submitted."""
node_title: str
rendered_content: str
action_id: str
action_text: str

View File

@ -643,6 +643,7 @@ class Node(Generic[NodeDataT]):
id=self.execution_id,
node_id=self._node_id,
node_type=self.node_type,
node_title=event.node_title,
rendered_content=event.rendered_content,
action_id=event.action_id,
action_text=event.action_text,

View File

@ -246,6 +246,7 @@ class HumanInputNode(Node[HumanInputNodeData]):
action_text = self._node_data.find_action_text(selected_action_id)
yield HumanInputFormFilledEvent(
node_title=self._node_data.title,
rendered_content=rendered_content,
action_id=selected_action_id,
action_text=action_text,

View File

@ -46,6 +46,7 @@ def test_human_input_form_filled_stream_response_contains_rendered_content():
node_execution_id="exec-1",
node_id="node-1",
node_type="human-input",
node_title="Human Input",
rendered_content="# Title\nvalue",
action_id="Approve",
action_text="Approve",
@ -55,5 +56,6 @@ def test_human_input_form_filled_stream_response_contains_rendered_content():
assert resp.workflow_run_id == "run-1"
assert resp.data.node_id == "node-1"
assert resp.data.node_title == "Human Input"
assert resp.data.rendered_content.startswith("# Title")
assert resp.data.action_id == "Approve"

View File

@ -95,6 +95,7 @@ def test_human_input_node_emits_form_filled_event_before_succeeded():
assert isinstance(events[1], NodeRunHumanInputFormFilledEvent)
filled_event = events[1]
assert filled_event.node_title == "Human Input"
assert filled_event.rendered_content.endswith("Alice")
assert filled_event.action_id == "Accept"
assert filled_event.action_text == "Approve"