POST /v1/ai/workflow/chat/stream
Issue a caddie-v3 chat session (Socket.IO). Returns sessionToken + socketUrl.

Request Body required

Chat request parameters

application/json
One of:
Option 1
Option 2
agentVersion string
Optional - agent version toggle; "v3" routes to the caddie service (open to every org)
Enum: v1, v2, v3, both
apiKeyOverride string
Optional - override the LLM API key for this request (eval/testing use only)
conversationId string
Stable conversation identifier (generated client-side, persists across session→workflow transition)
definition object
Definition is the inline workflow graph to analyze. Same shape as a saved workflow's definition. Unlike the ephemeral-run endpoint there is no trigger restriction — analysis is read-only and method-agnostic.
blockExpansions object
Set on run snapshots only (not workflow DB)
inputSchema object[]
Array of:
description string
key string
required boolean
type string
"string", "number", "boolean", "object", "array"
nodes object REQUIRED
sensitivePropKeys string[]
Legacy: kept for old runs; no longer populated for new workflows
Array of:
triggerNodeIds string[]
TriggerNodeIDs lists the node IDs that are trigger (root) nodes. Every workflow declares this — single-trigger workflows ship ["root"] (the legacy node id), multi-trigger workflows list every trigger node id. Treating single-trigger as a forest-of-1 removes the two-path branching throughout the BE + FE; older rows without the field are backfilled by migration 000282 and the field-missing path stays as a read-side safety net (see FindTriggerNodeIDs) but is no longer exercised by saves. "root" is also a runtime alias for "the trigger that fired this run" — {{root.X}} variable references resolve to the firing trigger regardless of which trigger fired. Don't repurpose the literal "root" as a trigger id on a multi-trigger workflow.
Array of:
variableDefs object[]
VariableDefs is a snapshot of the workflow's declared variables at run creation time. The canonical source lives on the workflows row (Workflow.VariableDefs column). Snapshotted into the run definition so the worker can resolve {{$vars.x}} lookups and route variable-action writes to the right scope without an extra DB round trip.
Array of:
default unknown
description string
lifetime string
Enum: persist, reset
name string
type string
Enum: number, text, boolean, list, object
description string
Optional - for generating new workflow
images object[]
Optional - images attached to the message (base64 for LLM, IPFS for storage)
Array of:
base64 string
ipfsUrl string
lastEventIndex integer
Last received event index for replay (reconnection)
message string
Optional on reconnect, required for new sessions
modelOverride string
Optional - override the LLM model for this request (eval/testing use only)
name string
Optional - for generating new workflow
preferredMode string
Optional - user's preferred mode hint; overrides auto-classifier when set
Enum: planning, building, repair, conversation
requestId string
Client-generated UUID4 for persistent session tracking (optional for legacy/inline mode)
sessionId string
Optional - metadata: which create-page session started this conversation
temperatureOverride number
Optional - override the LLM temperature for this request (eval/testing use only)
templateSearchMode string
Optional - template search mode toggle (defaults to lightweight)
Enum: lightweight, hybrid
timezone string
Optional - user's IANA timezone (e.g. "America/New_York") for time-aware responses
workflowId string
Optional - metadata: which workflow this conversation is about

Responses

200 sessionToken + socketUrl for the caddie-v3 Socket.IO connection
application/json
400 Bad Request
curl -X POST 'https://api.example.com/v1/ai/workflow/chat/stream' \  -H 'Authorization: Bearer YOUR_API_TOKEN' \  -H 'Content-Type: application/json' \  -d '{}'
const response = await fetch('https://api.example.com/v1/ai/workflow/chat/stream', {  method: 'POST',  headers: {      "Authorization": "Bearer YOUR_API_TOKEN",      "Content-Type": "application/json"  },  body: JSON.stringify({})});const data = await response.json();console.log(data);
import requestsheaders = {    'Authorization': 'Bearer YOUR_API_TOKEN'}response = requests.post('https://api.example.com/v1/ai/workflow/chat/stream', headers=headers, json={})print(response.json())
package mainimport (	"fmt"	"io"	"net/http"	"strings")func main() {	body := strings.NewReader(`{}`)	req, _ := http.NewRequest("POST", "https://api.example.com/v1/ai/workflow/chat/stream", body)	req.Header.Set("Authorization", "Bearer YOUR_API_TOKEN")	req.Header.Set("Content-Type", "application/json")	resp, _ := http.DefaultClient.Do(req)	defer resp.Body.Close()	result, _ := io.ReadAll(resp.Body)	fmt.Println(string(result))}
200 Response
"<object>"