@ema.co/mcp-toolkit 2026.1.24 → 2026.1.26-3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of @ema.co/mcp-toolkit might be problematic. Click here for more details.

Files changed (81) hide show
  1. package/README.md +10 -2
  2. package/dist/mcp/handlers/action/index.js +3 -18
  3. package/dist/mcp/handlers/data/index.js +385 -41
  4. package/dist/mcp/handlers/data/templates.js +107 -0
  5. package/dist/mcp/handlers/deprecation.js +50 -0
  6. package/dist/mcp/handlers/env/index.js +8 -4
  7. package/dist/mcp/handlers/knowledge/index.js +44 -237
  8. package/dist/mcp/handlers/persona/create.js +5 -11
  9. package/dist/mcp/handlers/persona/index.js +5 -1
  10. package/dist/mcp/handlers/persona/version.js +234 -0
  11. package/dist/mcp/handlers/reference/index.js +101 -1
  12. package/dist/mcp/handlers/sync/index.js +3 -18
  13. package/dist/mcp/handlers/template/index.js +75 -10
  14. package/dist/mcp/handlers/workflow/analyze.js +171 -0
  15. package/dist/mcp/handlers/workflow/compare.js +70 -0
  16. package/dist/mcp/handlers/workflow/compile.js +39 -0
  17. package/dist/mcp/handlers/workflow/deploy.js +73 -0
  18. package/dist/mcp/handlers/workflow/generate.js +350 -0
  19. package/dist/mcp/handlers/workflow/index.js +136 -0
  20. package/dist/mcp/handlers/workflow/modify.js +456 -0
  21. package/dist/mcp/handlers/workflow/optimize.js +136 -0
  22. package/dist/mcp/handlers/workflow/types.js +4 -0
  23. package/dist/mcp/handlers/workflow/utils.js +132 -0
  24. package/dist/mcp/handlers-consolidated.js +62 -2691
  25. package/dist/mcp/prompts.js +13 -14
  26. package/dist/mcp/resources.js +55 -54
  27. package/dist/mcp/server.js +93 -124
  28. package/dist/mcp/{tools-v2.js → tools.js} +1 -1
  29. package/dist/mcp/workflow-operations.js +2 -2
  30. package/dist/sdk/client-adapter.js +267 -32
  31. package/dist/sdk/client.js +31 -15
  32. package/dist/sdk/ema-client.js +183 -0
  33. package/dist/sdk/generated/template-fallbacks.js +123 -0
  34. package/dist/sdk/guidance.js +65 -11
  35. package/dist/sdk/index.js +3 -1
  36. package/dist/sdk/knowledge.js +16 -86
  37. package/dist/sdk/workflow-intent.js +27 -0
  38. package/dist/sdk/workflow-transformer.js +0 -342
  39. package/docs/DEBUG-ANALYSIS-unused-category-type-mismatch.md +481 -0
  40. package/docs/TODO-fix-analyzer-and-modify.md +182 -0
  41. package/package.json +9 -4
  42. package/dist/mcp/tools-consolidated.js +0 -866
  43. package/dist/mcp/tools-legacy.js +0 -736
  44. package/docs/CODEBASE-ANALYSIS-2026-01-23.md +0 -936
  45. package/docs/CODEBASE-ANALYSIS-PRIORITIZED.md +0 -774
  46. package/docs/api-contracts.md +0 -216
  47. package/docs/auto-builder-analysis.md +0 -271
  48. package/docs/blog/mcp-tool-design-lessons.md +0 -309
  49. package/docs/data-architecture.md +0 -166
  50. package/docs/ema-auto-builder-guide.html +0 -394
  51. package/docs/lessons-learned.md +0 -209
  52. package/docs/llm-native-workflow-design.md +0 -252
  53. package/docs/local-generation.md +0 -508
  54. package/docs/mcp-flow-diagram.md +0 -135
  55. package/docs/migration/action-composition-migration.md +0 -270
  56. package/docs/naming-conventions.md +0 -278
  57. package/docs/proposals/HANDOFF-tool-restructure.md +0 -526
  58. package/docs/proposals/action-composition.md +0 -490
  59. package/docs/proposals/explicit-method-restructure.md +0 -328
  60. package/docs/proposals/mcp-tool-restructure-2026-01.md +0 -366
  61. package/docs/proposals/self-contained-guidance.md +0 -427
  62. package/docs/proto-sdk-generation.md +0 -242
  63. package/docs/release-impact.md +0 -102
  64. package/docs/release-process.md +0 -157
  65. package/docs/staging.RULE.md +0 -142
  66. package/docs/test-persona-creation.md +0 -196
  67. package/docs/tool-consolidation-v2.md +0 -225
  68. package/docs/tool-response-standards.md +0 -256
  69. package/resources/docs/getting-started.md +0 -97
  70. package/resources/templates/auto-builder-rules.md +0 -224
  71. package/resources/templates/chat-ai/README.md +0 -119
  72. package/resources/templates/chat-ai/persona-config.json +0 -111
  73. package/resources/templates/dashboard-ai/README.md +0 -156
  74. package/resources/templates/dashboard-ai/persona-config.json +0 -180
  75. package/resources/templates/demo-scenarios/README.md +0 -63
  76. package/resources/templates/demo-scenarios/test-published-package.md +0 -116
  77. package/resources/templates/document-gen-ai/README.md +0 -132
  78. package/resources/templates/document-gen-ai/persona-config.json +0 -316
  79. package/resources/templates/voice-ai/README.md +0 -123
  80. package/resources/templates/voice-ai/persona-config.json +0 -74
  81. package/resources/templates/voice-ai/workflow-prompt.md +0 -121
