feat(trigger): implement trigger debugging functionality

- Added DraftWorkflowTriggerNodeApi and DraftWorkflowTriggerRunApi for debugging trigger nodes and workflows.
- Enhanced TriggerDebugService to manage trigger debugging sessions and event listening.
- Introduced structured event responses for trigger debugging, including listening started, received, node finished, and workflow started events.
- Updated Queue and Stream entities to support new trigger debug events.
- Refactored trigger input handling to streamline the process of creating inputs from trigger data.

This implementation improves the debugging capabilities for trigger nodes and workflows, providing clearer event handling and structured responses.
This commit is contained in:
Harry
2025-09-11 14:09:02 +08:00
parent e9e843b27d
commit 1562d00037
10 changed files with 561 additions and 75 deletions

View File

@ -51,6 +51,12 @@ class QueueEvent(StrEnum):
PING = "ping"
STOP = "stop"
RETRY = "retry"
# Trigger debug events
TRIGGER_DEBUG_LISTENING_STARTED = "trigger_debug_listening_started"
TRIGGER_DEBUG_RECEIVED = "trigger_debug_received"
TRIGGER_DEBUG_NODE_FINISHED = "trigger_debug_node_finished"
TRIGGER_DEBUG_WORKFLOW_STARTED = "trigger_debug_workflow_started"
TRIGGER_DEBUG_TIMEOUT = "trigger_debug_timeout"
class AppQueueEvent(BaseModel):
@ -718,6 +724,65 @@ class QueueParallelBranchRunSucceededEvent(AppQueueEvent):
"""loop id if node is in loop"""
class QueueTriggerDebugListeningStartedEvent(AppQueueEvent):
"""
QueueTriggerDebugListeningStartedEvent entity
"""
event: QueueEvent = QueueEvent.TRIGGER_DEBUG_LISTENING_STARTED
session_id: str
webhook_url: str
timeout: int
class QueueTriggerDebugReceivedEvent(AppQueueEvent):
"""
QueueTriggerDebugReceivedEvent entity
"""
event: QueueEvent = QueueEvent.TRIGGER_DEBUG_RECEIVED
subscription_id: str
triggers: list[str]
request_id: str
timestamp: float
class QueueTriggerDebugNodeFinishedEvent(AppQueueEvent):
"""
QueueTriggerDebugNodeFinishedEvent entity
"""
event: QueueEvent = QueueEvent.TRIGGER_DEBUG_NODE_FINISHED
id: str
node_id: str
node_type: str
status: str
outputs: Optional[Mapping[str, Any]] = None
error: Optional[str] = None
elapsed_time: Optional[float] = None
execution_metadata: Optional[Mapping[str, Any]] = None
class QueueTriggerDebugWorkflowStartedEvent(AppQueueEvent):
"""
QueueTriggerDebugWorkflowStartedEvent entity
"""
event: QueueEvent = QueueEvent.TRIGGER_DEBUG_WORKFLOW_STARTED
subscription_id: str
triggers: list[str]
request_id: str
class QueueTriggerDebugTimeoutEvent(AppQueueEvent):
"""
QueueTriggerDebugTimeoutEvent entity
"""
event: QueueEvent = QueueEvent.TRIGGER_DEBUG_TIMEOUT
error: str = "Timeout waiting for trigger"
class QueueParallelBranchRunFailedEvent(AppQueueEvent):
"""
QueueParallelBranchRunFailedEvent entity

View File

@ -82,6 +82,12 @@ class StreamEvent(Enum):
TEXT_CHUNK = "text_chunk"
TEXT_REPLACE = "text_replace"
AGENT_LOG = "agent_log"
# Trigger debug events
TRIGGER_DEBUG_LISTENING_STARTED = "trigger_debug_listening_started"
TRIGGER_DEBUG_RECEIVED = "trigger_debug_received"
TRIGGER_DEBUG_NODE_FINISHED = "trigger_debug_node_finished"
TRIGGER_DEBUG_WORKFLOW_STARTED = "trigger_debug_workflow_started"
TRIGGER_DEBUG_TIMEOUT = "trigger_debug_timeout"
class StreamResponse(BaseModel):
@ -837,3 +843,63 @@ class AgentLogStreamResponse(StreamResponse):
event: StreamEvent = StreamEvent.AGENT_LOG
data: Data
# Trigger Debug Stream Responses
class TriggerDebugListeningStartedResponse(StreamResponse):
"""
TriggerDebugListeningStartedResponse entity
"""
event: StreamEvent = StreamEvent.TRIGGER_DEBUG_LISTENING_STARTED
session_id: str
webhook_url: str
timeout: int
class TriggerDebugReceivedResponse(StreamResponse):
"""
TriggerDebugReceivedResponse entity
"""
event: StreamEvent = StreamEvent.TRIGGER_DEBUG_RECEIVED
subscription_id: str
triggers: list[str]
request_id: str
timestamp: float
class TriggerDebugNodeFinishedResponse(StreamResponse):
"""
TriggerDebugNodeFinishedResponse entity
"""
event: StreamEvent = StreamEvent.TRIGGER_DEBUG_NODE_FINISHED
id: str
node_id: str
node_type: str
status: str
outputs: Optional[Mapping[str, Any]] = None
error: Optional[str] = None
elapsed_time: float
execution_metadata: Optional[Mapping[str, Any]] = None
class TriggerDebugWorkflowStartedResponse(StreamResponse):
"""
TriggerDebugWorkflowStartedResponse entity
"""
event: StreamEvent = StreamEvent.TRIGGER_DEBUG_WORKFLOW_STARTED
subscription_id: str
triggers: list[str]
request_id: str
class TriggerDebugTimeoutResponse(StreamResponse):
"""
TriggerDebugTimeoutResponse entity
"""
event: StreamEvent = StreamEvent.TRIGGER_DEBUG_TIMEOUT
error: str = "Timeout waiting for trigger"