Build an agent
The SDK mirrors the node-and-edge model of the Voice Agent Builder. You create a Workflow, add nodes (startCall, agentNode, endCall, …) with add(), connect them with edge(), and persist the result via save_workflow.
Prerequisites
- A Decibyl API key exported as
DECIBYL_API_KEY - An existing agent ID to save drafts against (create one in the Decibyl UI or via
POST /api/v1/workflows/create)
Build and save
The example below builds a three-node loan-qualification agent and saves it as a new draft version on an existing agent. Your published agent keeps serving calls until you explicitly publish the draft.
from decibyl_sdk import DecibylClient, Workflow
with DecibylClient(api_key="YOUR_API_KEY") as client: wf = Workflow(client=client, name="loan_qualification")
greeting = wf.add( type="startCall", name="greeting", prompt="You are Sarah from Acme Loans. Greet the caller warmly.", ) qualify = wf.add( type="agentNode", name="qualify", prompt="Ask about loan amount, purpose, and monthly income.", ) done = wf.add( type="endCall", name="done", prompt="Thank them and end the call politely.", )
wf.edge(greeting, qualify, label="interested", condition="Caller wants to continue.") wf.edge(qualify, done, label="done", condition="All qualification questions answered.")
client.save_workflow(workflow_id=123, workflow=wf)import { DecibylClient, Workflow } from "@decibyl/sdk";
const client = new DecibylClient({ apiKey: "YOUR_API_KEY" });const wf = new Workflow({ client, name: "loan_qualification" });
const greeting = await wf.add({ type: "startCall", name: "greeting", prompt: "You are Sarah from Acme Loans. Greet the caller warmly.",});const qualify = await wf.add({ type: "agentNode", name: "qualify", prompt: "Ask about loan amount, purpose, and monthly income.",});const done = await wf.add({ type: "endCall", name: "done", prompt: "Thank them and end the call politely.",});
wf.edge(greeting, qualify, { label: "interested", condition: "Caller wants to continue." });wf.edge(qualify, done, { label: "done", condition: "All qualification questions answered." });
await client.saveWorkflow(123, wf);Edit an existing agent
Load an agent into an editable Workflow, mutate it, then save:
wf = client.load_workflow(workflow_id=123)wf.name = "loan_qualification_v2"client.save_workflow(workflow_id=123, workflow=wf)const wf = await client.loadWorkflow(123);wf.name = "loan_qualification_v2";await client.saveWorkflow(123, wf);Discover node types
Each node’s type string and required fields come from the backend’s node-spec catalog. Fetch it at runtime to validate what you can build:
types = client.list_node_types()for spec in types.node_types: print(spec.name, [p.name for p in spec.properties])const types = await client.listNodeTypes();for (const spec of types.node_types) { console.log(spec.name, spec.properties.map(p => p.name));}