@arizeai/phoenix-cli 1.0.4 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +40 -0
  2. package/build/commands/annotationMutationUtils.d.ts +44 -0
  3. package/build/commands/annotationMutationUtils.d.ts.map +1 -0
  4. package/build/commands/annotationMutationUtils.js +119 -0
  5. package/build/commands/annotationMutationUtils.js.map +1 -0
  6. package/build/commands/formatAnnotationMutation.d.ts +8 -0
  7. package/build/commands/formatAnnotationMutation.d.ts.map +1 -0
  8. package/build/commands/formatAnnotationMutation.js +24 -0
  9. package/build/commands/formatAnnotationMutation.js.map +1 -0
  10. package/build/commands/formatNoteMutation.d.ts +8 -0
  11. package/build/commands/formatNoteMutation.d.ts.map +1 -0
  12. package/build/commands/formatNoteMutation.js +20 -0
  13. package/build/commands/formatNoteMutation.js.map +1 -0
  14. package/build/commands/formatSpans.js +12 -0
  15. package/build/commands/formatSpans.js.map +1 -1
  16. package/build/commands/formatTraces.js +84 -0
  17. package/build/commands/formatTraces.js.map +1 -1
  18. package/build/commands/noteMutationUtils.d.ts +22 -0
  19. package/build/commands/noteMutationUtils.d.ts.map +1 -0
  20. package/build/commands/noteMutationUtils.js +30 -0
  21. package/build/commands/noteMutationUtils.js.map +1 -0
  22. package/build/commands/span.d.ts +2 -0
  23. package/build/commands/span.d.ts.map +1 -1
  24. package/build/commands/span.js +195 -1
  25. package/build/commands/span.js.map +1 -1
  26. package/build/commands/trace.d.ts +1 -0
  27. package/build/commands/trace.d.ts.map +1 -1
  28. package/build/commands/trace.js +227 -43
  29. package/build/commands/trace.js.map +1 -1
  30. package/build/commands/traceAnnotations.d.ts +14 -0
  31. package/build/commands/traceAnnotations.d.ts.map +1 -0
  32. package/build/commands/traceAnnotations.js +60 -0
  33. package/build/commands/traceAnnotations.js.map +1 -0
  34. package/build/normalize.d.ts +8 -0
  35. package/build/normalize.d.ts.map +1 -0
  36. package/build/normalize.js +30 -0
  37. package/build/normalize.js.map +1 -0
  38. package/build/trace.d.ts +3 -0
  39. package/build/trace.d.ts.map +1 -1
  40. package/build/trace.js.map +1 -1
  41. package/build/version.d.ts.map +1 -1
  42. package/build/version.js +3 -4
  43. package/build/version.js.map +1 -1
  44. package/package.json +3 -3
@@ -1,11 +1,16 @@
1
1
  import * as fs from "fs";
2
+ import { addSpanNote } from "@arizeai/phoenix-client/spans";
2
3
  import { Command } from "commander";
3
4
  import { createPhoenixClient, resolveProjectId } from "../client.js";
4
5
  import { getConfigErrorMessage, resolveConfig, validateConfig, } from "../config.js";
5
6
  import { assertDeletesEnabled, confirmOrExit } from "../confirm.js";
6
7
  import { ExitCode, getExitCodeForError } from "../exitCodes.js";
7
8
  import { writeError, writeOutput, writeProgress } from "../io.js";
8
- import { formatSpansOutput } from "./formatSpans.js";
9
+ import { buildAnnotationMutationResult, getAnnotationMutationHelpText, getResponseErrorMessage, normalizeAnnotationInput, } from "./annotationMutationUtils.js";
10
+ import { formatAnnotationMutationOutput, } from "./formatAnnotationMutation.js";
11
+ import { formatNoteMutationOutput, } from "./formatNoteMutation.js";
12
+ import { formatSpansOutput, } from "./formatSpans.js";
13
+ import { buildNoteMutationResult, NOTE_ANNOTATION_NAME, normalizeNoteText, } from "./noteMutationUtils.js";
9
14
  import { fetchSpanAnnotations } from "./spanAnnotations.js";