@@ -1,316 +0,0 @@
1
- {
2
- "$schema": "https://ema.co/schemas/persona-config-document-gen.json",
3
- "$comment": "Document Generation AI Persona Configuration - Resume Analysis Report Generator",
4
-
5
- "personaType": "document_generation",
6
- "projectType": 7,
7
- "name": "Resume Analysis Report Generator",
8
- "description": "Generates comprehensive analysis reports from uploaded resumes/CVs, including skills assessment, experience evaluation, and fit scoring for specified roles.",
9
-
10
- "category": "EMPLOYEE_EXPERIENCE",
11
- "triggerType": "DASHBOARD",
12
-
13
- "documentTypes": [
14
- {
15
- "type": 1,
16
- "name": "Candidate Assessment Report",
17
- "description": "Comprehensive analysis of a single candidate's resume with scoring and recommendations",
18
- "sections": [
19
- {
20
- "name": "executive_summary",
21
- "title": "Executive Summary",
22
- "description": "High-level overview and recommendation"
23
- },
24
- {
25
- "name": "candidate_profile",
26
- "title": "Candidate Profile",
27
- "description": "Contact info, current role, key highlights"
28
- },
29
- {
30
- "name": "skills_assessment",
31
- "title": "Skills Assessment",
32
- "description": "Technical and soft skills evaluation"
33
- },
34
- {
35
- "name": "experience_analysis",
36
- "title": "Experience Analysis",
37
- "description": "Work history and career progression"
38
- },
39
- {
40
- "name": "education_credentials",
41
- "title": "Education & Credentials",
42
- "description": "Degrees, certifications, and training"
43
- },
44
- {
45
- "name": "fit_scoring",
46
- "title": "Fit Scoring",
47
- "description": "Quantified assessment (technical fit, cultural fit, overall)"
48
- },
49
- {
50
- "name": "recommendations",
51
- "title": "Recommendations",
52
- "description": "Hiring recommendation and next steps"
53
- }
54
- ]
55
- },
56
- {
57
- "type": 2,
58
- "name": "Skills Gap Analysis",
59
- "description": "Compare candidate skills against job requirements and identify gaps",
60
- "sections": [
61
- {
62
- "name": "overview",
63
- "title": "Analysis Overview",
64
- "description": "Summary of gap analysis findings"
65
- },
66
- {
67
- "name": "required_skills",
68
- "title": "Required Skills Inventory",
69
- "description": "Skills needed for the role"
70
- },
71
- {
72
- "name": "candidate_skills",
73
- "title": "Candidate Skills Inventory",
74
- "description": "Skills the candidate possesses"
75
- },
76
- {
77
- "name": "gap_matrix",
78
- "title": "Gap Identification Matrix",
79
- "description": "Detailed skill-by-skill gap analysis"
80
- },
81
- {
82
- "name": "severity_assessment",
83
- "title": "Gap Severity Assessment",
84
- "description": "Critical, moderate, minor gap classification"
85
- },
86
- {
87
- "name": "development_plan",
88
- "title": "Development Recommendations",
89
- "description": "Training and development suggestions"
90
- }
91
- ]
92
- },
93
- {
94
- "type": 3,
95
- "name": "Candidate Comparison Report",
96
- "description": "Side-by-side comparison of multiple candidates for a role",
97
- "sections": [
98
- {
99
- "name": "comparison_summary",
100
- "title": "Comparison Summary",
101
- "description": "Quick comparison table and rankings"
102
- },
103
- {
104
- "name": "candidate_profiles",
105
- "title": "Individual Candidate Profiles",
106
- "description": "Brief profile of each candidate"
107
- },
108
- {
109
- "name": "skills_matrix",
110
- "title": "Skills Comparison Matrix",
111
- "description": "Side-by-side skills comparison"
112
- },
113
- {
114
- "name": "experience_comparison",
115
- "title": "Experience Comparison",
116
- "description": "Years, industries, and role levels"
117
- },
118
- {
119
- "name": "rankings",
120
- "title": "Overall Rankings",
121
- "description": "Ranked list with rationale"
122
- },
123
- {
124
- "name": "interview_recommendations",
125
- "title": "Interview Recommendations",
126
- "description": "Priority order and focus areas per candidate"
127
- }
128
- ]
129
- }
130
- ],
131
-
132
- "entityExtraction": {
133
- "columns": [
134
- {
135
- "id": "candidate_name",
136
- "name": "Candidate Name",
137
- "type": "string",
138
- "description": "Full name of the candidate"
139
- },
140
- {
141
- "id": "contact_info",
142
- "name": "Contact Information",
143
- "type": "object",
144
- "description": "Email and phone number",
145
- "fields": [
146
- {"name": "email", "type": "string"},
147
- {"name": "phone", "type": "string"}
148
- ]
149
- },
150
- {
151
- "id": "years_experience",
152
- "name": "Total Years of Experience",
153
- "type": "number",
154
- "description": "Total professional work experience in years"
155
- },
156
- {
157
- "id": "current_role",
158
- "name": "Current/Most Recent Role",
159
- "type": "string",
160
- "description": "Current or most recent job title and company"
161
- },
162
- {
163
- "id": "education",
164
- "name": "Education",
165
- "type": "array",
166
- "description": "Educational background",
167
- "itemType": "object",
168
- "itemFields": [
169
- {"name": "degree", "type": "string", "description": "Degree type"},
170
- {"name": "institution", "type": "string", "description": "School/university name"},
171
- {"name": "field", "type": "string", "description": "Field of study"},
172
- {"name": "year", "type": "number", "description": "Graduation year"}
173
- ]
174
- },
175
- {
176
- "id": "technical_skills",
177
- "name": "Technical Skills",
178
- "type": "array",
179
- "description": "List of technical skills, tools, and technologies"
180
- },
181
- {
182
- "id": "certifications",
183
- "name": "Certifications",
184
- "type": "array",
185
- "description": "Professional certifications and licenses"
186
- },
187
- {
188
- "id": "work_history",
189
- "name": "Work History",
190
- "type": "array",
191
- "description": "Employment history",
192
- "itemType": "object",
193
- "itemFields": [
194
- {"name": "company", "type": "string"},
195
- {"name": "title", "type": "string"},
196
- {"name": "duration", "type": "string"},
197
- {"name": "highlights", "type": "string"}
198
- ]
199
- }
200
- ]
201
- },
202
-
203
- "ruleValidation": {
204
- "rulesets": [
205
- {
206
- "id": "basic_requirements",
207
- "name": "Basic Requirements",
208
- "description": "Standard hiring criteria",
209
- "rules": [
210
- {
211
- "id": "min_experience",
212
- "name": "Minimum Experience",
213
- "description": "Candidate must have at least 2 years of professional work experience",
214
- "severity": "required"
215
- },
216
- {
217
- "id": "education",
218
- "name": "Education Requirement",
219
- "description": "Candidate should have at least a Bachelor's degree or equivalent experience",
220
- "severity": "preferred"
221
- },
222
- {
223
- "id": "communication",
224
- "name": "Communication Skills",
225
- "description": "Resume demonstrates strong written communication skills",
226
- "severity": "preferred"
227
- },
228
- {
229
- "id": "career_progression",
230
- "name": "Career Progression",
231
- "description": "Career shows logical progression with increasing responsibilities",
232
- "severity": "preferred"
233
- },
234
- {
235
- "id": "employment_continuity",
236
- "name": "Employment Continuity",
237
- "description": "No unexplained employment gaps longer than 12 months",
238
- "severity": "warning"
239
- }
240
- ],
241
- "aggregation": "(min_experience AND education) OR (communication AND career_progression)"
242
- }
243
- ]
244
- },
245
-
246
- "fileUpload": {
247
- "acceptedTypes": [
248
- "application/pdf",
249
- "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
250
- "application/msword",
251
- "text/plain"
252
- ],
253
- "tags": {
254
- "default": ["resume_documents"],
255
- "jobDescription": ["job_description"],
256
- "comparison": ["comparison_resumes"],
257
- "gapAnalysis": ["gap_analysis_resume", "gap_requirements"]
258
- }
259
- },
260
-
261
- "dataProtection": {
262
- "protectedClasses": [
263
- "phone_number",
264
- "email",
265
- "address",
266
- "social_security_number"
267
- ],
268
- "$comment": "Sensitive data to redact from LLM processing"
269
- },
270
-
271
- "fusionModel": {
272
- "allModels": true,
273
- "selectedModels": [],
274
- "$comment": "Use all available LLMs for optimal analysis accuracy"
275
- },
276
-
277
- "scoringCriteria": {
278
- "scales": [
279
- {
280
- "name": "fit_score",
281
- "min": 1,
282
- "max": 10,
283
- "description": "How well candidate matches requirements"
284
- }
285
- ],
286
- "recommendations": [
287
- "Strong Yes",
288
- "Yes",
289
- "Maybe",
290
- "No"
291
- ],
292
- "dimensions": [
293
- {
294
- "name": "technical_fit",
295
- "weight": 0.4,
296
- "description": "Match of technical skills to requirements"
297
- },
298
- {
299
- "name": "experience_fit",
300
- "weight": 0.35,
301
- "description": "Relevance and depth of experience"
302
- },
303
- {
304
- "name": "cultural_fit",
305
- "weight": 0.25,
306
- "description": "Alignment with company values and team dynamics"
307
- }
308
- ]
309
- },
310
-
311
- "samplePrompts": {
312
- "candidateAssessment": "Generate a comprehensive candidate assessment report for this resume. Analyze skills, experience, education, and provide a fit score (1-10) for each dimension: technical fit, experience fit, and cultural fit. Include a final recommendation (Strong Yes/Yes/Maybe/No) with rationale.",
313
- "skillsGap": "Compare this candidate's skills against the job requirements. Identify all gaps, categorize them by severity (critical, moderate, minor), and provide specific training or development recommendations for each gap.",
314
- "candidateComparison": "Compare these candidates for the specified role. Create a comparison matrix, rank the candidates, and provide a recommended interview order with specific focus areas for each candidate."
315
- }
316
- }
@@ -1,123 +0,0 @@
1
- # {Persona Name}
2
-
3
- **Type**: Voice AI
4
- **Created**: {Date}
5
- **Version**: 1.0
6
-
7
- ## Overview
8
-
9
- {Brief description of what this Voice AI Employee does}
10
-
11
- ## Deployment Steps
12
-
13
- ### Step 1: Create Workflow in Auto Builder
14
-
15
- 1. Go to [Ema Auto Builder](https://builder.ema.co/)
16
- 2. Create new AI Employee → Select **Voice AI**
17
- 3. Copy contents of `workflow-prompt.md` into the prompt field
18
- 4. Click "Generate Workflow"
19
- 5. Review generated nodes and verify:
20
- - All categorizers have edges for every category
21
- - Search nodes connect to respond nodes correctly
22
- - Fallback paths are present
23
-
24
- ### Step 2: Configure Conversational Behavior
25
-
26
- 1. Navigate to "Conversational Behavior" section
27
- 2. Apply settings from `persona-config.json`:
28
-
29
- | Field | Source |
30
- |-------|--------|
31
- | Welcome Message | `conversationSettings.welcomeMessage` |
32
- | Identity & Purpose | `conversationSettings.identityAndPurpose` |
33
- | Take Action Instructions | `conversationSettings.takeActionInstructions` |
34
- | Hangup Instructions | `conversationSettings.hangupInstructions` |
35
- | Transfer Call Instructions | `conversationSettings.transferCallInstructions` |
36
- | Speech Characteristics | `conversationSettings.speechCharacteristics` |
37
- | System Prompt | `conversationSettings.systemPrompt` |
38
- | Wait Message | `conversationSettings.waitMessage` |
39
-
40
- ### Step 3: Configure Voice Settings
41
-
42
- 1. Navigate to "Voice Settings" section
43
- 2. Apply settings:
44
- - Language: From `voiceSettings.languageHints`
45
- - Voice Model: From `voiceSettings.voiceModel`
46
-
47
- ### Step 4: Configure VAD & Data Storage
48
-
49
- 1. **VAD Settings** (Voice Activity Detection):
50
- - Turn Timeout: `vadSettings.turnTimeout` seconds
51
- - Silence End Call: `vadSettings.silenceEndCallTimeout` seconds
52
- - Max Duration: `vadSettings.maxConversationDuration` seconds
53
-
54
- 2. **Data Storage**:
55
- - Store Audio: `dataStorageSettings.storeAudioRecording`
56
- - Store Transcripts: `dataStorageSettings.storeTranscripts`
57
-
58
- ### Step 5: Upload Knowledge Base (if applicable)
59
-
60
- 1. Navigate to "Knowledge Base" section
61
- 2. Upload documents from `docs/` folder
62
- 3. Apply tags as specified in `docs/_metadata.json`
63
-
64
- ### Step 6: Test
65
-
66
- 1. **Simulator Test**: Use the built-in call simulator
67
- 2. **Test Calls**:
68
- - Test happy path (main use case)
69
- - Test each category branch
70
- - Test fallback handling
71
- - Test verification flows (if applicable)
72
- 3. **Edge Cases**:
73
- - Test with unexpected inputs
74
- - Test silence handling
75
- - Test interruption handling
76
-
77
- ## Files
78
-
79
- | File | Description |
80
- |------|-------------|
81
- | `workflow-prompt.md` | Auto Builder prompt with safeguards |
82
- | `persona-config.json` | Voice AI configuration |
83
- | `proto-config.json` | Full API-deployable config |
84
- | `docs/` | Knowledge base documents |
85
-
86
- ## Testing Checklist
87
-
88
- - [ ] Workflow generates without validation errors
89
- - [ ] All category paths work correctly
90
- - [ ] Fallback provides helpful response
91
- - [ ] Voice sounds natural and appropriate
92
- - [ ] Actions/tools execute correctly
93
- - [ ] Handoff to human works (if applicable)
94
- - [ ] Call ends appropriately
95
-
96
- ## Maintenance
97
-
98
- | Change Type | Action |
99
- |-------------|--------|
100
- | Workflow logic | Update `workflow-prompt.md`, re-generate |
101
- | Persona behavior | Update `persona-config.json`, apply in UI |
102
- | Knowledge content | Update docs in `docs/`, re-upload |
103
- | Voice settings | Update `persona-config.json`, apply in UI |
104
-
105
- ## Troubleshooting
106
-
107
- ### "Validation failed" in Auto Builder
108
-
109
- - Check that all categorizers have Fallback category
110
- - Verify edge format: `category_<Name>` not `category::<Name>`
111
- - Ensure all nodes have required inputs
112
-
113
- ### Voice sounds unnatural
114
-
115
- - Review `speechCharacteristics` for TTS rules
116
- - Add pronunciation guides for technical terms
117
- - Adjust pauses and pacing instructions
118
-
119
- ### Actions not triggering
120
-
121
- - Check `takeActionInstructions` uses correct `</Case N>` format
122
- - Verify tool names match exactly
123
- - Review `systemPrompt` for tool calling rules
@@ -1,74 +0,0 @@
1
- {
2
- "$schema": "https://ema.co/schemas/persona-config-voice.json",
3
- "$comment": "Voice AI Persona Configuration - Fill in all {placeholder} values",
4
-
5
- "personaType": "voice",
6
- "projectType": 5,
7
- "name": "{Persona Name}",
8
- "description": "{Brief description of what this Voice AI does}",
9
-
10
- "conversationSettings": {
11
- "name": "{AI Name - e.g., 'Sofia', 'Alex', 'Service Agent'}",
12
-
13
- "welcomeMessage": "{Opening greeting when call connects}\n\nExample:\nHello, thank you for calling {Company}. This is {AI Name}. How can I help you today?",
14
-
15
- "identityAndPurpose": "You are {AI Name}, a Voice AI assistant for {Company}.\n\nPrimary responsibility: {Main purpose}\n\nYour responsibilities:\n1. {Responsibility 1}\n2. {Responsibility 2}\n3. {Responsibility 3}\n\nRules:\n- {Rule 1}\n- {Rule 2}",
16
-
17
- "takeActionInstructions": "</Case 1>\n{Action 1 Name}\n\nTrigger When:\n{Condition that triggers this action}\n\nIntent for tool call: \"{Tool Intent Name}\"\n\nRequired parameters:\n{ \"{param1}\": \"\", \"{param2}\": \"\" }\n</Case 1>\n\n</Case 2>\n{Action 2 Name}\n\nTrigger When:\n{Condition that triggers this action}\n\nIntent for tool call: \"{Tool Intent Name}\"\n\nRequired parameters:\n{ \"{param1}\": \"\" }\n</Case 2>",
18
-
19
- "hangupInstructions": "End the call when:\n- The caller explicitly says goodbye or asks to hang up\n- The caller confirms they have no more questions\n- {Additional hangup conditions}\n\nBefore ending:\n- Confirm all issues are resolved\n- Offer any follow-up information\n- Thank the caller",
20
-
21
- "transferCallInstructions": "Transfer the call when:\n- The caller explicitly requests a human agent\n- {Condition requiring human}\n- {Complex scenario}\n\nBefore transferring:\n- Inform the caller you're transferring them\n- Provide brief context to the human agent\n- {Additional transfer instructions}",
22
-
23
- "speechCharacteristics": "**Conversational Style:**\n- Keep responses brief (2-3 sentences per turn)\n- Use warm, professional tone\n- Speak clearly at moderate pace\n\n**Natural Speech:**\n- Use brief pauses between sentences\n- Acknowledge with 'I understand', 'Of course', 'Certainly'\n- Avoid robotic language\n\n**TTS Pronunciation Rules:**\n- Spell out IDs: 'A-B-C-1-2-3'\n- Pause between numbers: 'Your code is... 1... 2... 3... 4'\n- {Domain-specific pronunciation rules}",
24
-
25
- "systemPrompt": "Tool Calling Instructions:\n\n1. Always collect required parameters before calling tools\n2. Confirm parameter values with the caller\n3. Handle tool errors gracefully\n4. {Additional tool calling rules}\n\nParameter Collection:\n- {Param 1}: {How to collect}\n- {Param 2}: {How to collect}",
26
-
27
- "formFillingInstructions": "{Instructions for collecting form data, if applicable}\n\nExample:\nWhen collecting booking information:\n1. Ask for name first\n2. Then ask for date preference\n3. Confirm all details before proceeding",
28
-
29
- "waitMessage": "One moment while I look that up for you..."
30
- },
31
-
32
- "voiceSettings": {
33
- "languageHints": ["en-US"],
34
- "voiceModel": "default",
35
- "$comment_voiceModel": "Options: default, professional-male, professional-female, casual"
36
- },
37
-
38
- "vadSettings": {
39
- "turnTimeout": 3,
40
- "$comment_turnTimeout": "Seconds to wait for caller to finish speaking",
41
- "silenceEndCallTimeout": 30,
42
- "$comment_silenceEndCallTimeout": "Seconds of silence before ending call",
43
- "maxConversationDuration": 600,
44
- "$comment_maxConversationDuration": "Maximum call length in seconds (600 = 10 minutes)"
45
- },
46
-
47
- "dataStorageSettings": {
48
- "storeAudioRecording": true,
49
- "storeTranscripts": true,
50
- "storeAgentTranscript": true
51
- },
52
-
53
- "callSettings": {
54
- "enableCallForwarding": false,
55
- "callForwardingNumber": "",
56
- "enableSpamCallPrevention": true,
57
- "enableDisconnectCall": false
58
- },
59
-
60
- "dataProtection": {
61
- "protectedClasses": [
62
- "ssn",
63
- "credit_card",
64
- "phone_number"
65
- ],
66
- "$comment_protectedClasses": "PII classes to redact. Options: ssn, credit_card, phone_number, email, address, dob, account_number"
67
- },
68
-
69
- "fusionModel": {
70
- "allModels": true,
71
- "selectedModels": [],
72
- "$comment": "Leave allModels: true for best results, or specify models: ['gpt-4', 'claude-3']"
73
- }
74
- }
@@ -1,121 +0,0 @@
1
- # Workflow Prompt: {Persona Name}
2
-
3
- > **IMPORTANT**: Copy the content in the "Auto Builder Prompt" section below into Ema Auto Builder.
4
- > The safeguards and validation sections help ensure correct interpretation.
5
-
6
- ---
7
-
8
- ## Auto Builder Prompt
9
-
10
- ```text
11
- Title: {Persona Name}
12
-
13
- Summary: {One sentence describing what this Voice AI does}
14
-
15
- Trigger: voice_call (inbound phone call)
16
-
17
- ---
18
- ## EXPLICIT NODE DEFINITIONS
19
- ---
20
-
21
- Agents/Nodes:
22
- 1. trigger (chat_trigger)
23
- - outputs: chat_conversation, user_query
24
-
25
- 2. intent_classifier (chat_categorizer)
26
- - input: trigger.chat_conversation
27
- - categories: [{Category1}, {Category2}, {Category3}, Fallback]
28
- - output: category
29
- - description: "Classifies caller intent"
30
-
31
- {For each category, define the processing nodes:}
32
-
33
- 3. {category1_processor} ({action_type})
34
- - runIf: intent_classifier.category == {Category1}
35
- - inputs: {specify inputs}
36
- - outputs: {specify outputs}
37
- - description: "{What this node does}"
38
-
39
- 4. {category1_response} (call_llm)
40
- - runIf: intent_classifier.category == {Category1}
41
- - inputs:
42
- - query: trigger.user_query
43
- - named_inputs_{Category1}_Data: {category1_processor}.{output}
44
- - instructions: "{Specific response instructions}"
45
-
46
- {Repeat for each category...}
47
-
48
- N. fallback_response (call_llm)
49
- - runIf: intent_classifier.category == Fallback
50
- - inputs: query: trigger.user_query
51
- - instructions: "Ask a clarifying question. Provide examples:
52
- 1. {Example query 1}
53
- 2. {Example query 2}
54
- 3. {Example query 3}"
55
-
56
- ---
57
- ## EXPLICIT CONNECTIONS
58
- ---
59
-
60
- Connections:
61
- trigger.chat_conversation → intent_classifier.conversation
62
- trigger.user_query → intent_classifier.query
63
-
64
- # Category routing via runIf (NOT edges):
65
- # {category1_processor} has runIf: intent_classifier.category == {Category1}
66
- # {category2_processor} has runIf: intent_classifier.category == {Category2}
67
- # {category3_processor} has runIf: intent_classifier.category == {Category3}
68
- # fallback_response has runIf: intent_classifier.category == Fallback
69
-
70
- {category1_processor}.{output} → {category1_response}.named_inputs_{Category1}_Data
71
- trigger.user_query → {category1_response}.query
72
-
73
- {Repeat for all connections...}
74
-
75
- ---
76
- ## RESULTS MAPPING
77
- ---
78
-
79
- Results:
80
- - {category1_response}.response_with_sources → WORKFLOW_OUTPUT
81
- - {category2_response}.response_with_sources → WORKFLOW_OUTPUT
82
- - {category3_response}.response_with_sources → WORKFLOW_OUTPUT
83
- - fallback_response.response_with_sources → WORKFLOW_OUTPUT
84
-
85
- ---
86
- ## VALIDATION ASSERTIONS
87
- ---
88
-
89
- Assertions:
90
- - [ ] intent_classifier has edges for ALL categories: {Category1}, {Category2}, {Category3}, Fallback
91
- - [ ] Each category has exactly one routing path to a response node
92
- - [ ] All search/data nodes receive TEXT_WITH_SOURCES input from trigger.user_query
93
- - [ ] All call_llm nodes have explicit instructions
94
- - [ ] Fallback provides examples of valid queries
95
- - [ ] All response nodes map to WORKFLOW_OUTPUT
96
- ```
97
-
98
- ---
99
-
100
- ## Safeguard Checklist (Verify Before Pasting)
101
-
102
- ### Structure Safeguards
103
-
104
- - [ ] **Trigger specified**: `voice_call` or `chat_trigger`
105
- - [ ] **All categories listed**: Including `Fallback`
106
- - [ ] **Explicit node definitions**: Each node has name, type, inputs, outputs
107
- - [ ] **Explicit connections**: Using `source.output → target.input` format
108
- - [ ] **Results mapping**: All outputs map to `WORKFLOW_OUTPUT`
109
-
110
- ### Type Compatibility Safeguards
111
-
112
- - [ ] `chat_trigger.chat_conversation` → `chat_categorizer.conversation` ✓
113
- - [ ] `chat_trigger.user_query` → `call_llm.query` ✓
114
- - [ ] `search.search_results` → `respond_with_sources.search_results` ✓
115
- - [ ] `external_action_caller.tool_execution_result` → `call_llm.named_inputs_*` ✓
116
-
117
- ### Category Routing Safeguards
118
-
119
- - [ ] Every category has a handler node with `runIf` condition
120
- - [ ] runIf format: `output: "category"` compared to `enumValue: "<CategoryName>"`
121
- - [ ] **DO NOT** use `category_<Name>` - use `output: "category"` with `enumValue`