mirror of
https://github.com/dograh-hq/dograh.git
synced 2026-06-19 08:28:10 +02:00
* feat(examples): add multi-node Workflow SDK example in Python and TypeScript Closes #369 * docs: preserve workflow name in SDK build examples --------- Co-authored-by: Abhishek Kumar <abhishek@a6k.me>
101 lines
3.2 KiB
Python
101 lines
3.2 KiB
Python
"""Build a multi-node voice agent using the Workflow SDK and save it as a draft.
|
|
|
|
Requirements:
|
|
pip install -r requirements.txt
|
|
|
|
Environment variables (loaded from `.env` in this directory):
|
|
DOGRAH_API_ENDPOINT - Dograh API base URL (e.g. http://localhost:8000)
|
|
DOGRAH_API_TOKEN - API token sent as X-API-Key
|
|
|
|
Run:
|
|
python build_workflow_with_sdk.py
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
from dotenv import load_dotenv
|
|
|
|
from dograh_sdk import DograhClient, Workflow
|
|
|
|
load_dotenv(Path(__file__).parent / ".env")
|
|
|
|
# Replace with the numeric ID of an existing agent in your Dograh account.
|
|
# Create one via the UI or with create_workflow.py if you don't have one yet.
|
|
WORKFLOW_ID = 0
|
|
|
|
|
|
def main() -> int:
|
|
api_endpoint = os.environ.get("DOGRAH_API_ENDPOINT", "http://localhost:8000")
|
|
api_token = os.environ.get("DOGRAH_API_TOKEN")
|
|
|
|
if not api_token:
|
|
print("DOGRAH_API_TOKEN is required", file=sys.stderr)
|
|
return 1
|
|
|
|
if WORKFLOW_ID == 0:
|
|
print("Set WORKFLOW_ID at the top of this file to an existing workflow ID", file=sys.stderr)
|
|
return 1
|
|
|
|
with DograhClient(base_url=api_endpoint, api_key=api_token) as client:
|
|
existing = client.get_workflow(WORKFLOW_ID)
|
|
# Preserve the live workflow name; save_workflow sends name with the draft update.
|
|
wf = Workflow(client=client, name=existing.name)
|
|
|
|
greeting = wf.add(
|
|
type="startCall",
|
|
name="greeting",
|
|
prompt=(
|
|
"# Goal\n"
|
|
"You are a helpful agent having a conversation over voice with a human. "
|
|
"This is a voice conversation, so transcripts can be error prone.\n\n"
|
|
"## Flow\n"
|
|
"Greet the caller warmly and ask whether they would like to continue."
|
|
),
|
|
)
|
|
qualify = wf.add(
|
|
type="agentNode",
|
|
name="qualify",
|
|
prompt=(
|
|
"# Goal\n"
|
|
"Qualify the lead by asking about their needs, budget, and timeline.\n\n"
|
|
"## Rules\n"
|
|
"- Keep responses short — 2-3 sentences max\n"
|
|
"- Confirm all three answers before moving on"
|
|
),
|
|
)
|
|
done = wf.add(
|
|
type="endCall",
|
|
name="done",
|
|
prompt="Thank the caller for their time and let them know the team will follow up shortly.",
|
|
)
|
|
|
|
wf.edge(
|
|
greeting,
|
|
qualify,
|
|
label="interested",
|
|
condition="Caller confirms they want to continue.",
|
|
)
|
|
wf.edge(
|
|
qualify,
|
|
done,
|
|
label="qualified",
|
|
condition="All qualification questions have been answered.",
|
|
)
|
|
|
|
result = client.save_workflow(workflow_id=WORKFLOW_ID, workflow=wf)
|
|
node_count = len(result.workflow_definition.get("nodes", []))
|
|
print(
|
|
f"Saved workflow {result.id}: {result.name!r} "
|
|
f"(version={result.version_number}, status={result.version_status}, "
|
|
f"nodes={node_count})"
|
|
)
|
|
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|