10
15
  /**
11
16
  * Fetch spans for a project with optional filters
@@ -131,6 +136,7 @@ async function spanListHandler(file, options) {
131
136
  client,
132
137
  projectIdentifier: projectId,
133
138
  spanIds,
139
+ excludeAnnotationNames: [NOTE_ANNOTATION_NAME],
134
140
  });
135
141
  const annotationsBySpanId = new Map();
136
142
  for (const annotation of annotations) {
@@ -150,6 +156,38 @@ async function spanListHandler(file, options) {
150
156
  }
151
157
  }
152
158
  }
159
+ if (options.includeNotes) {
160
+ writeProgress({
161
+ message: "Fetching span notes...",
162
+ noProgress: !options.progress,
163
+ });
164
+ const spanIds = spans
165
+ .map((span) => span.context?.span_id)
166
+ .filter((spanId) => Boolean(spanId));
167
+ const notes = await fetchSpanAnnotations({
168
+ client,
169
+ projectIdentifier: projectId,
170
+ spanIds,
171
+ includeAnnotationNames: [NOTE_ANNOTATION_NAME],
172
+ });
173
+ const notesBySpanId = new Map();
174
+ for (const note of notes) {
175
+ const spanId = note.span_id;
176
+ if (!notesBySpanId.has(spanId)) {
177
+ notesBySpanId.set(spanId, []);
178
+ }
179
+ notesBySpanId.get(spanId).push(note);
180
+ }
181
+ for (const span of spans) {
182
+ const spanId = span.context?.span_id;
183
+ if (!spanId)
184
+ continue;
185
+ const spanNotes = notesBySpanId.get(spanId);
186
+ if (spanNotes) {
187
+ span.notes = spanNotes;
188
+ }
189
+ }
190
+ }
153
191
  // Output spans
154
192
  if (file) {
155
193
  if (userSpecifiedFormat && options.format && options.format !== "json") {
@@ -197,8 +235,162 @@ export function createSpanListCommand() {
197
235
  .option("--trace-id <ids...>", "Filter by trace ID(s)")
198
236
  .option("--parent-id <id>", 'Filter by parent span ID (use "null" for root spans only)')
199
237
  .option("--include-annotations", "Include span annotations in the output")
238
+ .option("--include-notes", "Include span notes in the output")
200
239
  .action(spanListHandler);
201
240
  }
241
+ /**
242
+ * Handler for `span annotate`
243
+ */
244
+ async function spanAnnotateHandler(spanId, options) {
245
+ try {
246
+ const config = resolveConfig({
247
+ cliOptions: {
248
+ endpoint: options.endpoint,
249
+ apiKey: options.apiKey,
250
+ },
251
+ });
252
+ const validation = validateConfig({ config, projectRequired: false });
253
+ if (!validation.valid) {
254
+ writeError({
255
+ message: getConfigErrorMessage({ errors: validation.errors }),
256
+ });
257
+ process.exit(ExitCode.INVALID_ARGUMENT);
258
+ }
259
+ const annotationInput = normalizeAnnotationInput({
260
+ targetType: "span",
261
+ name: options.name,
262
+ label: options.label,
263
+ score: options.score,
264
+ explanation: options.explanation,
265
+ annotatorKind: options.annotatorKind,
266
+ });
267
+ const client = createPhoenixClient({ config });
268
+ writeProgress({
269
+ message: `Annotating span ${spanId}...`,
270
+ noProgress: !options.progress,
271
+ });
272
+ const response = await client.POST("/v1/span_annotations", {
273
+ params: {
274
+ query: {
275
+ sync: true,
276
+ },
277
+ },
278
+ body: {
279
+ data: [
280
+ {
281
+ span_id: spanId,
282
+ name: annotationInput.name,
283
+ annotator_kind: annotationInput.annotatorKind,
284
+ result: annotationInput.result,
285
+ identifier: "",
286
+ },
287
+ ],
288
+ },
289
+ });
290
+ if (response.error) {
291
+ throw new Error(getResponseErrorMessage(response.error));
292
+ }
293
+ const insertedAnnotation = response.data?.data?.[0];
294
+ if (!insertedAnnotation) {
295
+ throw new Error("Phoenix did not return the inserted span annotation ID.");
296
+ }
297
+ const annotation = buildAnnotationMutationResult({
298
+ id: insertedAnnotation.id,
299
+ targetType: "span",
300
+ targetId: spanId,
301
+ annotationInput,
302
+ });
303
+ const output = formatAnnotationMutationOutput({
304
+ annotation,
305
+ format: options.format,
306
+ });
307
+ writeOutput({ message: output });
308
+ }
309
+ catch (error) {
310
+ writeError({
311
+ message: `Error annotating span: ${error instanceof Error ? error.message : String(error)}`,
312
+ });
313
+ process.exit(getExitCodeForError(error));
314
+ }
315
+ }
316
+ export function createSpanAnnotateCommand() {
317
+ return new Command("annotate")
318
+ .description("Annotate a span by OpenTelemetry span ID")
319
+ .argument("<span-id>", "OpenTelemetry span ID")
320
+ .option("--endpoint <url>", "Phoenix API endpoint")
321
+ .option("--api-key <key>", "Phoenix API key for authentication")
322
+ .option("--name <name>", "Annotation name")
323
+ .option("--label <label>", "Annotation label")
324
+ .option("--score <number>", "Annotation score")
325
+ .option("--explanation <text>", "Annotation explanation")
326
+ .option("--annotator-kind <kind>", "Annotation kind: HUMAN, LLM, or CODE")
327
+ .option("--format <format>", "Output format: pretty, json, or raw", "pretty")
328
+ .option("--no-progress", "Disable progress indicators")
329
+ .addHelpText("after", getAnnotationMutationHelpText({ targetType: "span" }))
330
+ .action(spanAnnotateHandler);
331
+ }
332
+ async function spanAddNoteHandler(spanId, options) {
333
+ try {
334
+ const config = resolveConfig({
335
+ cliOptions: {
336
+ endpoint: options.endpoint,
337
+ apiKey: options.apiKey,
338
+ },
339
+ });
340
+ const validation = validateConfig({ config, projectRequired: false });
341
+ if (!validation.valid) {
342
+ writeError({
343
+ message: getConfigErrorMessage({ errors: validation.errors }),
344
+ });
345
+ process.exit(ExitCode.INVALID_ARGUMENT);
346
+ }
347
+ const noteText = normalizeNoteText({
348
+ targetType: "span",
349
+ text: options.text,
350
+ });
351
+ const client = createPhoenixClient({ config });
352
+ writeProgress({
353
+ message: `Adding note to span ${spanId}...`,
354
+ noProgress: !options.progress,
355
+ });
356
+ const result = await addSpanNote({
357
+ client,
358
+ spanNote: {
359
+ spanId,
360
+ note: noteText,
361
+ },
362
+ });
363
+ const note = buildNoteMutationResult({
364
+ id: result.id,
365
+ targetType: "span",
366
+ targetId: spanId,
367
+ text: noteText,
368
+ });
369
+ writeOutput({
370
+ message: formatNoteMutationOutput({
371
+ note,
372
+ format: options.format,
373
+ }),
374
+ });
375
+ }
376
+ catch (error) {
377
+ writeError({
378
+ message: `Error adding span note: ${error instanceof Error ? error.message : String(error)}`,
379
+ });
380
+ process.exit(getExitCodeForError(error));
381
+ }
382
+ }
383
+ export function createSpanAddNoteCommand() {
384
+ return new Command("add-note")
385
+ .description("Add a note to a span by OpenTelemetry span ID")
386
+ .argument("<span-id>", "OpenTelemetry span ID")
387
+ .option("--endpoint <url>", "Phoenix API endpoint")
388
+ .option("--api-key <key>", "Phoenix API key for authentication")
389
+ .option("--text <text>", "Note text")
390
+ .option("--format <format>", "Output format: pretty, json, or raw", "pretty")
391
+ .option("--no-progress", "Disable progress indicators")
392
+ .action(spanAddNoteHandler);
393
+ }
202
394
  /**
203
395
  * Handler for `span delete`
204
396
  */
