@inkeep/agents-manage-ui 0.1.0 → 0.1.2

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 (43) hide show
  1. package/{.env.sample → .env.example} +6 -1
  2. package/.turbo/turbo-build.log +27 -33
  3. package/.turbo/turbo-test.log +43 -10
  4. package/LICENSE.md +49 -0
  5. package/package.json +16 -16
  6. package/src/app/api/signoz/conversations/[conversationId]/route.ts +43 -4
  7. package/src/app/api/signoz/route.ts +8 -6
  8. package/src/components/api-keys/form/api-key-form.tsx +2 -0
  9. package/src/components/api-keys/form/validation.ts +1 -1
  10. package/src/components/artifact-components/form/artifact-component-form.tsx +5 -0
  11. package/src/components/artifact-components/form/validation.ts +3 -3
  12. package/src/components/credentials/views/credential-form-validation.ts +1 -1
  13. package/src/components/credentials/views/credential-form.tsx +2 -0
  14. package/src/components/credentials/views/edit-credential-form.tsx +1 -1
  15. package/src/components/credentials/views/generic-auth-form.tsx +1 -1
  16. package/src/components/data-components/form/data-component-form.tsx +10 -1
  17. package/src/components/data-components/form/validation.ts +3 -2
  18. package/src/components/form/expandable-field.tsx +6 -1
  19. package/src/components/form/form-field-wrapper.tsx +3 -1
  20. package/src/components/form/generic-combo-box.tsx +3 -1
  21. package/src/components/form/generic-input.tsx +9 -1
  22. package/src/components/form/generic-select.tsx +3 -1
  23. package/src/components/form/generic-textarea.tsx +3 -1
  24. package/src/components/form/json-schema-input.tsx +9 -1
  25. package/src/components/graph/playground/chat-widget.tsx +30 -1
  26. package/src/components/graph/playground/playground.tsx +7 -1
  27. package/src/components/graph/sidepane/metadata/metadata-editor.tsx +38 -38
  28. package/src/components/graph/sidepane/nodes/agent-node-editor.tsx +22 -8
  29. package/src/components/graph/sidepane/nodes/expandable-text-area.tsx +3 -1
  30. package/src/components/graph/sidepane/nodes/form-fields.tsx +10 -1
  31. package/src/components/mcp-servers/form/mcp-server-form.tsx +8 -1
  32. package/src/components/mcp-servers/form/validation.ts +1 -1
  33. package/src/components/projects/edit-project-dialog.tsx +1 -1
  34. package/src/components/projects/form/project-form.tsx +3 -0
  35. package/src/components/projects/form/validation.ts +14 -10
  36. package/src/components/projects/new-project-dialog.tsx +1 -1
  37. package/src/components/traces/timeline/timeline-wrapper.tsx +117 -28
  38. package/src/components/ui/alert.tsx +66 -0
  39. package/src/components/ui/form.tsx +11 -4
  40. package/src/hooks/use-chat-activities-polling.ts +44 -11
  41. package/src/lib/api/signoz-stats.ts +958 -304
  42. package/src/lib/types/graph-full.ts +1 -1
  43. package/src/lib/validation.ts +1 -1
@@ -1,12 +1,26 @@
1
- import { z } from 'zod';
2
- import { SPAN_KEYS, AI_OPERATIONS, SPAN_NAMES, QUERY_FIELD_CONFIGS, UNKNOWN_VALUE, AI_TOOL_TYPES, OPERATORS, QUERY_EXPRESSIONS, REDUCE_OPERATIONS, ORDER_DIRECTIONS, QUERY_DEFAULTS, DATA_SOURCES, AGGREGATE_OPERATORS, QUERY_TYPES, PANEL_TYPES } from '@/constants/signoz';
3
1
  import axios from 'axios';
4
2
  import axiosRetry from 'axios-retry';
3
+ import { z } from 'zod/v4';
4
+ import {
5
+ AGGREGATE_OPERATORS,
6
+ AI_OPERATIONS,
7
+ AI_TOOL_TYPES,
8
+ DATA_SOURCES,
9
+ OPERATORS,
10
+ ORDER_DIRECTIONS,
11
+ PANEL_TYPES,
12
+ QUERY_DEFAULTS,
13
+ QUERY_EXPRESSIONS,
14
+ QUERY_FIELD_CONFIGS,
15
+ QUERY_TYPES,
16
+ REDUCE_OPERATIONS,
17
+ SPAN_KEYS,
18
+ SPAN_NAMES,
19
+ UNKNOWN_VALUE,
20
+ } from '@/constants/signoz';
5
21
 
6
22
  // ---------- String Constants for Type Safety
7
23
 
8
-
9
-
10
24
  export interface ConversationStats {
11
25
  conversationId: string;
12
26
  tenantId: string;
@@ -22,7 +36,7 @@ export interface ConversationStats {
22
36
  totalErrors: number;
23
37
  hasErrors: boolean;
24
38
  firstUserMessage?: string;
25
- startTime?: number;
39
+ startTime?: number;
26
40
  }
27
41
 
28
42
  export interface PaginatedConversationStats {
@@ -43,12 +57,22 @@ export interface SpanFilterOptions {
43
57
  key: string;
44
58
  value: string;
45
59
  operator?:
46
- | '=' | '!=' | '<' | '>' | '<=' | '>='
47
- | 'in' | 'nin'
48
- | 'contains' | 'ncontains'
49
- | 'regex' | 'nregex'
50
- | 'like' | 'nlike'
51
- | 'exists' | 'nexists';
60
+ | '='
61
+ | '!='
62
+ | '<'
63
+ | '>'
64
+ | '<='
65
+ | '>='
66
+ | 'in'
67
+ | 'nin'
68
+ | 'contains'
69
+ | 'ncontains'
70
+ | 'regex'
71
+ | 'nregex'
72
+ | 'like'
73
+ | 'nlike'
74
+ | 'exists'
75
+ | 'nexists';
52
76
  }[];
53
77
  }
54
78
 
@@ -56,15 +80,10 @@ export interface SpanFilterOptions {
56
80
 
57
81
  const nsToMs = (ns: number) => Math.floor(ns / 1_000_000);
58
82
 
59
- const asNumberIfNumeric = (v: string) =>
60
- /^-?\d+(\.\d+)?$/.test(v) ? Number(v) : v;
83
+ const asNumberIfNumeric = (v: string) => (/^-?\d+(\.\d+)?$/.test(v) ? Number(v) : v);
61
84
 
62
85
  // Type-safe filter value schema and parser
63
- const FilterValueSchema = z.union([
64
- z.string(),
65
- z.number(),
66
- z.boolean(),
67
- ]);
86
+ const FilterValueSchema = z.union([z.string(), z.number(), z.boolean()]);
68
87
 
69
88
  type FilterValue = z.infer<typeof FilterValueSchema>;
70
89
 
@@ -77,13 +96,13 @@ const asTypedFilterValue = (v: string): FilterValue => {
77
96
  if (v === 'false') {
78
97
  return FilterValueSchema.parse(false);
79
98
  }
80
-
99
+
81
100
  // Handle numeric values with validation
82
101
  const numericValue = asNumberIfNumeric(v);
83
102
  if (typeof numericValue === 'number') {
84
103
  return FilterValueSchema.parse(numericValue);
85
104
  }
86
-
105
+
87
106
  // Return as validated string
88
107
  return FilterValueSchema.parse(v);
89
108
  } catch (error) {
@@ -101,26 +120,30 @@ const countFromSeries = (s: Series) => parseInt(s.values?.[0]?.value ?? '0', 10)
101
120
  const numberFromSeries = (s: Series) => Number(s.values?.[0]?.value ?? 0) || 0;
102
121
 
103
122
  const datesRange = (startMs: number, endMs: number) => {
104
- const start = new Date(startMs); start.setHours(0, 0, 0, 0);
105
- const end = new Date(endMs); end.setHours(0, 0, 0, 0);
123
+ const start = new Date(startMs);
124
+ start.setHours(0, 0, 0, 0);
125
+ const end = new Date(endMs);
126
+ end.setHours(0, 0, 0, 0);
106
127
  const out: string[] = [];
107
128
  for (let d = new Date(start); d <= end; d.setDate(d.getDate() + 1)) {
108
- out.push(`${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`);
129
+ out.push(
130
+ `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`
131
+ );
109
132
  }
110
133
  return out;
111
134
  };
112
135
 
113
136
  // ---------- Client
114
137
 
115
- axiosRetry(axios, {
138
+ axiosRetry(axios, {
116
139
  retries: 3,
117
- retryDelay: axiosRetry.exponentialDelay
140
+ retryDelay: axiosRetry.exponentialDelay,
118
141
  });
119
142
 
120
143
  class SigNozStatsAPI {
121
144
  private async makeRequest<T = any>(payload: any): Promise<T> {
122
145
  const response = await axios.post<T>('/api/signoz', payload, {
123
- timeout: 30000,
146
+ timeout: 30000,
124
147
  headers: {
125
148
  'Content-Type': 'application/json',
126
149
  },
@@ -141,30 +164,36 @@ class SigNozStatsAPI {
141
164
  filters?: SpanFilterOptions,
142
165
  projectId?: string,
143
166
  pagination?: { page: number; limit: number },
144
- searchQuery?: string,
167
+ searchQuery?: string
145
168
  ): Promise<ConversationStats[] | PaginatedConversationStats> {
146
169
  try {
147
170
  const payload = this.buildCombinedPayload(startTime, endTime, filters, projectId);
148
171
  const resp = await this.makeRequest(payload);
149
172
 
150
- const toolsSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.TOOLS);
151
- const transfersSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.TRANSFERS);
152
- const delegationsSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.DELEGATIONS);
153
- const aiCallsSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.AI_CALLS);
154
- const lastActivitySeries = this.extractSeries(resp, QUERY_EXPRESSIONS.LAST_ACTIVITY);
155
- const metadataSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.CONVERSATION_METADATA);
156
- const contextErrorsSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.CONTEXT_ERRORS);
157
- const agentGenerationErrorsSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.AGENT_GENERATION_ERRORS);
158
- const userMessagesSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.USER_MESSAGES);
173
+ const toolsSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.TOOLS);
174
+ const transfersSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.TRANSFERS);
175
+ const delegationsSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.DELEGATIONS);
176
+ const aiCallsSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.AI_CALLS);
177
+ const lastActivitySeries = this.extractSeries(resp, QUERY_EXPRESSIONS.LAST_ACTIVITY);
178
+ const metadataSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.CONVERSATION_METADATA);
179
+ const contextErrorsSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.CONTEXT_ERRORS);
180
+ const agentGenerationErrorsSeries = this.extractSeries(
181
+ resp,
182
+ QUERY_EXPRESSIONS.AGENT_GENERATION_ERRORS
183
+ );
184
+ const userMessagesSeries = this.extractSeries(resp, QUERY_EXPRESSIONS.USER_MESSAGES);
159
185
 
160
186
  // metadata map
161
- const metaByConv = new Map<string, { tenantId: string; graphId: string; graphName: string }>();
187
+ const metaByConv = new Map<
188
+ string,
189
+ { tenantId: string; graphId: string; graphName: string }
190
+ >();
162
191
  for (const s of metadataSeries) {
163
192
  const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID];
164
193
  if (!id) continue;
165
194
  metaByConv.set(id, {
166
195
  tenantId: s.labels?.[SPAN_KEYS.TENANT_ID] ?? UNKNOWN_VALUE,
167
- graphId: s.labels?.[SPAN_KEYS.GRAPH_ID] ?? UNKNOWN_VALUE,
196
+ graphId: s.labels?.[SPAN_KEYS.GRAPH_ID] ?? UNKNOWN_VALUE,
168
197
  graphName: s.labels?.[SPAN_KEYS.GRAPH_NAME] ?? UNKNOWN_VALUE,
169
198
  });
170
199
  }
