fix: add missing flowchart and terminal nodes

This commit is contained in:
Richard Tang
2026-03-17 16:03:29 -07:00
parent 48747e20af
commit 3aca153be5
2 changed files with 302 additions and 5 deletions
+32 -5
View File
@@ -14,7 +14,7 @@
"start": "intake"
},
"pause_nodes": [],
"terminal_nodes": [],
"terminal_nodes": ["complete"],
"conversation_mode": "continuous",
"identity_prompt": "You are an SDR (Sales Development Representative) assistant. You help users automate their outreach by scoring contacts, filtering suspicious profiles, generating personalized messages, and creating Gmail drafts — all with human review before anything is sent.",
"nodes": [
@@ -193,7 +193,7 @@
"nullable_output_keys": [],
"input_schema": {},
"output_schema": {},
"system_prompt": "You are an SDR assistant. Generate a clear campaign summary report and present it to the user.\n\n**STEP 1 — Load draft records:**\nCall load_data(filename=<the \"drafts_created\" value from context>) to read the draft records.\nIf has_more=true, load additional chunks until all records are loaded.\n\n**STEP 2 — Present the report (text only, NO tool calls):**\n\nPresent a clean summary:\n\n📊 **SDR Campaign Summary — [outreach_goal]**\n\n**Overview:**\n- Total contacts processed: [N]\n- Contacts filtered (suspicious profiles): [filtered_count]\n- Safe contacts messaged: [N - filtered_count]\n- Gmail drafts created: [N]\n\n**Drafts Created:**\nList each draft: Contact Name | Company | Subject\n\n**Next Steps:**\n\"Your Gmail drafts are ready for review. Please:\n1. Open Gmail and review each draft\n2. Personalize further if needed\n3. Send when ready\n\nWould you like to run another outreach batch or adjust the strategy?\"\n\n**STEP 3 — After the user responds, call set_output:**\n- set_output(\"summary_report\", <the formatted report text>)",
"system_prompt": "You are an SDR assistant. Generate a clear campaign summary report and present it to the user.\n\n**STEP 1 — Load draft records:**\nCall load_data(filename=<the \"drafts_created\" value from context>) to read the draft records.\nIf has_more=true, load additional chunks until all records are loaded.\n\n**STEP 2 — Present the report (text only, NO tool calls):**\n\nPresent a clean summary:\n\n📊 **SDR Campaign Summary — [outreach_goal]**\n\n**Overview:**\n- Total contacts processed: [N]\n- Contacts filtered (suspicious profiles): [filtered_count]\n- Safe contacts messaged: [N - filtered_count]\n- Gmail drafts created: [N]\n\n**Drafts Created:**\nList each draft: Contact Name | Company | Subject\n\n**Next Steps:**\n\"Your Gmail drafts are ready for review. Please:\n1. Open Gmail and review each draft\n2. Personalize further if needed\n3. Send when ready\n\nCampaign complete!\"\n\n**STEP 3 — After the user responds, call set_output:**\n- set_output(\"summary_report\", <the formatted report text>)",
"tools": [
"load_data"
],
@@ -207,6 +207,33 @@
"max_validation_retries": 2,
"client_facing": true,
"success_criteria": null
},
{
"id": "complete",
"name": "Complete",
"description": "Terminal node - campaign complete.",
"node_type": "event_loop",
"input_keys": [
"summary_report"
],
"output_keys": [
"final_report"
],
"nullable_output_keys": [],
"input_schema": {},
"output_schema": {},
"system_prompt": "Campaign is complete. Set the final output.\n\nCall set_output(\"final_report\", <summary_report value from context>)",
"tools": [],
"model": null,
"function": null,
"routes": {},
"max_retries": 3,
"retry_on": [],
"max_node_visits": 1,
"output_model": null,
"max_validation_retries": 2,
"client_facing": false,
"success_criteria": null
}
],
"edges": [
@@ -256,9 +283,9 @@
"input_mapping": {}
},
{
"id": "report-to-intake",
"id": "report-to-complete",
"source": "report",
"target": "intake",
"target": "complete",
"condition": "on_success",
"condition_expr": null,
"priority": 1,
@@ -345,7 +372,7 @@
"append_data"
],
"metadata": {
"node_count": 6,
"node_count": 7,
"edge_count": 6
}
}
+270
View File
@@ -0,0 +1,270 @@
{
"original_draft": {
"agent_name": "sdr_agent",
"goal": "Automate sales development outreach: score contacts by priority, filter suspicious profiles, generate personalized messages, and create Gmail drafts for human review.",
"description": "",
"success_criteria": [
"Contacts are correctly scored and ranked by priority factors (alumni status, connection degree, domain verification)",
"Suspicious profiles (risk_score >= 7) are correctly identified and excluded from outreach",
"Generated messages reference specific profile details (alumni connection, role, company) and match the outreach goal",
"Gmail drafts are created for all safe contacts without errors"
],
"constraints": [
"Agent creates Gmail drafts but NEVER sends emails automatically",
"Must not process more contacts than the configured max_contacts parameter",
"Contacts with risk_score >= 7 must be excluded from outreach"
],
"nodes": [
{
"id": "intake",
"name": "Intake",
"description": "Receive the contact list and outreach goal from the user. Confirm the strategy and batch size before proceeding.",
"node_type": "event_loop",
"tools": [
"load_contacts_from_file"
],
"input_keys": [
"contacts",
"outreach_goal",
"max_contacts",
"user_background"
],
"output_keys": [
"contacts",
"outreach_goal",
"max_contacts",
"user_background"
],
"success_criteria": "The user has confirmed the contact list, outreach goal, batch size, and their background. All four keys have been written via set_output.",
"sub_agents": [],
"flowchart_type": "start",
"flowchart_shape": "stadium",
"flowchart_color": "#8aad3f"
},
{
"id": "score-contacts",
"name": "Score Contacts",
"description": "Score and rank each contact from 0 to 100 based on priority factors: alumni status, connection degree, domain verification, mutual connections, and active job postings.",
"node_type": "event_loop",
"tools": [
"load_data",
"append_data"
],
"input_keys": [
"contacts",
"outreach_goal"
],
"output_keys": [
"scored_contacts"
],
"success_criteria": "Every contact has a priority_score field (0-100) and scored_contacts.jsonl has been written and referenced via set_output.",
"sub_agents": [],
"flowchart_type": "database",
"flowchart_shape": "cylinder",
"flowchart_color": "#508878"
},
{
"id": "filter-contacts",
"name": "Filter Contacts",
"description": "Analyze each contact for authenticity and filter out suspicious profiles. Any contact with a risk score of 7 or higher is skipped.",
"node_type": "event_loop",
"tools": [
"load_data",
"append_data"
],
"input_keys": [
"scored_contacts"
],
"output_keys": [
"safe_contacts",
"filtered_count"
],
"success_criteria": "Each contact has a risk_score and recommendation field. Contacts with risk_score >= 7 are excluded. safe_contacts.jsonl and filtered_count are set via set_output.",
"sub_agents": [],
"flowchart_type": "database",
"flowchart_shape": "cylinder",
"flowchart_color": "#508878"
},
{
"id": "personalize",
"name": "Personalize",
"description": "Generate a personalized outreach message for each contact based on their profile, shared background, and the user's outreach goal.",
"node_type": "event_loop",
"tools": [
"load_data",
"append_data"
],
"input_keys": [
"safe_contacts",
"outreach_goal",
"user_background"
],
"output_keys": [
"personalized_contacts"
],
"success_criteria": "Every safe contact has an outreach_message field of 80-120 words that references a specific hook from their profile. personalized_contacts.jsonl is set via set_output.",
"sub_agents": [],
"flowchart_type": "database",
"flowchart_shape": "cylinder",
"flowchart_color": "#508878"
},
{
"id": "send-outreach",
"name": "Send Outreach",
"description": "Create Gmail draft emails for each contact using their personalized message. Drafts are created for human review \u2014 emails are never sent automatically.",
"node_type": "event_loop",
"tools": [
"gmail_create_draft",
"load_data",
"append_data"
],
"input_keys": [
"personalized_contacts",
"outreach_goal"
],
"output_keys": [
"drafts_created"
],
"success_criteria": "A Gmail draft has been created for every safe contact. drafts.jsonl records each draft and drafts_created is set via set_output.",
"sub_agents": [],
"flowchart_type": "database",
"flowchart_shape": "cylinder",
"flowchart_color": "#508878"
},
{
"id": "report",
"name": "Report",
"description": "Generate a summary report of the outreach campaign: contacts scored, filtered, messaged, and drafts created. Present to user for review.",
"node_type": "event_loop",
"tools": [
"load_data"
],
"input_keys": [
"drafts_created",
"filtered_count",
"outreach_goal"
],
"output_keys": [
"summary_report"
],
"success_criteria": "A campaign summary has been presented to the user listing totals for contacts scored, filtered, messaged, and drafts created. summary_report is set via set_output.",
"sub_agents": [],
"flowchart_type": "terminal",
"flowchart_shape": "stadium",
"flowchart_color": "#b5453a"
}
],
"edges": [
{
"id": "edge-0",
"source": "intake",
"target": "score-contacts",
"condition": "on_success",
"description": "",
"label": ""
},
{
"id": "edge-1",
"source": "score-contacts",
"target": "filter-contacts",
"condition": "on_success",
"description": "",
"label": ""
},
{
"id": "edge-2",
"source": "filter-contacts",
"target": "personalize",
"condition": "on_success",
"description": "",
"label": ""
},
{
"id": "edge-3",
"source": "personalize",
"target": "send-outreach",
"condition": "on_success",
"description": "",
"label": ""
},
{
"id": "edge-4",
"source": "send-outreach",
"target": "report",
"condition": "on_success",
"description": "",
"label": ""
},
{
"id": "edge-5",
"source": "report",
"target": "intake",
"condition": "on_success",
"description": "",
"label": ""
}
],
"entry_node": "intake",
"terminal_nodes": [
"report"
],
"flowchart_legend": {
"start": {
"shape": "stadium",
"color": "#8aad3f"
},
"terminal": {
"shape": "stadium",
"color": "#b5453a"
},
"process": {
"shape": "rectangle",
"color": "#b5a575"
},
"decision": {
"shape": "diamond",
"color": "#d89d26"
},
"io": {
"shape": "parallelogram",
"color": "#d06818"
},
"document": {
"shape": "document",
"color": "#c4b830"
},
"database": {
"shape": "cylinder",
"color": "#508878"
},
"subprocess": {
"shape": "subroutine",
"color": "#887a48"
},
"browser": {
"shape": "hexagon",
"color": "#cc8850"
}
}
},
"flowchart_map": {
"intake": [
"intake"
],
"score-contacts": [
"score-contacts"
],
"filter-contacts": [
"filter-contacts"
],
"personalize": [
"personalize"
],
"send-outreach": [
"send-outreach"
],
"report": [
"report"
]
}
}