@arizeai/phoenix-cli 0.0.4 → 0.2.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.
- package/README.md +279 -16
- package/build/cli.d.ts.map +1 -0
- package/build/cli.js +25 -0
- package/build/cli.js.map +1 -0
- package/build/client.d.ts +49 -0
- package/build/client.d.ts.map +1 -0
- package/build/client.js +96 -0
- package/build/client.js.map +1 -0
- package/build/commands/dataset.d.ts +6 -0
- package/build/commands/dataset.d.ts.map +1 -0
- package/build/commands/dataset.js +153 -0
- package/build/commands/dataset.js.map +1 -0
- package/build/commands/datasets.d.ts +6 -0
- package/build/commands/datasets.d.ts.map +1 -0
- package/build/commands/datasets.js +97 -0
- package/build/commands/datasets.js.map +1 -0
- package/build/commands/experiment.d.ts +6 -0
- package/build/commands/experiment.d.ts.map +1 -0
- package/build/commands/experiment.js +106 -0
- package/build/commands/experiment.js.map +1 -0
- package/build/commands/experiments.d.ts +6 -0
- package/build/commands/experiments.d.ts.map +1 -0
- package/build/commands/experiments.js +201 -0
- package/build/commands/experiments.js.map +1 -0
- package/build/commands/formatDataset.d.ts +26 -0
- package/build/commands/formatDataset.d.ts.map +1 -0
- package/build/commands/formatDataset.js +60 -0
- package/build/commands/formatDataset.js.map +1 -0
- package/build/commands/formatDatasets.d.ts +27 -0
- package/build/commands/formatDatasets.d.ts.map +1 -0
- package/build/commands/formatDatasets.js +76 -0
- package/build/commands/formatDatasets.js.map +1 -0
- package/build/commands/formatExperiment.d.ts +35 -0
- package/build/commands/formatExperiment.d.ts.map +1 -0
- package/build/commands/formatExperiment.js +191 -0
- package/build/commands/formatExperiment.js.map +1 -0
- package/build/commands/formatExperiments.d.ts +16 -0
- package/build/commands/formatExperiments.d.ts.map +1 -0
- package/build/commands/formatExperiments.js +53 -0
- package/build/commands/formatExperiments.js.map +1 -0
- package/build/commands/formatProjects.d.ts +19 -0
- package/build/commands/formatProjects.d.ts.map +1 -0
- package/build/commands/formatProjects.js +21 -0
- package/build/commands/formatProjects.js.map +1 -0
- package/build/commands/formatTraces.d.ts +25 -0
- package/build/commands/formatTraces.d.ts.map +1 -0
- package/build/commands/formatTraces.js +165 -0
- package/build/commands/formatTraces.js.map +1 -0
- package/build/commands/index.d.ts +8 -0
- package/build/commands/index.d.ts.map +1 -0
- package/build/commands/index.js +8 -0
- package/build/commands/index.js.map +1 -0
- package/build/commands/projects.d.ts +6 -0
- package/build/commands/projects.d.ts.map +1 -0
- package/build/commands/projects.js +87 -0
- package/build/commands/projects.js.map +1 -0
- package/build/commands/trace.d.ts +6 -0
- package/build/commands/trace.d.ts.map +1 -0
- package/build/commands/trace.js +143 -0
- package/build/commands/trace.js.map +1 -0
- package/build/commands/traces.d.ts +6 -0
- package/build/commands/traces.d.ts.map +1 -0
- package/build/commands/traces.js +239 -0
- package/build/commands/traces.js.map +1 -0
- package/build/config.d.ts +70 -0
- package/build/config.d.ts.map +1 -0
- package/build/config.js +77 -0
- package/build/config.js.map +1 -0
- package/{dist/src → build}/index.d.ts.map +1 -1
- package/{dist/esm → build}/index.js +0 -0
- package/build/index.js.map +1 -0
- package/build/io.d.ts +49 -0
- package/build/io.d.ts.map +1 -0
- package/build/io.js +29 -0
- package/build/io.js.map +1 -0
- package/build/trace.d.ts +41 -0
- package/build/trace.d.ts.map +1 -0
- package/build/trace.js +55 -0
- package/build/trace.js.map +1 -0
- package/package.json +19 -15
- package/dist/esm/cli.d.ts.map +0 -1
- package/dist/esm/cli.js +0 -17
- package/dist/esm/cli.js.map +0 -1
- package/dist/esm/commands/index.d.ts +0 -1
- package/dist/esm/commands/index.d.ts.map +0 -1
- package/dist/esm/commands/index.js +0 -8
- package/dist/esm/commands/index.js.map +0 -1
- package/dist/esm/index.d.ts.map +0 -1
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/package.json +0 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +0 -1
- package/dist/esm/utils/index.d.ts +0 -1
- package/dist/esm/utils/index.d.ts.map +0 -1
- package/dist/esm/utils/index.js +0 -8
- package/dist/esm/utils/index.js.map +0 -1
- package/dist/src/cli.d.ts +0 -3
- package/dist/src/cli.d.ts.map +0 -1
- package/dist/src/cli.js +0 -20
- package/dist/src/cli.js.map +0 -1
- package/dist/src/commands/index.d.ts +0 -2
- package/dist/src/commands/index.d.ts.map +0 -1
- package/dist/src/commands/index.js +0 -9
- package/dist/src/commands/index.js.map +0 -1
- package/dist/src/index.d.ts +0 -3
- package/dist/src/index.js +0 -8
- package/dist/src/index.js.map +0 -1
- package/dist/src/utils/index.d.ts +0 -2
- package/dist/src/utils/index.d.ts.map +0 -1
- package/dist/src/utils/index.js +0 -9
- package/dist/src/utils/index.js.map +0 -1
- package/dist/test/cli.test.d.ts +0 -2
- package/dist/test/cli.test.d.ts.map +0 -1
- package/dist/test/cli.test.js +0 -12
- package/dist/test/cli.test.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/src/cli.ts +0 -22
- package/src/commands/index.ts +0 -7
- package/src/index.ts +0 -7
- package/src/utils/index.ts +0 -7
- /package/{dist/esm → build}/cli.d.ts +0 -0
- /package/{dist/esm → build}/index.d.ts +0 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export function formatDatasetsOutput({ datasets, format, }) {
|
|
2
|
+
const selected = format || "pretty";
|
|
3
|
+
if (selected === "raw") {
|
|
4
|
+
return JSON.stringify(datasets);
|
|
5
|
+
}
|
|
6
|
+
if (selected === "json") {
|
|
7
|
+
return JSON.stringify(datasets, null, 2);
|
|
8
|
+
}
|
|
9
|
+
return formatDatasetsPretty(datasets);
|
|
10
|
+
}
|
|
11
|
+
function formatDatasetsPretty(datasets) {
|
|
12
|
+
if (datasets.length === 0) {
|
|
13
|
+
return "No datasets found";
|
|
14
|
+
}
|
|
15
|
+
const lines = [];
|
|
16
|
+
lines.push("Datasets:");
|
|
17
|
+
lines.push("");
|
|
18
|
+
for (const dataset of datasets) {
|
|
19
|
+
const desc = dataset.description === null ||
|
|
20
|
+
dataset.description === undefined ||
|
|
21
|
+
dataset.description === ""
|
|
22
|
+
? ""
|
|
23
|
+
: ` — ${dataset.description}`;
|
|
24
|
+
lines.push(`┌─ ${dataset.name} (${dataset.id})`);
|
|
25
|
+
lines.push(`│ Examples: ${dataset.example_count}`);
|
|
26
|
+
lines.push(`│ Created: ${formatDate(dataset.created_at)}`);
|
|
27
|
+
lines.push(`│ Updated: ${formatDate(dataset.updated_at)}`);
|
|
28
|
+
if (desc) {
|
|
29
|
+
lines.push(`│ Description:${desc}`);
|
|
30
|
+
}
|
|
31
|
+
lines.push(`└─`);
|
|
32
|
+
lines.push("");
|
|
33
|
+
}
|
|
34
|
+
return lines.join("\n").trimEnd();
|
|
35
|
+
}
|
|
36
|
+
export function formatDatasetOutput({ dataset, format, }) {
|
|
37
|
+
const selected = format || "pretty";
|
|
38
|
+
if (selected === "raw") {
|
|
39
|
+
return JSON.stringify(dataset);
|
|
40
|
+
}
|
|
41
|
+
if (selected === "json") {
|
|
42
|
+
return JSON.stringify(dataset, null, 2);
|
|
43
|
+
}
|
|
44
|
+
return formatDatasetPretty(dataset);
|
|
45
|
+
}
|
|
46
|
+
function formatDatasetPretty(dataset) {
|
|
47
|
+
const lines = [];
|
|
48
|
+
const desc = dataset.description === null ||
|
|
49
|
+
dataset.description === undefined ||
|
|
50
|
+
dataset.description === ""
|
|
51
|
+
? ""
|
|
52
|
+
: ` — ${dataset.description}`;
|
|
53
|
+
lines.push(`┌─ Dataset: ${dataset.name} (${dataset.id})`);
|
|
54
|
+
lines.push(`│`);
|
|
55
|
+
lines.push(`│ Examples: ${dataset.example_count}`);
|
|
56
|
+
lines.push(`│ Created: ${formatDate(dataset.created_at)}`);
|
|
57
|
+
lines.push(`│ Updated: ${formatDate(dataset.updated_at)}`);
|
|
58
|
+
if (desc) {
|
|
59
|
+
lines.push(`│ Description:${desc}`);
|
|
60
|
+
}
|
|
61
|
+
if (dataset.metadata && Object.keys(dataset.metadata).length > 0) {
|
|
62
|
+
lines.push(`│ Metadata: ${JSON.stringify(dataset.metadata)}`);
|
|
63
|
+
}
|
|
64
|
+
lines.push(`└─`);
|
|
65
|
+
return lines.join("\n");
|
|
66
|
+
}
|
|
67
|
+
function formatDate(dateStr) {
|
|
68
|
+
try {
|
|
69
|
+
const date = new Date(dateStr);
|
|
70
|
+
return date.toLocaleString();
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return dateStr;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=formatDatasets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatDatasets.js","sourceRoot":"","sources":["../../src/commands/formatDatasets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { componentsV1 } from "@arizeai/phoenix-client";
|
|
2
|
+
export type OutputFormat = "pretty" | "json" | "raw";
|
|
3
|
+
type Experiment = componentsV1["schemas"]["Experiment"];
|
|
4
|
+
type ExperimentRun = componentsV1["schemas"]["ExperimentRun"];
|
|
5
|
+
export interface ExperimentWithRuns {
|
|
6
|
+
experiment: Experiment;
|
|
7
|
+
runs: ExperimentRun[];
|
|
8
|
+
}
|
|
9
|
+
export interface FormatExperimentOutputOptions {
|
|
10
|
+
/**
|
|
11
|
+
* Experiment data to format.
|
|
12
|
+
*/
|
|
13
|
+
data: ExperimentWithRuns;
|
|
14
|
+
/**
|
|
15
|
+
* Output format. Defaults to `"pretty"`.
|
|
16
|
+
*/
|
|
17
|
+
format?: OutputFormat;
|
|
18
|
+
}
|
|
19
|
+
export declare function formatExperimentOutput({ data, format, }: FormatExperimentOutputOptions): string;
|
|
20
|
+
/**
|
|
21
|
+
* Format raw experiment JSON data from the API
|
|
22
|
+
*/
|
|
23
|
+
export interface FormatExperimentJsonOutputOptions {
|
|
24
|
+
/**
|
|
25
|
+
* Raw JSON data from the experiment endpoint.
|
|
26
|
+
*/
|
|
27
|
+
jsonData: string;
|
|
28
|
+
/**
|
|
29
|
+
* Output format. Defaults to `"pretty"`.
|
|
30
|
+
*/
|
|
31
|
+
format?: OutputFormat;
|
|
32
|
+
}
|
|
33
|
+
export declare function formatExperimentJsonOutput({ jsonData, format, }: FormatExperimentJsonOutputOptions): string;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=formatExperiment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatExperiment.d.ts","sourceRoot":"","sources":["../../src/commands/formatExperiment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;AAErD,KAAK,UAAU,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC;AACxD,KAAK,aAAa,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,CAAC;AAE9D,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,UAAU,CAAC;IACvB,IAAI,EAAE,aAAa,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,6BAA6B;IAC5C;;OAEG;IACH,IAAI,EAAE,kBAAkB,CAAC;IACzB;;OAEG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,wBAAgB,sBAAsB,CAAC,EACrC,IAAI,EACJ,MAAM,GACP,EAAE,6BAA6B,GAAG,MAAM,CASxC;AAoED;;GAEG;AACH,MAAM,WAAW,iCAAiC;IAChD;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,wBAAgB,0BAA0B,CAAC,EACzC,QAAQ,EACR,MAAM,GACP,EAAE,iCAAiC,GAAG,MAAM,CAsB5C"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
export function formatExperimentOutput({ data, format, }) {
|
|
2
|
+
const selected = format || "pretty";
|
|
3
|
+
if (selected === "raw") {
|
|
4
|
+
return JSON.stringify(data);
|
|
5
|
+
}
|
|
6
|
+
if (selected === "json") {
|
|
7
|
+
return JSON.stringify(data, null, 2);
|
|
8
|
+
}
|
|
9
|
+
return formatExperimentPretty(data);
|
|
10
|
+
}
|
|
11
|
+
function formatExperimentPretty(data) {
|
|
12
|
+
const { experiment, runs } = data;
|
|
13
|
+
const lines = [];
|
|
14
|
+
const projectInfo = experiment.project_name
|
|
15
|
+
? ` [Project: ${experiment.project_name}]`
|
|
16
|
+
: "";
|
|
17
|
+
lines.push(`┌─ Experiment: ${experiment.id}${projectInfo}`);
|
|
18
|
+
lines.push(`│`);
|
|
19
|
+
lines.push(`│ Dataset ID: ${experiment.dataset_id}`);
|
|
20
|
+
lines.push(`│ Version ID: ${experiment.dataset_version_id}`);
|
|
21
|
+
lines.push(`│ Examples: ${experiment.example_count}`);
|
|
22
|
+
lines.push(`│ Repetitions: ${experiment.repetitions}`);
|
|
23
|
+
lines.push(`│`);
|
|
24
|
+
lines.push(`│ Run Summary:`);
|
|
25
|
+
lines.push(`│ ✓ Successful: ${experiment.successful_run_count}`);
|
|
26
|
+
lines.push(`│ ✗ Failed: ${experiment.failed_run_count}`);
|
|
27
|
+
lines.push(`│ ○ Missing: ${experiment.missing_run_count}`);
|
|
28
|
+
lines.push(`│`);
|
|
29
|
+
lines.push(`│ Created: ${formatDate(experiment.created_at)}`);
|
|
30
|
+
lines.push(`│ Updated: ${formatDate(experiment.updated_at)}`);
|
|
31
|
+
if (experiment.metadata &&
|
|
32
|
+
Object.keys(experiment.metadata).length > 0) {
|
|
33
|
+
lines.push(`│ Metadata: ${JSON.stringify(experiment.metadata)}`);
|
|
34
|
+
}
|
|
35
|
+
if (runs.length > 0) {
|
|
36
|
+
lines.push(`│`);
|
|
37
|
+
lines.push(`│ Runs (${runs.length}):`);
|
|
38
|
+
for (const run of runs) {
|
|
39
|
+
const status = run.error ? "✗" : "✓";
|
|
40
|
+
const duration = formatDurationMs(run.start_time, run.end_time);
|
|
41
|
+
const traceInfo = run.trace_id ? ` [trace: ${run.trace_id}]` : "";
|
|
42
|
+
const repInfo = run.repetition_number > 1 ? ` (rep ${run.repetition_number})` : "";
|
|
43
|
+
lines.push(`│ ${status} ${run.id}${repInfo} - ${duration}${traceInfo}`);
|
|
44
|
+
if (run.error) {
|
|
45
|
+
lines.push(`│ Error: ${truncate(run.error, 80)}`);
|
|
46
|
+
}
|
|
47
|
+
if (run.output !== null && run.output !== undefined) {
|
|
48
|
+
const outputPreview = truncate(typeof run.output === "string"
|
|
49
|
+
? run.output
|
|
50
|
+
: JSON.stringify(run.output), 100);
|
|
51
|
+
lines.push(`│ Output: ${outputPreview}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
lines.push(`└─`);
|
|
56
|
+
return lines.join("\n");
|
|
57
|
+
}
|
|
58
|
+
export function formatExperimentJsonOutput({ jsonData, format, }) {
|
|
59
|
+
const selected = format || "pretty";
|
|
60
|
+
if (selected === "raw") {
|
|
61
|
+
// Return as compact JSON
|
|
62
|
+
try {
|
|
63
|
+
const parsed = JSON.parse(jsonData);
|
|
64
|
+
return JSON.stringify(parsed);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return jsonData;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (selected === "json") {
|
|
71
|
+
// Return as pretty JSON
|
|
72
|
+
try {
|
|
73
|
+
const parsed = JSON.parse(jsonData);
|
|
74
|
+
return JSON.stringify(parsed, null, 2);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return jsonData;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Pretty format - parse and format nicely
|
|
81
|
+
return formatExperimentJsonPretty(jsonData);
|
|
82
|
+
}
|
|
83
|
+
function formatExperimentJsonPretty(jsonData) {
|
|
84
|
+
try {
|
|
85
|
+
const data = JSON.parse(jsonData);
|
|
86
|
+
const lines = [];
|
|
87
|
+
// Handle array of experiment runs from the JSON endpoint
|
|
88
|
+
if (Array.isArray(data)) {
|
|
89
|
+
lines.push(`Experiment Runs (${data.length}):`);
|
|
90
|
+
lines.push("");
|
|
91
|
+
for (const run of data) {
|
|
92
|
+
const status = run.error ? "✗" : "✓";
|
|
93
|
+
const runId = run.id || run.run_id || "unknown";
|
|
94
|
+
lines.push(`┌─ ${status} Run: ${runId}`);
|
|
95
|
+
if (run.example_id || run.dataset_example_id) {
|
|
96
|
+
lines.push(`│ Example ID: ${run.example_id || run.dataset_example_id}`);
|
|
97
|
+
}
|
|
98
|
+
if (run.repetition_number) {
|
|
99
|
+
lines.push(`│ Repetition: ${run.repetition_number}`);
|
|
100
|
+
}
|
|
101
|
+
if (run.start_time && run.end_time) {
|
|
102
|
+
lines.push(`│ Duration: ${formatDurationMs(run.start_time, run.end_time)}`);
|
|
103
|
+
}
|
|
104
|
+
if (run.trace_id) {
|
|
105
|
+
lines.push(`│ Trace ID: ${run.trace_id}`);
|
|
106
|
+
}
|
|
107
|
+
if (run.error) {
|
|
108
|
+
lines.push(`│ Error: ${truncate(run.error, 100)}`);
|
|
109
|
+
}
|
|
110
|
+
if (run.output !== null && run.output !== undefined) {
|
|
111
|
+
const outputStr = typeof run.output === "string"
|
|
112
|
+
? run.output
|
|
113
|
+
: JSON.stringify(run.output);
|
|
114
|
+
lines.push(`│ Output: ${truncate(outputStr, 200)}`);
|
|
115
|
+
}
|
|
116
|
+
if (run.input !== null && run.input !== undefined) {
|
|
117
|
+
const inputStr = typeof run.input === "string"
|
|
118
|
+
? run.input
|
|
119
|
+
: JSON.stringify(run.input);
|
|
120
|
+
lines.push(`│ Input: ${truncate(inputStr, 200)}`);
|
|
121
|
+
}
|
|
122
|
+
if (run.expected_output !== null && run.expected_output !== undefined) {
|
|
123
|
+
const expectedStr = typeof run.expected_output === "string"
|
|
124
|
+
? run.expected_output
|
|
125
|
+
: JSON.stringify(run.expected_output);
|
|
126
|
+
lines.push(`│ Expected: ${truncate(expectedStr, 200)}`);
|
|
127
|
+
}
|
|
128
|
+
// Handle evaluations
|
|
129
|
+
if (run.evaluations && Object.keys(run.evaluations).length > 0) {
|
|
130
|
+
lines.push(`│ Evaluations:`);
|
|
131
|
+
for (const [name, result] of Object.entries(run.evaluations)) {
|
|
132
|
+
const evalResult = result;
|
|
133
|
+
const parts = [];
|
|
134
|
+
if (evalResult.score !== undefined && evalResult.score !== null) {
|
|
135
|
+
parts.push(`score=${evalResult.score}`);
|
|
136
|
+
}
|
|
137
|
+
if (evalResult.label !== undefined && evalResult.label !== null) {
|
|
138
|
+
parts.push(`label="${evalResult.label}"`);
|
|
139
|
+
}
|
|
140
|
+
lines.push(`│ - ${name}: ${parts.join(", ")}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
lines.push(`└─`);
|
|
144
|
+
lines.push("");
|
|
145
|
+
}
|
|
146
|
+
return lines.join("\n").trimEnd();
|
|
147
|
+
}
|
|
148
|
+
// Fallback for non-array data
|
|
149
|
+
return JSON.stringify(data, null, 2);
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return jsonData;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
function formatDate(dateStr) {
|
|
156
|
+
try {
|
|
157
|
+
const date = new Date(dateStr);
|
|
158
|
+
return date.toLocaleString();
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return dateStr;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function formatDurationMs(startTime, endTime) {
|
|
165
|
+
try {
|
|
166
|
+
const startMs = Date.parse(startTime);
|
|
167
|
+
const endMs = Date.parse(endTime);
|
|
168
|
+
if (Number.isNaN(startMs) || Number.isNaN(endMs)) {
|
|
169
|
+
return "n/a";
|
|
170
|
+
}
|
|
171
|
+
const durationMs = Math.max(0, endMs - startMs);
|
|
172
|
+
if (durationMs < 1000) {
|
|
173
|
+
return `${durationMs}ms`;
|
|
174
|
+
}
|
|
175
|
+
if (durationMs < 60000) {
|
|
176
|
+
return `${(durationMs / 1000).toFixed(2)}s`;
|
|
177
|
+
}
|
|
178
|
+
return `${(durationMs / 60000).toFixed(2)}m`;
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
return "n/a";
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
function truncate(str, maxLength) {
|
|
185
|
+
const cleaned = str.replace(/\s+/g, " ").trim();
|
|
186
|
+
if (cleaned.length <= maxLength) {
|
|
187
|
+
return cleaned;
|
|
188
|
+
}
|
|
189
|
+
return `${cleaned.slice(0, maxLength)}…`;
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=formatExperiment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatExperiment.js","sourceRoot":"","sources":["../../src/commands/formatExperiment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { componentsV1 } from "@arizeai/phoenix-client";
|
|
2
|
+
export type OutputFormat = "pretty" | "json" | "raw";
|
|
3
|
+
type Experiment = componentsV1["schemas"]["Experiment"];
|
|
4
|
+
export interface FormatExperimentsOutputOptions {
|
|
5
|
+
/**
|
|
6
|
+
* Experiments to format.
|
|
7
|
+
*/
|
|
8
|
+
experiments: Experiment[];
|
|
9
|
+
/**
|
|
10
|
+
* Output format. Defaults to `"pretty"`.
|
|
11
|
+
*/
|
|
12
|
+
format?: OutputFormat;
|
|
13
|
+
}
|
|
14
|
+
export declare function formatExperimentsOutput({ experiments, format, }: FormatExperimentsOutputOptions): string;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=formatExperiments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatExperiments.d.ts","sourceRoot":"","sources":["../../src/commands/formatExperiments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;AAErD,KAAK,UAAU,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC;AAExD,MAAM,WAAW,8BAA8B;IAC7C;;OAEG;IACH,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B;;OAEG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,wBAAgB,uBAAuB,CAAC,EACtC,WAAW,EACX,MAAM,GACP,EAAE,8BAA8B,GAAG,MAAM,CASzC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export function formatExperimentsOutput({ experiments, format, }) {
|
|
2
|
+
const selected = format || "pretty";
|
|
3
|
+
if (selected === "raw") {
|
|
4
|
+
return JSON.stringify(experiments);
|
|
5
|
+
}
|
|
6
|
+
if (selected === "json") {
|
|
7
|
+
return JSON.stringify(experiments, null, 2);
|
|
8
|
+
}
|
|
9
|
+
return formatExperimentsPretty(experiments);
|
|
10
|
+
}
|
|
11
|
+
function formatExperimentsPretty(experiments) {
|
|
12
|
+
if (experiments.length === 0) {
|
|
13
|
+
return "No experiments found";
|
|
14
|
+
}
|
|
15
|
+
const lines = [];
|
|
16
|
+
lines.push("Experiments:");
|
|
17
|
+
lines.push("");
|
|
18
|
+
for (const experiment of experiments) {
|
|
19
|
+
const projectInfo = experiment.project_name
|
|
20
|
+
? ` [Project: ${experiment.project_name}]`
|
|
21
|
+
: "";
|
|
22
|
+
lines.push(`┌─ ${experiment.id}${projectInfo}`);
|
|
23
|
+
lines.push(`│ Dataset ID: ${experiment.dataset_id}`);
|
|
24
|
+
lines.push(`│ Version ID: ${experiment.dataset_version_id}`);
|
|
25
|
+
lines.push(`│ Examples: ${experiment.example_count}`);
|
|
26
|
+
lines.push(`│ Repetitions: ${experiment.repetitions}`);
|
|
27
|
+
lines.push(`│`);
|
|
28
|
+
lines.push(`│ Runs:`);
|
|
29
|
+
lines.push(`│ ✓ Successful: ${experiment.successful_run_count}`);
|
|
30
|
+
lines.push(`│ ✗ Failed: ${experiment.failed_run_count}`);
|
|
31
|
+
lines.push(`│ ○ Missing: ${experiment.missing_run_count}`);
|
|
32
|
+
lines.push(`│`);
|
|
33
|
+
lines.push(`│ Created: ${formatDate(experiment.created_at)}`);
|
|
34
|
+
lines.push(`│ Updated: ${formatDate(experiment.updated_at)}`);
|
|
35
|
+
if (experiment.metadata &&
|
|
36
|
+
Object.keys(experiment.metadata).length > 0) {
|
|
37
|
+
lines.push(`│ Metadata: ${JSON.stringify(experiment.metadata)}`);
|
|
38
|
+
}
|
|
39
|
+
lines.push(`└─`);
|
|
40
|
+
lines.push("");
|
|
41
|
+
}
|
|
42
|
+
return lines.join("\n").trimEnd();
|
|
43
|
+
}
|
|
44
|
+
function formatDate(dateStr) {
|
|
45
|
+
try {
|
|
46
|
+
const date = new Date(dateStr);
|
|
47
|
+
return date.toLocaleString();
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return dateStr;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=formatExperiments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatExperiments.js","sourceRoot":"","sources":["../../src/commands/formatExperiments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type OutputFormat = "pretty" | "json" | "raw";
|
|
2
|
+
type ProjectLike = {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
description?: string | null;
|
|
6
|
+
};
|
|
7
|
+
export interface FormatProjectsOutputOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Projects to format.
|
|
10
|
+
*/
|
|
11
|
+
projects: ProjectLike[];
|
|
12
|
+
/**
|
|
13
|
+
* Output format. Defaults to `"pretty"`.
|
|
14
|
+
*/
|
|
15
|
+
format?: OutputFormat;
|
|
16
|
+
}
|
|
17
|
+
export declare function formatProjectsOutput({ projects, format, }: FormatProjectsOutputOptions): string;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=formatProjects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatProjects.d.ts","sourceRoot":"","sources":["../../src/commands/formatProjects.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;AAErD,KAAK,WAAW,GAAG;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,CAAC;AAEF,MAAM,WAAW,2BAA2B;IAC1C;;OAEG;IACH,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB;;OAEG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,MAAM,GACP,EAAE,2BAA2B,GAAG,MAAM,CAqBtC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export function formatProjectsOutput({ projects, format, }) {
|
|
2
|
+
const selected = format || "pretty";
|
|
3
|
+
if (selected === "raw") {
|
|
4
|
+
return JSON.stringify(projects);
|
|
5
|
+
}
|
|
6
|
+
if (selected === "json") {
|
|
7
|
+
return JSON.stringify(projects, null, 2);
|
|
8
|
+
}
|
|
9
|
+
const lines = [];
|
|
10
|
+
lines.push("Projects:");
|
|
11
|
+
for (const p of projects) {
|
|
12
|
+
const desc = p.description === null ||
|
|
13
|
+
p.description === undefined ||
|
|
14
|
+
p.description === ""
|
|
15
|
+
? ""
|
|
16
|
+
: ` — ${p.description}`;
|
|
17
|
+
lines.push(`- ${p.name} (${p.id})${desc}`);
|
|
18
|
+
}
|
|
19
|
+
return lines.join("\n");
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=formatProjects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatProjects.js","sourceRoot":"","sources":["../../src/commands/formatProjects.ts"],"names":[],"mappings":"AAmBA,MAAM,UAAU,oBAAoB,CAAC,EACnC,QAAQ,EACR,MAAM,GACsB;IAC5B,MAAM,QAAQ,GAAG,MAAM,IAAI,QAAQ,CAAC;IACpC,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,IAAI,GACR,CAAC,CAAC,WAAW,KAAK,IAAI;YACtB,CAAC,CAAC,WAAW,KAAK,SAAS;YAC3B,CAAC,CAAC,WAAW,KAAK,EAAE;YAClB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Trace } from "../trace.js";
|
|
2
|
+
export type OutputFormat = "pretty" | "json" | "raw";
|
|
3
|
+
export interface FormatTraceOutputOptions {
|
|
4
|
+
/**
|
|
5
|
+
* Trace to format.
|
|
6
|
+
*/
|
|
7
|
+
trace: Trace;
|
|
8
|
+
/**
|
|
9
|
+
* Output format. Defaults to `"pretty"`.
|
|
10
|
+
*/
|
|
11
|
+
format?: OutputFormat;
|
|
12
|
+
}
|
|
13
|
+
export declare function formatTraceOutput({ trace, format, }: FormatTraceOutputOptions): string;
|
|
14
|
+
export interface FormatTracesOutputOptions {
|
|
15
|
+
/**
|
|
16
|
+
* Traces to format.
|
|
17
|
+
*/
|
|
18
|
+
traces: Trace[];
|
|
19
|
+
/**
|
|
20
|
+
* Output format. Defaults to `"pretty"`.
|
|
21
|
+
*/
|
|
22
|
+
format?: OutputFormat;
|
|
23
|
+
}
|
|
24
|
+
export declare function formatTracesOutput({ traces, format, }: FormatTracesOutputOptions): string;
|
|
25
|
+
//# sourceMappingURL=formatTraces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatTraces.d.ts","sourceRoot":"","sources":["../../src/commands/formatTraces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;AAMrD,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,KAAK,EAAE,KAAK,CAAC;IACb;;OAEG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,MAAM,GACP,EAAE,wBAAwB,GAAG,MAAM,CASnC;AAED,MAAM,WAAW,yBAAyB;IACxC;;OAEG;IACH,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB;;OAEG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,MAAM,GACP,EAAE,yBAAyB,GAAG,MAAM,CAcpC"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
const INPUT_VALUE_ATTRIBUTE = "input.value";
|
|
2
|
+
const OUTPUT_VALUE_ATTRIBUTE = "output.value";
|
|
3
|
+
const VALUE_PREVIEW_MAX_CHARS = 200;
|
|
4
|
+
export function formatTraceOutput({ trace, format, }) {
|
|
5
|
+
const selected = format || "pretty";
|
|
6
|
+
if (selected === "raw") {
|
|
7
|
+
return JSON.stringify(trace);
|
|
8
|
+
}
|
|
9
|
+
if (selected === "json") {
|
|
10
|
+
return JSON.stringify(trace, null, 2);
|
|
11
|
+
}
|
|
12
|
+
return formatTracePretty(trace);
|
|
13
|
+
}
|
|
14
|
+
export function formatTracesOutput({ traces, format, }) {
|
|
15
|
+
const selected = format || "pretty";
|
|
16
|
+
if (selected === "raw") {
|
|
17
|
+
return JSON.stringify(traces);
|
|
18
|
+
}
|
|
19
|
+
if (selected === "json") {
|
|
20
|
+
return JSON.stringify(traces, null, 2);
|
|
21
|
+
}
|
|
22
|
+
if (traces.length === 0) {
|
|
23
|
+
return "No traces found";
|
|
24
|
+
}
|
|
25
|
+
return traces
|
|
26
|
+
.map((t) => formatTracePretty(t))
|
|
27
|
+
.join("\n\n" + "=".repeat(80) + "\n\n");
|
|
28
|
+
}
|
|
29
|
+
function formatTracePretty(trace) {
|
|
30
|
+
const lines = [];
|
|
31
|
+
lines.push(`┌─ Trace: ${trace.traceId}`);
|
|
32
|
+
lines.push(`│`);
|
|
33
|
+
const forest = buildSpanForest(trace.spans);
|
|
34
|
+
const rootWithIo = forest.find((n) => {
|
|
35
|
+
const attrs = n.span.attributes;
|
|
36
|
+
return (previewAttributeValue(attrs?.[INPUT_VALUE_ATTRIBUTE]) !== undefined ||
|
|
37
|
+
previewAttributeValue(attrs?.[OUTPUT_VALUE_ATTRIBUTE]) !== undefined);
|
|
38
|
+
});
|
|
39
|
+
if (rootWithIo) {
|
|
40
|
+
const inputPreview = previewAttributeValue(rootWithIo.span.attributes?.[INPUT_VALUE_ATTRIBUTE]);
|
|
41
|
+
const outputPreview = previewAttributeValue(rootWithIo.span.attributes?.[OUTPUT_VALUE_ATTRIBUTE]);
|
|
42
|
+
if (inputPreview)
|
|
43
|
+
lines.push(`│ Input: ${inputPreview}`);
|
|
44
|
+
if (outputPreview)
|
|
45
|
+
lines.push(`│ Output: ${outputPreview}`);
|
|
46
|
+
if (inputPreview || outputPreview)
|
|
47
|
+
lines.push(`│`);
|
|
48
|
+
}
|
|
49
|
+
lines.push(`│ Spans:`);
|
|
50
|
+
for (let i = 0; i < forest.length; i++) {
|
|
51
|
+
renderSpanNode(lines, forest[i], {
|
|
52
|
+
ancestors: [],
|
|
53
|
+
isLast: i === forest.length - 1,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
lines.push(`└─`);
|
|
57
|
+
return lines.join("\n");
|
|
58
|
+
}
|
|
59
|
+
function buildSpanForest(spans) {
|
|
60
|
+
const spanIdToSpan = new Map();
|
|
61
|
+
const spanIdToNode = new Map();
|
|
62
|
+
const parentIdToChildren = new Map();
|
|
63
|
+
for (const span of spans) {
|
|
64
|
+
const spanId = span.context?.span_id;
|
|
65
|
+
if (!spanId)
|
|
66
|
+
continue;
|
|
67
|
+
spanIdToSpan.set(spanId, span);
|
|
68
|
+
}
|
|
69
|
+
for (const span of spans) {
|
|
70
|
+
const parentId = span.parent_id ?? null;
|
|
71
|
+
if (!parentId)
|
|
72
|
+
continue;
|
|
73
|
+
if (!parentIdToChildren.has(parentId)) {
|
|
74
|
+
parentIdToChildren.set(parentId, []);
|
|
75
|
+
}
|
|
76
|
+
parentIdToChildren.get(parentId).push(span);
|
|
77
|
+
}
|
|
78
|
+
const getNode = (span) => {
|
|
79
|
+
const spanId = span.context.span_id;
|
|
80
|
+
const existing = spanIdToNode.get(spanId);
|
|
81
|
+
if (existing)
|
|
82
|
+
return existing;
|
|
83
|
+
const node = { span, children: [] };
|
|
84
|
+
spanIdToNode.set(spanId, node);
|
|
85
|
+
return node;
|
|
86
|
+
};
|
|
87
|
+
// roots: no parent_id, or parent_id not present in this trace
|
|
88
|
+
const roots = [];
|
|
89
|
+
for (const span of spans) {
|
|
90
|
+
const parentId = span.parent_id ?? null;
|
|
91
|
+
if (!parentId || !spanIdToSpan.has(parentId)) {
|
|
92
|
+
roots.push(span);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const sortByStartTime = (a, b) => {
|
|
96
|
+
const aStart = Date.parse(a.start_time);
|
|
97
|
+
const bStart = Date.parse(b.start_time);
|
|
98
|
+
if (!Number.isNaN(aStart) && !Number.isNaN(bStart)) {
|
|
99
|
+
return aStart - bStart;
|
|
100
|
+
}
|
|
101
|
+
return String(a.name).localeCompare(String(b.name));
|
|
102
|
+
};
|
|
103
|
+
const buildNodeRec = (span) => {
|
|
104
|
+
const node = getNode(span);
|
|
105
|
+
const children = parentIdToChildren.get(span.context.span_id) ?? [];
|
|
106
|
+
children.sort(sortByStartTime);
|
|
107
|
+
node.children = children.map(buildNodeRec);
|
|
108
|
+
return node;
|
|
109
|
+
};
|
|
110
|
+
roots.sort(sortByStartTime);
|
|
111
|
+
return roots.map(buildNodeRec);
|
|
112
|
+
}
|
|
113
|
+
function renderSpanNode(lines, node, opts) {
|
|
114
|
+
const { span, children } = node;
|
|
115
|
+
const baseIndent = "│ ";
|
|
116
|
+
const treePrefix = opts.ancestors
|
|
117
|
+
.map((ancestorIsLast) => (ancestorIsLast ? " " : "│ "))
|
|
118
|
+
.join("");
|
|
119
|
+
const connector = opts.isLast ? "└─" : "├─";
|
|
120
|
+
const status = span.status_code === "ERROR" ? "✗" : "✓";
|
|
121
|
+
const kind = span.span_kind;
|
|
122
|
+
const duration = formatDurationMs(span.start_time, span.end_time);
|
|
123
|
+
lines.push(`${baseIndent}${treePrefix}${connector} ${status} ${span.name} (${kind}) - ${duration}`);
|
|
124
|
+
const nextAncestors = [...opts.ancestors, opts.isLast];
|
|
125
|
+
for (let i = 0; i < children.length; i++) {
|
|
126
|
+
renderSpanNode(lines, children[i], {
|
|
127
|
+
ancestors: nextAncestors,
|
|
128
|
+
isLast: i === children.length - 1,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function formatDurationMs(startTime, endTime) {
|
|
133
|
+
const startMs = Date.parse(startTime);
|
|
134
|
+
const endMs = Date.parse(endTime);
|
|
135
|
+
if (Number.isNaN(startMs) || Number.isNaN(endMs)) {
|
|
136
|
+
return "n/a";
|
|
137
|
+
}
|
|
138
|
+
return `${Math.max(0, endMs - startMs)}ms`;
|
|
139
|
+
}
|
|
140
|
+
function previewAttributeValue(value) {
|
|
141
|
+
if (value === undefined || value === null) {
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
144
|
+
let str;
|
|
145
|
+
if (typeof value === "string") {
|
|
146
|
+
str = value;
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
try {
|
|
150
|
+
str = JSON.stringify(value);
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
str = String(value);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
str = str.replace(/\s+/g, " ").trim();
|
|
157
|
+
if (!str) {
|
|
158
|
+
return undefined;
|
|
159
|
+
}
|
|
160
|
+
if (str.length > VALUE_PREVIEW_MAX_CHARS) {
|
|
161
|
+
return `${str.slice(0, VALUE_PREVIEW_MAX_CHARS)}…`;
|
|
162
|
+
}
|
|
163
|
+
return str;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=formatTraces.js.map
|