@@ -266,6 +458,8 @@ export function createSpanCommand() {
266
458
  const command = new Command("span");
267
459
  command.description("Manage Phoenix spans");
268
460
  command.addCommand(createSpanListCommand());
461
+ command.addCommand(createSpanAnnotateCommand());
462
+ command.addCommand(createSpanAddNoteCommand());
269
463
  command.addCommand(createSpanDeleteCommand());
270
464
  return command;
271
465
  }
@@ -1 +1 @@
1
- {"version":3,"file":"span.js","sourceRoot":"","sources":["../../src/commands/span.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"span.js","sourceRoot":"","sources":["../../src/commands/span.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { Command } from "commander";
2
2
  export declare function createTraceGetCommand(): Command;
3
3
  export declare function createTraceListCommand(): Command;
4
+ export declare function createTraceAnnotateCommand(): Command;
4
5
  export declare function createTraceDeleteCommand(): Command;
5
6
  /**
6
7
  * Create the `trace` command with subcommands
@@ -1 +1 @@
1
- {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/commands/trace.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4gBpC,wBAAgB,qBAAqB,IAAI,OAAO,CAmB/C;AAED,wBAAgB,sBAAsB,IAAI,OAAO,CAoChD;AAsED,wBAAgB,wBAAwB,IAAI,OAAO,CAYlD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAO5C"}
1
+ {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/commands/trace.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAspBpC,wBAAgB,qBAAqB,IAAI,OAAO,CAoB/C;AAED,wBAAgB,sBAAsB,IAAI,OAAO,CAqChD;AA2FD,wBAAgB,0BAA0B,IAAI,OAAO,CAsBpD;AAsED,wBAAgB,wBAAwB,IAAI,OAAO,CAYlD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAQ5C"}
@@ -6,10 +6,70 @@ import { getConfigErrorMessage, resolveConfig, validateConfig, } from "../config
6
6
  import { assertDeletesEnabled, confirmOrExit } from "../confirm.js";
7
7
  import { ExitCode, getExitCodeForError } from "../exitCodes.js";
8
8
  import { writeError, writeOutput, writeProgress } from "../io.js";
9
- import { buildTrace, groupSpansByTrace } from "../trace.js";
10
- import { formatTraceOutput } from "./formatTraces.js";
11
- import { formatTracesOutput } from "./formatTraces.js";
9
+ import { buildTrace, groupSpansByTrace, } from "../trace.js";
10
+ import { buildAnnotationMutationResult, getAnnotationMutationHelpText, getResponseErrorMessage, normalizeAnnotationInput, } from "./annotationMutationUtils.js";
11
+ import { formatAnnotationMutationOutput, } from "./formatAnnotationMutation.js";
12
+ import { formatTraceOutput, formatTracesOutput, } from "./formatTraces.js";
13
+ import { NOTE_ANNOTATION_NAME } from "./noteMutationUtils.js";
12
14
  import { fetchSpanAnnotations } from "./spanAnnotations.js";
15
+ import { fetchTraceAnnotations, } from "./traceAnnotations.js";
16
+ function attachSpanAnnotationsToSpans(spans, annotations) {
17
+ const annotationsBySpanId = new Map();
18
+ for (const annotation of annotations) {
19
+ const spanId = annotation.span_id;
20
+ if (!annotationsBySpanId.has(spanId)) {
21
+ annotationsBySpanId.set(spanId, []);
22
+ }
23
+ annotationsBySpanId.get(spanId).push(annotation);
24
+ }
25
+ for (const span of spans) {
26
+ const spanId = span.context?.span_id;
27
+ if (!spanId)
28
+ continue;
29
+ const spanAnnotations = annotationsBySpanId.get(spanId);
30
+ if (spanAnnotations) {
31
+ span.annotations = spanAnnotations;
32
+ }
33
+ }
34
+ }
35
+ function attachTraceAnnotationsToTraces(traces, annotations) {
36
+ const annotationsByTraceId = new Map();
37
+ for (const annotation of annotations) {
38
+ const traceId = annotation.trace_id;
39
+ if (!annotationsByTraceId.has(traceId)) {
40
+ annotationsByTraceId.set(traceId, []);
41
+ }
42
+ annotationsByTraceId.get(traceId).push(annotation);
43
+ }
44
+ for (const trace of traces) {
45
+ const traceAnnotations = annotationsByTraceId.get(trace.traceId);
46
+ if (traceAnnotations) {
47
+ trace.annotations = traceAnnotations;
48
+ }
49
+ }
50
+ }
51
+ function attachSpanNotesToSpans(spans, notes) {
52
+ const notesBySpanId = new Map();
53
+ for (const note of notes) {
54
+ const spanId = note.span_id;
55
+ if (!notesBySpanId.has(spanId)) {
56
+ notesBySpanId.set(spanId, []);
57
+ }
58
+ notesBySpanId.get(spanId).push(note);
59
+ }
60
+ for (const span of spans) {
61
+ const spanId = span.context?.span_id;
62
+ if (!spanId)
63
+ continue;
64
+ const spanNotes = notesBySpanId.get(spanId);
65
+ if (spanNotes) {
66
+ span.notes = spanNotes;
67
+ }
68
+ }
69
+ }
70
+ function getResolvedTraceId(spans) {
71
+ return spans[0]?.context?.trace_id;
72
+ }
13
73
  /**
14
74
  * Fetch spans for a project within a time range
15
75
  */
@@ -205,35 +265,52 @@ async function traceGetHandler(traceId, options) {
205
265
  message: `Found ${spans.length} span(s)`,
206
266
  noProgress: !options.progress,
207
267
  });
268
+ const traceSpans = spans;
269
+ const resolvedTraceId = getResolvedTraceId(spans);
270
+ let traceAnnotations;
208
271
  if (options.includeAnnotations) {
209
- const spanIds = spans
272
+ writeProgress({
273
+ message: "Fetching trace and span annotations...",
274
+ noProgress: !options.progress,
275
+ });
276
+ traceAnnotations = await fetchTraceAnnotations({
277
+ client,
278
+ projectIdentifier: projectId,
279
+ traceIds: resolvedTraceId ? [resolvedTraceId] : [traceId],
280
+ excludeAnnotationNames: [NOTE_ANNOTATION_NAME],
281
+ });
282
+ const spanIds = traceSpans
210
283
  .map((span) => span.context?.span_id)
211
284
  .filter((spanId) => Boolean(spanId));
212
- const annotations = await fetchSpanAnnotations({
285
+ const spanAnnotations = await fetchSpanAnnotations({
213
286
  client,
214
287
  projectIdentifier: projectId,
215
288
  spanIds,
289
+ excludeAnnotationNames: [NOTE_ANNOTATION_NAME],
216
290
  });
217
- const annotationsBySpanId = new Map();
218
- for (const annotation of annotations) {
219
- const spanId = annotation.span_id;
220
- if (!annotationsBySpanId.has(spanId)) {
221
- annotationsBySpanId.set(spanId, []);
222
- }
223
- annotationsBySpanId.get(spanId).push(annotation);
224
- }
225
- for (const span of spans) {
226
- const spanId = span.context?.span_id;
227
- if (!spanId)
228
- continue;
229
- const spanAnnotations = annotationsBySpanId.get(spanId);
230
- if (spanAnnotations) {
231
- span.annotations = spanAnnotations;
232
- }
233
- }
291
+ attachSpanAnnotationsToSpans(traceSpans, spanAnnotations);
292
+ }
293
+ if (options.includeNotes) {
294
+ writeProgress({
295
+ message: "Fetching span notes...",
296
+ noProgress: !options.progress,
297
+ });
298
+ const spanIds = traceSpans
299
+ .map((span) => span.context?.span_id)
300
+ .filter((spanId) => Boolean(spanId));
301
+ const spanNotes = await fetchSpanAnnotations({
302
+ client,
303
+ projectIdentifier: projectId,
304
+ spanIds,
305
+ includeAnnotationNames: [NOTE_ANNOTATION_NAME],
306
+ });
307
+ attachSpanNotesToSpans(traceSpans, spanNotes);
234
308
  }
235
309
  // Build trace
236
- const trace = buildTrace({ spans });
310
+ const trace = buildTrace({ spans: traceSpans });
311
+ if (traceAnnotations?.length) {
312
+ trace.annotations = traceAnnotations;
313
+ }
237
314
  // Output trace
238
315
  const outputFormat = options.file
239
316
  ? "json"
@@ -319,37 +396,50 @@ async function traceListHandler(directory, options) {
319
396
  });
320
397
  if (options.includeAnnotations) {
321
398
  writeProgress({
322
- message: "Fetching span annotations...",
399
+ message: "Fetching trace and span annotations...",
323
400
  noProgress: !options.progress,
324
401
  });
402
+ const traceAnnotations = await fetchTraceAnnotations({
403
+ client,
404
+ projectIdentifier: projectId,
405
+ traceIds: traces.map((trace) => trace.traceId),
406
+ excludeAnnotationNames: [NOTE_ANNOTATION_NAME],
407
+ maxConcurrent: options.maxConcurrent,
408
+ });
409
+ attachTraceAnnotationsToTraces(traces, traceAnnotations);
325
410
  const spanIds = traces
326
411
  .flatMap((trace) => trace.spans)
327
412
  .map((span) => span.context?.span_id)
328
413
  .filter((spanId) => Boolean(spanId));
329
- const annotations = await fetchSpanAnnotations({
414
+ const spanAnnotations = await fetchSpanAnnotations({
330
415
  client,
331
416
  projectIdentifier: projectId,
332
417
  spanIds,
418
+ excludeAnnotationNames: [NOTE_ANNOTATION_NAME],
333
419
  maxConcurrent: options.maxConcurrent,
334
420
  });
335
- const annotationsBySpanId = new Map();
336
- for (const annotation of annotations) {
337
- const spanId = annotation.span_id;
338
- if (!annotationsBySpanId.has(spanId)) {
339
- annotationsBySpanId.set(spanId, []);
340
- }
341
- annotationsBySpanId.get(spanId).push(annotation);
421
+ for (const trace of traces) {
422
+ attachSpanAnnotationsToSpans(trace.spans, spanAnnotations);
342
423
  }
424
+ }
425
+ if (options.includeNotes) {
426
+ writeProgress({
427
+ message: "Fetching span notes...",
428
+ noProgress: !options.progress,
429
+ });
430
+ const spanIds = traces
431
+ .flatMap((trace) => trace.spans)
432
+ .map((span) => span.context?.span_id)
433
+ .filter((spanId) => Boolean(spanId));
434
+ const spanNotes = await fetchSpanAnnotations({
435
+ client,
436
+ projectIdentifier: projectId,
437
+ spanIds,
438
+ includeAnnotationNames: [NOTE_ANNOTATION_NAME],
439
+ maxConcurrent: options.maxConcurrent,
440
+ });
343
441
  for (const trace of traces) {
344
- for (const span of trace.spans) {
345
- const spanId = span.context?.span_id;
346
- if (!spanId)
347
- continue;
348
- const spanAnnotations = annotationsBySpanId.get(spanId);
349
- if (spanAnnotations) {
350
- span.annotations = spanAnnotations;
351
- }
352
- }
442
+ attachSpanNotesToSpans(trace.spans, spanNotes);
353
443
  }
354
444
  }
355
445
  if (directory) {
@@ -393,7 +483,8 @@ export function createTraceGetCommand() {
393
483
  .option("--format <format>", "Output format: pretty, json, or raw", "pretty")
394
484
  .option("--no-progress", "Disable progress indicators")
395
485
  .option("--file <path>", "Save trace to file instead of stdout")
396
- .option("--include-annotations", "Include span annotations in the trace export")
486
+ .option("--include-annotations", "Include trace and span annotations in the trace export")
487
+ .option("--include-notes", "Include span notes in the trace export")
397
488
  .action(traceGetHandler);
398
489
  }
399
490
  export function createTraceListCommand() {
@@ -409,9 +500,101 @@ export function createTraceListCommand() {
409
500
  .option("--last-n-minutes <number>", "Only fetch traces from the last N minutes", parseInt)
410
501
  .option("--since <timestamp>", "Fetch traces since this ISO timestamp")
411
502
  .option("--max-concurrent <number>", "Maximum concurrent fetches for bulk operations", (v) => parseInt(v, 10), 10)
412
- .option("--include-annotations", "Include span annotations in the trace export")
503
+ .option("--include-annotations", "Include trace and span annotations in the trace export")
504
+ .option("--include-notes", "Include span notes in the trace export")
413
505
  .action(traceListHandler);
414
506
  }
507
+ /**
508
+ * Handler for `trace annotate`
509
+ */
510
+ async function traceAnnotateHandler(traceId, options) {
511
+ try {
512
+ const config = resolveConfig({
513
+ cliOptions: {
514
+ endpoint: options.endpoint,
515
+ apiKey: options.apiKey,
516
+ },
517
+ });
518
+ const validation = validateConfig({ config, projectRequired: false });
519
+ if (!validation.valid) {
520
+ writeError({
521
+ message: getConfigErrorMessage({ errors: validation.errors }),
522
+ });
523
+ process.exit(ExitCode.INVALID_ARGUMENT);
524
+ }
525
+ const annotationInput = normalizeAnnotationInput({
526
+ targetType: "trace",
527
+ name: options.name,
528
+ label: options.label,
529
+ score: options.score,
530
+ explanation: options.explanation,
531
+ annotatorKind: options.annotatorKind,
532
+ });
533
+ const client = createPhoenixClient({ config });
534
+ writeProgress({
535
+ message: `Annotating trace ${traceId}...`,
536
+ noProgress: !options.progress,
537
+ });
538
+ const response = await client.POST("/v1/trace_annotations", {
539
+ params: {
540
+ query: {
541
+ sync: true,
542
+ },
543
+ },
544
+ body: {
545
+ data: [
546
+ {
547
+ trace_id: traceId,
548
+ name: annotationInput.name,
549
+ annotator_kind: annotationInput.annotatorKind,
550
+ result: annotationInput.result,
551
+ identifier: "",
552
+ },
553
+ ],
554
+ },
555
+ });
556
+ if (response.error) {
557
+ throw new Error(getResponseErrorMessage(response.error));
558
+ }
559
+ const insertedAnnotation = response.data?.data?.[0];
560
+ if (!insertedAnnotation) {
561
+ throw new Error("Phoenix did not return the inserted trace annotation ID.");
562
+ }
563
+ const annotation = buildAnnotationMutationResult({
564
+ id: insertedAnnotation.id,
565
+ targetType: "trace",
566
+ targetId: traceId,
567
+ annotationInput,
568
+ });
569
+ const output = formatAnnotationMutationOutput({
570
+ annotation,
571
+ format: options.format,
572
+ });
573
+ writeOutput({ message: output });
574
+ }
575
+ catch (error) {
576
+ writeError({
577
+ message: `Error annotating trace: ${error instanceof Error ? error.message : String(error)}`,
578
+ });
579
+ process.exit(getExitCodeForError(error));
580
+ }
581
+ }
582
+ export function createTraceAnnotateCommand() {
583
+ return new Command("annotate")
584
+ .description("Annotate a trace by OpenTelemetry trace ID")
585
+ .argument("<trace-id>", "OpenTelemetry trace ID")
586
+ .option("--endpoint <url>", "Phoenix API endpoint")
587
+ .option("--api-key <key>", "Phoenix API key for authentication")
588
+ .option("--name <name>", "Annotation name")
589
+ .option("--label <label>", "Annotation label")
590
+ .option("--score <number>", "Annotation score")
591
+ .option("--explanation <text>", "Annotation explanation")
592
+ .option("--annotator-kind <kind>", "Annotation kind: HUMAN, LLM, or CODE")
593
+ .option("--format <format>", "Output format: pretty, json, or raw", "pretty")
594
+ .option("--no-progress", "Disable progress indicators")
595
+ .addHelpText("after", getAnnotationMutationHelpText({ targetType: "trace" }))
596
+ .action(traceAnnotateHandler);
597
+ }
415
598
  /**
416
599
  * Handler for `trace delete`
417
600
  */
@@ -480,6 +663,7 @@ export function createTraceCommand() {
480
663
  command.description("Manage Phoenix traces");
481
664
  command.addCommand(createTraceListCommand());
482
665
  command.addCommand(createTraceGetCommand());
666
+ command.addCommand(createTraceAnnotateCommand());
483
667
  command.addCommand(createTraceDeleteCommand());
484
668
  return command;
485
669
  }