curl --request POST \
--url http://localhost:5173/api/flowdrop/agentspec/flows/validate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"component_type": "flow",
"name": "document_processing",
"start_node": "start",
"nodes": [
{
"component_type": "start_node",
"name": "process_input",
"description": "<string>",
"inputs": [
{
"title": "user_query",
"type": "string",
"description": "<string>",
"default": "<unknown>",
"enum": [
"<unknown>"
],
"items": "<unknown>",
"properties": {},
"required": [
"<string>"
]
}
],
"outputs": [
{
"title": "user_query",
"type": "string",
"description": "<string>",
"default": "<unknown>",
"enum": [
"<unknown>"
],
"items": "<unknown>",
"properties": {},
"required": [
"<string>"
]
}
],
"metadata": {}
}
],
"control_flow_connections": [
{
"name": "start_to_process",
"from_node": "start",
"to_node": "process_input",
"from_branch": "high_priority"
}
],
"description": "<string>",
"data_flow_connections": [
{
"name": "query_to_llm",
"source_node": "process_input",
"source_output": "processed_text",
"destination_node": "llm_generate",
"destination_input": "prompt"
}
],
"metadata": {}
}
'import requests
url = "http://localhost:5173/api/flowdrop/agentspec/flows/validate"
payload = {
"component_type": "flow",
"name": "document_processing",
"start_node": "start",
"nodes": [
{
"component_type": "start_node",
"name": "process_input",
"description": "<string>",
"inputs": [
{
"title": "user_query",
"type": "string",
"description": "<string>",
"default": "<unknown>",
"enum": ["<unknown>"],
"items": "<unknown>",
"properties": {},
"required": ["<string>"]
}
],
"outputs": [
{
"title": "user_query",
"type": "string",
"description": "<string>",
"default": "<unknown>",
"enum": ["<unknown>"],
"items": "<unknown>",
"properties": {},
"required": ["<string>"]
}
],
"metadata": {}
}
],
"control_flow_connections": [
{
"name": "start_to_process",
"from_node": "start",
"to_node": "process_input",
"from_branch": "high_priority"
}
],
"description": "<string>",
"data_flow_connections": [
{
"name": "query_to_llm",
"source_node": "process_input",
"source_output": "processed_text",
"destination_node": "llm_generate",
"destination_input": "prompt"
}
],
"metadata": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
component_type: 'flow',
name: 'document_processing',
start_node: 'start',
nodes: [
{
component_type: 'start_node',
name: 'process_input',
description: '<string>',
inputs: [
{
title: 'user_query',
type: 'string',
description: '<string>',
default: '<unknown>',
enum: ['<unknown>'],
items: '<unknown>',
properties: {},
required: ['<string>']
}
],
outputs: [
{
title: 'user_query',
type: 'string',
description: '<string>',
default: '<unknown>',
enum: ['<unknown>'],
items: '<unknown>',
properties: {},
required: ['<string>']
}
],
metadata: {}
}
],
control_flow_connections: [
{
name: 'start_to_process',
from_node: 'start',
to_node: 'process_input',
from_branch: 'high_priority'
}
],
description: '<string>',
data_flow_connections: [
{
name: 'query_to_llm',
source_node: 'process_input',
source_output: 'processed_text',
destination_node: 'llm_generate',
destination_input: 'prompt'
}
],
metadata: {}
})
};
fetch('http://localhost:5173/api/flowdrop/agentspec/flows/validate', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "5173",
CURLOPT_URL => "http://localhost:5173/api/flowdrop/agentspec/flows/validate",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'component_type' => 'flow',
'name' => 'document_processing',
'start_node' => 'start',
'nodes' => [
[
'component_type' => 'start_node',
'name' => 'process_input',
'description' => '<string>',
'inputs' => [
[
'title' => 'user_query',
'type' => 'string',
'description' => '<string>',
'default' => '<unknown>',
'enum' => [
'<unknown>'
],
'items' => '<unknown>',
'properties' => [
],
'required' => [
'<string>'
]
]
],
'outputs' => [
[
'title' => 'user_query',
'type' => 'string',
'description' => '<string>',
'default' => '<unknown>',
'enum' => [
'<unknown>'
],
'items' => '<unknown>',
'properties' => [
],
'required' => [
'<string>'
]
]
],
'metadata' => [
]
]
],
'control_flow_connections' => [
[
'name' => 'start_to_process',
'from_node' => 'start',
'to_node' => 'process_input',
'from_branch' => 'high_priority'
]
],
'description' => '<string>',
'data_flow_connections' => [
[
'name' => 'query_to_llm',
'source_node' => 'process_input',
'source_output' => 'processed_text',
'destination_node' => 'llm_generate',
'destination_input' => 'prompt'
]
],
'metadata' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "http://localhost:5173/api/flowdrop/agentspec/flows/validate"
payload := strings.NewReader("{\n \"component_type\": \"flow\",\n \"name\": \"document_processing\",\n \"start_node\": \"start\",\n \"nodes\": [\n {\n \"component_type\": \"start_node\",\n \"name\": \"process_input\",\n \"description\": \"<string>\",\n \"inputs\": [\n {\n \"title\": \"user_query\",\n \"type\": \"string\",\n \"description\": \"<string>\",\n \"default\": \"<unknown>\",\n \"enum\": [\n \"<unknown>\"\n ],\n \"items\": \"<unknown>\",\n \"properties\": {},\n \"required\": [\n \"<string>\"\n ]\n }\n ],\n \"outputs\": [\n {\n \"title\": \"user_query\",\n \"type\": \"string\",\n \"description\": \"<string>\",\n \"default\": \"<unknown>\",\n \"enum\": [\n \"<unknown>\"\n ],\n \"items\": \"<unknown>\",\n \"properties\": {},\n \"required\": [\n \"<string>\"\n ]\n }\n ],\n \"metadata\": {}\n }\n ],\n \"control_flow_connections\": [\n {\n \"name\": \"start_to_process\",\n \"from_node\": \"start\",\n \"to_node\": \"process_input\",\n \"from_branch\": \"high_priority\"\n }\n ],\n \"description\": \"<string>\",\n \"data_flow_connections\": [\n {\n \"name\": \"query_to_llm\",\n \"source_node\": \"process_input\",\n \"source_output\": \"processed_text\",\n \"destination_node\": \"llm_generate\",\n \"destination_input\": \"prompt\"\n }\n ],\n \"metadata\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("http://localhost:5173/api/flowdrop/agentspec/flows/validate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"component_type\": \"flow\",\n \"name\": \"document_processing\",\n \"start_node\": \"start\",\n \"nodes\": [\n {\n \"component_type\": \"start_node\",\n \"name\": \"process_input\",\n \"description\": \"<string>\",\n \"inputs\": [\n {\n \"title\": \"user_query\",\n \"type\": \"string\",\n \"description\": \"<string>\",\n \"default\": \"<unknown>\",\n \"enum\": [\n \"<unknown>\"\n ],\n \"items\": \"<unknown>\",\n \"properties\": {},\n \"required\": [\n \"<string>\"\n ]\n }\n ],\n \"outputs\": [\n {\n \"title\": \"user_query\",\n \"type\": \"string\",\n \"description\": \"<string>\",\n \"default\": \"<unknown>\",\n \"enum\": [\n \"<unknown>\"\n ],\n \"items\": \"<unknown>\",\n \"properties\": {},\n \"required\": [\n \"<string>\"\n ]\n }\n ],\n \"metadata\": {}\n }\n ],\n \"control_flow_connections\": [\n {\n \"name\": \"start_to_process\",\n \"from_node\": \"start\",\n \"to_node\": \"process_input\",\n \"from_branch\": \"high_priority\"\n }\n ],\n \"description\": \"<string>\",\n \"data_flow_connections\": [\n {\n \"name\": \"query_to_llm\",\n \"source_node\": \"process_input\",\n \"source_output\": \"processed_text\",\n \"destination_node\": \"llm_generate\",\n \"destination_input\": \"prompt\"\n }\n ],\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:5173/api/flowdrop/agentspec/flows/validate")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"component_type\": \"flow\",\n \"name\": \"document_processing\",\n \"start_node\": \"start\",\n \"nodes\": [\n {\n \"component_type\": \"start_node\",\n \"name\": \"process_input\",\n \"description\": \"<string>\",\n \"inputs\": [\n {\n \"title\": \"user_query\",\n \"type\": \"string\",\n \"description\": \"<string>\",\n \"default\": \"<unknown>\",\n \"enum\": [\n \"<unknown>\"\n ],\n \"items\": \"<unknown>\",\n \"properties\": {},\n \"required\": [\n \"<string>\"\n ]\n }\n ],\n \"outputs\": [\n {\n \"title\": \"user_query\",\n \"type\": \"string\",\n \"description\": \"<string>\",\n \"default\": \"<unknown>\",\n \"enum\": [\n \"<unknown>\"\n ],\n \"items\": \"<unknown>\",\n \"properties\": {},\n \"required\": [\n \"<string>\"\n ]\n }\n ],\n \"metadata\": {}\n }\n ],\n \"control_flow_connections\": [\n {\n \"name\": \"start_to_process\",\n \"from_node\": \"start\",\n \"to_node\": \"process_input\",\n \"from_branch\": \"high_priority\"\n }\n ],\n \"description\": \"<string>\",\n \"data_flow_connections\": [\n {\n \"name\": \"query_to_llm\",\n \"source_node\": \"process_input\",\n \"source_output\": \"processed_text\",\n \"destination_node\": \"llm_generate\",\n \"destination_input\": \"prompt\"\n }\n ],\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"valid": true,
"errors": [
"<string>"
]
}{
"success": false,
"error": "Invalid request parameters",
"code": "VALIDATION_ERROR",
"details": {
"field": "name",
"message": "Name is required"
}
}{
"success": false,
"error": "Internal server error",
"code": "INTERNAL_ERROR"
}Validate Agent Spec flow on runtime
Validate an Agent Spec flow specification against the runtime without executing it. Checks for structural correctness, valid node references, and property compatibility.
curl --request POST \
--url http://localhost:5173/api/flowdrop/agentspec/flows/validate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"component_type": "flow",
"name": "document_processing",
"start_node": "start",
"nodes": [
{
"component_type": "start_node",
"name": "process_input",
"description": "<string>",
"inputs": [
{
"title": "user_query",
"type": "string",
"description": "<string>",
"default": "<unknown>",
"enum": [
"<unknown>"
],
"items": "<unknown>",
"properties": {},
"required": [
"<string>"
]
}
],
"outputs": [
{
"title": "user_query",
"type": "string",
"description": "<string>",
"default": "<unknown>",
"enum": [
"<unknown>"
],
"items": "<unknown>",
"properties": {},
"required": [
"<string>"
]
}
],
"metadata": {}
}
],
"control_flow_connections": [
{
"name": "start_to_process",
"from_node": "start",
"to_node": "process_input",
"from_branch": "high_priority"
}
],
"description": "<string>",
"data_flow_connections": [
{
"name": "query_to_llm",
"source_node": "process_input",
"source_output": "processed_text",
"destination_node": "llm_generate",
"destination_input": "prompt"
}
],
"metadata": {}
}
'import requests
url = "http://localhost:5173/api/flowdrop/agentspec/flows/validate"
payload = {
"component_type": "flow",
"name": "document_processing",
"start_node": "start",
"nodes": [
{
"component_type": "start_node",
"name": "process_input",
"description": "<string>",
"inputs": [
{
"title": "user_query",
"type": "string",
"description": "<string>",
"default": "<unknown>",
"enum": ["<unknown>"],
"items": "<unknown>",
"properties": {},
"required": ["<string>"]
}
],
"outputs": [
{
"title": "user_query",
"type": "string",
"description": "<string>",
"default": "<unknown>",
"enum": ["<unknown>"],
"items": "<unknown>",
"properties": {},
"required": ["<string>"]
}
],
"metadata": {}
}
],
"control_flow_connections": [
{
"name": "start_to_process",
"from_node": "start",
"to_node": "process_input",
"from_branch": "high_priority"
}
],
"description": "<string>",
"data_flow_connections": [
{
"name": "query_to_llm",
"source_node": "process_input",
"source_output": "processed_text",
"destination_node": "llm_generate",
"destination_input": "prompt"
}
],
"metadata": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
component_type: 'flow',
name: 'document_processing',
start_node: 'start',
nodes: [
{
component_type: 'start_node',
name: 'process_input',
description: '<string>',
inputs: [
{
title: 'user_query',
type: 'string',
description: '<string>',
default: '<unknown>',
enum: ['<unknown>'],
items: '<unknown>',
properties: {},
required: ['<string>']
}
],
outputs: [
{
title: 'user_query',
type: 'string',
description: '<string>',
default: '<unknown>',
enum: ['<unknown>'],
items: '<unknown>',
properties: {},
required: ['<string>']
}
],
metadata: {}
}
],
control_flow_connections: [
{
name: 'start_to_process',
from_node: 'start',
to_node: 'process_input',
from_branch: 'high_priority'
}
],
description: '<string>',
data_flow_connections: [
{
name: 'query_to_llm',
source_node: 'process_input',
source_output: 'processed_text',
destination_node: 'llm_generate',
destination_input: 'prompt'
}
],
metadata: {}
})
};
fetch('http://localhost:5173/api/flowdrop/agentspec/flows/validate', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "5173",
CURLOPT_URL => "http://localhost:5173/api/flowdrop/agentspec/flows/validate",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'component_type' => 'flow',
'name' => 'document_processing',
'start_node' => 'start',
'nodes' => [
[
'component_type' => 'start_node',
'name' => 'process_input',
'description' => '<string>',
'inputs' => [
[
'title' => 'user_query',
'type' => 'string',
'description' => '<string>',
'default' => '<unknown>',
'enum' => [
'<unknown>'
],
'items' => '<unknown>',
'properties' => [
],
'required' => [
'<string>'
]
]
],
'outputs' => [
[
'title' => 'user_query',
'type' => 'string',
'description' => '<string>',
'default' => '<unknown>',
'enum' => [
'<unknown>'
],
'items' => '<unknown>',
'properties' => [
],
'required' => [
'<string>'
]
]
],
'metadata' => [
]
]
],
'control_flow_connections' => [
[
'name' => 'start_to_process',
'from_node' => 'start',
'to_node' => 'process_input',
'from_branch' => 'high_priority'
]
],
'description' => '<string>',
'data_flow_connections' => [
[
'name' => 'query_to_llm',
'source_node' => 'process_input',
'source_output' => 'processed_text',
'destination_node' => 'llm_generate',
'destination_input' => 'prompt'
]
],
'metadata' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "http://localhost:5173/api/flowdrop/agentspec/flows/validate"
payload := strings.NewReader("{\n \"component_type\": \"flow\",\n \"name\": \"document_processing\",\n \"start_node\": \"start\",\n \"nodes\": [\n {\n \"component_type\": \"start_node\",\n \"name\": \"process_input\",\n \"description\": \"<string>\",\n \"inputs\": [\n {\n \"title\": \"user_query\",\n \"type\": \"string\",\n \"description\": \"<string>\",\n \"default\": \"<unknown>\",\n \"enum\": [\n \"<unknown>\"\n ],\n \"items\": \"<unknown>\",\n \"properties\": {},\n \"required\": [\n \"<string>\"\n ]\n }\n ],\n \"outputs\": [\n {\n \"title\": \"user_query\",\n \"type\": \"string\",\n \"description\": \"<string>\",\n \"default\": \"<unknown>\",\n \"enum\": [\n \"<unknown>\"\n ],\n \"items\": \"<unknown>\",\n \"properties\": {},\n \"required\": [\n \"<string>\"\n ]\n }\n ],\n \"metadata\": {}\n }\n ],\n \"control_flow_connections\": [\n {\n \"name\": \"start_to_process\",\n \"from_node\": \"start\",\n \"to_node\": \"process_input\",\n \"from_branch\": \"high_priority\"\n }\n ],\n \"description\": \"<string>\",\n \"data_flow_connections\": [\n {\n \"name\": \"query_to_llm\",\n \"source_node\": \"process_input\",\n \"source_output\": \"processed_text\",\n \"destination_node\": \"llm_generate\",\n \"destination_input\": \"prompt\"\n }\n ],\n \"metadata\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("http://localhost:5173/api/flowdrop/agentspec/flows/validate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"component_type\": \"flow\",\n \"name\": \"document_processing\",\n \"start_node\": \"start\",\n \"nodes\": [\n {\n \"component_type\": \"start_node\",\n \"name\": \"process_input\",\n \"description\": \"<string>\",\n \"inputs\": [\n {\n \"title\": \"user_query\",\n \"type\": \"string\",\n \"description\": \"<string>\",\n \"default\": \"<unknown>\",\n \"enum\": [\n \"<unknown>\"\n ],\n \"items\": \"<unknown>\",\n \"properties\": {},\n \"required\": [\n \"<string>\"\n ]\n }\n ],\n \"outputs\": [\n {\n \"title\": \"user_query\",\n \"type\": \"string\",\n \"description\": \"<string>\",\n \"default\": \"<unknown>\",\n \"enum\": [\n \"<unknown>\"\n ],\n \"items\": \"<unknown>\",\n \"properties\": {},\n \"required\": [\n \"<string>\"\n ]\n }\n ],\n \"metadata\": {}\n }\n ],\n \"control_flow_connections\": [\n {\n \"name\": \"start_to_process\",\n \"from_node\": \"start\",\n \"to_node\": \"process_input\",\n \"from_branch\": \"high_priority\"\n }\n ],\n \"description\": \"<string>\",\n \"data_flow_connections\": [\n {\n \"name\": \"query_to_llm\",\n \"source_node\": \"process_input\",\n \"source_output\": \"processed_text\",\n \"destination_node\": \"llm_generate\",\n \"destination_input\": \"prompt\"\n }\n ],\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://localhost:5173/api/flowdrop/agentspec/flows/validate")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"component_type\": \"flow\",\n \"name\": \"document_processing\",\n \"start_node\": \"start\",\n \"nodes\": [\n {\n \"component_type\": \"start_node\",\n \"name\": \"process_input\",\n \"description\": \"<string>\",\n \"inputs\": [\n {\n \"title\": \"user_query\",\n \"type\": \"string\",\n \"description\": \"<string>\",\n \"default\": \"<unknown>\",\n \"enum\": [\n \"<unknown>\"\n ],\n \"items\": \"<unknown>\",\n \"properties\": {},\n \"required\": [\n \"<string>\"\n ]\n }\n ],\n \"outputs\": [\n {\n \"title\": \"user_query\",\n \"type\": \"string\",\n \"description\": \"<string>\",\n \"default\": \"<unknown>\",\n \"enum\": [\n \"<unknown>\"\n ],\n \"items\": \"<unknown>\",\n \"properties\": {},\n \"required\": [\n \"<string>\"\n ]\n }\n ],\n \"metadata\": {}\n }\n ],\n \"control_flow_connections\": [\n {\n \"name\": \"start_to_process\",\n \"from_node\": \"start\",\n \"to_node\": \"process_input\",\n \"from_branch\": \"high_priority\"\n }\n ],\n \"description\": \"<string>\",\n \"data_flow_connections\": [\n {\n \"name\": \"query_to_llm\",\n \"source_node\": \"process_input\",\n \"source_output\": \"processed_text\",\n \"destination_node\": \"llm_generate\",\n \"destination_input\": \"prompt\"\n }\n ],\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"valid": true,
"errors": [
"<string>"
]
}{
"success": false,
"error": "Invalid request parameters",
"code": "VALIDATION_ERROR",
"details": {
"field": "name",
"message": "Name is required"
}
}{
"success": false,
"error": "Internal server error",
"code": "INTERNAL_ERROR"
}Authorizations
JWT token for authentication
Body
Agent Spec Flow — a directed, potentially cyclic graph of nodes. Flows function as "subroutines" encapsulating repeatable processes. They separate control-flow (execution order) from data-flow (data routing).
flow Flow name
"document_processing"
Reference to the StartNode name
"start"
All nodes in the flow
Union of all Agent Spec node types. Discriminated by component_type.
- Option 1
- Option 2
- Option 3
- Option 4
- Option 5
- Option 6
- Option 7
- Option 8
- Option 9
Show child attributes
Show child attributes
Execution order edges
Show child attributes
Show child attributes
Human-readable description
Data routing edges. When null, data flows by matching input/output property names across connected nodes.
Show child attributes
Show child attributes
Extension metadata
Was this page helpful?