eqho-eval 0.5.0

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.
Files changed (179) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +552 -0
  3. package/dist/cli/auth-store.d.ts +5 -0
  4. package/dist/cli/auth-store.d.ts.map +1 -0
  5. package/dist/cli/auth-store.js +39 -0
  6. package/dist/cli/auth-store.js.map +1 -0
  7. package/dist/cli/banner.d.ts +3 -0
  8. package/dist/cli/banner.d.ts.map +1 -0
  9. package/dist/cli/banner.js +38 -0
  10. package/dist/cli/banner.js.map +1 -0
  11. package/dist/cli/commands/action-eval.d.ts +3 -0
  12. package/dist/cli/commands/action-eval.d.ts.map +1 -0
  13. package/dist/cli/commands/action-eval.js +133 -0
  14. package/dist/cli/commands/action-eval.js.map +1 -0
  15. package/dist/cli/commands/auth.d.ts +3 -0
  16. package/dist/cli/commands/auth.d.ts.map +1 -0
  17. package/dist/cli/commands/auth.js +156 -0
  18. package/dist/cli/commands/auth.js.map +1 -0
  19. package/dist/cli/commands/cache.d.ts +3 -0
  20. package/dist/cli/commands/cache.d.ts.map +1 -0
  21. package/dist/cli/commands/cache.js +43 -0
  22. package/dist/cli/commands/cache.js.map +1 -0
  23. package/dist/cli/commands/ci.d.ts +3 -0
  24. package/dist/cli/commands/ci.d.ts.map +1 -0
  25. package/dist/cli/commands/ci.js +124 -0
  26. package/dist/cli/commands/ci.js.map +1 -0
  27. package/dist/cli/commands/conversations.d.ts +3 -0
  28. package/dist/cli/commands/conversations.d.ts.map +1 -0
  29. package/dist/cli/commands/conversations.js +89 -0
  30. package/dist/cli/commands/conversations.js.map +1 -0
  31. package/dist/cli/commands/diff.d.ts +3 -0
  32. package/dist/cli/commands/diff.d.ts.map +1 -0
  33. package/dist/cli/commands/diff.js +122 -0
  34. package/dist/cli/commands/diff.js.map +1 -0
  35. package/dist/cli/commands/doctor.d.ts +11 -0
  36. package/dist/cli/commands/doctor.d.ts.map +1 -0
  37. package/dist/cli/commands/doctor.js +308 -0
  38. package/dist/cli/commands/doctor.js.map +1 -0
  39. package/dist/cli/commands/eval.d.ts +3 -0
  40. package/dist/cli/commands/eval.d.ts.map +1 -0
  41. package/dist/cli/commands/eval.js +101 -0
  42. package/dist/cli/commands/eval.js.map +1 -0
  43. package/dist/cli/commands/init.d.ts +3 -0
  44. package/dist/cli/commands/init.d.ts.map +1 -0
  45. package/dist/cli/commands/init.js +182 -0
  46. package/dist/cli/commands/init.js.map +1 -0
  47. package/dist/cli/commands/list.d.ts +3 -0
  48. package/dist/cli/commands/list.d.ts.map +1 -0
  49. package/dist/cli/commands/list.js +80 -0
  50. package/dist/cli/commands/list.js.map +1 -0
  51. package/dist/cli/commands/mentions.d.ts +3 -0
  52. package/dist/cli/commands/mentions.d.ts.map +1 -0
  53. package/dist/cli/commands/mentions.js +125 -0
  54. package/dist/cli/commands/mentions.js.map +1 -0
  55. package/dist/cli/commands/org.d.ts +3 -0
  56. package/dist/cli/commands/org.d.ts.map +1 -0
  57. package/dist/cli/commands/org.js +196 -0
  58. package/dist/cli/commands/org.js.map +1 -0
  59. package/dist/cli/commands/postcall-eval.d.ts +3 -0
  60. package/dist/cli/commands/postcall-eval.d.ts.map +1 -0
  61. package/dist/cli/commands/postcall-eval.js +188 -0
  62. package/dist/cli/commands/postcall-eval.js.map +1 -0
  63. package/dist/cli/commands/render.d.ts +3 -0
  64. package/dist/cli/commands/render.d.ts.map +1 -0
  65. package/dist/cli/commands/render.js +223 -0
  66. package/dist/cli/commands/render.js.map +1 -0
  67. package/dist/cli/commands/results.d.ts +3 -0
  68. package/dist/cli/commands/results.d.ts.map +1 -0
  69. package/dist/cli/commands/results.js +128 -0
  70. package/dist/cli/commands/results.js.map +1 -0
  71. package/dist/cli/commands/scenarios.d.ts +3 -0
  72. package/dist/cli/commands/scenarios.d.ts.map +1 -0
  73. package/dist/cli/commands/scenarios.js +57 -0
  74. package/dist/cli/commands/scenarios.js.map +1 -0
  75. package/dist/cli/commands/start.d.ts +3 -0
  76. package/dist/cli/commands/start.d.ts.map +1 -0
  77. package/dist/cli/commands/start.js +260 -0
  78. package/dist/cli/commands/start.js.map +1 -0
  79. package/dist/cli/commands/status.d.ts +3 -0
  80. package/dist/cli/commands/status.d.ts.map +1 -0
  81. package/dist/cli/commands/status.js +133 -0
  82. package/dist/cli/commands/status.js.map +1 -0
  83. package/dist/cli/commands/sync.d.ts +3 -0
  84. package/dist/cli/commands/sync.d.ts.map +1 -0
  85. package/dist/cli/commands/sync.js +80 -0
  86. package/dist/cli/commands/sync.js.map +1 -0
  87. package/dist/cli/commands/view.d.ts +3 -0
  88. package/dist/cli/commands/view.d.ts.map +1 -0
  89. package/dist/cli/commands/view.js +29 -0
  90. package/dist/cli/commands/view.js.map +1 -0
  91. package/dist/cli/error-handler.d.ts +8 -0
  92. package/dist/cli/error-handler.d.ts.map +1 -0
  93. package/dist/cli/error-handler.js +133 -0
  94. package/dist/cli/error-handler.js.map +1 -0
  95. package/dist/cli/gateway.d.ts +14 -0
  96. package/dist/cli/gateway.d.ts.map +1 -0
  97. package/dist/cli/gateway.js +222 -0
  98. package/dist/cli/gateway.js.map +1 -0
  99. package/dist/cli/index.d.ts +3 -0
  100. package/dist/cli/index.d.ts.map +1 -0
  101. package/dist/cli/index.js +194 -0
  102. package/dist/cli/index.js.map +1 -0
  103. package/dist/core/action-eval-builder.d.ts +20 -0
  104. package/dist/core/action-eval-builder.d.ts.map +1 -0
  105. package/dist/core/action-eval-builder.js +276 -0
  106. package/dist/core/action-eval-builder.js.map +1 -0
  107. package/dist/core/agent-fetcher.d.ts +35 -0
  108. package/dist/core/agent-fetcher.d.ts.map +1 -0
  109. package/dist/core/agent-fetcher.js +81 -0
  110. package/dist/core/agent-fetcher.js.map +1 -0
  111. package/dist/core/api-cache.d.ts +11 -0
  112. package/dist/core/api-cache.d.ts.map +1 -0
  113. package/dist/core/api-cache.js +89 -0
  114. package/dist/core/api-cache.js.map +1 -0
  115. package/dist/core/config-generator.d.ts +26 -0
  116. package/dist/core/config-generator.d.ts.map +1 -0
  117. package/dist/core/config-generator.js +457 -0
  118. package/dist/core/config-generator.js.map +1 -0
  119. package/dist/core/conversation-loader.d.ts +21 -0
  120. package/dist/core/conversation-loader.d.ts.map +1 -0
  121. package/dist/core/conversation-loader.js +74 -0
  122. package/dist/core/conversation-loader.js.map +1 -0
  123. package/dist/core/dataset-loader.d.ts +26 -0
  124. package/dist/core/dataset-loader.d.ts.map +1 -0
  125. package/dist/core/dataset-loader.js +121 -0
  126. package/dist/core/dataset-loader.js.map +1 -0
  127. package/dist/core/disposition-builder.d.ts +38 -0
  128. package/dist/core/disposition-builder.d.ts.map +1 -0
  129. package/dist/core/disposition-builder.js +270 -0
  130. package/dist/core/disposition-builder.js.map +1 -0
  131. package/dist/core/eqho-client.d.ts +45 -0
  132. package/dist/core/eqho-client.d.ts.map +1 -0
  133. package/dist/core/eqho-client.js +154 -0
  134. package/dist/core/eqho-client.js.map +1 -0
  135. package/dist/core/greeting-builder.d.ts +18 -0
  136. package/dist/core/greeting-builder.d.ts.map +1 -0
  137. package/dist/core/greeting-builder.js +83 -0
  138. package/dist/core/greeting-builder.js.map +1 -0
  139. package/dist/core/postcall-simulator.d.ts +20 -0
  140. package/dist/core/postcall-simulator.d.ts.map +1 -0
  141. package/dist/core/postcall-simulator.js +212 -0
  142. package/dist/core/postcall-simulator.js.map +1 -0
  143. package/dist/core/prompt-assembler.d.ts +25 -0
  144. package/dist/core/prompt-assembler.d.ts.map +1 -0
  145. package/dist/core/prompt-assembler.js +185 -0
  146. package/dist/core/prompt-assembler.js.map +1 -0
  147. package/dist/core/promptfoo-runner.d.ts +13 -0
  148. package/dist/core/promptfoo-runner.d.ts.map +1 -0
  149. package/dist/core/promptfoo-runner.js +49 -0
  150. package/dist/core/promptfoo-runner.js.map +1 -0
  151. package/dist/core/provider-mapper.d.ts +39 -0
  152. package/dist/core/provider-mapper.d.ts.map +1 -0
  153. package/dist/core/provider-mapper.js +120 -0
  154. package/dist/core/provider-mapper.js.map +1 -0
  155. package/dist/core/template-engine.d.ts +10 -0
  156. package/dist/core/template-engine.d.ts.map +1 -0
  157. package/dist/core/template-engine.js +78 -0
  158. package/dist/core/template-engine.js.map +1 -0
  159. package/dist/core/tools-builder.d.ts +14 -0
  160. package/dist/core/tools-builder.d.ts.map +1 -0
  161. package/dist/core/tools-builder.js +208 -0
  162. package/dist/core/tools-builder.js.map +1 -0
  163. package/dist/index.d.ts +18 -0
  164. package/dist/index.d.ts.map +1 -0
  165. package/dist/index.js +16 -0
  166. package/dist/index.js.map +1 -0
  167. package/dist/types/config.d.ts +100 -0
  168. package/dist/types/config.d.ts.map +1 -0
  169. package/dist/types/config.js +2 -0
  170. package/dist/types/config.js.map +1 -0
  171. package/dist/types/eqho.d.ts +221 -0
  172. package/dist/types/eqho.d.ts.map +1 -0
  173. package/dist/types/eqho.js +2 -0
  174. package/dist/types/eqho.js.map +1 -0
  175. package/dist/types/helpers.d.ts +9 -0
  176. package/dist/types/helpers.d.ts.map +1 -0
  177. package/dist/types/helpers.js +8 -0
  178. package/dist/types/helpers.js.map +1 -0
  179. package/package.json +77 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-eval-builder.d.ts","sourceRoot":"","sources":["../../src/core/action-eval-builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EAAc,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGxD,MAAM,WAAW,eAAe;IAC9B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC7C,SAAS,EAAE,eAAe,CAAC;IAC3B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CAC5B,GAAG,eAAe,CAyElB"}
