@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.
- package/README.md +10 -2
- package/dist/mcp/handlers/action/index.js +3 -18
- package/dist/mcp/handlers/data/index.js +385 -41
- package/dist/mcp/handlers/data/templates.js +107 -0
- package/dist/mcp/handlers/deprecation.js +50 -0
- package/dist/mcp/handlers/env/index.js +8 -4
- package/dist/mcp/handlers/knowledge/index.js +44 -237
- package/dist/mcp/handlers/persona/create.js +5 -11
- package/dist/mcp/handlers/persona/index.js +5 -1
- package/dist/mcp/handlers/persona/version.js +234 -0
- package/dist/mcp/handlers/reference/index.js +101 -1
- package/dist/mcp/handlers/sync/index.js +3 -18
- package/dist/mcp/handlers/template/index.js +75 -10
- package/dist/mcp/handlers/workflow/analyze.js +171 -0
- package/dist/mcp/handlers/workflow/compare.js +70 -0
- package/dist/mcp/handlers/workflow/compile.js +39 -0
- package/dist/mcp/handlers/workflow/deploy.js +73 -0
- package/dist/mcp/handlers/workflow/generate.js +350 -0
- package/dist/mcp/handlers/workflow/index.js +136 -0
- package/dist/mcp/handlers/workflow/modify.js +456 -0
- package/dist/mcp/handlers/workflow/optimize.js +136 -0
- package/dist/mcp/handlers/workflow/types.js +4 -0
- package/dist/mcp/handlers/workflow/utils.js +132 -0
- package/dist/mcp/handlers-consolidated.js +62 -2691
- package/dist/mcp/prompts.js +13 -14
- package/dist/mcp/resources.js +55 -54
- package/dist/mcp/server.js +93 -124
- package/dist/mcp/{tools-v2.js → tools.js} +1 -1
- package/dist/mcp/workflow-operations.js +2 -2
- package/dist/sdk/client-adapter.js +267 -32
- package/dist/sdk/client.js +31 -15
- package/dist/sdk/ema-client.js +183 -0
- package/dist/sdk/generated/template-fallbacks.js +123 -0
- package/dist/sdk/guidance.js +65 -11
- package/dist/sdk/index.js +3 -1
- package/dist/sdk/knowledge.js +16 -86
- package/dist/sdk/workflow-intent.js +27 -0
- package/dist/sdk/workflow-transformer.js +0 -342
- package/docs/DEBUG-ANALYSIS-unused-category-type-mismatch.md +481 -0
- package/docs/TODO-fix-analyzer-and-modify.md +182 -0
- package/package.json +9 -4
- package/dist/mcp/tools-consolidated.js +0 -866
- package/dist/mcp/tools-legacy.js +0 -736
- package/docs/CODEBASE-ANALYSIS-2026-01-23.md +0 -936
- package/docs/CODEBASE-ANALYSIS-PRIORITIZED.md +0 -774
- package/docs/api-contracts.md +0 -216
- package/docs/auto-builder-analysis.md +0 -271
- package/docs/blog/mcp-tool-design-lessons.md +0 -309
- package/docs/data-architecture.md +0 -166
- package/docs/ema-auto-builder-guide.html +0 -394
- package/docs/lessons-learned.md +0 -209
- package/docs/llm-native-workflow-design.md +0 -252
- package/docs/local-generation.md +0 -508
- package/docs/mcp-flow-diagram.md +0 -135
- package/docs/migration/action-composition-migration.md +0 -270
- package/docs/naming-conventions.md +0 -278
- package/docs/proposals/HANDOFF-tool-restructure.md +0 -526
- package/docs/proposals/action-composition.md +0 -490
- package/docs/proposals/explicit-method-restructure.md +0 -328
- package/docs/proposals/mcp-tool-restructure-2026-01.md +0 -366
- package/docs/proposals/self-contained-guidance.md +0 -427
- package/docs/proto-sdk-generation.md +0 -242
- package/docs/release-impact.md +0 -102
- package/docs/release-process.md +0 -157
- package/docs/staging.RULE.md +0 -142
- package/docs/test-persona-creation.md +0 -196
- package/docs/tool-consolidation-v2.md +0 -225
- package/docs/tool-response-standards.md +0 -256
- package/resources/docs/getting-started.md +0 -97
- package/resources/templates/auto-builder-rules.md +0 -224
- package/resources/templates/chat-ai/README.md +0 -119
- package/resources/templates/chat-ai/persona-config.json +0 -111
- package/resources/templates/dashboard-ai/README.md +0 -156
- package/resources/templates/dashboard-ai/persona-config.json +0 -180
- package/resources/templates/demo-scenarios/README.md +0 -63
- package/resources/templates/demo-scenarios/test-published-package.md +0 -116
- package/resources/templates/document-gen-ai/README.md +0 -132
- package/resources/templates/document-gen-ai/persona-config.json +0 -316
- package/resources/templates/voice-ai/README.md +0 -123
- package/resources/templates/voice-ai/persona-config.json +0 -74
- 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`
|