@@ -185,7 +214,7 @@ class SigNozStatsAPI {
185
214
  const content = s.labels?.[SPAN_KEYS.MESSAGE_CONTENT];
186
215
  const t = numberFromSeries(s);
187
216
  if (!id || !content) continue;
188
- (msgsByConv.get(id) ?? msgsByConv.set(id, []).get(id)!) .push({ t, c: content });
217
+ (msgsByConv.get(id) ?? msgsByConv.set(id, []).get(id)!).push({ t, c: content });
189
218
  }
190
219
  for (const [id, arr] of msgsByConv) {
191
220
  arr.sort((a, b) => a.t - b.t);
@@ -198,8 +227,14 @@ class SigNozStatsAPI {
198
227
 
199
228
  // build stats
200
229
  let stats = this.toConversationStats(
201
- toolsSeries, transfersSeries, delegationsSeries, aiCallsSeries,
202
- metaByConv, contextErrorsSeries, agentGenerationErrorsSeries, firstMsgByConv,
230
+ toolsSeries,
231
+ transfersSeries,
232
+ delegationsSeries,
233
+ aiCallsSeries,
234
+ metaByConv,
235
+ contextErrorsSeries,
236
+ agentGenerationErrorsSeries,
237
+ firstMsgByConv
203
238
  );
204
239
 
205
240
  // optional secondary filter pass via span filters
@@ -210,15 +245,18 @@ class SigNozStatsAPI {
210
245
  // search filter
211
246
  if (searchQuery?.trim()) {
212
247
  const q = searchQuery.toLowerCase().trim();
213
- stats = stats.filter(s =>
214
- s.firstUserMessage?.toLowerCase().includes(q) ||
215
- s.conversationId.toLowerCase().includes(q) ||
216
- s.graphId.toLowerCase().includes(q),
248
+ stats = stats.filter(
249
+ (s) =>
250
+ s.firstUserMessage?.toLowerCase().includes(q) ||
251
+ s.conversationId.toLowerCase().includes(q) ||
252
+ s.graphId.toLowerCase().includes(q)
217
253
  );
218
254
  }
219
255
 
220
256
  // sort by last activity
221
- stats.sort((a, b) => byMostRecent(lastSeen.get(a.conversationId), lastSeen.get(b.conversationId)));
257
+ stats.sort((a, b) =>
258
+ byMostRecent(lastSeen.get(a.conversationId), lastSeen.get(b.conversationId))
259
+ );
222
260
 
223
261
  if (!pagination) return stats;
224
262
 
@@ -231,7 +269,10 @@ class SigNozStatsAPI {
231
269
  return {
232
270
  data,
233
271
  pagination: {
234
- page, limit, total, totalPages,
272
+ page,
273
+ limit,
274
+ total,
275
+ totalPages,
235
276
  hasNextPage: page < totalPages,
236
277
  hasPreviousPage: page > 1,
237
278
  },
@@ -244,7 +285,9 @@ class SigNozStatsAPI {
244
285
 
245
286
  async getAICallsByGraph(startTime: number, endTime: number, projectId?: string) {
246
287
  try {
247
- const resp = await this.makeRequest(this.buildCombinedPayload(startTime, endTime, undefined, projectId));
288
+ const resp = await this.makeRequest(
289
+ this.buildCombinedPayload(startTime, endTime, undefined, projectId)
290
+ );
248
291
  const series = this.extractSeries(resp, QUERY_EXPRESSIONS.AI_CALLS);
249
292
  const totals = new Map<string, number>();
250
293
  for (const s of series) {
@@ -252,24 +295,36 @@ class SigNozStatsAPI {
252
295
  const count = countFromSeries(s);
253
296
  if (count) totals.set(graphId, (totals.get(graphId) || 0) + count);
254
297
  }
255
- return [...totals].map(([graphId, totalCalls]) => ({ graphId, totalCalls }))
256
- .sort((a, b) => b.totalCalls - a.totalCalls);
298
+ return [...totals]
299
+ .map(([graphId, totalCalls]) => ({ graphId, totalCalls }))
300
+ .sort((a, b) => b.totalCalls - a.totalCalls);
257
301
  } catch (e) {
258
302
  console.error('getAICallsByGraph error:', e);
259
303
  return [];
260
304
  }
261
305
  }
262
306
 
263
- async getAICallsByAgent(startTime: number, endTime: number, graphId?: string, modelId?: string, projectId?: string) {
307
+ async getAICallsByAgent(
308
+ startTime: number,
309
+ endTime: number,
310
+ graphId?: string,
311
+ modelId?: string,
312
+ projectId?: string
313
+ ) {
264
314
  try {
265
- const resp = await this.makeRequest(this.buildAgentModelBreakdownPayload(startTime, endTime, projectId));
315
+ const resp = await this.makeRequest(
316
+ this.buildAgentModelBreakdownPayload(startTime, endTime, projectId)
317
+ );
266
318
  const series = this.extractSeries(resp, 'agentModelCalls');
267
- const acc = new Map<string, { agentId: string; graphId: string; modelId: string; totalCalls: number }>();
319
+ const acc = new Map<
320
+ string,
321
+ { agentId: string; graphId: string; modelId: string; totalCalls: number }
322
+ >();
268
323
 
269
324
  for (const s of series) {
270
325
  const agent = s.labels?.[SPAN_KEYS.AI_TELEMETRY_FUNCTION_ID] || UNKNOWN_VALUE;
271
- const gId = s.labels?.[SPAN_KEYS.GRAPH_ID] || UNKNOWN_VALUE;
272
- const mId = s.labels?.[SPAN_KEYS.AI_MODEL_ID] || UNKNOWN_VALUE;
326
+ const gId = s.labels?.[SPAN_KEYS.GRAPH_ID] || UNKNOWN_VALUE;
327
+ const mId = s.labels?.[SPAN_KEYS.AI_MODEL_ID] || UNKNOWN_VALUE;
273
328
  const count = countFromSeries(s);
274
329
 
275
330
  if (!count) continue;
@@ -288,9 +343,16 @@ class SigNozStatsAPI {
288
343
  }
289
344
  }
290
345
 
291
- async getAICallsByModel(startTime: number, endTime: number, graphId?: string, projectId?: string) {
346
+ async getAICallsByModel(
347
+ startTime: number,
348
+ endTime: number,
349
+ graphId?: string,
350
+ projectId?: string
351
+ ) {
292
352
  try {
293
- const resp = await this.makeRequest(this.buildModelBreakdownPayload(startTime, endTime, projectId));
353
+ const resp = await this.makeRequest(
354
+ this.buildModelBreakdownPayload(startTime, endTime, projectId)
355
+ );
294
356
  const series = this.extractSeries(resp, 'modelCalls');
295
357
  const totals = new Map<string, number>();
296
358
 
@@ -303,8 +365,9 @@ class SigNozStatsAPI {
303
365
  totals.set(mId, (totals.get(mId) || 0) + count);
304
366
  }
305
367
 
306
- return [...totals].map(([modelId, totalCalls]) => ({ modelId, totalCalls }))
307
- .sort((a, b) => b.totalCalls - a.totalCalls);
368
+ return [...totals]
369
+ .map(([modelId, totalCalls]) => ({ modelId, totalCalls }))
370
+ .sort((a, b) => b.totalCalls - a.totalCalls);
308
371
  } catch (e) {
309
372
  console.error('getAICallsByModel error:', e);
310
373
  return [];
@@ -313,13 +376,15 @@ class SigNozStatsAPI {
313
376
 
314
377
  async getUniqueGraphs(startTime: number, endTime: number, projectId?: string) {
315
378
  try {
316
- const resp = await this.makeRequest(this.buildUniqueGraphsPayload(startTime, endTime, projectId));
379
+ const resp = await this.makeRequest(
380
+ this.buildUniqueGraphsPayload(startTime, endTime, projectId)
381
+ );
317
382
  const series = this.extractSeries(resp, 'uniqueGraphs');
318
383
  const graphs = series
319
- .map(s => s.labels?.[SPAN_KEYS.GRAPH_ID])
384
+ .map((s) => s.labels?.[SPAN_KEYS.GRAPH_ID])
320
385
  .filter((id): id is string => Boolean(id) && id !== UNKNOWN_VALUE)
321
386
  .sort();
322
- return [...new Set(graphs)];
387
+ return [...new Set(graphs)];
323
388
  } catch (e) {
324
389
  console.error('getUniqueGraphs error:', e);
325
390
  return [];
@@ -328,28 +393,42 @@ class SigNozStatsAPI {
328
393
 
329
394
  async getUniqueModels(startTime: number, endTime: number, projectId?: string) {
330
395
  try {
331
- const resp = await this.makeRequest(this.buildUniqueModelsPayload(startTime, endTime, projectId));
396
+ const resp = await this.makeRequest(
397
+ this.buildUniqueModelsPayload(startTime, endTime, projectId)
398
+ );
332
399
  const series = this.extractSeries(resp, 'uniqueModels');
333
400
  const models = series
334
- .map(s => s.labels?.[SPAN_KEYS.AI_MODEL_ID])
401
+ .map((s) => s.labels?.[SPAN_KEYS.AI_MODEL_ID])
335
402
  .filter((id): id is string => Boolean(id) && id !== UNKNOWN_VALUE)
336
403
  .sort();
337
- return [...new Set(models)];
404
+ return [...new Set(models)];
338
405
  } catch (e) {
339
406
  console.error('getUniqueModels error:', e);
340
407
  return [];
341
408
  }
342
409
  }
343
410
 
344
- async getConversationsPerDay(startTime: number, endTime: number, graphId?: string, projectId?: string) {
411
+ async getConversationsPerDay(
412
+ startTime: number,
413
+ endTime: number,
414
+ graphId?: string,
415
+ projectId?: string
416
+ ) {
345
417
  try {
346
418
  // 1) which conversations exist?
347
- const metaResp = await this.makeRequest(this.buildConversationMetadataPayload(startTime, endTime, graphId, projectId));
419
+ const metaResp = await this.makeRequest(
420
+ this.buildConversationMetadataPayload(startTime, endTime, graphId, projectId)
421
+ );
348
422
  const metaSeries = this.extractSeries(metaResp, 'conversationMetadata');
349
423
 
350
424
  // 2) if any, fetch their last activity
351
425
  const activitySeries = metaSeries.length
352
- ? this.extractSeries(await this.makeRequest(this.buildConversationActivityPayload(startTime, endTime, graphId, projectId)), 'lastActivity')
426
+ ? this.extractSeries(
427
+ await this.makeRequest(
428
+ this.buildConversationActivityPayload(startTime, endTime, graphId, projectId)
429
+ ),
430
+ 'lastActivity'
431
+ )
353
432
  : [];
354
433
 
355
434
  const buckets = new Map<string, number>();
@@ -361,35 +440,58 @@ class SigNozStatsAPI {
361
440
  buckets.set(key, (buckets.get(key) || 0) + 1);
362
441
  }
363
442
 
364
- return datesRange(startTime, endTime).map(date => ({ date, count: buckets.get(date) || 0 }));
443
+ return datesRange(startTime, endTime).map((date) => ({
444
+ date,
445
+ count: buckets.get(date) || 0,
446
+ }));
365
447
  } catch (e) {
366
448
  console.error('getConversationsPerDay error:', e);
367
- return datesRange(startTime, endTime).map(date => ({ date, count: 0 }));
449
+ return datesRange(startTime, endTime).map((date) => ({ date, count: 0 }));
368
450
  }
369
451
  }
370
452
 
371
- async getAggregateStats(startTime: number, endTime: number, filters?: SpanFilterOptions, projectId?: string) {
453
+ async getAggregateStats(
454
+ startTime: number,
455
+ endTime: number,
456
+ filters?: SpanFilterOptions,
457
+ projectId?: string
458
+ ) {
372
459
  try {
373
- const resp = await this.makeRequest(this.buildCombinedPayload(startTime, endTime, filters, projectId));
374
-
375
- const toolsSeries = this.extractSeries(resp, 'tools');
376
- const transfersSeries = this.extractSeries(resp, 'transfers');
377
- const delegationsSeries = this.extractSeries(resp, 'delegations');
378
- const aiCallsSeries = this.extractSeries(resp, 'aiCalls');
379
- const metadataSeries = this.extractSeries(resp, 'conversationMetadata');
380
- const contextErrSeries = this.extractSeries(resp, 'contextErrors');
381
- const agentGenErrSeries = this.extractSeries(resp, 'agentGenerationErrors');
460
+ const resp = await this.makeRequest(
461
+ this.buildCombinedPayload(startTime, endTime, filters, projectId)
462
+ );
382
463
 
383
- const metaByConv = new Map<string, { tenantId: string; graphId: string; graphName: string }>();
464
+ const toolsSeries = this.extractSeries(resp, 'tools');
465
+ const transfersSeries = this.extractSeries(resp, 'transfers');
466
+ const delegationsSeries = this.extractSeries(resp, 'delegations');
467
+ const aiCallsSeries = this.extractSeries(resp, 'aiCalls');
468
+ const metadataSeries = this.extractSeries(resp, 'conversationMetadata');
469
+ const contextErrSeries = this.extractSeries(resp, 'contextErrors');
470
+ const agentGenErrSeries = this.extractSeries(resp, 'agentGenerationErrors');
471
+
472
+ const metaByConv = new Map<
473
+ string,
474
+ { tenantId: string; graphId: string; graphName: string }
475
+ >();
384
476
  for (const s of metadataSeries) {
385
477
  const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID];
386
478
  if (!id) continue;
387
- metaByConv.set(id, { tenantId: s.labels?.[SPAN_KEYS.TENANT_ID] ?? UNKNOWN_VALUE, graphId: s.labels?.[SPAN_KEYS.GRAPH_ID] ?? UNKNOWN_VALUE, graphName: s.labels?.[SPAN_KEYS.GRAPH_NAME] ?? UNKNOWN_VALUE });
479
+ metaByConv.set(id, {
480
+ tenantId: s.labels?.[SPAN_KEYS.TENANT_ID] ?? UNKNOWN_VALUE,
481
+ graphId: s.labels?.[SPAN_KEYS.GRAPH_ID] ?? UNKNOWN_VALUE,
482
+ graphName: s.labels?.[SPAN_KEYS.GRAPH_NAME] ?? UNKNOWN_VALUE,
483
+ });
388
484
  }
389
485
 
390
486
  let stats = this.toConversationStats(
391
- toolsSeries, transfersSeries, delegationsSeries, aiCallsSeries,
392
- metaByConv, contextErrSeries, agentGenErrSeries, new Map<string, { content: string; timestamp: number }>(),
487
+ toolsSeries,
488
+ transfersSeries,
489
+ delegationsSeries,
490
+ aiCallsSeries,
491
+ metaByConv,
492
+ contextErrSeries,
493
+ agentGenErrSeries,
494
+ new Map<string, { content: string; timestamp: number }>()
393
495
  );
394
496
 
395
497
  if (filters?.spanName || filters?.attributes?.length) {
@@ -397,46 +499,82 @@ class SigNozStatsAPI {
397
499
  }
398
500
 
399
501
  return {
400
- totalToolCalls: stats.reduce((s, r) => s + r.totalToolCalls, 0),
401
- totalTransfers: stats.reduce((s, r) => s + r.totalTransfers, 0),
502
+ totalToolCalls: stats.reduce((s, r) => s + r.totalToolCalls, 0),
503
+ totalTransfers: stats.reduce((s, r) => s + r.totalTransfers, 0),
402
504
  totalDelegations: stats.reduce((s, r) => s + r.totalDelegations, 0),
403
505
  totalConversations: stats.length,
404
- totalAICalls: stats.reduce((s, r) => s + r.totalAICalls, 0),
506
+ totalAICalls: stats.reduce((s, r) => s + r.totalAICalls, 0),
405
507
  };
406
508
  } catch (e) {
407
509
  console.error('getAggregateStats error:', e);
408
- return { totalToolCalls: 0, totalTransfers: 0, totalDelegations: 0, totalConversations: 0, totalAICalls: 0 };
510
+ return {
511
+ totalToolCalls: 0,
512
+ totalTransfers: 0,
513
+ totalDelegations: 0,
514
+ totalConversations: 0,
515
+ totalAICalls: 0,
516
+ };
409
517
  }
410
518
  }
411
519
 
412
- async getAvailableSpanNames(startTime: number, endTime: number, graphId?: string, projectId?: string) {
520
+ async getAvailableSpanNames(
521
+ startTime: number,
522
+ endTime: number,
523
+ graphId?: string,
524
+ projectId?: string
525
+ ) {
413
526
  try {
414
527
  const filterItems: any[] = [
415
- { key: { key: SPAN_KEYS.NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN }, op: OPERATORS.EXISTS, value: '' },
528
+ {
529
+ key: { key: SPAN_KEYS.NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
530
+ op: OPERATORS.EXISTS,
531
+ value: '',
532
+ },
416
533
  ];
417
534
  if (graphId && graphId !== 'all') {
418
- filterItems.push({ key: { key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EQUALS, value: graphId });
535
+ filterItems.push({
536
+ key: { key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
537
+ op: OPERATORS.EQUALS,
538
+ value: graphId,
539
+ });
419
540
  }
420
541
  if (projectId) {
421
- filterItems.push({ key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EQUALS, value: projectId });
542
+ filterItems.push({
543
+ key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
544
+ op: OPERATORS.EQUALS,
545
+ value: projectId,
546
+ });
422
547
  }
423
548
 
424
549
  const payload = {
425
- start: startTime, end: endTime, step: QUERY_DEFAULTS.STEP, variables: {},
550
+ start: startTime,
551
+ end: endTime,
552
+ step: QUERY_DEFAULTS.STEP,
553
+ variables: {},
426
554
  compositeQuery: {
427
- queryType: QUERY_TYPES.BUILDER, panelType: PANEL_TYPES.LIST,
555
+ queryType: QUERY_TYPES.BUILDER,
556
+ panelType: PANEL_TYPES.LIST,
428
557
  builderQueries: {
429
558
  spanNames: {
430
- dataSource: DATA_SOURCES.TRACES, queryName: QUERY_EXPRESSIONS.SPAN_NAMES,
431
- aggregateOperator: AGGREGATE_OPERATORS.NOOP, aggregateAttribute: {},
559
+ dataSource: DATA_SOURCES.TRACES,
560
+ queryName: QUERY_EXPRESSIONS.SPAN_NAMES,
561
+ aggregateOperator: AGGREGATE_OPERATORS.NOOP,
562
+ aggregateAttribute: {},
432
563
  filters: { op: OPERATORS.AND, items: filterItems },
433
564
  selectColumns: [{ key: SPAN_KEYS.NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN }],
434
- expression: QUERY_EXPRESSIONS.SPAN_NAMES, disabled: QUERY_DEFAULTS.DISABLED, having: QUERY_DEFAULTS.HAVING,
435
- stepInterval: QUERY_DEFAULTS.STEP_INTERVAL, limit: QUERY_DEFAULTS.LIMIT_1000, orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }], groupBy: QUERY_DEFAULTS.EMPTY_GROUP_BY, offset: QUERY_DEFAULTS.OFFSET,
565
+ expression: QUERY_EXPRESSIONS.SPAN_NAMES,
566
+ disabled: QUERY_DEFAULTS.DISABLED,
567
+ having: QUERY_DEFAULTS.HAVING,
568
+ stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
569
+ limit: QUERY_DEFAULTS.LIMIT_1000,
570
+ orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
571
+ groupBy: QUERY_DEFAULTS.EMPTY_GROUP_BY,
572
+ offset: QUERY_DEFAULTS.OFFSET,
436
573
  },
437
574
  },
438
575
  },
439
- dataSource: DATA_SOURCES.TRACES, projectId,
576
+ dataSource: DATA_SOURCES.TRACES,
577
+ projectId,
440
578
  };
441
579
 
442
580
  const resp = await this.makeRequest(payload);
@@ -463,7 +601,7 @@ class SigNozStatsAPI {
463
601
  metaByConv: Map<string, { tenantId: string; graphId: string; graphName: string }>,
464
602
  contextErrSeries: Series[],
465
603
  agentGenErrSeries: Series[],
466
- firstMsgByConv: Map<string, { content: string; timestamp: number }>,
604
+ firstMsgByConv: Map<string, { content: string; timestamp: number }>
467
605
  ): ConversationStats[] {
468
606
  type Acc = {
469
607
  totalToolCalls: number;
@@ -497,51 +635,67 @@ class SigNozStatsAPI {
497
635
 
498
636
  // tools
499
637
  for (const s of toolCallsSeries) {
500
- const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID]; if (!id) continue;
501
- const name = s.labels?.[SPAN_KEYS.AI_TOOL_CALL_NAME]; if (!name) continue;
502
- const calls = countFromSeries(s); if (!calls) continue;
638
+ const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID];
639
+ if (!id) continue;
640
+ const name = s.labels?.[SPAN_KEYS.AI_TOOL_CALL_NAME];
641
+ if (!name) continue;
642
+ const calls = countFromSeries(s);
643
+ if (!calls) continue;
503
644
  const desc = s.labels?.[SPAN_KEYS.MCP_TOOL_DESCRIPTION] || '';
504
645
  const acc = ensure(id);
505
646
  acc.totalToolCalls += calls;
506
647
  const t = acc.toolsUsed.get(name) || { name, calls: 0, description: desc };
507
- t.calls += calls; acc.toolsUsed.set(name, t);
648
+ t.calls += calls;
649
+ acc.toolsUsed.set(name, t);
508
650
  }
509
651
 
510
652
  // transfers
511
653
  for (const s of transferSeries) {
512
- const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID]; if (!id) continue;
513
- const from = s.labels?.[SPAN_KEYS.TRANSFER_FROM_AGENT_ID]; const to = s.labels?.[SPAN_KEYS.TRANSFER_TO_AGENT_ID];
654
+ const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID];
655
+ if (!id) continue;
656
+ const from = s.labels?.[SPAN_KEYS.TRANSFER_FROM_AGENT_ID];
657
+ const to = s.labels?.[SPAN_KEYS.TRANSFER_TO_AGENT_ID];
514
658
  const count = countFromSeries(s);
515
659
  if (!from || !to || !count) continue;
516
- const acc = ensure(id); acc.totalTransfers += count;
660
+ const acc = ensure(id);
661
+ acc.totalTransfers += count;
517
662
  const key = `${from}→${to}`;
518
663
  const h = acc.transfers.get(key) || { from, to, count: 0 };
519
- h.count += count; acc.transfers.set(key, h);
664
+ h.count += count;
665
+ acc.transfers.set(key, h);
520
666
  }
521
667
 
522
668
  // delegations
523
669
  for (const s of delegationSeries) {
524
- const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID]; if (!id) continue;
525
- const from = s.labels?.[SPAN_KEYS.DELEGATION_FROM_AGENT_ID]; const to = s.labels?.[SPAN_KEYS.DELEGATION_TO_AGENT_ID];
670
+ const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID];
671
+ if (!id) continue;
672
+ const from = s.labels?.[SPAN_KEYS.DELEGATION_FROM_AGENT_ID];
673
+ const to = s.labels?.[SPAN_KEYS.DELEGATION_TO_AGENT_ID];
526
674
  const count = countFromSeries(s);
527
675
  if (!from || !to || !count) continue;
528
- const acc = ensure(id); acc.totalDelegations += count;
676
+ const acc = ensure(id);
677
+ acc.totalDelegations += count;
529
678
  const key = `${from}→${to}`;
530
679
  const d = acc.delegations.get(key) || { from, to, count: 0 };
531
- d.count += count; acc.delegations.set(key, d);
680
+ d.count += count;
681
+ acc.delegations.set(key, d);
532
682
  }
533
683
 
534
684
  // AI calls
535
685
  for (const s of aiCallsSeries) {
536
- const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID]; if (!id) continue;
537
- const count = countFromSeries(s); if (!count) continue;
686
+ const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID];
687
+ if (!id) continue;
688
+ const count = countFromSeries(s);
689
+ if (!count) continue;
538
690
  ensure(id).totalAICalls += count;
539
691
  }
540
692
 
541
693
  // errors
542
694
  for (const s of [...contextErrSeries, ...agentGenErrSeries]) {
543
- const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID]; if (!id) continue;
544
- const count = countFromSeries(s); if (!count) continue;
695
+ const id = s.labels?.[SPAN_KEYS.CONVERSATION_ID];
696
+ if (!id) continue;
697
+ const count = countFromSeries(s);
698
+ if (!count) continue;
545
699
  ensure(id).totalErrors += count;
546
700
  }
547
701
 
@@ -550,7 +704,11 @@ class SigNozStatsAPI {
550
704
  const allConvIds = new Set<string>([...byConv.keys(), ...metaByConv.keys()]);
551
705
  for (const id of allConvIds) {
552
706
  const acc = byConv.get(id) || ensure(id);
553
- const meta = metaByConv.get(id) || { tenantId: UNKNOWN_VALUE, graphId: UNKNOWN_VALUE, graphName: UNKNOWN_VALUE };
707
+ const meta = metaByConv.get(id) || {
708
+ tenantId: UNKNOWN_VALUE,
709
+ graphId: UNKNOWN_VALUE,
710
+ graphName: UNKNOWN_VALUE,
711
+ };
554
712
  out.push({
555
713
  conversationId: id,
556
714
  tenantId: meta.tenantId,
@@ -572,12 +730,22 @@ class SigNozStatsAPI {
572
730
  return out;
573
731
  }
574
732
 
575
- private async applySpanFilters(stats: ConversationStats[], startTime: number, endTime: number, filters: SpanFilterOptions, projectId?: string) {
733
+ private async applySpanFilters(
734
+ stats: ConversationStats[],
735
+ startTime: number,
736
+ endTime: number,
737
+ filters: SpanFilterOptions,
738
+ projectId?: string
739
+ ) {
576
740
  try {
577
- const resp = await this.makeRequest(this.buildFilteredConversationsPayload(startTime, endTime, filters, projectId));
741
+ const resp = await this.makeRequest(
742
+ this.buildFilteredConversationsPayload(startTime, endTime, filters, projectId)
743
+ );
578
744
  const series = this.extractSeries(resp, 'filteredConversations');
579
- const allowed = new Set<string>(series.map(s => s.labels?.[SPAN_KEYS.CONVERSATION_ID]).filter(Boolean) as string[]);
580
- return stats.filter(s => allowed.has(s.conversationId));
745
+ const allowed = new Set<string>(
746
+ series.map((s) => s.labels?.[SPAN_KEYS.CONVERSATION_ID]).filter(Boolean) as string[]
747
+ );
748
+ return stats.filter((s) => allowed.has(s.conversationId));
581
749
  } catch (e) {
582
750
  console.error('applySpanFilters error:', e);
583
751
  return stats;
@@ -588,19 +756,44 @@ class SigNozStatsAPI {
588
756
 
589
757
  private buildAgentModelBreakdownPayload(start: number, end: number, projectId?: string) {
590
758
  return {
591
- start, end, step: QUERY_DEFAULTS.STEP, variables: {},
759
+ start,
760
+ end,
761
+ step: QUERY_DEFAULTS.STEP,
762
+ variables: {},
592
763
  compositeQuery: {
593
- queryType: QUERY_TYPES.BUILDER, panelType: PANEL_TYPES.TABLE,
764
+ queryType: QUERY_TYPES.BUILDER,
765
+ panelType: PANEL_TYPES.TABLE,
594
766
  builderQueries: {
595
767
  agentModelCalls: {
596
- dataSource: DATA_SOURCES.TRACES, queryName: QUERY_EXPRESSIONS.AGENT_MODEL_CALLS,
768
+ dataSource: DATA_SOURCES.TRACES,
769
+ queryName: QUERY_EXPRESSIONS.AGENT_MODEL_CALLS,
597
770
  aggregateOperator: AGGREGATE_OPERATORS.COUNT,
598
- aggregateAttribute: { key: SPAN_KEYS.SPAN_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
771
+ aggregateAttribute: {
772
+ key: SPAN_KEYS.SPAN_ID,
773
+ ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
774
+ },
599
775
  filters: {
600
- op: OPERATORS.AND, items: [
601
- { key: { key: SPAN_KEYS.AI_OPERATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN }, op: OPERATORS.EQUALS, value: AI_OPERATIONS.GENERATE_TEXT },
602
- { key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EXISTS, value: '' },
603
- ...(projectId ? [{ key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EQUALS, value: projectId }] : []),
776
+ op: OPERATORS.AND,
777
+ items: [
778
+ {
779
+ key: { key: SPAN_KEYS.AI_OPERATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
780
+ op: OPERATORS.EQUALS,
781
+ value: AI_OPERATIONS.GENERATE_TEXT,
782
+ },
783
+ {
784
+ key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
785
+ op: OPERATORS.EXISTS,
786
+ value: '',
787
+ },
788
+ ...(projectId
789
+ ? [
790
+ {
791
+ key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
792
+ op: OPERATORS.EQUALS,
793
+ value: projectId,
794
+ },
795
+ ]
796
+ : []),
604
797
  ],
605
798
  },
606
799
  groupBy: [
@@ -609,31 +802,63 @@ class SigNozStatsAPI {
609
802
  { key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
610
803
  { key: SPAN_KEYS.AI_MODEL_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
611
804
  ],
612
- expression: QUERY_EXPRESSIONS.AGENT_MODEL_CALLS, reduceTo: REDUCE_OPERATIONS.SUM, stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
613
- orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }], offset: QUERY_DEFAULTS.OFFSET,
614
- disabled: QUERY_DEFAULTS.DISABLED, having: QUERY_DEFAULTS.HAVING, legend: QUERY_DEFAULTS.LEGEND, limit: QUERY_DEFAULTS.LIMIT_NULL,
805
+ expression: QUERY_EXPRESSIONS.AGENT_MODEL_CALLS,
806
+ reduceTo: REDUCE_OPERATIONS.SUM,
807
+ stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
808
+ orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
809
+ offset: QUERY_DEFAULTS.OFFSET,
810
+ disabled: QUERY_DEFAULTS.DISABLED,
811
+ having: QUERY_DEFAULTS.HAVING,
812
+ legend: QUERY_DEFAULTS.LEGEND,
813
+ limit: QUERY_DEFAULTS.LIMIT_NULL,
615
814
  },
616
815
  },
617
816
  },
618
- dataSource: DATA_SOURCES.TRACES, projectId,
817
+ dataSource: DATA_SOURCES.TRACES,
818
+ projectId,
619
819
  };
620
820
  }
621
821
 
622
822
  private buildModelBreakdownPayload(start: number, end: number, projectId?: string) {
623
823
  return {
624
- start, end, step: QUERY_DEFAULTS.STEP, variables: {},
824
+ start,
825
+ end,
826
+ step: QUERY_DEFAULTS.STEP,
827
+ variables: {},
625
828
  compositeQuery: {
626
- queryType: QUERY_TYPES.BUILDER, panelType: PANEL_TYPES.TABLE,
829
+ queryType: QUERY_TYPES.BUILDER,
830
+ panelType: PANEL_TYPES.TABLE,
627
831
  builderQueries: {
628
832
  modelCalls: {
629
- dataSource: DATA_SOURCES.TRACES, queryName: QUERY_EXPRESSIONS.MODEL_CALLS,
833
+ dataSource: DATA_SOURCES.TRACES,
834
+ queryName: QUERY_EXPRESSIONS.MODEL_CALLS,
630
835
  aggregateOperator: AGGREGATE_OPERATORS.COUNT,
631
- aggregateAttribute: { key: SPAN_KEYS.SPAN_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
836
+ aggregateAttribute: {
837
+ key: SPAN_KEYS.SPAN_ID,
838
+ ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
839
+ },
632
840
  filters: {
633
- op: OPERATORS.AND, items: [
634
- { key: { key: SPAN_KEYS.AI_OPERATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN }, op: OPERATORS.EQUALS, value: AI_OPERATIONS.GENERATE_TEXT },
635
- { key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EXISTS, value: '' },
636
- ...(projectId ? [{ key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EQUALS, value: projectId }] : []),
841
+ op: OPERATORS.AND,
842
+ items: [
843
+ {
844
+ key: { key: SPAN_KEYS.AI_OPERATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
845
+ op: OPERATORS.EQUALS,
846
+ value: AI_OPERATIONS.GENERATE_TEXT,
847
+ },
848
+ {
849
+ key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
850
+ op: OPERATORS.EXISTS,
851
+ value: '',
852
+ },
853
+ ...(projectId
854
+ ? [
855
+ {
856
+ key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
857
+ op: OPERATORS.EQUALS,
858
+ value: projectId,
859
+ },
860
+ ]
861
+ : []),
637
862
  ],
638
863
  },
639
864
  groupBy: [
@@ -641,62 +866,150 @@ class SigNozStatsAPI {
641
866
  { key: SPAN_KEYS.AI_MODEL_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
642
867
  { key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
643
868
  ],
644
- expression: QUERY_EXPRESSIONS.MODEL_CALLS, reduceTo: REDUCE_OPERATIONS.SUM, stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
645
- orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }], offset: QUERY_DEFAULTS.OFFSET,
646
- disabled: QUERY_DEFAULTS.DISABLED, having: QUERY_DEFAULTS.HAVING, legend: QUERY_DEFAULTS.LEGEND, limit: QUERY_DEFAULTS.LIMIT_ZERO,
869
+ expression: QUERY_EXPRESSIONS.MODEL_CALLS,
870
+ reduceTo: REDUCE_OPERATIONS.SUM,
871
+ stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
872
+ orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
873
+ offset: QUERY_DEFAULTS.OFFSET,
874
+ disabled: QUERY_DEFAULTS.DISABLED,
875
+ having: QUERY_DEFAULTS.HAVING,
876
+ legend: QUERY_DEFAULTS.LEGEND,
877
+ limit: QUERY_DEFAULTS.LIMIT_ZERO,
647
878
  },
648
879
  },
649
880
  },
650
- dataSource: DATA_SOURCES.TRACES, projectId,
881
+ dataSource: DATA_SOURCES.TRACES,
882
+ projectId,
651
883
  };
652
884
  }
653
885
 
654
- private buildConversationActivityPayload(start: number, end: number, graphId?: string, projectId?: string) {
886
+ private buildConversationActivityPayload(
887
+ start: number,
888
+ end: number,
889
+ graphId?: string,
890
+ projectId?: string
891
+ ) {
655
892
  const items: any[] = [
656
- { key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EXISTS, value: '' },
657
- ...(graphId && graphId !== 'all' ? [{ key: { key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EQUALS, value: graphId }] : []),
658
- ...(projectId ? [{ key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EQUALS, value: projectId }] : []),
893
+ {
894
+ key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
895
+ op: OPERATORS.EXISTS,
896
+ value: '',
897
+ },
898
+ ...(graphId && graphId !== 'all'
899
+ ? [
900
+ {
901
+ key: { key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
902
+ op: OPERATORS.EQUALS,
903
+ value: graphId,
904
+ },
905
+ ]
906
+ : []),
907
+ ...(projectId
908
+ ? [
909
+ {
910
+ key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
911
+ op: OPERATORS.EQUALS,
912
+ value: projectId,
913
+ },
914
+ ]
915
+ : []),
659
916
  ];
660
917
 
661
918
  return {
662
- start, end, step: QUERY_DEFAULTS.STEP, variables: {},
919
+ start,
920
+ end,
921
+ step: QUERY_DEFAULTS.STEP,
922
+ variables: {},
663
923
  compositeQuery: {
664
- queryType: QUERY_TYPES.BUILDER, panelType: PANEL_TYPES.TABLE,
924
+ queryType: QUERY_TYPES.BUILDER,
925
+ panelType: PANEL_TYPES.TABLE,
665
926
  builderQueries: {
666
927
  lastActivity: {
667
- dataSource: DATA_SOURCES.TRACES, queryName: QUERY_EXPRESSIONS.LAST_ACTIVITY,
928
+ dataSource: DATA_SOURCES.TRACES,
929
+ queryName: QUERY_EXPRESSIONS.LAST_ACTIVITY,
668
930
  aggregateOperator: AGGREGATE_OPERATORS.MAX,
669
- aggregateAttribute: { key: SPAN_KEYS.TIMESTAMP, ...QUERY_FIELD_CONFIGS.INT64_TAG_COLUMN },
931
+ aggregateAttribute: {
932
+ key: SPAN_KEYS.TIMESTAMP,
933
+ ...QUERY_FIELD_CONFIGS.INT64_TAG_COLUMN,
934
+ },
670
935
  filters: { op: OPERATORS.AND, items },
671
936
  groupBy: [{ key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }],
672
- expression: QUERY_EXPRESSIONS.LAST_ACTIVITY, reduceTo: REDUCE_OPERATIONS.MAX, stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
673
- orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }], offset: QUERY_DEFAULTS.OFFSET,
674
- disabled: QUERY_DEFAULTS.DISABLED, having: QUERY_DEFAULTS.HAVING, legend: QUERY_DEFAULTS.LEGEND, limit: QUERY_DEFAULTS.LIMIT_NULL,
937
+ expression: QUERY_EXPRESSIONS.LAST_ACTIVITY,
938
+ reduceTo: REDUCE_OPERATIONS.MAX,
939
+ stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
940
+ orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
941
+ offset: QUERY_DEFAULTS.OFFSET,
942
+ disabled: QUERY_DEFAULTS.DISABLED,
943
+ having: QUERY_DEFAULTS.HAVING,
944
+ legend: QUERY_DEFAULTS.LEGEND,
945
+ limit: QUERY_DEFAULTS.LIMIT_NULL,
675
946
  },
676
947
  },
677
948
  },
678
- dataSource: DATA_SOURCES.TRACES, projectId,
949
+ dataSource: DATA_SOURCES.TRACES,
950
+ projectId,
679
951
  };
680
952
  }
681
953
 
682
- private buildConversationMetadataPayload(start: number, end: number, graphId?: string, projectId?: string) {
954
+ private buildConversationMetadataPayload(
955
+ start: number,
956
+ end: number,
957
+ graphId?: string,
958
+ projectId?: string
959
+ ) {
683
960
  const items: any[] = [
684
- { key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EXISTS, value: '' },
685
- { key: { key: SPAN_KEYS.TENANT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EXISTS, value: '' },
686
- { key: { key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EXISTS, value: '' },
687
- ...(graphId && graphId !== 'all' ? [{ key: { key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EQUALS, value: graphId }] : []),
688
- ...(projectId ? [{ key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EQUALS, value: projectId }] : []),
961
+ {
962
+ key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
963
+ op: OPERATORS.EXISTS,
964
+ value: '',
965
+ },
966
+ {
967
+ key: { key: SPAN_KEYS.TENANT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
968
+ op: OPERATORS.EXISTS,
969
+ value: '',
970
+ },
971
+ {
972
+ key: { key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
973
+ op: OPERATORS.EXISTS,
974
+ value: '',
975
+ },
976
+ ...(graphId && graphId !== 'all'
977
+ ? [
978
+ {
979
+ key: { key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
980
+ op: OPERATORS.EQUALS,
981
+ value: graphId,
982
+ },
983
+ ]
984
+ : []),
985
+ ...(projectId
986
+ ? [
987
+ {
988
+ key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
989
+ op: OPERATORS.EQUALS,
990
+ value: projectId,
991
+ },
992
+ ]
993
+ : []),
689
994
  ];
690
995
 
691
996
  return {
692
- start, end, step: QUERY_DEFAULTS.STEP, variables: {},
997
+ start,
998
+ end,
999
+ step: QUERY_DEFAULTS.STEP,
1000
+ variables: {},
693
1001
  compositeQuery: {
694
- queryType: QUERY_TYPES.BUILDER, panelType: PANEL_TYPES.TABLE,
1002
+ queryType: QUERY_TYPES.BUILDER,
1003
+ panelType: PANEL_TYPES.TABLE,
695
1004
  builderQueries: {
696
1005
  conversationMetadata: {
697
- dataSource: DATA_SOURCES.TRACES, queryName: QUERY_EXPRESSIONS.CONVERSATION_METADATA,
1006
+ dataSource: DATA_SOURCES.TRACES,
1007
+ queryName: QUERY_EXPRESSIONS.CONVERSATION_METADATA,
698
1008
  aggregateOperator: AGGREGATE_OPERATORS.COUNT,
699
- aggregateAttribute: { key: SPAN_KEYS.SPAN_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
1009
+ aggregateAttribute: {
1010
+ key: SPAN_KEYS.SPAN_ID,
1011
+ ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
1012
+ },
700
1013
  filters: { op: OPERATORS.AND, items },
701
1014
  groupBy: [
702
1015
  { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
@@ -704,23 +1017,43 @@ class SigNozStatsAPI {
704
1017
  { key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
705
1018
  { key: SPAN_KEYS.GRAPH_NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG },
706
1019
  ],
707
- expression: QUERY_EXPRESSIONS.CONVERSATION_METADATA, reduceTo: REDUCE_OPERATIONS.SUM, stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
708
- orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }], offset: QUERY_DEFAULTS.OFFSET,
709
- disabled: QUERY_DEFAULTS.DISABLED, having: QUERY_DEFAULTS.HAVING, legend: QUERY_DEFAULTS.LEGEND, limit: QUERY_DEFAULTS.LIMIT_NULL,
1020
+ expression: QUERY_EXPRESSIONS.CONVERSATION_METADATA,
1021
+ reduceTo: REDUCE_OPERATIONS.SUM,
1022
+ stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
1023
+ orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
1024
+ offset: QUERY_DEFAULTS.OFFSET,
1025
+ disabled: QUERY_DEFAULTS.DISABLED,
1026
+ having: QUERY_DEFAULTS.HAVING,
1027
+ legend: QUERY_DEFAULTS.LEGEND,
1028
+ limit: QUERY_DEFAULTS.LIMIT_NULL,
710
1029
  },
711
1030
  },
712
1031
  },
713
- dataSource: DATA_SOURCES.TRACES, projectId,
1032
+ dataSource: DATA_SOURCES.TRACES,
1033
+ projectId,
714
1034
  };
715
1035
  }
716
1036
 
717
- private buildFilteredConversationsPayload(start: number, end: number, filters: SpanFilterOptions, projectId?: string) {
1037
+ private buildFilteredConversationsPayload(
1038
+ start: number,
1039
+ end: number,
1040
+ filters: SpanFilterOptions,
1041
+ projectId?: string
1042
+ ) {
718
1043
  const items: any[] = [
719
- { key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EXISTS, value: '' },
1044
+ {
1045
+ key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1046
+ op: OPERATORS.EXISTS,
1047
+ value: '',
1048
+ },
720
1049
  ];
721
1050
 
722
1051
  if (filters.spanName) {
723
- items.push({ key: { key: SPAN_KEYS.NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN }, op: OPERATORS.EQUALS, value: filters.spanName });
1052
+ items.push({
1053
+ key: { key: SPAN_KEYS.NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
1054
+ op: OPERATORS.EQUALS,
1055
+ value: filters.spanName,
1056
+ });
724
1057
  }
725
1058
 
726
1059
  // Attribute filters — pass typed booleans/numbers where possible
@@ -738,271 +1071,592 @@ class SigNozStatsAPI {
738
1071
  }
739
1072
 
740
1073
  // LIKE operators add wildcards if absent
741
- if ((op === OPERATORS.LIKE || op === OPERATORS.NOT_LIKE) && typeof value === 'string' && !value.includes('%')) {
1074
+ if (
1075
+ (op === OPERATORS.LIKE || op === OPERATORS.NOT_LIKE) &&
1076
+ typeof value === 'string' &&
1077
+ !value.includes('%')
1078
+ ) {
742
1079
  value = `%${value}%`;
743
1080
  }
744
1081
 
745
1082
  // For numeric equality, keep exact-match pair (>= & <=) for robustness
746
1083
  if ((dataType === 'int64' || dataType === 'float64') && op === OPERATORS.EQUALS) {
747
- const config = dataType === 'int64' ? QUERY_FIELD_CONFIGS.INT64_TAG : QUERY_FIELD_CONFIGS.FLOAT64_TAG;
748
- items.push({ key: { key: attr.key, ...config }, op: OPERATORS.GREATER_THAN_OR_EQUAL, value });
1084
+ const config =
1085
+ dataType === 'int64' ? QUERY_FIELD_CONFIGS.INT64_TAG : QUERY_FIELD_CONFIGS.FLOAT64_TAG;
1086
+ items.push({
1087
+ key: { key: attr.key, ...config },
1088
+ op: OPERATORS.GREATER_THAN_OR_EQUAL,
1089
+ value,
1090
+ });
749
1091
  items.push({ key: { key: attr.key, ...config }, op: OPERATORS.LESS_THAN_OR_EQUAL, value });
750
1092
  } else {
751
- const config = dataType === 'string' ? QUERY_FIELD_CONFIGS.STRING_TAG :
752
- dataType === 'int64' ? QUERY_FIELD_CONFIGS.INT64_TAG :
753
- dataType === 'float64' ? QUERY_FIELD_CONFIGS.FLOAT64_TAG :
754
- QUERY_FIELD_CONFIGS.BOOL_TAG;
1093
+ const config =
1094
+ dataType === 'string'
1095
+ ? QUERY_FIELD_CONFIGS.STRING_TAG
1096
+ : dataType === 'int64'
1097
+ ? QUERY_FIELD_CONFIGS.INT64_TAG
1098
+ : dataType === 'float64'
1099
+ ? QUERY_FIELD_CONFIGS.FLOAT64_TAG
1100
+ : QUERY_FIELD_CONFIGS.BOOL_TAG;
755
1101
  items.push({ key: { key: attr.key, ...config }, op, value });
756
1102
  }
757
1103
  }
758
1104
 
759
1105
  if (projectId) {
760
- items.push({ key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EQUALS, value: projectId });
1106
+ items.push({
1107
+ key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1108
+ op: OPERATORS.EQUALS,
1109
+ value: projectId,
1110
+ });
761
1111
  }
762
1112
 
763
1113
  return {
764
- start, end, step: QUERY_DEFAULTS.STEP, variables: {},
1114
+ start,
1115
+ end,
1116
+ step: QUERY_DEFAULTS.STEP,
1117
+ variables: {},
765
1118
  compositeQuery: {
766
- queryType: QUERY_TYPES.BUILDER, panelType: PANEL_TYPES.TABLE,
1119
+ queryType: QUERY_TYPES.BUILDER,
1120
+ panelType: PANEL_TYPES.TABLE,
767
1121
  builderQueries: {
768
1122
  filteredConversations: {
769
- dataSource: DATA_SOURCES.TRACES, queryName: QUERY_EXPRESSIONS.FILTERED_CONVERSATIONS,
1123
+ dataSource: DATA_SOURCES.TRACES,
1124
+ queryName: QUERY_EXPRESSIONS.FILTERED_CONVERSATIONS,
770
1125
  aggregateOperator: AGGREGATE_OPERATORS.COUNT,
771
- aggregateAttribute: { key: SPAN_KEYS.SPAN_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
1126
+ aggregateAttribute: {
1127
+ key: SPAN_KEYS.SPAN_ID,
1128
+ ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
1129
+ },
772
1130
  filters: { op: OPERATORS.AND, items },
773
1131
  groupBy: [{ key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }],
774
- expression: QUERY_EXPRESSIONS.FILTERED_CONVERSATIONS, reduceTo: REDUCE_OPERATIONS.SUM, stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
775
- orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }], offset: QUERY_DEFAULTS.OFFSET,
776
- disabled: QUERY_DEFAULTS.DISABLED, having: QUERY_DEFAULTS.HAVING, legend: QUERY_DEFAULTS.LEGEND, limit: QUERY_DEFAULTS.LIMIT_NULL,
1132
+ expression: QUERY_EXPRESSIONS.FILTERED_CONVERSATIONS,
1133
+ reduceTo: REDUCE_OPERATIONS.SUM,
1134
+ stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
1135
+ orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
1136
+ offset: QUERY_DEFAULTS.OFFSET,
1137
+ disabled: QUERY_DEFAULTS.DISABLED,
1138
+ having: QUERY_DEFAULTS.HAVING,
1139
+ legend: QUERY_DEFAULTS.LEGEND,
1140
+ limit: QUERY_DEFAULTS.LIMIT_NULL,
777
1141
  },
778
1142
  },
779
1143
  },
780
- dataSource: DATA_SOURCES.TRACES, projectId,
1144
+ dataSource: DATA_SOURCES.TRACES,
1145
+ projectId,
781
1146
  };
782
1147
  }
783
1148
 
784
- private buildCombinedPayload(start: number, end: number, _filters?: SpanFilterOptions, projectId?: string) {
1149
+ private buildCombinedPayload(
1150
+ start: number,
1151
+ end: number,
1152
+ _filters?: SpanFilterOptions,
1153
+ projectId?: string
1154
+ ) {
785
1155
  const withProject = (items: any[]) =>
786
- projectId ? [...items, { key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EQUALS, value: projectId }] : items;
1156
+ projectId
1157
+ ? [
1158
+ ...items,
1159
+ {
1160
+ key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1161
+ op: OPERATORS.EQUALS,
1162
+ value: projectId,
1163
+ },
1164
+ ]
1165
+ : items;
787
1166
 
788
1167
  return {
789
- start, end, step: QUERY_DEFAULTS.STEP, variables: {},
1168
+ start,
1169
+ end,
1170
+ step: QUERY_DEFAULTS.STEP,
1171
+ variables: {},
790
1172
  compositeQuery: {
791
- queryType: QUERY_TYPES.BUILDER, panelType: PANEL_TYPES.TABLE,
1173
+ queryType: QUERY_TYPES.BUILDER,
1174
+ panelType: PANEL_TYPES.TABLE,
792
1175
  builderQueries: {
793
1176
  tools: {
794
- dataSource: DATA_SOURCES.TRACES, queryName: QUERY_EXPRESSIONS.TOOLS,
1177
+ dataSource: DATA_SOURCES.TRACES,
1178
+ queryName: QUERY_EXPRESSIONS.TOOLS,
795
1179
  aggregateOperator: AGGREGATE_OPERATORS.COUNT,
796
- aggregateAttribute: { key: SPAN_KEYS.SPAN_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
797
- filters: { op: OPERATORS.AND, items: withProject([
798
- { key: { key: SPAN_KEYS.NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN }, op: OPERATORS.EQUALS, value: SPAN_NAMES.AI_TOOL_CALL },
799
- { key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EXISTS, value: '' },
800
- { key: { key: SPAN_KEYS.AI_TOOL_TYPE, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EQUALS, value: AI_TOOL_TYPES.MCP },
801
- ]) },
1180
+ aggregateAttribute: {
1181
+ key: SPAN_KEYS.SPAN_ID,
1182
+ ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
1183
+ },
1184
+ filters: {
1185
+ op: OPERATORS.AND,
1186
+ items: withProject([
1187
+ {
1188
+ key: { key: SPAN_KEYS.NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
1189
+ op: OPERATORS.EQUALS,
1190
+ value: SPAN_NAMES.AI_TOOL_CALL,
1191
+ },
1192
+ {
1193
+ key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1194
+ op: OPERATORS.EXISTS,
1195
+ value: '',
1196
+ },
1197
+ {
1198
+ key: { key: SPAN_KEYS.AI_TOOL_TYPE, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1199
+ op: OPERATORS.EQUALS,
1200
+ value: AI_TOOL_TYPES.MCP,
1201
+ },
1202
+ ]),
1203
+ },
802
1204
  groupBy: [
803
1205
  { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
804
1206
  { key: SPAN_KEYS.AI_TOOL_CALL_NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG },
805
1207
  ],
806
- expression: QUERY_EXPRESSIONS.TOOLS, reduceTo: REDUCE_OPERATIONS.SUM, stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
807
- orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }], offset: QUERY_DEFAULTS.OFFSET,
808
- disabled: QUERY_DEFAULTS.DISABLED, having: QUERY_DEFAULTS.HAVING, legend: QUERY_DEFAULTS.LEGEND, limit: QUERY_DEFAULTS.LIMIT_NULL,
1208
+ expression: QUERY_EXPRESSIONS.TOOLS,
1209
+ reduceTo: REDUCE_OPERATIONS.SUM,
1210
+ stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
1211
+ orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
1212
+ offset: QUERY_DEFAULTS.OFFSET,
1213
+ disabled: QUERY_DEFAULTS.DISABLED,
1214
+ having: QUERY_DEFAULTS.HAVING,
1215
+ legend: QUERY_DEFAULTS.LEGEND,
1216
+ limit: QUERY_DEFAULTS.LIMIT_NULL,
809
1217
  },
810
1218
 
811
1219
  transfers: {
812
- dataSource: DATA_SOURCES.TRACES, queryName: QUERY_EXPRESSIONS.TRANSFERS,
1220
+ dataSource: DATA_SOURCES.TRACES,
1221
+ queryName: QUERY_EXPRESSIONS.TRANSFERS,
813
1222
  aggregateOperator: AGGREGATE_OPERATORS.COUNT,
814
- aggregateAttribute: { key: SPAN_KEYS.SPAN_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
815
- filters: { op: OPERATORS.AND, items: withProject([
816
- { key: { key: SPAN_KEYS.NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN }, op: OPERATORS.EQUALS, value: SPAN_NAMES.AI_TOOL_CALL },
817
- { key: { key: SPAN_KEYS.AI_TOOL_TYPE, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EQUALS, value: AI_TOOL_TYPES.TRANSFER },
818
- { key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EXISTS, value: '' },
819
- ]) },
1223
+ aggregateAttribute: {
1224
+ key: SPAN_KEYS.SPAN_ID,
1225
+ ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
1226
+ },
1227
+ filters: {
1228
+ op: OPERATORS.AND,
1229
+ items: withProject([
1230
+ {
1231
+ key: { key: SPAN_KEYS.NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
1232
+ op: OPERATORS.EQUALS,
1233
+ value: SPAN_NAMES.AI_TOOL_CALL,
1234
+ },
1235
+ {
1236
+ key: { key: SPAN_KEYS.AI_TOOL_TYPE, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1237
+ op: OPERATORS.EQUALS,
1238
+ value: AI_TOOL_TYPES.TRANSFER,
1239
+ },
1240
+ {
1241
+ key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1242
+ op: OPERATORS.EXISTS,
1243
+ value: '',
1244
+ },
1245
+ ]),
1246
+ },
820
1247
  groupBy: [
821
1248
  { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
822
1249
  { key: SPAN_KEYS.TRANSFER_FROM_AGENT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
823
1250
  { key: SPAN_KEYS.TRANSFER_TO_AGENT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
824
1251
  ],
825
- expression: QUERY_EXPRESSIONS.TRANSFERS, reduceTo: REDUCE_OPERATIONS.SUM, stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
826
- orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }], offset: QUERY_DEFAULTS.OFFSET,
827
- disabled: QUERY_DEFAULTS.DISABLED, having: QUERY_DEFAULTS.HAVING, legend: QUERY_DEFAULTS.LEGEND, limit: QUERY_DEFAULTS.LIMIT_NULL,
1252
+ expression: QUERY_EXPRESSIONS.TRANSFERS,
1253
+ reduceTo: REDUCE_OPERATIONS.SUM,
1254
+ stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
1255
+ orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
1256
+ offset: QUERY_DEFAULTS.OFFSET,
1257
+ disabled: QUERY_DEFAULTS.DISABLED,
1258
+ having: QUERY_DEFAULTS.HAVING,
1259
+ legend: QUERY_DEFAULTS.LEGEND,
1260
+ limit: QUERY_DEFAULTS.LIMIT_NULL,
828
1261
  },
829
1262
 
830
1263
  delegations: {
831
- dataSource: DATA_SOURCES.TRACES, queryName: QUERY_EXPRESSIONS.DELEGATIONS,
1264
+ dataSource: DATA_SOURCES.TRACES,
1265
+ queryName: QUERY_EXPRESSIONS.DELEGATIONS,
832
1266
  aggregateOperator: AGGREGATE_OPERATORS.COUNT,
833
- aggregateAttribute: { key: SPAN_KEYS.SPAN_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
834
- filters: { op: OPERATORS.AND, items: withProject([
835
- { key: { key: SPAN_KEYS.NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN }, op: OPERATORS.EQUALS, value: SPAN_NAMES.AI_TOOL_CALL },
836
- { key: { key: SPAN_KEYS.AI_TOOL_TYPE, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EQUALS, value: AI_TOOL_TYPES.DELEGATION },
837
- { key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EXISTS, value: '' },
838
- ]) },
1267
+ aggregateAttribute: {
1268
+ key: SPAN_KEYS.SPAN_ID,
1269
+ ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
1270
+ },
1271
+ filters: {
1272
+ op: OPERATORS.AND,
1273
+ items: withProject([
1274
+ {
1275
+ key: { key: SPAN_KEYS.NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
1276
+ op: OPERATORS.EQUALS,
1277
+ value: SPAN_NAMES.AI_TOOL_CALL,
1278
+ },
1279
+ {
1280
+ key: { key: SPAN_KEYS.AI_TOOL_TYPE, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1281
+ op: OPERATORS.EQUALS,
1282
+ value: AI_TOOL_TYPES.DELEGATION,
1283
+ },
1284
+ {
1285
+ key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1286
+ op: OPERATORS.EXISTS,
1287
+ value: '',
1288
+ },
1289
+ ]),
1290
+ },
839
1291
  groupBy: [
840
1292
  { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
841
1293
  { key: SPAN_KEYS.DELEGATION_FROM_AGENT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
842
1294
  { key: SPAN_KEYS.DELEGATION_TO_AGENT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
843
1295
  ],
844
- expression: QUERY_EXPRESSIONS.DELEGATIONS, reduceTo: REDUCE_OPERATIONS.SUM, stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
845
- orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }], offset: QUERY_DEFAULTS.OFFSET,
846
- disabled: QUERY_DEFAULTS.DISABLED, having: QUERY_DEFAULTS.HAVING, legend: QUERY_DEFAULTS.LEGEND, limit: QUERY_DEFAULTS.LIMIT_NULL,
1296
+ expression: QUERY_EXPRESSIONS.DELEGATIONS,
1297
+ reduceTo: REDUCE_OPERATIONS.SUM,
1298
+ stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
1299
+ orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
1300
+ offset: QUERY_DEFAULTS.OFFSET,
1301
+ disabled: QUERY_DEFAULTS.DISABLED,
1302
+ having: QUERY_DEFAULTS.HAVING,
1303
+ legend: QUERY_DEFAULTS.LEGEND,
1304
+ limit: QUERY_DEFAULTS.LIMIT_NULL,
847
1305
  },
848
1306
 
849
1307
  conversationMetadata: {
850
- dataSource: DATA_SOURCES.TRACES, queryName: QUERY_EXPRESSIONS.CONVERSATION_METADATA,
1308
+ dataSource: DATA_SOURCES.TRACES,
1309
+ queryName: QUERY_EXPRESSIONS.CONVERSATION_METADATA,
851
1310
  aggregateOperator: AGGREGATE_OPERATORS.COUNT,
852
- aggregateAttribute: { key: SPAN_KEYS.SPAN_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
853
- filters: { op: OPERATORS.AND, items: withProject([
854
- { key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EXISTS, value: '' },
855
- { key: { key: SPAN_KEYS.TENANT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EXISTS, value: '' },
856
- { key: { key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EXISTS, value: '' },
857
- ]) },
1311
+ aggregateAttribute: {
1312
+ key: SPAN_KEYS.SPAN_ID,
1313
+ ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
1314
+ },
1315
+ filters: {
1316
+ op: OPERATORS.AND,
1317
+ items: withProject([
1318
+ {
1319
+ key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1320
+ op: OPERATORS.EXISTS,
1321
+ value: '',
1322
+ },
1323
+ {
1324
+ key: { key: SPAN_KEYS.TENANT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1325
+ op: OPERATORS.EXISTS,
1326
+ value: '',
1327
+ },
1328
+ {
1329
+ key: { key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1330
+ op: OPERATORS.EXISTS,
1331
+ value: '',
1332
+ },
1333
+ ]),
1334
+ },
858
1335
  groupBy: [
859
1336
  { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
860
1337
  { key: SPAN_KEYS.TENANT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
861
1338
  { key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
862
1339
  { key: SPAN_KEYS.GRAPH_NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG },
863
1340
  ],
864
- expression: QUERY_EXPRESSIONS.CONVERSATION_METADATA, reduceTo: REDUCE_OPERATIONS.SUM, stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
865
- orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }], offset: QUERY_DEFAULTS.OFFSET,
866
- disabled: QUERY_DEFAULTS.DISABLED, having: QUERY_DEFAULTS.HAVING, legend: QUERY_DEFAULTS.LEGEND, limit: QUERY_DEFAULTS.LIMIT_NULL,
1341
+ expression: QUERY_EXPRESSIONS.CONVERSATION_METADATA,
1342
+ reduceTo: REDUCE_OPERATIONS.SUM,
1343
+ stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
1344
+ orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
1345
+ offset: QUERY_DEFAULTS.OFFSET,
1346
+ disabled: QUERY_DEFAULTS.DISABLED,
1347
+ having: QUERY_DEFAULTS.HAVING,
1348
+ legend: QUERY_DEFAULTS.LEGEND,
1349
+ limit: QUERY_DEFAULTS.LIMIT_NULL,
867
1350
  },
868
1351
 
869
1352
  aiCalls: {
870
- dataSource: DATA_SOURCES.TRACES, queryName: QUERY_EXPRESSIONS.AI_CALLS,
1353
+ dataSource: DATA_SOURCES.TRACES,
1354
+ queryName: QUERY_EXPRESSIONS.AI_CALLS,
871
1355
  aggregateOperator: AGGREGATE_OPERATORS.COUNT,
872
- aggregateAttribute: { key: SPAN_KEYS.SPAN_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
873
- filters: { op: OPERATORS.AND, items: withProject([
874
- { key: { key: SPAN_KEYS.AI_OPERATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN }, op: OPERATORS.EQUALS, value: AI_OPERATIONS.GENERATE_TEXT },
875
- { key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EXISTS, value: '' },
876
- ]) },
1356
+ aggregateAttribute: {
1357
+ key: SPAN_KEYS.SPAN_ID,
1358
+ ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
1359
+ },
1360
+ filters: {
1361
+ op: OPERATORS.AND,
1362
+ items: withProject([
1363
+ {
1364
+ key: { key: SPAN_KEYS.AI_OPERATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
1365
+ op: OPERATORS.EQUALS,
1366
+ value: AI_OPERATIONS.GENERATE_TEXT,
1367
+ },
1368
+ {
1369
+ key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1370
+ op: OPERATORS.EXISTS,
1371
+ value: '',
1372
+ },
1373
+ ]),
1374
+ },
877
1375
  groupBy: [
878
1376
  { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
879
1377
  { key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
880
1378
  { key: 'ai.telemetry.functionId', ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
881
1379
  ],
882
- expression: QUERY_EXPRESSIONS.AI_CALLS, reduceTo: REDUCE_OPERATIONS.SUM, stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
883
- orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }], offset: QUERY_DEFAULTS.OFFSET,
884
- disabled: QUERY_DEFAULTS.DISABLED, having: QUERY_DEFAULTS.HAVING, legend: QUERY_DEFAULTS.LEGEND, limit: QUERY_DEFAULTS.LIMIT_NULL,
1380
+ expression: QUERY_EXPRESSIONS.AI_CALLS,
1381
+ reduceTo: REDUCE_OPERATIONS.SUM,
1382
+ stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
1383
+ orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
1384
+ offset: QUERY_DEFAULTS.OFFSET,
1385
+ disabled: QUERY_DEFAULTS.DISABLED,
1386
+ having: QUERY_DEFAULTS.HAVING,
1387
+ legend: QUERY_DEFAULTS.LEGEND,
1388
+ limit: QUERY_DEFAULTS.LIMIT_NULL,
885
1389
  },
886
1390
 
887
1391
  lastActivity: {
888
- dataSource: DATA_SOURCES.TRACES, queryName: QUERY_EXPRESSIONS.LAST_ACTIVITY,
1392
+ dataSource: DATA_SOURCES.TRACES,
1393
+ queryName: QUERY_EXPRESSIONS.LAST_ACTIVITY,
889
1394
  aggregateOperator: AGGREGATE_OPERATORS.MAX,
890
- aggregateAttribute: { key: SPAN_KEYS.TIMESTAMP, ...QUERY_FIELD_CONFIGS.INT64_TAG_COLUMN },
891
- filters: { op: OPERATORS.AND, items: withProject([
892
- { key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EXISTS, value: '' },
893
- ]) },
1395
+ aggregateAttribute: {
1396
+ key: SPAN_KEYS.TIMESTAMP,
1397
+ ...QUERY_FIELD_CONFIGS.INT64_TAG_COLUMN,
1398
+ },
1399
+ filters: {
1400
+ op: OPERATORS.AND,
1401
+ items: withProject([
1402
+ {
1403
+ key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1404
+ op: OPERATORS.EXISTS,
1405
+ value: '',
1406
+ },
1407
+ ]),
1408
+ },
894
1409
  groupBy: [{ key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }],
895
- expression: QUERY_EXPRESSIONS.LAST_ACTIVITY, reduceTo: REDUCE_OPERATIONS.MAX, stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
896
- orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }], offset: QUERY_DEFAULTS.OFFSET,
897
- disabled: QUERY_DEFAULTS.DISABLED, having: QUERY_DEFAULTS.HAVING, legend: QUERY_DEFAULTS.LEGEND, limit: QUERY_DEFAULTS.LIMIT_NULL,
1410
+ expression: QUERY_EXPRESSIONS.LAST_ACTIVITY,
1411
+ reduceTo: REDUCE_OPERATIONS.MAX,
1412
+ stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
1413
+ orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
1414
+ offset: QUERY_DEFAULTS.OFFSET,
1415
+ disabled: QUERY_DEFAULTS.DISABLED,
1416
+ having: QUERY_DEFAULTS.HAVING,
1417
+ legend: QUERY_DEFAULTS.LEGEND,
1418
+ limit: QUERY_DEFAULTS.LIMIT_NULL,
898
1419
  },
899
1420
 
900
1421
  contextErrors: {
901
- dataSource: DATA_SOURCES.TRACES, queryName: QUERY_EXPRESSIONS.CONTEXT_ERRORS,
1422
+ dataSource: DATA_SOURCES.TRACES,
1423
+ queryName: QUERY_EXPRESSIONS.CONTEXT_ERRORS,
902
1424
  aggregateOperator: AGGREGATE_OPERATORS.COUNT,
903
- aggregateAttribute: { key: SPAN_KEYS.SPAN_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
904
- filters: { op: OPERATORS.AND, items: withProject([
905
- { key: { key: SPAN_KEYS.NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN }, op: OPERATORS.EQUALS, value: SPAN_NAMES.CONTEXT_HANDLE },
906
- { key: { key: SPAN_KEYS.HAS_ERROR, ...QUERY_FIELD_CONFIGS.BOOL_TAG_COLUMN }, op: OPERATORS.EQUALS, value: true }, // real boolean
907
- { key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EXISTS, value: '' },
908
- ]) },
1425
+ aggregateAttribute: {
1426
+ key: SPAN_KEYS.SPAN_ID,
1427
+ ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
1428
+ },
1429
+ filters: {
1430
+ op: OPERATORS.AND,
1431
+ items: withProject([
1432
+ {
1433
+ key: { key: SPAN_KEYS.NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
1434
+ op: OPERATORS.EQUALS,
1435
+ value: SPAN_NAMES.CONTEXT_HANDLE,
1436
+ },
1437
+ {
1438
+ key: { key: SPAN_KEYS.HAS_ERROR, ...QUERY_FIELD_CONFIGS.BOOL_TAG_COLUMN },
1439
+ op: OPERATORS.EQUALS,
1440
+ value: true,
1441
+ }, // real boolean
1442
+ {
1443
+ key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1444
+ op: OPERATORS.EXISTS,
1445
+ value: '',
1446
+ },
1447
+ ]),
1448
+ },
909
1449
  groupBy: [{ key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }],
910
- expression: QUERY_EXPRESSIONS.CONTEXT_ERRORS, reduceTo: REDUCE_OPERATIONS.SUM, stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
911
- orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }], offset: QUERY_DEFAULTS.OFFSET,
912
- disabled: QUERY_DEFAULTS.DISABLED, having: QUERY_DEFAULTS.HAVING, legend: QUERY_DEFAULTS.LEGEND, limit: QUERY_DEFAULTS.LIMIT_NULL,
1450
+ expression: QUERY_EXPRESSIONS.CONTEXT_ERRORS,
1451
+ reduceTo: REDUCE_OPERATIONS.SUM,
1452
+ stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
1453
+ orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
1454
+ offset: QUERY_DEFAULTS.OFFSET,
1455
+ disabled: QUERY_DEFAULTS.DISABLED,
1456
+ having: QUERY_DEFAULTS.HAVING,
1457
+ legend: QUERY_DEFAULTS.LEGEND,
1458
+ limit: QUERY_DEFAULTS.LIMIT_NULL,
913
1459
  },
914
1460
 
915
1461
  agentGenerationErrors: {
916
- dataSource: DATA_SOURCES.TRACES, queryName: QUERY_EXPRESSIONS.AGENT_GENERATION_ERRORS,
1462
+ dataSource: DATA_SOURCES.TRACES,
1463
+ queryName: QUERY_EXPRESSIONS.AGENT_GENERATION_ERRORS,
917
1464
  aggregateOperator: AGGREGATE_OPERATORS.COUNT,
918
- aggregateAttribute: { key: SPAN_KEYS.SPAN_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
919
- filters: { op: OPERATORS.AND, items: withProject([
920
- { key: { key: SPAN_KEYS.NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN }, op: OPERATORS.EQUALS, value: SPAN_NAMES.AGENT_GENERATION },
921
- { key: { key: SPAN_KEYS.HAS_ERROR, ...QUERY_FIELD_CONFIGS.BOOL_TAG_COLUMN }, op: OPERATORS.EQUALS, value: true }, // real boolean
922
- { key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EXISTS, value: '' },
923
- ]) },
1465
+ aggregateAttribute: {
1466
+ key: SPAN_KEYS.SPAN_ID,
1467
+ ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
1468
+ },
1469
+ filters: {
1470
+ op: OPERATORS.AND,
1471
+ items: withProject([
1472
+ {
1473
+ key: { key: SPAN_KEYS.NAME, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
1474
+ op: OPERATORS.EQUALS,
1475
+ value: SPAN_NAMES.AGENT_GENERATION,
1476
+ },
1477
+ {
1478
+ key: { key: SPAN_KEYS.HAS_ERROR, ...QUERY_FIELD_CONFIGS.BOOL_TAG_COLUMN },
1479
+ op: OPERATORS.EQUALS,
1480
+ value: true,
1481
+ }, // real boolean
1482
+ {
1483
+ key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1484
+ op: OPERATORS.EXISTS,
1485
+ value: '',
1486
+ },
1487
+ ]),
1488
+ },
924
1489
  groupBy: [{ key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }],
925
- expression: QUERY_EXPRESSIONS.AGENT_GENERATION_ERRORS, reduceTo: REDUCE_OPERATIONS.SUM, stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
926
- orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }], offset: QUERY_DEFAULTS.OFFSET,
927
- disabled: QUERY_DEFAULTS.DISABLED, having: QUERY_DEFAULTS.HAVING, legend: QUERY_DEFAULTS.LEGEND, limit: QUERY_DEFAULTS.LIMIT_NULL,
1490
+ expression: QUERY_EXPRESSIONS.AGENT_GENERATION_ERRORS,
1491
+ reduceTo: REDUCE_OPERATIONS.SUM,
1492
+ stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
1493
+ orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.DESC }],
1494
+ offset: QUERY_DEFAULTS.OFFSET,
1495
+ disabled: QUERY_DEFAULTS.DISABLED,
1496
+ having: QUERY_DEFAULTS.HAVING,
1497
+ legend: QUERY_DEFAULTS.LEGEND,
1498
+ limit: QUERY_DEFAULTS.LIMIT_NULL,
928
1499
  },
929
1500
 
930
1501
  userMessages: {
931
- dataSource: DATA_SOURCES.TRACES, queryName: QUERY_EXPRESSIONS.USER_MESSAGES,
1502
+ dataSource: DATA_SOURCES.TRACES,
1503
+ queryName: QUERY_EXPRESSIONS.USER_MESSAGES,
932
1504
  aggregateOperator: AGGREGATE_OPERATORS.MIN,
933
- aggregateAttribute: { key: SPAN_KEYS.TIMESTAMP, ...QUERY_FIELD_CONFIGS.INT64_TAG_COLUMN },
934
- filters: { op: OPERATORS.AND, items: withProject([
935
- { key: { key: SPAN_KEYS.MESSAGE_CONTENT, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EXISTS, value: '' },
936
- { key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EXISTS, value: '' },
937
-
938
- ]) },
1505
+ aggregateAttribute: {
1506
+ key: SPAN_KEYS.TIMESTAMP,
1507
+ ...QUERY_FIELD_CONFIGS.INT64_TAG_COLUMN,
1508
+ },
1509
+ filters: {
1510
+ op: OPERATORS.AND,
1511
+ items: withProject([
1512
+ {
1513
+ key: { key: SPAN_KEYS.MESSAGE_CONTENT, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1514
+ op: OPERATORS.EXISTS,
1515
+ value: '',
1516
+ },
1517
+ {
1518
+ key: { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1519
+ op: OPERATORS.EXISTS,
1520
+ value: '',
1521
+ },
1522
+ ]),
1523
+ },
939
1524
  groupBy: [
940
1525
  { key: SPAN_KEYS.CONVERSATION_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
941
1526
  { key: SPAN_KEYS.MESSAGE_CONTENT, ...QUERY_FIELD_CONFIGS.STRING_TAG },
942
1527
  ],
943
- expression: QUERY_EXPRESSIONS.USER_MESSAGES, reduceTo: REDUCE_OPERATIONS.MIN, stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
944
- orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.ASC }], offset: QUERY_DEFAULTS.OFFSET,
945
- disabled: QUERY_DEFAULTS.DISABLED, having: QUERY_DEFAULTS.HAVING, legend: QUERY_DEFAULTS.LEGEND, limit: QUERY_DEFAULTS.LIMIT_NULL,
1528
+ expression: QUERY_EXPRESSIONS.USER_MESSAGES,
1529
+ reduceTo: REDUCE_OPERATIONS.MIN,
1530
+ stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
1531
+ orderBy: [{ columnName: SPAN_KEYS.TIMESTAMP, order: ORDER_DIRECTIONS.ASC }],
1532
+ offset: QUERY_DEFAULTS.OFFSET,
1533
+ disabled: QUERY_DEFAULTS.DISABLED,
1534
+ having: QUERY_DEFAULTS.HAVING,
1535
+ legend: QUERY_DEFAULTS.LEGEND,
1536
+ limit: QUERY_DEFAULTS.LIMIT_NULL,
946
1537
  },
947
1538
  },
948
1539
  },
949
- dataSource: DATA_SOURCES.TRACES, projectId,
1540
+ dataSource: DATA_SOURCES.TRACES,
1541
+ projectId,
950
1542
  };
951
1543
  }
952
1544
 
953
1545
  private buildUniqueGraphsPayload(start: number, end: number, projectId?: string) {
954
1546
  const items: any[] = [
955
- { key: { key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EXISTS, value: '' },
956
- { key: { key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.NOT_EQUALS, value: UNKNOWN_VALUE },
957
- ...(projectId ? [{ key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EQUALS, value: projectId }] : []),
1547
+ {
1548
+ key: { key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1549
+ op: OPERATORS.EXISTS,
1550
+ value: '',
1551
+ },
1552
+ {
1553
+ key: { key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1554
+ op: OPERATORS.NOT_EQUALS,
1555
+ value: UNKNOWN_VALUE,
1556
+ },
1557
+ ...(projectId
1558
+ ? [
1559
+ {
1560
+ key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1561
+ op: OPERATORS.EQUALS,
1562
+ value: projectId,
1563
+ },
1564
+ ]
1565
+ : []),
958
1566
  ];
959
1567
 
960
1568
  return {
961
- start, end, step: QUERY_DEFAULTS.STEP, variables: {},
1569
+ start,
1570
+ end,
1571
+ step: QUERY_DEFAULTS.STEP,
1572
+ variables: {},
962
1573
  compositeQuery: {
963
- queryType: QUERY_TYPES.BUILDER, panelType: PANEL_TYPES.TABLE,
1574
+ queryType: QUERY_TYPES.BUILDER,
1575
+ panelType: PANEL_TYPES.TABLE,
964
1576
  builderQueries: {
965
1577
  uniqueGraphs: {
966
- dataSource: DATA_SOURCES.TRACES, queryName: QUERY_EXPRESSIONS.UNIQUE_GRAPHS,
1578
+ dataSource: DATA_SOURCES.TRACES,
1579
+ queryName: QUERY_EXPRESSIONS.UNIQUE_GRAPHS,
967
1580
  aggregateOperator: AGGREGATE_OPERATORS.COUNT,
968
- aggregateAttribute: { key: SPAN_KEYS.SPAN_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
1581
+ aggregateAttribute: {
1582
+ key: SPAN_KEYS.SPAN_ID,
1583
+ ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
1584
+ },
969
1585
  filters: { op: OPERATORS.AND, items },
970
1586
  groupBy: [{ key: SPAN_KEYS.GRAPH_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }],
971
- expression: QUERY_EXPRESSIONS.UNIQUE_GRAPHS, reduceTo: REDUCE_OPERATIONS.SUM, stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
972
- orderBy: [{ columnName: SPAN_KEYS.GRAPH_ID, order: ORDER_DIRECTIONS.ASC }], offset: QUERY_DEFAULTS.OFFSET,
973
- disabled: QUERY_DEFAULTS.DISABLED, having: QUERY_DEFAULTS.HAVING, legend: QUERY_DEFAULTS.LEGEND, limit: QUERY_DEFAULTS.LIMIT_NULL,
1587
+ expression: QUERY_EXPRESSIONS.UNIQUE_GRAPHS,
1588
+ reduceTo: REDUCE_OPERATIONS.SUM,
1589
+ stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
1590
+ orderBy: [{ columnName: SPAN_KEYS.GRAPH_ID, order: ORDER_DIRECTIONS.ASC }],
1591
+ offset: QUERY_DEFAULTS.OFFSET,
1592
+ disabled: QUERY_DEFAULTS.DISABLED,
1593
+ having: QUERY_DEFAULTS.HAVING,
1594
+ legend: QUERY_DEFAULTS.LEGEND,
1595
+ limit: QUERY_DEFAULTS.LIMIT_NULL,
974
1596
  },
975
1597
  },
976
1598
  },
977
- dataSource: DATA_SOURCES.TRACES, projectId,
1599
+ dataSource: DATA_SOURCES.TRACES,
1600
+ projectId,
978
1601
  };
979
1602
  }
980
1603
 
981
1604
  private buildUniqueModelsPayload(start: number, end: number, projectId?: string) {
982
1605
  const items: any[] = [
983
- { key: { key: SPAN_KEYS.AI_MODEL_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN }, op: OPERATORS.EXISTS, value: '' },
984
- { key: { key: SPAN_KEYS.AI_MODEL_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN }, op: OPERATORS.NOT_EQUALS, value: UNKNOWN_VALUE },
985
- ...(projectId ? [{ key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG }, op: OPERATORS.EQUALS, value: projectId }] : []),
1606
+ {
1607
+ key: { key: SPAN_KEYS.AI_MODEL_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
1608
+ op: OPERATORS.EXISTS,
1609
+ value: '',
1610
+ },
1611
+ {
1612
+ key: { key: SPAN_KEYS.AI_MODEL_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
1613
+ op: OPERATORS.NOT_EQUALS,
1614
+ value: UNKNOWN_VALUE,
1615
+ },
1616
+ ...(projectId
1617
+ ? [
1618
+ {
1619
+ key: { key: SPAN_KEYS.PROJECT_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG },
1620
+ op: OPERATORS.EQUALS,
1621
+ value: projectId,
1622
+ },
1623
+ ]
1624
+ : []),
986
1625
  ];
987
1626
 
988
1627
  return {
989
- start, end, step: QUERY_DEFAULTS.STEP, variables: {},
1628
+ start,
1629
+ end,
1630
+ step: QUERY_DEFAULTS.STEP,
1631
+ variables: {},
990
1632
  compositeQuery: {
991
- queryType: QUERY_TYPES.BUILDER, panelType: PANEL_TYPES.TABLE,
1633
+ queryType: QUERY_TYPES.BUILDER,
1634
+ panelType: PANEL_TYPES.TABLE,
992
1635
  builderQueries: {
993
1636
  uniqueModels: {
994
- dataSource: DATA_SOURCES.TRACES, queryName: QUERY_EXPRESSIONS.UNIQUE_MODELS,
1637
+ dataSource: DATA_SOURCES.TRACES,
1638
+ queryName: QUERY_EXPRESSIONS.UNIQUE_MODELS,
995
1639
  aggregateOperator: AGGREGATE_OPERATORS.COUNT,
996
- aggregateAttribute: { key: SPAN_KEYS.SPAN_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN },
1640
+ aggregateAttribute: {
1641
+ key: SPAN_KEYS.SPAN_ID,
1642
+ ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN,
1643
+ },
997
1644
  filters: { op: OPERATORS.AND, items },
998
1645
  groupBy: [{ key: SPAN_KEYS.AI_MODEL_ID, ...QUERY_FIELD_CONFIGS.STRING_TAG_COLUMN }],
999
- expression: QUERY_EXPRESSIONS.UNIQUE_MODELS, reduceTo: REDUCE_OPERATIONS.SUM, stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
1000
- orderBy: [{ columnName: SPAN_KEYS.AI_MODEL_ID, order: ORDER_DIRECTIONS.ASC }], offset: QUERY_DEFAULTS.OFFSET,
1001
- disabled: QUERY_DEFAULTS.DISABLED, having: QUERY_DEFAULTS.HAVING, legend: QUERY_DEFAULTS.LEGEND, limit: QUERY_DEFAULTS.LIMIT_NULL,
1646
+ expression: QUERY_EXPRESSIONS.UNIQUE_MODELS,
1647
+ reduceTo: REDUCE_OPERATIONS.SUM,
1648
+ stepInterval: QUERY_DEFAULTS.STEP_INTERVAL,
1649
+ orderBy: [{ columnName: SPAN_KEYS.AI_MODEL_ID, order: ORDER_DIRECTIONS.ASC }],
1650
+ offset: QUERY_DEFAULTS.OFFSET,
1651
+ disabled: QUERY_DEFAULTS.DISABLED,
1652
+ having: QUERY_DEFAULTS.HAVING,
1653
+ legend: QUERY_DEFAULTS.LEGEND,
1654
+ limit: QUERY_DEFAULTS.LIMIT_NULL,
1002
1655
  },
1003
1656
  },
1004
1657
  },
1005
- dataSource: DATA_SOURCES.TRACES, projectId,
1658
+ dataSource: DATA_SOURCES.TRACES,
1659
+ projectId,
1006
1660
  };
1007
1661
  }
1008
1662
  }