@@ -0,0 +1,276 @@
1
+ import yaml from "js-yaml";
2
+ import { buildToolsByExecutionType } from "./tools-builder.js";
3
+ import { formatTranscript } from "./disposition-builder.js";
4
+ import { injectProxy } from "./provider-mapper.js";
5
+ /**
6
+ * Generates a promptfoo eval config for testing live (in-call) action usage.
7
+ * Evaluates whether the model selects the correct tool and passes valid arguments
8
+ * given a system prompt and user message/transcript context.
9
+ */
10
+ export function generateActionEvalConfig(opts) {
11
+ const { assembled, actions, campaignName, calls, proxy } = opts;
12
+ const liveTools = buildToolsByExecutionType(actions, "live");
13
+ if (liveTools.length === 0) {
14
+ return {
15
+ "promptfooconfig.yaml": yaml.dump({
16
+ description: `${campaignName} — No live actions found`,
17
+ tests: [],
18
+ }, { lineWidth: 120 }),
19
+ };
20
+ }
21
+ const toolsFile = `tools/${assembled.agentSlug}-live.json`;
22
+ const promptFile = `prompts/${assembled.agentSlug}-live.json`;
23
+ const chatMessages = [
24
+ { role: "system", content: assembled.systemPrompt },
25
+ ...assembled.conversationSeeder,
26
+ { role: "user", content: "{{message}}" },
27
+ ];
28
+ const callTests = calls?.length
29
+ ? buildActionTestsFromCalls(calls, liveTools, actions)
30
+ : [];
31
+ const defaultTests = buildDefaultActionTests(liveTools, actions);
32
+ const tests = [...callTests, ...defaultTests];
33
+ const config = {
34
+ description: `${campaignName} — Live Action Eval (${assembled.agentName})`,
35
+ outputPath: [
36
+ "output/action-report.html",
37
+ "output/action-results.json",
38
+ ],
39
+ prompts: [
40
+ { id: `file://${promptFile}`, label: `${assembled.agentName} Live Actions` },
41
+ ],
42
+ providers: injectProxy([
43
+ {
44
+ id: "openai:chat:gpt-4.1-mini",
45
+ label: "GPT-4.1-mini",
46
+ config: { temperature: 0, tools: `file://${toolsFile}` },
47
+ },
48
+ {
49
+ id: "openai:chat:gpt-4.1",
50
+ label: "GPT-4.1",
51
+ config: { temperature: 0, tools: `file://${toolsFile}` },
52
+ },
53
+ ], proxy),
54
+ defaultTest: {
55
+ options: {
56
+ provider: injectProxy([{
57
+ id: "openai:chat:gpt-5-nano",
58
+ config: { temperature: 0 },
59
+ }], proxy)[0],
60
+ },
61
+ },
62
+ tests,
63
+ };
64
+ return {
65
+ "promptfooconfig.yaml": yaml.dump(config, {
66
+ lineWidth: 120,
67
+ noRefs: true,
68
+ quotingType: '"',
69
+ }),
70
+ [toolsFile]: JSON.stringify(liveTools, null, 2),
71
+ [promptFile]: JSON.stringify(chatMessages, null, 2),
72
+ };
73
+ }
74
+ function profileForAction(action) {
75
+ const slug = action.slug;
76
+ const name = action.name || slug;
77
+ switch (action.type) {
78
+ case "call_transfer":
79
+ case "custom_call_transfer":
80
+ return {
81
+ triggerMessage: "Can I talk to a real person? I want to be transferred to someone who can help.",
82
+ expectedTool: slug,
83
+ rubric: `The agent should use the ${name} action to transfer the call when a customer explicitly requests to speak with a human.`,
84
+ };
85
+ case "terminate_call":
86
+ return {
87
+ triggerMessage: "Okay thanks, goodbye.",
88
+ expectedTool: slug,
89
+ rubric: `The agent should use the ${name} action to end the call gracefully when the conversation is complete.`,
90
+ };
91
+ case "gcal_appointment_schedule":
92
+ return {
93
+ triggerMessage: "Let's schedule that for next Tuesday at 2pm Eastern time.",
94
+ expectedTool: slug,
95
+ rubric: `The agent should use the ${name} action with appropriate datetime parameters when a customer confirms an appointment.`,
96
+ };
97
+ case "gcal_get_free_slots":
98
+ case "gcal_check_busy_time":
99
+ return {
100
+ triggerMessage: "What times do you have available this week?",
101
+ expectedTool: slug,
102
+ rubric: `The agent should use the ${name} action to check calendar availability before suggesting appointment times.`,
103
+ };
104
+ case "gcal_cancel_appointment":
105
+ return {
106
+ triggerMessage: "I need to cancel my appointment that's scheduled.",
107
+ expectedTool: slug,
108
+ rubric: `The agent should use the ${name} action when a customer requests to cancel their appointment.`,
109
+ };
110
+ case "gcal_update_appointment":
111
+ return {
112
+ triggerMessage: "Can we reschedule my appointment to Thursday at 3pm instead?",
113
+ expectedTool: slug,
114
+ rubric: `The agent should use the ${name} action when a customer requests to modify their existing appointment.`,
115
+ };
116
+ case "set_lead_email":
117
+ return {
118
+ triggerMessage: "My email address is alex.thompson@example.com",
119
+ expectedTool: slug,
120
+ rubric: `The agent should use the ${name} action to capture the user's email address, correctly formatted.`,
121
+ };
122
+ case "set_lead_names":
123
+ return {
124
+ triggerMessage: "My name is Alex Thompson.",
125
+ expectedTool: slug,
126
+ rubric: `The agent should use the ${name} action to capture the user's first and last name.`,
127
+ };
128
+ case "set_lead_timezone":
129
+ return {
130
+ triggerMessage: "I'm in the Pacific timezone, so that's 3 hours behind Eastern.",
131
+ expectedTool: slug,
132
+ rubric: `The agent should use the ${name} action to set the lead's timezone.`,
133
+ };
134
+ case "webhook":
135
+ case "http_request":
136
+ default: {
137
+ const profile = inferProfileFromSlug(action);
138
+ return profile;
139
+ }
140
+ }
141
+ }
142
+ function buildDefaultActionTests(tools, actions) {
143
+ const tests = [];
144
+ const liveActions = actions.filter((a) => !a.execution_type || a.execution_type === "live");
145
+ tests.push({
146
+ description: "Actions — all tool calls have valid schemas",
147
+ vars: { message: "I'd like to get started, what information do you need from me?" },
148
+ assert: [{ type: "is-valid-openai-tools-call" }],
149
+ });
150
+ for (const action of liveActions) {
151
+ const profile = profileForAction(action);
152
+ if (!profile)
153
+ continue;
154
+ tests.push({
155
+ description: `Action — ${action.name || action.slug} trigger`,
156
+ vars: { message: profile.triggerMessage },
157
+ assert: [
158
+ { type: "is-valid-openai-tools-call" },
159
+ { type: "tool-call-f1", value: [profile.expectedTool] },
160
+ { type: "llm-rubric", value: profile.rubric },
161
+ ],
162
+ });
163
+ }
164
+ tests.push({
165
+ description: "Actions — no unnecessary tool calls for simple greeting",
166
+ vars: { message: "Hi there, how's your day going?" },
167
+ assert: [
168
+ {
169
+ type: "llm-rubric",
170
+ value: "For a casual greeting, the agent should NOT invoke any action tools. It should respond conversationally and guide the caller toward the main objective.",
171
+ },
172
+ ],
173
+ });
174
+ return tests;
175
+ }
176
+ function buildActionTestsFromCalls(calls, _tools, actions) {
177
+ const tests = [];
178
+ const liveActionSlugs = new Set(actions
179
+ .filter((a) => !a.execution_type || a.execution_type === "live")
180
+ .map((a) => a.slug));
181
+ for (const call of calls) {
182
+ if (!call.transcript?.length)
183
+ continue;
184
+ const conversationMsgs = call.transcript.filter((m) => m.role !== "Action" && m.role !== "action");
185
+ if (conversationMsgs.length < 3)
186
+ continue;
187
+ const actionMsgs = call.transcript.filter((m) => (m.role === "Action" || m.role === "action") &&
188
+ m.content?.startsWith("# TOOL-RESPONSE"));
189
+ const toolsUsed = new Set();
190
+ for (const msg of actionMsgs) {
191
+ for (const slug of liveActionSlugs) {
192
+ if (msg.content?.includes(slug)) {
193
+ toolsUsed.add(slug);
194
+ }
195
+ }
196
+ }
197
+ if (toolsUsed.size === 0)
198
+ continue;
199
+ const transcript = formatTranscript(call.transcript.map((m) => ({ role: m.role, content: m.content })));
200
+ const callId = (call.id || call._id || "unknown").slice(-6);
201
+ const summary = (call.call_summary || "").slice(0, 80);
202
+ const label = summary || call.lead?.first_name || "Real call";
203
+ const lastUserMsg = [...conversationMsgs]
204
+ .reverse()
205
+ .find((m) => m.role === "User" || m.role === "user");
206
+ const triggerMsg = lastUserMsg?.content || "Continue with the process.";
207
+ tests.push({
208
+ description: `Action (real call) — ${label} [${callId}]`,
209
+ vars: { message: triggerMsg },
210
+ assert: [
211
+ { type: "is-valid-openai-tools-call" },
212
+ {
213
+ type: "llm-rubric",
214
+ value: `Based on the conversation context, the agent should use one or more of these tools: ${[...toolsUsed].join(", ")}. The tool arguments should be reasonable and complete based on the information available. Transcript for reference:\n\n${transcript.slice(0, 2000)}`,
215
+ },
216
+ ],
217
+ });
218
+ }
219
+ return tests;
220
+ }
221
+ function inferProfileFromSlug(action) {
222
+ const slug = action.slug.toLowerCase();
223
+ const name = action.name || action.slug;
224
+ const instructions = (action.instructions || "").toLowerCase();
225
+ if (slug.includes("vehicle") || slug.includes("car_type")) {
226
+ return {
227
+ triggerMessage: "It's a 2020 Toyota Camry, silver color.",
228
+ expectedTool: action.slug,
229
+ rubric: `The agent should use the ${name} action when vehicle information is provided by the caller.`,
230
+ };
231
+ }
232
+ if (slug.includes("pickup") && (slug.includes("location") || slug.includes("lookup"))) {
233
+ return {
234
+ triggerMessage: "I'm broken down at 123 Main Street near the highway on-ramp.",
235
+ expectedTool: action.slug,
236
+ rubric: `The agent should use the ${name} action when a pickup location or address is provided.`,
237
+ };
238
+ }
239
+ if (slug.includes("dropoff") || slug.includes("destination")) {
240
+ return {
241
+ triggerMessage: "I need it towed to the mechanic shop at 456 Oak Avenue.",
242
+ expectedTool: action.slug,
243
+ rubric: `The agent should use the ${name} action when a dropoff or destination location is provided.`,
244
+ };
245
+ }
246
+ if (slug.includes("impound") || instructions.includes("impound")) {
247
+ return {
248
+ triggerMessage: "My car got towed and I need to find out about getting it back from impound.",
249
+ expectedTool: action.slug,
250
+ rubric: `The agent should use the ${name} action when a caller inquires about an impounded vehicle.`,
251
+ };
252
+ }
253
+ if (slug.includes("location") || slug.includes("gps") || slug.includes("obtain_user")) {
254
+ return {
255
+ triggerMessage: "I'm not sure exactly where I am, somewhere on the highway.",
256
+ expectedTool: action.slug,
257
+ rubric: `The agent should use the ${name} action when the caller cannot provide a precise location.`,
258
+ };
259
+ }
260
+ if (slug.includes("search") || slug.includes("lookup") || slug.includes("fetch")) {
261
+ return {
262
+ triggerMessage: "Can you look up my account? I called earlier today.",
263
+ expectedTool: action.slug,
264
+ rubric: `The agent should use the ${name} action to look up relevant information.`,
265
+ };
266
+ }
267
+ if (slug.includes("notify") || slug.includes("alert") || slug.includes("sms")) {
268
+ return {
269
+ triggerMessage: "Can you send me a text with the details?",
270
+ expectedTool: action.slug,
271
+ rubric: `The agent should use the ${name} action to send a notification or message.`,
272
+ };
273
+ }
274
+ return null;
275
+ }
276
+ //# sourceMappingURL=action-eval-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-eval-builder.js","sourceRoot":"","sources":["../../src/core/action-eval-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { EqhoClient } from "./eqho-client.js";
2
+ import type { FullAgent, EqhoCampaign, SystemPromptSection, ConversationSeederMessage } from "../types/eqho.js";
3
+ export interface FetchedAgentData {
4
+ agent: FullAgent;
5
+ systemPromptSections: SystemPromptSection[];
6
+ conversationSeeder: ConversationSeederMessage[];
7
+ }
8
+ /**
9
+ * Fetches complete agent data by calling both GET /v1/agents/{id} (for
10
+ * system_prompt, language, alias, etc.) and GET /v1/agents/{id}/details
11
+ * (for expanded roles, actions, scripts) in parallel.
12
+ */
13
+ export declare function fetchFullAgent(client: EqhoClient, agentId: string): Promise<FullAgent>;
14
+ /**
15
+ * Resolves system prompt sections by merging agent and campaign sections
16
+ * following eqho-ai's SystemPromptService logic:
17
+ * - If agent has sections and extend_sections=false, use agent only
18
+ * - If extend_sections=true (default), prepend campaign sections
19
+ */
20
+ export declare function resolveSystemPromptSections(agent: FullAgent, campaign: EqhoCampaign, callType?: "inbound" | "outbound"): {
21
+ sections: SystemPromptSection[];
22
+ seeder: ConversationSeederMessage[];
23
+ };
24
+ /**
25
+ * Fetches all agents for a campaign with error handling.
26
+ * Returns successful agents and logs failures instead of crashing.
27
+ */
28
+ export declare function fetchCampaignAgents(client: EqhoClient, campaign: EqhoCampaign, opts?: {
29
+ agentId?: string;
30
+ onProgress?: (msg: string) => void;
31
+ }): Promise<{
32
+ agents: FetchedAgentData[];
33
+ errors: string[];
34
+ }>;
35
+ //# sourceMappingURL=agent-fetcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-fetcher.d.ts","sourceRoot":"","sources":["../../src/core/agent-fetcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,mBAAmB,EACnB,yBAAyB,EAC1B,MAAM,kBAAkB,CAAC;AAG1B,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,SAAS,CAAC;IACjB,oBAAoB,EAAE,mBAAmB,EAAE,CAAC;IAC5C,kBAAkB,EAAE,yBAAyB,EAAE,CAAC;CACjD;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,SAAS,CAAC,CAepB;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,YAAY,EACtB,QAAQ,GAAE,SAAS,GAAG,UAAsB,GAC3C;IAAE,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAAC,MAAM,EAAE,yBAAyB,EAAE,CAAA;CAAE,CAiC1E;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,YAAY,EACtB,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAAO,GAClE,OAAO,CAAC;IAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA0B3D"}
@@ -0,0 +1,81 @@
1
+ import { EqhoApiError } from "./eqho-client.js";
2
+ /**
3
+ * Fetches complete agent data by calling both GET /v1/agents/{id} (for
4
+ * system_prompt, language, alias, etc.) and GET /v1/agents/{id}/details
5
+ * (for expanded roles, actions, scripts) in parallel.
6
+ */
7
+ export async function fetchFullAgent(client, agentId) {
8
+ const [basic, details] = await Promise.all([
9
+ client.getAgent(agentId),
10
+ client.getAgentDetails(agentId),
11
+ ]);
12
+ return {
13
+ ...basic,
14
+ roles: details.roles,
15
+ actions: details.actions,
16
+ scripts: details.scripts,
17
+ greetings: details.greetings,
18
+ greeting_type_inbound: details.greeting_type_inbound,
19
+ greeting_type_outbound: details.greeting_type_outbound,
20
+ };
21
+ }
22
+ /**
23
+ * Resolves system prompt sections by merging agent and campaign sections
24
+ * following eqho-ai's SystemPromptService logic:
25
+ * - If agent has sections and extend_sections=false, use agent only
26
+ * - If extend_sections=true (default), prepend campaign sections
27
+ */
28
+ export function resolveSystemPromptSections(agent, campaign, callType = "inbound") {
29
+ const agentSP = agent.system_prompt;
30
+ const campaignSP = campaign.system_prompt;
31
+ const agentSub = agentSP
32
+ ? agentSP[callType]
33
+ : undefined;
34
+ const campaignSub = campaignSP
35
+ ? campaignSP[callType]
36
+ : undefined;
37
+ let sections = agentSub?.sections ?? agentSP?.sections ?? [];
38
+ let seeder = agentSub?.structured_conversation_seeder ?? agentSP?.structured_conversation_seeder ?? [];
39
+ const extendSections = agentSub?.extend_sections !== false;
40
+ const extendSeeder = agentSub?.extend_conversation_seeder !== false;
41
+ const campaignSections = campaignSub?.sections ?? campaignSP?.sections ?? [];
42
+ const campaignSeeder = campaignSub?.structured_conversation_seeder ?? campaignSP?.structured_conversation_seeder ?? [];
43
+ if (extendSections && campaignSections.length) {
44
+ sections = [...campaignSections, ...sections];
45
+ }
46
+ if (extendSeeder && campaignSeeder.length) {
47
+ seeder = [...campaignSeeder, ...seeder];
48
+ }
49
+ return { sections, seeder };
50
+ }
51
+ /**
52
+ * Fetches all agents for a campaign with error handling.
53
+ * Returns successful agents and logs failures instead of crashing.
54
+ */
55
+ export async function fetchCampaignAgents(client, campaign, opts = {}) {
56
+ const agentIds = [];
57
+ if (opts.agentId) {
58
+ agentIds.push(opts.agentId);
59
+ }
60
+ else if (Array.isArray(campaign.agents)) {
61
+ for (const a of campaign.agents) {
62
+ agentIds.push(typeof a === "string" ? a : a.id || a._id || "");
63
+ }
64
+ }
65
+ const agents = [];
66
+ const errors = [];
67
+ for (const agentId of agentIds) {
68
+ opts.onProgress?.(`Fetching agent ${agentId}...`);
69
+ try {
70
+ const agent = await fetchFullAgent(client, agentId);
71
+ const { sections, seeder } = resolveSystemPromptSections(agent, campaign);
72
+ agents.push({ agent, systemPromptSections: sections, conversationSeeder: seeder });
73
+ }
74
+ catch (err) {
75
+ const msg = err instanceof EqhoApiError ? err.message : String(err);
76
+ errors.push(`Agent ${agentId}: ${msg}`);
77
+ }
78
+ }
79
+ return { agents, errors };
80
+ }
81
+ //# sourceMappingURL=agent-fetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-fetcher.js","sourceRoot":"","sources":["../../src/core/agent-fetcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare function getCached<T>(namespace: string, identifier: string): T | null;
2
+ export declare function setCache<T>(namespace: string, identifier: string, data: T, ttlMs?: number): void;
3
+ export declare function clearCache(): {
4
+ cleared: number;
5
+ };
6
+ export declare function cacheStats(): {
7
+ entries: number;
8
+ sizeBytes: number;
9
+ oldestMs: number | null;
10
+ };
11
+ //# sourceMappingURL=api-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-cache.d.ts","sourceRoot":"","sources":["../../src/core/api-cache.ts"],"names":[],"mappings":"AAyBA,wBAAgB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAc5E;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,SAAiB,GAAG,IAAI,CAKxG;AAED,wBAAgB,UAAU,IAAI;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAehD;AAED,wBAAgB,UAAU,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CA4B5F"}
@@ -0,0 +1,89 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import os from "node:os";
4
+ import crypto from "node:crypto";
5
+ const CACHE_DIR = path.join(os.homedir(), ".eqho-eval", "cache");
6
+ const DEFAULT_TTL_MS = 15 * 60 * 1000;
7
+ function ensureCacheDir() {
8
+ if (!fs.existsSync(CACHE_DIR)) {
9
+ fs.mkdirSync(CACHE_DIR, { recursive: true });
10
+ }
11
+ }
12
+ function cacheKey(namespace, identifier) {
13
+ const hash = crypto.createHash("sha256").update(`${namespace}:${identifier}`).digest("hex").slice(0, 16);
14
+ return path.join(CACHE_DIR, `${namespace}-${hash}.json`);
15
+ }
16
+ export function getCached(namespace, identifier) {
17
+ const file = cacheKey(namespace, identifier);
18
+ try {
19
+ if (!fs.existsSync(file))
20
+ return null;
21
+ const raw = fs.readFileSync(file, "utf-8");
22
+ const entry = JSON.parse(raw);
23
+ if (Date.now() - entry.timestamp > entry.ttl) {
24
+ fs.unlinkSync(file);
25
+ return null;
26
+ }
27
+ return entry.data;
28
+ }
29
+ catch {
30
+ return null;
31
+ }
32
+ }
33
+ export function setCache(namespace, identifier, data, ttlMs = DEFAULT_TTL_MS) {
34
+ ensureCacheDir();
35
+ const file = cacheKey(namespace, identifier);
36
+ const entry = { data, timestamp: Date.now(), ttl: ttlMs };
37
+ fs.writeFileSync(file, JSON.stringify(entry), "utf-8");
38
+ }
39
+ export function clearCache() {
40
+ let cleared = 0;
41
+ try {
42
+ if (!fs.existsSync(CACHE_DIR))
43
+ return { cleared: 0 };
44
+ const files = fs.readdirSync(CACHE_DIR);
45
+ for (const f of files) {
46
+ if (f.endsWith(".json")) {
47
+ fs.unlinkSync(path.join(CACHE_DIR, f));
48
+ cleared++;
49
+ }
50
+ }
51
+ }
52
+ catch {
53
+ // best-effort
54
+ }
55
+ return { cleared };
56
+ }
57
+ export function cacheStats() {
58
+ let entries = 0;
59
+ let sizeBytes = 0;
60
+ let oldestMs = null;
61
+ try {
62
+ if (!fs.existsSync(CACHE_DIR))
63
+ return { entries: 0, sizeBytes: 0, oldestMs: null };
64
+ const files = fs.readdirSync(CACHE_DIR);
65
+ for (const f of files) {
66
+ if (!f.endsWith(".json"))
67
+ continue;
68
+ const fp = path.join(CACHE_DIR, f);
69
+ const stat = fs.statSync(fp);
70
+ entries++;
71
+ sizeBytes += stat.size;
72
+ try {
73
+ const raw = fs.readFileSync(fp, "utf-8");
74
+ const entry = JSON.parse(raw);
75
+ const age = Date.now() - entry.timestamp;
76
+ if (oldestMs === null || age > oldestMs)
77
+ oldestMs = age;
78
+ }
79
+ catch {
80
+ // skip
81
+ }
82
+ }
83
+ }
84
+ catch {
85
+ // best-effort
86
+ }
87
+ return { entries, sizeBytes, oldestMs };
88
+ }
89
+ //# sourceMappingURL=api-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-cache.js","sourceRoot":"","sources":["../../src/core/api-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { AssembledPrompt } from "../types/config.js";
2
+ import type { GreetingConfig } from "./greeting-builder.js";
3
+ import type { ProxyConfig } from "./provider-mapper.js";
4
+ export interface GeneratedFiles {
5
+ "promptfooconfig.yaml": string;
6
+ [key: string]: string;
7
+ }
8
+ interface GenerateOptions {
9
+ prompts: AssembledPrompt[];
10
+ campaignId: string;
11
+ campaignName: string;
12
+ providers?: ProviderConfig[];
13
+ proxy?: ProxyConfig | null;
14
+ multiTurn?: boolean;
15
+ extraTests?: Array<Record<string, unknown>>;
16
+ greetingConfig?: GreetingConfig;
17
+ agentName?: string;
18
+ }
19
+ interface ProviderConfig {
20
+ id: string;
21
+ label: string;
22
+ config?: Record<string, unknown>;
23
+ }
24
+ export declare function generateConfig(options: GenerateOptions): GeneratedFiles;
25
+ export {};
26
+ //# sourceMappingURL=config-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-generator.d.ts","sourceRoot":"","sources":["../../src/core/config-generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAc,MAAM,oBAAoB,CAAC;AAEtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,WAAW,cAAc;IAC7B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7B,KAAK,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5C,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAQD,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,CAwJvE"}