Feat/Add API Trigger and Webhooks in Agent Builder (#83)

* feat: add api trigger node for agent runs

* feat: add webhook node

* Execute webhook nodes post workflow run

* Add hint to go to API keys
This commit is contained in:
Abhishek 2025-12-22 14:08:30 +05:30 committed by GitHub
parent 4ddb144dd0
commit 55b727a872
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
37 changed files with 3667 additions and 494 deletions

View file

@ -9,6 +9,8 @@ class NodeType(str, Enum):
endNode = "endCall"
agentNode = "agentNode"
globalNode = "globalNode"
trigger = "trigger"
webhook = "webhook"
class Position(BaseModel):
@ -28,9 +30,20 @@ class ExtractionVariableDTO(BaseModel):
prompt: Optional[str] = None
class CustomHeaderDTO(BaseModel):
key: str
value: str
class RetryConfigDTO(BaseModel):
enabled: bool = False
max_retries: int = 3
retry_delay_seconds: int = 5
class NodeDataDTO(BaseModel):
name: str = Field(..., min_length=1)
prompt: str = Field(..., min_length=1)
prompt: Optional[str] = Field(default=None)
is_static: bool = False
is_start: bool = False
is_end: bool = False
@ -44,6 +57,15 @@ class NodeDataDTO(BaseModel):
detect_voicemail: bool = True
delayed_start: bool = False
delayed_start_duration: Optional[float] = None
trigger_path: Optional[str] = None
# Webhook node specific fields
enabled: bool = True
http_method: Optional[str] = None
endpoint_url: Optional[str] = None
credential_uuid: Optional[str] = None
custom_headers: Optional[list[CustomHeaderDTO]] = None
payload_template: Optional[dict] = None
retry_config: Optional[RetryConfigDTO] = None
class RFNodeDTO(BaseModel):
@ -52,6 +74,14 @@ class RFNodeDTO(BaseModel):
position: Position
data: NodeDataDTO
@model_validator(mode="after")
def _validate_prompt_required(self):
"""Require prompt for all node types except trigger and webhook."""
if self.type not in (NodeType.trigger, NodeType.webhook):
if not self.data.prompt or len(self.data.prompt.strip()) == 0:
raise ValueError("Prompt is required for non-trigger nodes")
return self
class EdgeDataDTO(BaseModel):
label: str = Field(..., min_length=1)