@wayai/cli 0.2.38 → 0.2.40
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.
- package/dist/commands/analytics.d.ts +12 -0
- package/dist/commands/analytics.js +225 -0
- package/dist/commands/analytics.js.map +1 -0
- package/dist/commands/conversations.d.ts +3 -0
- package/dist/commands/conversations.js +95 -1
- package/dist/commands/conversations.js.map +1 -1
- package/dist/commands/eval-results.d.ts +10 -0
- package/dist/commands/eval-results.js +158 -0
- package/dist/commands/eval-results.js.map +1 -0
- package/dist/commands/evals.d.ts +9 -0
- package/dist/commands/evals.js +40 -0
- package/dist/commands/evals.js.map +1 -0
- package/dist/commands/run-eval.d.ts +11 -0
- package/dist/commands/run-eval.js +85 -0
- package/dist/commands/run-eval.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/api-client.d.ts +224 -0
- package/dist/lib/api-client.js +47 -0
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/eval-format.d.ts +27 -0
- package/dist/lib/eval-format.js +32 -0
- package/dist/lib/eval-format.js.map +1 -0
- package/dist/lib/utils.d.ts +14 -0
- package/dist/lib/utils.js +75 -0
- package/dist/lib/utils.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* wayai analytics — show analytics summary and metrics for the current hub
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* wayai analytics # summary for last 7d
|
|
6
|
+
* wayai analytics --period 30d # summary for last 30 days
|
|
7
|
+
* wayai analytics --from 2026-01-01 --to 2026-01-31 # explicit date range
|
|
8
|
+
* wayai analytics --metric tokens_total,first_response_time
|
|
9
|
+
* wayai analytics --list-metrics # list available metrics
|
|
10
|
+
* wayai analytics --json # raw JSON output
|
|
11
|
+
*/
|
|
12
|
+
export declare function analyticsCommand(args: string[]): Promise<void>;
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* wayai analytics — show analytics summary and metrics for the current hub
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* wayai analytics # summary for last 7d
|
|
6
|
+
* wayai analytics --period 30d # summary for last 30 days
|
|
7
|
+
* wayai analytics --from 2026-01-01 --to 2026-01-31 # explicit date range
|
|
8
|
+
* wayai analytics --metric tokens_total,first_response_time
|
|
9
|
+
* wayai analytics --list-metrics # list available metrics
|
|
10
|
+
* wayai analytics --json # raw JSON output
|
|
11
|
+
*/
|
|
12
|
+
import { requireAuth } from '../lib/auth.js';
|
|
13
|
+
import { requireRepoConfig } from '../lib/repo-config.js';
|
|
14
|
+
import { ApiClient } from '../lib/api-client.js';
|
|
15
|
+
import { parsePeriod, parseDateArg } from '../lib/utils.js';
|
|
16
|
+
export async function analyticsCommand(args) {
|
|
17
|
+
const { config, accessToken } = await requireAuth();
|
|
18
|
+
const repoConfig = requireRepoConfig();
|
|
19
|
+
// Parse args
|
|
20
|
+
let period;
|
|
21
|
+
let from;
|
|
22
|
+
let to;
|
|
23
|
+
let metricNames;
|
|
24
|
+
let listMetrics = false;
|
|
25
|
+
let jsonOutput = false;
|
|
26
|
+
for (let i = 0; i < args.length; i++) {
|
|
27
|
+
const arg = args[i];
|
|
28
|
+
if (arg === '--period') {
|
|
29
|
+
if (i + 1 >= args.length) {
|
|
30
|
+
console.error('--period requires a value');
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
period = args[++i];
|
|
34
|
+
}
|
|
35
|
+
else if (arg === '--from') {
|
|
36
|
+
if (i + 1 >= args.length) {
|
|
37
|
+
console.error('--from requires a value');
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
from = args[++i];
|
|
41
|
+
}
|
|
42
|
+
else if (arg === '--to') {
|
|
43
|
+
if (i + 1 >= args.length) {
|
|
44
|
+
console.error('--to requires a value');
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
to = args[++i];
|
|
48
|
+
}
|
|
49
|
+
else if (arg === '--metric') {
|
|
50
|
+
if (i + 1 >= args.length) {
|
|
51
|
+
console.error('--metric requires a value');
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
metricNames = args[++i].split(',').map((s) => s.trim()).filter(Boolean);
|
|
55
|
+
}
|
|
56
|
+
else if (arg === '--list-metrics') {
|
|
57
|
+
listMetrics = true;
|
|
58
|
+
}
|
|
59
|
+
else if (arg === '--json') {
|
|
60
|
+
jsonOutput = true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const client = new ApiClient({ apiUrl: config.api_url, accessToken });
|
|
64
|
+
// --list-metrics: fetch and display available variables
|
|
65
|
+
if (listMetrics) {
|
|
66
|
+
const result = await client.getAnalyticsVariables(repoConfig.hub_id);
|
|
67
|
+
if (jsonOutput) {
|
|
68
|
+
console.log(JSON.stringify(result.data, null, 2));
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
printVariablesByCategory(result.data);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// Validate --from/--to pair
|
|
75
|
+
if ((from && !to) || (!from && to)) {
|
|
76
|
+
console.error('--from and --to must both be provided together.');
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
// Compute time interval
|
|
80
|
+
let start;
|
|
81
|
+
let end;
|
|
82
|
+
let periodicity;
|
|
83
|
+
try {
|
|
84
|
+
if (from && to) {
|
|
85
|
+
start = parseDateArg(from, 'from');
|
|
86
|
+
end = parseDateArg(to, 'to');
|
|
87
|
+
if (new Date(start).getTime() >= new Date(end).getTime()) {
|
|
88
|
+
console.error('--from must be before --to.');
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
// Infer periodicity from range length
|
|
92
|
+
const rangeMs = new Date(end).getTime() - new Date(start).getTime();
|
|
93
|
+
const rangeDays = rangeMs / (1000 * 60 * 60 * 24);
|
|
94
|
+
if (rangeDays > 365)
|
|
95
|
+
periodicity = 'yearly';
|
|
96
|
+
else if (rangeDays > 90)
|
|
97
|
+
periodicity = 'monthly';
|
|
98
|
+
else if (rangeDays > 14)
|
|
99
|
+
periodicity = 'weekly';
|
|
100
|
+
else
|
|
101
|
+
periodicity = 'daily';
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
const parsed = parsePeriod(period || '7d');
|
|
105
|
+
start = parsed.start;
|
|
106
|
+
end = parsed.end;
|
|
107
|
+
periodicity = parsed.periodicity;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
// Resolve metric names → variable IDs
|
|
115
|
+
let selectedVariables = [];
|
|
116
|
+
let variableNameMap;
|
|
117
|
+
if (metricNames && metricNames.length > 0) {
|
|
118
|
+
const varsResult = await client.getAnalyticsVariables(repoConfig.hub_id);
|
|
119
|
+
const allVars = Object.values(varsResult.data.variablesByCategory).flat();
|
|
120
|
+
variableNameMap = new Map(allVars.map((v) => [v.variable_id, v.variable_name]));
|
|
121
|
+
const notFound = [];
|
|
122
|
+
for (const name of metricNames) {
|
|
123
|
+
const match = allVars.find((v) => v.variable_name === name);
|
|
124
|
+
if (match) {
|
|
125
|
+
selectedVariables.push(match.variable_id);
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
notFound.push(name);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (notFound.length > 0) {
|
|
132
|
+
const available = allVars.map((v) => v.variable_name).sort();
|
|
133
|
+
console.error(`Unknown metric(s): ${notFound.join(', ')}`);
|
|
134
|
+
console.error(`\nAvailable metrics:\n ${available.join('\n ')}`);
|
|
135
|
+
process.exit(1);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Fetch analytics data
|
|
139
|
+
const result = await client.getAnalyticsData({
|
|
140
|
+
hub_id: repoConfig.hub_id,
|
|
141
|
+
selected_variables: selectedVariables,
|
|
142
|
+
time_interval: { start, end },
|
|
143
|
+
periodicity,
|
|
144
|
+
trend_analysis: false,
|
|
145
|
+
include_summary: true,
|
|
146
|
+
});
|
|
147
|
+
if (jsonOutput) {
|
|
148
|
+
console.log(JSON.stringify(result, null, 2));
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
// Format output
|
|
152
|
+
const label = from && to
|
|
153
|
+
? `${from} to ${to}`
|
|
154
|
+
: `last ${period || '7d'}`;
|
|
155
|
+
console.log(`Hub Analytics (${label})\n`);
|
|
156
|
+
// Summary section
|
|
157
|
+
if (result.summary) {
|
|
158
|
+
const s = result.summary;
|
|
159
|
+
console.log('Summary:');
|
|
160
|
+
console.log(` Total conversations: ${s.total_conversations}`);
|
|
161
|
+
console.log(` AI-only rate: ${(s.ai_only_rate * 100).toFixed(1)}%`);
|
|
162
|
+
console.log(` Avg response time: ${formatMinutes(s.avg_response_time)}`);
|
|
163
|
+
console.log(` AI response time: ${formatMinutes(s.assistant_response_time)}`);
|
|
164
|
+
console.log(` Support response time: ${formatMinutes(s.support_response_time)}`);
|
|
165
|
+
if (s.threshold1_minutes) {
|
|
166
|
+
console.log(` SLA (< ${s.threshold1_minutes}min): ${(s.rate_under_threshold1 * 100).toFixed(1)}%`);
|
|
167
|
+
console.log(` SLA (< ${s.threshold2_minutes}min): ${(s.rate_under_threshold2 * 100).toFixed(1)}%`);
|
|
168
|
+
console.log(` SLA (< ${s.threshold3_minutes}min): ${(s.rate_under_threshold3 * 100).toFixed(1)}%`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// Metrics section
|
|
172
|
+
if (result.analytics && result.analytics.length > 0) {
|
|
173
|
+
console.log('\nMetrics:');
|
|
174
|
+
for (const item of result.analytics) {
|
|
175
|
+
const name = variableNameMap?.get(item.variable_id) || item.variable;
|
|
176
|
+
console.log(` ${name}:`);
|
|
177
|
+
if (item.type === 'numeric' && item.metrics) {
|
|
178
|
+
const m = item.metrics;
|
|
179
|
+
const parts = [];
|
|
180
|
+
parts.push(`Average: ${fmt(m.average)}`);
|
|
181
|
+
if (m.median !== undefined)
|
|
182
|
+
parts.push(`Median: ${fmt(m.median)}`);
|
|
183
|
+
parts.push(`Min: ${fmt(m.minimum)}`);
|
|
184
|
+
parts.push(`Max: ${fmt(m.maximum)}`);
|
|
185
|
+
if (m.count !== undefined)
|
|
186
|
+
parts.push(`Count: ${m.count}`);
|
|
187
|
+
console.log(` ${parts.join(' ')}`);
|
|
188
|
+
}
|
|
189
|
+
else if (item.type === 'categorical' && item.distribution) {
|
|
190
|
+
for (const [cat, count] of Object.entries(item.distribution)) {
|
|
191
|
+
console.log(` ${cat}: ${count}`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
function printVariablesByCategory(data) {
|
|
198
|
+
console.log('Analytics Variables\n');
|
|
199
|
+
for (const category of data.categories) {
|
|
200
|
+
const variables = data.variablesByCategory[category.category] || [];
|
|
201
|
+
console.log(`${category.label} (${category.variableCount}):`);
|
|
202
|
+
if (variables.length === 0) {
|
|
203
|
+
console.log(' (none)\n');
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
for (const v of variables) {
|
|
207
|
+
const desc = v.variable_description ? ` — ${v.variable_description}` : '';
|
|
208
|
+
console.log(` ${v.variable_name} (${v.variable_type})${desc}`);
|
|
209
|
+
}
|
|
210
|
+
console.log('');
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
function formatMinutes(minutes) {
|
|
214
|
+
if (minutes == null)
|
|
215
|
+
return 'N/A';
|
|
216
|
+
if (minutes < 1)
|
|
217
|
+
return `${(minutes * 60).toFixed(1)}s`;
|
|
218
|
+
return `${minutes.toFixed(1)}min`;
|
|
219
|
+
}
|
|
220
|
+
function fmt(n) {
|
|
221
|
+
if (n == null)
|
|
222
|
+
return 'N/A';
|
|
223
|
+
return Number.isInteger(n) ? String(n) : n.toFixed(2);
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/commands/analytics.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,5 +5,8 @@
|
|
|
5
5
|
* wayai conversations # list conversations
|
|
6
6
|
* wayai conversations <conversation_id> # show detail + messages
|
|
7
7
|
* wayai conversations --status ended # filter by status
|
|
8
|
+
* wayai conversations --period 7d # analytics-powered list
|
|
9
|
+
* wayai conversations --from 2026-01-01 --to 2026-01-31
|
|
10
|
+
* wayai conversations --json # raw JSON output
|
|
8
11
|
*/
|
|
9
12
|
export declare function conversationsCommand(args: string[]): Promise<void>;
|
|
@@ -5,10 +5,14 @@
|
|
|
5
5
|
* wayai conversations # list conversations
|
|
6
6
|
* wayai conversations <conversation_id> # show detail + messages
|
|
7
7
|
* wayai conversations --status ended # filter by status
|
|
8
|
+
* wayai conversations --period 7d # analytics-powered list
|
|
9
|
+
* wayai conversations --from 2026-01-01 --to 2026-01-31
|
|
10
|
+
* wayai conversations --json # raw JSON output
|
|
8
11
|
*/
|
|
9
12
|
import { requireAuth } from '../lib/auth.js';
|
|
10
13
|
import { requireRepoConfig } from '../lib/repo-config.js';
|
|
11
14
|
import { ApiClient } from '../lib/api-client.js';
|
|
15
|
+
import { parsePeriod, parseDateArg } from '../lib/utils.js';
|
|
12
16
|
export async function conversationsCommand(args) {
|
|
13
17
|
const { config, accessToken } = await requireAuth();
|
|
14
18
|
const repoConfig = requireRepoConfig();
|
|
@@ -17,6 +21,10 @@ export async function conversationsCommand(args) {
|
|
|
17
21
|
let conversationId;
|
|
18
22
|
let limit;
|
|
19
23
|
let offset;
|
|
24
|
+
let period;
|
|
25
|
+
let from;
|
|
26
|
+
let to;
|
|
27
|
+
let jsonOutput = false;
|
|
20
28
|
for (let i = 0; i < args.length; i++) {
|
|
21
29
|
const arg = args[i];
|
|
22
30
|
if (arg === '--status') {
|
|
@@ -35,14 +43,43 @@ export async function conversationsCommand(args) {
|
|
|
35
43
|
else if (arg === '--offset') {
|
|
36
44
|
offset = parseInt(args[++i], 10);
|
|
37
45
|
}
|
|
46
|
+
else if (arg === '--period') {
|
|
47
|
+
if (i + 1 >= args.length) {
|
|
48
|
+
console.error('--period requires a value');
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
period = args[++i];
|
|
52
|
+
}
|
|
53
|
+
else if (arg === '--from') {
|
|
54
|
+
if (i + 1 >= args.length) {
|
|
55
|
+
console.error('--from requires a value');
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
from = args[++i];
|
|
59
|
+
}
|
|
60
|
+
else if (arg === '--to') {
|
|
61
|
+
if (i + 1 >= args.length) {
|
|
62
|
+
console.error('--to requires a value');
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
to = args[++i];
|
|
66
|
+
}
|
|
67
|
+
else if (arg === '--json') {
|
|
68
|
+
jsonOutput = true;
|
|
69
|
+
}
|
|
38
70
|
else if (!arg.startsWith('-')) {
|
|
39
71
|
conversationId = arg;
|
|
40
72
|
}
|
|
41
73
|
}
|
|
42
74
|
const client = new ApiClient({ apiUrl: config.api_url, accessToken });
|
|
75
|
+
const hasAnalyticsFlags = !!(period || from || to);
|
|
43
76
|
if (conversationId) {
|
|
44
77
|
// Show detail
|
|
45
78
|
const result = await client.getConversation(repoConfig.hub_id, conversationId, { limit, offset });
|
|
79
|
+
if (jsonOutput) {
|
|
80
|
+
console.log(JSON.stringify(result, null, 2));
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
46
83
|
console.log(`Conversation: ${result.conversation.conversation_id}`);
|
|
47
84
|
console.log(`Status: ${result.conversation.conversation_status}`);
|
|
48
85
|
if (result.conversation.kanban_status) {
|
|
@@ -61,9 +98,66 @@ export async function conversationsCommand(args) {
|
|
|
61
98
|
console.log('');
|
|
62
99
|
}
|
|
63
100
|
}
|
|
101
|
+
else if (hasAnalyticsFlags) {
|
|
102
|
+
// Analytics-powered list
|
|
103
|
+
if (status) {
|
|
104
|
+
console.error('The --status flag is not supported with --period/--from/--to. Without these flags, --status works as before.');
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
if ((from && !to) || (!from && to)) {
|
|
108
|
+
console.error('--from and --to must both be provided together.');
|
|
109
|
+
process.exit(1);
|
|
110
|
+
}
|
|
111
|
+
let start;
|
|
112
|
+
let end;
|
|
113
|
+
try {
|
|
114
|
+
if (from && to) {
|
|
115
|
+
start = parseDateArg(from, 'from');
|
|
116
|
+
end = parseDateArg(to, 'to');
|
|
117
|
+
if (new Date(start).getTime() >= new Date(end).getTime()) {
|
|
118
|
+
console.error('--from must be before --to.');
|
|
119
|
+
process.exit(1);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
const parsed = parsePeriod(period || '7d');
|
|
124
|
+
start = parsed.start;
|
|
125
|
+
end = parsed.end;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
132
|
+
const result = await client.getAnalyticsConversations({
|
|
133
|
+
hub_id: repoConfig.hub_id,
|
|
134
|
+
time_interval: { start, end },
|
|
135
|
+
limit: limit ?? 50,
|
|
136
|
+
offset: offset ?? 0,
|
|
137
|
+
});
|
|
138
|
+
if (jsonOutput) {
|
|
139
|
+
console.log(JSON.stringify(result, null, 2));
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
if (result.conversations.length === 0) {
|
|
143
|
+
console.log('No conversations found.');
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
console.log(`Conversations (${result.conversations.length} of ${result.total}):\n`);
|
|
147
|
+
for (const conv of result.conversations) {
|
|
148
|
+
const participant = conv.participant_name || conv.participant_phone || 'unknown';
|
|
149
|
+
const updated = conv.updated_at ? new Date(conv.updated_at).toLocaleString() : '-';
|
|
150
|
+
const msgs = conv.message_count != null ? `${conv.message_count} msgs` : '';
|
|
151
|
+
console.log(` ${conv.conversation_id} ${participant.padEnd(20)} ${msgs.padEnd(10)} ${updated}`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
64
154
|
else {
|
|
65
|
-
//
|
|
155
|
+
// Original list path (backward compat)
|
|
66
156
|
const result = await client.getConversations(repoConfig.hub_id, { status, limit, offset });
|
|
157
|
+
if (jsonOutput) {
|
|
158
|
+
console.log(JSON.stringify(result, null, 2));
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
67
161
|
if (result.conversations.length === 0) {
|
|
68
162
|
console.log('No conversations found.');
|
|
69
163
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversations.js","sourceRoot":"","sources":["../../src/commands/conversations.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"conversations.js","sourceRoot":"","sources":["../../src/commands/conversations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* wayai eval-results — view results from a completed eval session
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* wayai eval-results --session <id> # show aggregate results
|
|
6
|
+
* wayai eval-results --session <id> --runs # show individual run details
|
|
7
|
+
* wayai eval-results --session <id> --json # raw JSON output
|
|
8
|
+
* wayai eval-results --eval "Test Greeting" # latest session results for an eval
|
|
9
|
+
*/
|
|
10
|
+
export declare function evalResultsCommand(args: string[]): Promise<void>;
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* wayai eval-results — view results from a completed eval session
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* wayai eval-results --session <id> # show aggregate results
|
|
6
|
+
* wayai eval-results --session <id> --runs # show individual run details
|
|
7
|
+
* wayai eval-results --session <id> --json # raw JSON output
|
|
8
|
+
* wayai eval-results --eval "Test Greeting" # latest session results for an eval
|
|
9
|
+
*/
|
|
10
|
+
import { requireAuth } from '../lib/auth.js';
|
|
11
|
+
import { requireRepoConfig } from '../lib/repo-config.js';
|
|
12
|
+
import { ApiClient } from '../lib/api-client.js';
|
|
13
|
+
import { printResultsTable } from '../lib/eval-format.js';
|
|
14
|
+
export async function evalResultsCommand(args) {
|
|
15
|
+
const { config, accessToken } = await requireAuth();
|
|
16
|
+
const repoConfig = requireRepoConfig();
|
|
17
|
+
// Parse args
|
|
18
|
+
let sessionId;
|
|
19
|
+
let evalName;
|
|
20
|
+
let showRuns = false;
|
|
21
|
+
let jsonOutput = false;
|
|
22
|
+
for (let i = 0; i < args.length; i++) {
|
|
23
|
+
const arg = args[i];
|
|
24
|
+
if (arg === '--session') {
|
|
25
|
+
if (i + 1 >= args.length) {
|
|
26
|
+
console.error('--session requires a value');
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
sessionId = args[++i];
|
|
30
|
+
}
|
|
31
|
+
else if (arg === '--eval') {
|
|
32
|
+
if (i + 1 >= args.length) {
|
|
33
|
+
console.error('--eval requires a value');
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
evalName = args[++i];
|
|
37
|
+
}
|
|
38
|
+
else if (arg === '--runs') {
|
|
39
|
+
showRuns = true;
|
|
40
|
+
}
|
|
41
|
+
else if (arg === '--json') {
|
|
42
|
+
jsonOutput = true;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (!sessionId && !evalName) {
|
|
46
|
+
console.error('Usage: wayai eval-results --session <id> [--runs] [--json]');
|
|
47
|
+
console.error(' wayai eval-results --eval <name> [--runs] [--json]');
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
const client = new ApiClient({ apiUrl: config.api_url, accessToken });
|
|
51
|
+
// If --eval, find the latest completed session containing that eval
|
|
52
|
+
if (evalName && !sessionId) {
|
|
53
|
+
sessionId = await findLatestSessionForEval(client, repoConfig.hub_id, evalName);
|
|
54
|
+
}
|
|
55
|
+
if (!sessionId) {
|
|
56
|
+
// findLatestSessionForEval already printed the error
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (showRuns) {
|
|
60
|
+
await showRunDetails(client, sessionId, evalName, jsonOutput);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
await showAggregateResults(client, sessionId, jsonOutput);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function findLatestSessionForEval(client, hubId, evalName) {
|
|
67
|
+
// Fetch evals and completed sessions in parallel
|
|
68
|
+
const [evalsResult, sessionsResult] = await Promise.all([
|
|
69
|
+
client.getEvals(hubId),
|
|
70
|
+
client.getEvalSessions(hubId, { status: 'completed' }),
|
|
71
|
+
]);
|
|
72
|
+
const matchingEval = evalsResult.data.evals.find((e) => e.eval_name.toLowerCase() === evalName.toLowerCase());
|
|
73
|
+
if (!matchingEval) {
|
|
74
|
+
console.error(`Eval "${evalName}" not found in this hub.`);
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
const completedSessions = sessionsResult.data.sessions;
|
|
78
|
+
if (completedSessions.length === 0) {
|
|
79
|
+
console.error('No completed sessions found for this hub.');
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
// Sessions are ordered by created_at desc, so first match is the latest
|
|
83
|
+
for (const session of completedSessions) {
|
|
84
|
+
const details = await client.getEvalSessionDetails(session.eval_session_id);
|
|
85
|
+
const hasEval = details.data.results.some((r) => r.eval_fk === matchingEval.eval_id);
|
|
86
|
+
if (hasEval) {
|
|
87
|
+
return session.eval_session_id;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
console.error(`No completed session found containing eval "${evalName}".`);
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
async function showAggregateResults(client, sessionId, jsonOutput) {
|
|
94
|
+
const details = await client.getEvalSessionDetails(sessionId);
|
|
95
|
+
if (jsonOutput) {
|
|
96
|
+
console.log(JSON.stringify(details.data, null, 2));
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const session = details.data.session;
|
|
100
|
+
const results = details.data.results;
|
|
101
|
+
console.log(`Session: ${session.session_name} (${session.session_status})`);
|
|
102
|
+
if (session.started_at) {
|
|
103
|
+
console.log(`Started: ${new Date(session.started_at).toLocaleString()}`);
|
|
104
|
+
}
|
|
105
|
+
if (session.completed_at && session.started_at) {
|
|
106
|
+
const durationMs = new Date(session.completed_at).getTime() - new Date(session.started_at).getTime();
|
|
107
|
+
console.log(`Duration: ${(durationMs / 1000).toFixed(0)}s`);
|
|
108
|
+
}
|
|
109
|
+
console.log('');
|
|
110
|
+
printResultsTable(results, 'detailed');
|
|
111
|
+
}
|
|
112
|
+
async function showRunDetails(client, sessionId, evalNameFilter, jsonOutput) {
|
|
113
|
+
// Fetch session details (for header + eval name resolution) once
|
|
114
|
+
const details = await client.getEvalSessionDetails(sessionId);
|
|
115
|
+
// If filtering by eval name, resolve eval_id from the already-fetched details
|
|
116
|
+
let evalId;
|
|
117
|
+
if (evalNameFilter) {
|
|
118
|
+
const matchingResult = details.data.results.find((r) => r.eval?.eval_name?.toLowerCase() === evalNameFilter.toLowerCase());
|
|
119
|
+
if (matchingResult) {
|
|
120
|
+
evalId = matchingResult.eval_fk;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const runsResult = await client.getEvalSessionRuns(sessionId, { evalId });
|
|
124
|
+
if (jsonOutput) {
|
|
125
|
+
console.log(JSON.stringify(runsResult.data, null, 2));
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
console.log(`Session: ${details.data.session.session_name} (${details.data.session.session_status})\n`);
|
|
129
|
+
if (runsResult.data.runs.length === 0) {
|
|
130
|
+
console.log('No runs found.');
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
for (const run of runsResult.data.runs) {
|
|
134
|
+
const evalName = run.eval?.eval_name || run.eval_fk.slice(0, 8);
|
|
135
|
+
const status = run.response_match === true ? 'PASS' : run.response_match === false ? 'FAIL' : 'PENDING';
|
|
136
|
+
const time = run.execution_time_ms != null ? `(${(run.execution_time_ms / 1000).toFixed(1)}s)` : '';
|
|
137
|
+
console.log(`${evalName} — Run #${run.run_number} [${status}] ${time}`);
|
|
138
|
+
if (run.eval_response?.content) {
|
|
139
|
+
console.log(` Response: "${truncate(run.eval_response.content, 80)}"`);
|
|
140
|
+
}
|
|
141
|
+
if (run.response_comment) {
|
|
142
|
+
console.log(` Comment: ${run.response_comment}`);
|
|
143
|
+
}
|
|
144
|
+
if (run.scores && Object.keys(run.scores).length > 0) {
|
|
145
|
+
const scoresStr = Object.entries(run.scores)
|
|
146
|
+
.map(([key, val]) => `${key}: ${Math.round(val * 100)}%`)
|
|
147
|
+
.join(', ');
|
|
148
|
+
console.log(` Scores: ${scoresStr}`);
|
|
149
|
+
}
|
|
150
|
+
console.log('');
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
function truncate(str, maxLen) {
|
|
154
|
+
if (str.length <= maxLen)
|
|
155
|
+
return str;
|
|
156
|
+
return str.slice(0, maxLen - 3) + '...';
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=eval-results.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval-results.js","sourceRoot":"","sources":["../../src/commands/eval-results.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* wayai evals — list evaluation scenarios for the current hub
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* wayai evals # list all evals
|
|
6
|
+
* wayai evals --enabled # show only enabled evals
|
|
7
|
+
* wayai evals --disabled # show only disabled evals
|
|
8
|
+
*/
|
|
9
|
+
export declare function evalsCommand(args: string[]): Promise<void>;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* wayai evals — list evaluation scenarios for the current hub
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* wayai evals # list all evals
|
|
6
|
+
* wayai evals --enabled # show only enabled evals
|
|
7
|
+
* wayai evals --disabled # show only disabled evals
|
|
8
|
+
*/
|
|
9
|
+
import { requireAuth } from '../lib/auth.js';
|
|
10
|
+
import { requireRepoConfig } from '../lib/repo-config.js';
|
|
11
|
+
import { ApiClient } from '../lib/api-client.js';
|
|
12
|
+
export async function evalsCommand(args) {
|
|
13
|
+
const { config, accessToken } = await requireAuth();
|
|
14
|
+
const repoConfig = requireRepoConfig();
|
|
15
|
+
// Parse args
|
|
16
|
+
let enabledFilter;
|
|
17
|
+
for (let i = 0; i < args.length; i++) {
|
|
18
|
+
const arg = args[i];
|
|
19
|
+
if (arg === '--enabled') {
|
|
20
|
+
enabledFilter = 'true';
|
|
21
|
+
}
|
|
22
|
+
else if (arg === '--disabled') {
|
|
23
|
+
enabledFilter = 'false';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const client = new ApiClient({ apiUrl: config.api_url, accessToken });
|
|
27
|
+
const result = await client.getEvals(repoConfig.hub_id, { enabled: enabledFilter });
|
|
28
|
+
if (result.data.evals.length === 0) {
|
|
29
|
+
console.log('No evals found.');
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
console.log(`Evals (${result.data.evals.length}):\n`);
|
|
33
|
+
for (const eval_ of result.data.evals) {
|
|
34
|
+
const status = eval_.enabled ? 'enabled' : 'disabled';
|
|
35
|
+
const runs = `${eval_.number_of_runs} run${eval_.number_of_runs === 1 ? '' : 's'}`;
|
|
36
|
+
const agentName = eval_.agent?.agent_name || 'unknown';
|
|
37
|
+
console.log(` ${eval_.eval_name.padEnd(20)} ${eval_.eval_id.slice(0, 8)} ${status.padEnd(9)} ${runs.padEnd(7)} Agent: ${agentName}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=evals.js.map
|