Agent Skill · Frontline

flow-builder

Build valid Frontline assistant flows from CLI commands. Use when creating flow graphs, choosing conversation node payloads, connecting nodes, or validating flow structure before execution.

Provider: Frontline Path in repo: flow-builder/SKILL.md

Skill body

Flow Builder

Default Workflow

  1. Select the agent:
frontline agents use <agentId>
  1. Create or select a flow:
frontline agents flows create --name "Flow name"
frontline agents flows use <flowId>
  1. Inspect before each change:
frontline agents flows graph --table

Valid Flow Rules

The Start flow & how flows are triggered

Variables And Intents

Use variables in text fields as {VARIABLE_NAME}. The name must match the agent variable exactly.

frontline agents variables create --name customer_name --description "Customer name"
frontline agents intents create --name cancellation --phrases '["cancel order","stop subscription"]'

Flow fields with variable replacement include API url, headers[].value, parameters[].value, body; Say AI message and prompt; Response AI instructions; Tools AI instructions; Conditional Routing AI conditions[].expression; and Create Record Activity rowId and content.

Capturing values into variables

Reading a variable ({name}) and capturing one are different. To populate a variable, the field depends on the node type — and using the wrong field is silently ignored (no error):

Do not put captureVariables on an API node (it’s dropped silently) or variables on an AI node. Both nodes resolve the captured value by name, so the same {name} can be written by either.

Capturing contact info creates a Person automatically. Capturing into the built-in contact variables first_name, last_name, email, or phone_number writes to (and creates/identifies) the conversation’s People record — no record-create node needed. It deduplicates by email (a matching email links to the existing Person when the current contact has no email yet). Do not create a custom variable named email (or other default names): use frontline agents variables check-name — defaults are reserved. Use names like email_api for API-only values. If a Person already has an email, a newly captured different email is not applied to that record (other captured fields still merge).

Node identity

Do not send nodeId or alias in nodes create. The server returns both in the 201 response. Use that nodeId for edges; set a custom alias with nodes update after create.

Persisted ids follow node_<uuid>. Names like start_1 are invalid for stored nodes.

Node Payloads

Start:

frontline agents flows nodes create --data '{"type":"START","position":{"positionX":0,"positionY":0}}'

Intent trigger:

frontline agents flows nodes create --data '{"type":"TRIGGER_INTENT","position":{"positionX":0,"positionY":0},"data":{"type":"TRIGGER_INTENT","intentIds":[123],"agenticRouting":null}}'

Say AI:

frontline agents flows nodes create --data '{"type":"SAY_AI","position":{"positionX":320,"positionY":0},"data":{"type":"SAY_AI","sayWithAi":false,"message":"Hello!"}}'

RESPONSE_AI (an assistant reply generated by a specific agent’s model config — capture values into variables via captureVariables; see Variables And Intents below):

frontline agents flows nodes create --data '{"type":"RESPONSE_AI","position":{"positionX":320,"positionY":0},"data":{"type":"RESPONSE_AI","assistantId":"<agent-id>","model":"<external_id_from_ai_models_list>","aiVendor":"<vendor_from_same_row>","temperature":0.2,"instructions":"Answer the customer's question politely.","captureVariables":[],"exitNodeWhen":"ALL_VARIABLES"}}'

API (two fixed outgoing handles: success and fail — the canvas never renders a default handle for this node type; connecting default is rejected):

frontline agents flows nodes create --data '{"type":"API","position":{"positionX":640,"positionY":0},"data":{"type":"API","url":"https://example.com","method":"GET","headers":[]}}'

# Connect both outgoing paths — never "default":
frontline agents flows edges add --source <api-node-id> --source-handle success --target <next-node-id> --target-handle default
frontline agents flows edges add --source <api-node-id> --source-handle fail --target <error-node-id> --target-handle default

Conditional routing (AI evaluator — write conditions in natural language; each {var} is injected as "var": value in the prompt; no dot-access like {item.id}; connect a no-match handle when none apply):

frontline agents flows nodes create --data '{"type":"CONDITIONAL_ROUTING","position":{"positionX":960,"positionY":0},"data":{"type":"CONDITIONAL_ROUTING","routingType":"CONDITIONAL_AI","conditions":[{"handleId":"yes","expression":"{confirmed} is true"},{"handleId":"no","expression":"{confirmed} is false"}]}}'

Create record activity (log a manual activity on an Object record mid-conversation):

frontline agents flows nodes create --data '{
  "type": "CREATE_RECORD_ACTIVITY",
  "position": { "positionX": 1280, "positionY": 0 },
  "data": {
    "type": "CREATE_RECORD_ACTIVITY",
    "recordTypeId": 5,
    "rowId": "{contact_row_id}",
    "activityType": "NOTE",
    "content": "El usuario preguntó: {user_question}"
  }
}'

Edges

Connect nodes:

frontline agents flows edges add --source node_11111111-1111-1111-1111-111111111111 --source-handle default --target node_22222222-2222-2222-2222-222222222222 --target-handle default

Connect routing handles:

frontline agents flows edges add --source node_44444444-4444-4444-4444-444444444444 --source-handle yes --target node_33333333-3333-3333-3333-333333333333 --target-handle default
frontline agents flows edges add --source node_44444444-4444-4444-4444-444444444444 --source-handle no  --target node_22222222-2222-2222-2222-222222222222 --target-handle default

Remove an edge:

frontline agents flows edges remove --source node_11111111-1111-1111-1111-111111111111 --source-handle default --target node_22222222-2222-2222-2222-222222222222 --target-handle default

Updates

frontline agents flows nodes update node_22222222-2222-2222-2222-222222222222 --data '{"alias":"Greeting"}'
frontline agents flows nodes delete node_22222222-2222-2222-2222-222222222222
frontline agents flows update --name "Flow name" --status ACTIVE

Reference validation (avoid 400s)

Every customToolIds, intentIds, assistantId, aiModelId, knowledgeBaseIds, playbookIds, selectedRecordTypes[].recordTypeId, connectedAccountConfigs[].connectedAccountId you put in a node’s data is validated against the database before the node is persisted. A non-existent id returns 400 bad_request with details.issues[].code === "not_found" and the node is dropped.

For TOOLS_AI table access, use selectedRecordTypes with recordTypeId and at least one permission set to true:

"selectedRecordTypes": [
  { "recordTypeId": 5, "read": true, "create": true, "update": true, "delete": false }
]

Before composing a node, look up the referenced resources to make sure they exist:

If you hand a non-existent id to the API, you’ll see a clear not_found issue with the offending path — fix and retry, the API never half-creates the node.


See also

Skill frontmatter

allowed-tools: Bash(frontline:*)

Work with this as data

Every skill here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for agent skills

4 MCP tools reach this
  • find_skillsBrowse and filter every skill in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This skill
curl "https://apis.io/api/v1/skills/flow-builder"
All agent skills
curl "https://apis.io/api/v1/skills?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.