@arizeai/phoenix-client 1.1.0 → 1.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/dist/esm/__generated__/api/v1.d.ts +375 -0
- package/dist/esm/__generated__/api/v1.d.ts.map +1 -1
- package/dist/esm/experiments/runExperiment.d.ts +48 -13
- package/dist/esm/experiments/runExperiment.d.ts.map +1 -1
- package/dist/esm/experiments/runExperiment.js +139 -36
- package/dist/esm/experiments/runExperiment.js.map +1 -1
- package/dist/esm/spans/addSpanAnnotation.d.ts +39 -0
- package/dist/esm/spans/addSpanAnnotation.d.ts.map +1 -0
- package/dist/esm/spans/addSpanAnnotation.js +44 -0
- package/dist/esm/spans/addSpanAnnotation.js.map +1 -0
- package/dist/esm/spans/index.d.ts +3 -0
- package/dist/esm/spans/index.d.ts.map +1 -0
- package/dist/esm/spans/index.js +3 -0
- package/dist/esm/spans/index.js.map +1 -0
- package/dist/esm/spans/logSpanAnnotations.d.ts +51 -0
- package/dist/esm/spans/logSpanAnnotations.d.ts.map +1 -0
- package/dist/esm/spans/logSpanAnnotations.js +53 -0
- package/dist/esm/spans/logSpanAnnotations.js.map +1 -0
- package/dist/esm/spans/types.d.ts +43 -0
- package/dist/esm/spans/types.d.ts.map +1 -0
- package/dist/esm/spans/types.js +18 -0
- package/dist/esm/spans/types.js.map +1 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/esm/types/annotations.d.ts +2 -1
- package/dist/esm/types/annotations.d.ts.map +1 -1
- package/dist/esm/types/experiments.d.ts +1 -7
- package/dist/esm/types/experiments.d.ts.map +1 -1
- package/dist/esm/utils/formatPromptMessages.d.ts.map +1 -1
- package/dist/esm/utils/getPromptBySelector.d.ts.map +1 -1
- package/dist/src/__generated__/api/v1.d.ts +375 -0
- package/dist/src/__generated__/api/v1.d.ts.map +1 -1
- package/dist/src/experiments/runExperiment.d.ts +48 -13
- package/dist/src/experiments/runExperiment.d.ts.map +1 -1
- package/dist/src/experiments/runExperiment.js +138 -36
- package/dist/src/experiments/runExperiment.js.map +1 -1
- package/dist/src/spans/addSpanAnnotation.d.ts +39 -0
- package/dist/src/spans/addSpanAnnotation.d.ts.map +1 -0
- package/dist/src/spans/addSpanAnnotation.js +59 -0
- package/dist/src/spans/addSpanAnnotation.js.map +1 -0
- package/dist/src/spans/index.d.ts +3 -0
- package/dist/src/spans/index.d.ts.map +1 -0
- package/dist/src/spans/index.js +19 -0
- package/dist/src/spans/index.js.map +1 -0
- package/dist/src/spans/logSpanAnnotations.d.ts +51 -0
- package/dist/src/spans/logSpanAnnotations.d.ts.map +1 -0
- package/dist/src/spans/logSpanAnnotations.js +68 -0
- package/dist/src/spans/logSpanAnnotations.js.map +1 -0
- package/dist/src/spans/types.d.ts +43 -0
- package/dist/src/spans/types.d.ts.map +1 -0
- package/dist/src/spans/types.js +22 -0
- package/dist/src/spans/types.js.map +1 -0
- package/dist/src/types/annotations.d.ts +2 -1
- package/dist/src/types/annotations.d.ts.map +1 -1
- package/dist/src/types/experiments.d.ts +1 -7
- package/dist/src/types/experiments.d.ts.map +1 -1
- package/dist/src/utils/formatPromptMessages.d.ts.map +1 -1
- package/dist/src/utils/getPromptBySelector.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -1
- package/src/__generated__/api/v1.ts +375 -0
- package/src/experiments/runExperiment.ts +211 -74
- package/src/spans/addSpanAnnotation.ts +59 -0
- package/src/spans/index.ts +2 -0
- package/src/spans/logSpanAnnotations.ts +71 -0
- package/src/spans/types.ts +60 -0
- package/src/types/annotations.ts +4 -1
- package/src/types/experiments.ts +1 -7
|
@@ -1,40 +1,80 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { promisifyResult } from "../utils/promisifyResult.js";
|
|
1
|
+
import { queue } from "async";
|
|
3
2
|
import invariant from "tiny-invariant";
|
|
4
|
-
import {
|
|
3
|
+
import { createClient } from "../client.js";
|
|
5
4
|
import { getDatasetBySelector } from "../utils/getDatasetBySelector.js";
|
|
5
|
+
import { pluralize } from "../utils/pluralize.js";
|
|
6
|
+
import { promisifyResult } from "../utils/promisifyResult.js";
|
|
6
7
|
/**
|
|
7
8
|
* Run an experiment.
|
|
8
9
|
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* import { asEvaluator, runExperiment } from "@phoenix/client/experiments";
|
|
13
|
+
*
|
|
14
|
+
* const experiment = await runExperiment({
|
|
15
|
+
* dataset: "my-dataset",
|
|
16
|
+
* task: async (example) => example.input,
|
|
17
|
+
* evaluators: [
|
|
18
|
+
* asEvaluator("my-evaluator", "CODE", async (params) => params.output),
|
|
19
|
+
* ],
|
|
20
|
+
* });
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
9
23
|
* @experimental This feature is not complete, and will change in the future.
|
|
10
|
-
* @deprecated This function will be un-marked as deprecated once the experimental feature flag is removed.
|
|
11
24
|
*/
|
|
12
|
-
export async function runExperiment({ experimentName: _experimentName, client: _client, dataset: _dataset, task, evaluators,
|
|
25
|
+
export async function runExperiment({ experimentName: _experimentName, experimentDescription, experimentMetadata, client: _client, dataset: _dataset, task, evaluators, projectName = "default", logger = console, record = true, concurrency = 5, dryRun = false, }) {
|
|
26
|
+
const isDryRun = typeof dryRun === "number" || dryRun === true;
|
|
13
27
|
const client = _client ?? createClient();
|
|
14
28
|
const dataset = await getDatasetBySelector({ dataset: _dataset, client });
|
|
15
29
|
invariant(dataset, `Dataset not found`);
|
|
16
30
|
invariant(dataset.examples.length > 0, `Dataset has no examples`);
|
|
31
|
+
const nExamples = typeof dryRun === "number"
|
|
32
|
+
? Math.max(dryRun, dataset.examples.length)
|
|
33
|
+
: dataset.examples.length;
|
|
17
34
|
const experimentName = _experimentName ?? `${dataset.name}-${new Date().toISOString()}`;
|
|
18
35
|
const experimentParams = {
|
|
19
|
-
|
|
20
|
-
// TODO: Make configurable?
|
|
21
|
-
nExamples: dataset.examples.length,
|
|
22
|
-
};
|
|
23
|
-
const experiment = {
|
|
24
|
-
id: id(),
|
|
25
|
-
datasetId: dataset.id,
|
|
26
|
-
datasetVersionId: dataset.versionId,
|
|
27
|
-
repetitions,
|
|
28
|
-
projectName,
|
|
36
|
+
nExamples,
|
|
29
37
|
};
|
|
38
|
+
let experiment;
|
|
39
|
+
if (isDryRun) {
|
|
40
|
+
experiment = {
|
|
41
|
+
id: id(),
|
|
42
|
+
datasetId: dataset.id,
|
|
43
|
+
datasetVersionId: dataset.versionId,
|
|
44
|
+
projectName,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
const experimentResponse = await client
|
|
49
|
+
.POST("/v1/datasets/{dataset_id}/experiments", {
|
|
50
|
+
params: {
|
|
51
|
+
path: {
|
|
52
|
+
dataset_id: dataset.id,
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
body: {
|
|
56
|
+
name: experimentName,
|
|
57
|
+
description: experimentDescription,
|
|
58
|
+
metadata: experimentMetadata,
|
|
59
|
+
project_name: projectName,
|
|
60
|
+
},
|
|
61
|
+
})
|
|
62
|
+
.then((res) => res.data?.data);
|
|
63
|
+
invariant(experimentResponse, `Failed to create experiment`);
|
|
64
|
+
experiment = {
|
|
65
|
+
id: experimentResponse.id,
|
|
66
|
+
datasetId: dataset.id,
|
|
67
|
+
datasetVersionId: dataset.versionId,
|
|
68
|
+
projectName,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
30
71
|
if (!record) {
|
|
31
72
|
logger.info(`🔧 Running experiment in readonly mode. Results will not be recorded.`);
|
|
32
73
|
}
|
|
33
|
-
logger.info(`🧪 Starting experiment "${experimentName}" on dataset "${dataset.id}" with task "${task.name}" and ${evaluators?.length ?? 0} ${pluralize("evaluator", evaluators?.length ?? 0)}`);
|
|
34
|
-
logger.info(`🔁 Running ${repetitions} ${pluralize("repetition", repetitions)} of task "${task.name}"`);
|
|
74
|
+
logger.info(`🧪 Starting experiment "${experimentName}" on dataset "${dataset.id}" with task "${task.name}" and ${evaluators?.length ?? 0} ${pluralize("evaluator", evaluators?.length ?? 0)} and ${concurrency} concurrent runs`);
|
|
35
75
|
const runs = {};
|
|
36
|
-
await
|
|
37
|
-
|
|
76
|
+
await runTask({
|
|
77
|
+
client,
|
|
38
78
|
experimentId: experiment.id,
|
|
39
79
|
task,
|
|
40
80
|
dataset,
|
|
@@ -42,7 +82,10 @@ export async function runExperiment({ experimentName: _experimentName, client: _
|
|
|
42
82
|
onComplete: (run) => {
|
|
43
83
|
runs[run.id] = run;
|
|
44
84
|
},
|
|
45
|
-
|
|
85
|
+
concurrency,
|
|
86
|
+
isDryRun,
|
|
87
|
+
nExamples,
|
|
88
|
+
});
|
|
46
89
|
logger.info(`✅ Task runs completed`);
|
|
47
90
|
const ranExperiment = {
|
|
48
91
|
...experiment,
|
|
@@ -54,24 +97,26 @@ export async function runExperiment({ experimentName: _experimentName, client: _
|
|
|
54
97
|
evaluators: evaluators ?? [],
|
|
55
98
|
client,
|
|
56
99
|
logger,
|
|
100
|
+
concurrency,
|
|
101
|
+
dryRun,
|
|
57
102
|
});
|
|
58
103
|
ranExperiment.evaluationRuns = evaluationRuns;
|
|
59
104
|
logger.info(`✅ Experiment ${experiment.id} completed`);
|
|
60
105
|
return ranExperiment;
|
|
61
106
|
}
|
|
62
107
|
/**
|
|
63
|
-
* Run a task against
|
|
108
|
+
* Run a task against n examples in a dataset.
|
|
64
109
|
*/
|
|
65
|
-
function runTask({ experimentId, task, dataset,
|
|
66
|
-
logger.info(`🔧
|
|
110
|
+
function runTask({ client, experimentId, task, dataset, onComplete, logger, concurrency = 5, isDryRun, nExamples, }) {
|
|
111
|
+
logger.info(`🔧 Running task "${task.name}" on dataset "${dataset.id}"`);
|
|
67
112
|
const run = async (example) => {
|
|
113
|
+
logger.info(`🔧 Running task "${task.name}" on example "${example.id} of dataset "${dataset.id}"`);
|
|
68
114
|
const thisRun = {
|
|
69
115
|
id: id(),
|
|
70
|
-
traceId:
|
|
116
|
+
traceId: null, // TODO: fill this in once we trace experiments
|
|
71
117
|
experimentId,
|
|
72
118
|
datasetExampleId: example.id,
|
|
73
119
|
startTime: new Date(),
|
|
74
|
-
repetitionNumber: repetition,
|
|
75
120
|
endTime: new Date(), // will get replaced with actual end time
|
|
76
121
|
output: null,
|
|
77
122
|
error: null,
|
|
@@ -88,17 +133,46 @@ function runTask({ experimentId, task, dataset, repetition, onComplete, logger,
|
|
|
88
133
|
thisRun.error = error instanceof Error ? error.message : "Unknown error";
|
|
89
134
|
}
|
|
90
135
|
thisRun.endTime = new Date();
|
|
136
|
+
if (!isDryRun) {
|
|
137
|
+
// Log the run to the server
|
|
138
|
+
// We log this without awaiting (e.g. best effort)
|
|
139
|
+
const res = await client.POST("/v1/experiments/{experiment_id}/runs", {
|
|
140
|
+
params: {
|
|
141
|
+
path: {
|
|
142
|
+
experiment_id: experimentId,
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
body: {
|
|
146
|
+
dataset_example_id: example.id,
|
|
147
|
+
output: thisRun.output,
|
|
148
|
+
repetition_number: 0,
|
|
149
|
+
start_time: thisRun.startTime.toISOString(),
|
|
150
|
+
end_time: thisRun.endTime.toISOString(),
|
|
151
|
+
trace_id: thisRun.traceId,
|
|
152
|
+
error: thisRun.error,
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
// replace the local run id with the server-assigned id
|
|
156
|
+
thisRun.id = res.data?.data.id ?? thisRun.id;
|
|
157
|
+
}
|
|
91
158
|
onComplete(thisRun);
|
|
159
|
+
return thisRun;
|
|
92
160
|
};
|
|
93
|
-
|
|
161
|
+
const q = queue(run, concurrency);
|
|
162
|
+
const examplesToUse = dataset.examples.slice(0, nExamples);
|
|
163
|
+
examplesToUse.forEach((example) => q.push(example));
|
|
164
|
+
return q.drain();
|
|
94
165
|
}
|
|
95
166
|
/**
|
|
96
167
|
* Evaluate an experiment.
|
|
97
168
|
*
|
|
98
169
|
* @experimental This feature is not complete, and will change in the future.
|
|
99
|
-
* @deprecated This function will be un-marked as deprecated once the experimental feature flag is removed.
|
|
100
170
|
*/
|
|
101
|
-
export async function evaluateExperiment({ experiment, evaluators, client: _client, logger, }) {
|
|
171
|
+
export async function evaluateExperiment({ experiment, evaluators, client: _client, logger, concurrency = 5, dryRun = false, }) {
|
|
172
|
+
const isDryRun = typeof dryRun === "number" || dryRun === true;
|
|
173
|
+
const nRuns = typeof dryRun === "number"
|
|
174
|
+
? Math.max(dryRun, Object.keys(experiment.runs).length)
|
|
175
|
+
: Object.keys(experiment.runs).length;
|
|
102
176
|
const client = _client ?? createClient();
|
|
103
177
|
const dataset = await getDatasetBySelector({
|
|
104
178
|
dataset: experiment.datasetId,
|
|
@@ -107,6 +181,7 @@ export async function evaluateExperiment({ experiment, evaluators, client: _clie
|
|
|
107
181
|
invariant(dataset, `Dataset "${experiment.datasetId}" not found`);
|
|
108
182
|
invariant(dataset.examples.length > 0, `Dataset "${experiment.datasetId}" has no examples`);
|
|
109
183
|
invariant(experiment.runs, `Experiment "${experiment.id}" has no runs`);
|
|
184
|
+
const runsToEvaluate = Object.values(experiment.runs).slice(0, nRuns);
|
|
110
185
|
if (evaluators?.length === 0) {
|
|
111
186
|
return {
|
|
112
187
|
...experiment,
|
|
@@ -123,12 +198,40 @@ export async function evaluateExperiment({ experiment, evaluators, client: _clie
|
|
|
123
198
|
evaluationRuns[run.id] = run;
|
|
124
199
|
};
|
|
125
200
|
// Run evaluators against all runs
|
|
126
|
-
|
|
201
|
+
// Flat list of evaluator + run tuples
|
|
202
|
+
const evaluatorsAndRuns = evaluators.flatMap((evaluator) => runsToEvaluate.map((run) => ({
|
|
127
203
|
evaluator,
|
|
128
204
|
run,
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
205
|
+
})));
|
|
206
|
+
const evaluatorsQueue = queue(async (evaluatorAndRun) => {
|
|
207
|
+
const evalResult = await runEvaluator({
|
|
208
|
+
evaluator: evaluatorAndRun.evaluator,
|
|
209
|
+
run: evaluatorAndRun.run,
|
|
210
|
+
exampleCache: examplesById,
|
|
211
|
+
onComplete: onEvaluationComplete,
|
|
212
|
+
});
|
|
213
|
+
if (!isDryRun) {
|
|
214
|
+
logger.info(`📝 Logging evaluation ${evalResult.id}`);
|
|
215
|
+
// Log the evaluation to the server
|
|
216
|
+
// We log this without awaiting (e.g. best effort)
|
|
217
|
+
client.POST("/v1/experiment_evaluations", {
|
|
218
|
+
body: {
|
|
219
|
+
experiment_run_id: evaluatorAndRun.run.id,
|
|
220
|
+
name: evaluatorAndRun.evaluator.name,
|
|
221
|
+
annotator_kind: evaluatorAndRun.evaluator.kind,
|
|
222
|
+
start_time: evalResult.startTime.toISOString(),
|
|
223
|
+
end_time: evalResult.endTime.toISOString(),
|
|
224
|
+
result: {
|
|
225
|
+
...evalResult.result,
|
|
226
|
+
},
|
|
227
|
+
error: evalResult.error,
|
|
228
|
+
trace_id: evalResult.traceId,
|
|
229
|
+
},
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
}, concurrency);
|
|
233
|
+
evaluatorsAndRuns.forEach((evaluatorAndRun) => evaluatorsQueue.push(evaluatorAndRun));
|
|
234
|
+
await evaluatorsQueue.drain();
|
|
132
235
|
logger.info(`✅ Evaluation runs completed`);
|
|
133
236
|
return {
|
|
134
237
|
...experiment,
|
|
@@ -139,7 +242,6 @@ export async function evaluateExperiment({ experiment, evaluators, client: _clie
|
|
|
139
242
|
* Run an evaluator against a run.
|
|
140
243
|
*
|
|
141
244
|
* @experimental This feature is not complete, and will change in the future.
|
|
142
|
-
* @deprecated This function will be un-marked as deprecated once the experimental feature flag is removed.
|
|
143
245
|
*/
|
|
144
246
|
async function runEvaluator({ evaluator, run, exampleCache, onComplete, }) {
|
|
145
247
|
const example = exampleCache[run.datasetExampleId];
|
|
@@ -147,7 +249,7 @@ async function runEvaluator({ evaluator, run, exampleCache, onComplete, }) {
|
|
|
147
249
|
const evaluate = async () => {
|
|
148
250
|
const thisEval = {
|
|
149
251
|
id: id(),
|
|
150
|
-
traceId:
|
|
252
|
+
traceId: null, // TODO: fill this in once we trace experiments
|
|
151
253
|
experimentRunId: run.id,
|
|
152
254
|
startTime: new Date(),
|
|
153
255
|
endTime: new Date(), // will get replaced with actual end time
|
|
@@ -170,6 +272,7 @@ async function runEvaluator({ evaluator, run, exampleCache, onComplete, }) {
|
|
|
170
272
|
}
|
|
171
273
|
thisEval.endTime = new Date();
|
|
172
274
|
onComplete(thisEval);
|
|
275
|
+
return thisEval;
|
|
173
276
|
};
|
|
174
277
|
return evaluate();
|
|
175
278
|
}
|
|
@@ -177,15 +280,15 @@ async function runEvaluator({ evaluator, run, exampleCache, onComplete, }) {
|
|
|
177
280
|
* Wrap an evaluator function in an object with a name property.
|
|
178
281
|
*
|
|
179
282
|
* @experimental This feature is not complete, and will change in the future.
|
|
180
|
-
* @deprecated This function will be un-marked as deprecated once the experimental feature flag is removed.
|
|
181
283
|
*
|
|
182
284
|
* @param name - The name of the evaluator.
|
|
183
285
|
* @param evaluate - The evaluator function.
|
|
184
286
|
* @returns The evaluator object.
|
|
185
287
|
*/
|
|
186
|
-
export function asEvaluator(name, evaluate) {
|
|
288
|
+
export function asEvaluator({ name, kind, evaluate, }) {
|
|
187
289
|
return {
|
|
188
290
|
name,
|
|
291
|
+
kind,
|
|
189
292
|
evaluate,
|
|
190
293
|
};
|
|
191
294
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runExperiment.js","sourceRoot":"","sources":["../../../src/experiments/runExperiment.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runExperiment.js","sourceRoot":"","sources":["../../../src/experiments/runExperiment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { ClientFn } from "../types/core.js";
|
|
2
|
+
import { SpanAnnotation } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Parameters to add a span annotation
|
|
5
|
+
*/
|
|
6
|
+
interface AddSpanAnnotationParams extends ClientFn {
|
|
7
|
+
spanAnnotation: SpanAnnotation;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Add an annotation to a span.
|
|
11
|
+
*
|
|
12
|
+
* The annotation can be of type "LLM", "CODE", or "HUMAN" and can include a label, score, and metadata.
|
|
13
|
+
* If an identifier is provided and an annotation with that identifier already exists, it will be updated.
|
|
14
|
+
*
|
|
15
|
+
* @param params - The parameters to add a span annotation
|
|
16
|
+
* @returns The ID of the created or updated annotation
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* const result = await addSpanAnnotation({
|
|
21
|
+
* spanAnnotation: {
|
|
22
|
+
* spanId: "123abc",
|
|
23
|
+
* name: "quality_score",
|
|
24
|
+
* label: "good",
|
|
25
|
+
* score: 0.95,
|
|
26
|
+
* annotatorKind: "LLM",
|
|
27
|
+
* identifier: "custom_id_123",
|
|
28
|
+
* metadata: {
|
|
29
|
+
* model: "gpt-4"
|
|
30
|
+
* }
|
|
31
|
+
* }
|
|
32
|
+
* });
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function addSpanAnnotation({ client: _client, spanAnnotation, }: AddSpanAnnotationParams): Promise<{
|
|
36
|
+
id: string;
|
|
37
|
+
}>;
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=addSpanAnnotation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addSpanAnnotation.d.ts","sourceRoot":"","sources":["../../../src/spans/addSpanAnnotation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAwB,MAAM,SAAS,CAAC;AAE/D;;GAEG;AACH,UAAU,uBAAwB,SAAQ,QAAQ;IAChD,cAAc,EAAE,cAAc,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,iBAAiB,CAAC,EACtC,MAAM,EAAE,OAAO,EACf,cAAc,GACf,EAAE,uBAAuB,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAkBnD"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { createClient } from "../client.js";
|
|
2
|
+
import { toSpanAnnotationData } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Add an annotation to a span.
|
|
5
|
+
*
|
|
6
|
+
* The annotation can be of type "LLM", "CODE", or "HUMAN" and can include a label, score, and metadata.
|
|
7
|
+
* If an identifier is provided and an annotation with that identifier already exists, it will be updated.
|
|
8
|
+
*
|
|
9
|
+
* @param params - The parameters to add a span annotation
|
|
10
|
+
* @returns The ID of the created or updated annotation
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* const result = await addSpanAnnotation({
|
|
15
|
+
* spanAnnotation: {
|
|
16
|
+
* spanId: "123abc",
|
|
17
|
+
* name: "quality_score",
|
|
18
|
+
* label: "good",
|
|
19
|
+
* score: 0.95,
|
|
20
|
+
* annotatorKind: "LLM",
|
|
21
|
+
* identifier: "custom_id_123",
|
|
22
|
+
* metadata: {
|
|
23
|
+
* model: "gpt-4"
|
|
24
|
+
* }
|
|
25
|
+
* }
|
|
26
|
+
* });
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export async function addSpanAnnotation({ client: _client, spanAnnotation, }) {
|
|
30
|
+
const client = _client ?? createClient();
|
|
31
|
+
const { data, error } = await client.POST("/v1/span_annotations", {
|
|
32
|
+
body: {
|
|
33
|
+
data: [toSpanAnnotationData(spanAnnotation)],
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
if (error) {
|
|
37
|
+
throw new Error(`Failed to add span annotation: ${error}`);
|
|
38
|
+
}
|
|
39
|
+
if (!data?.data?.[0]?.id) {
|
|
40
|
+
throw new Error("No annotation ID returned from server");
|
|
41
|
+
}
|
|
42
|
+
return data.data[0];
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=addSpanAnnotation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addSpanAnnotation.js","sourceRoot":"","sources":["../../../src/spans/addSpanAnnotation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAkB,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAS/D;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EACtC,MAAM,EAAE,OAAO,EACf,cAAc,GACU;IACxB,MAAM,MAAM,GAAG,OAAO,IAAI,YAAY,EAAE,CAAC;IAEzC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;QAChE,IAAI,EAAE;YACJ,IAAI,EAAE,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;SAC7C;KACF,CAAC,CAAC;IAEH,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,kCAAkC,KAAK,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/spans/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/spans/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { ClientFn } from "../types/core.js";
|
|
2
|
+
import { SpanAnnotation } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Parameters to log multiple span annotations
|
|
5
|
+
*/
|
|
6
|
+
interface LogSpanAnnotationsParams extends ClientFn {
|
|
7
|
+
/**
|
|
8
|
+
* The span annotations to log
|
|
9
|
+
*/
|
|
10
|
+
spanAnnotations: SpanAnnotation[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Log multiple span annotations in a single request.
|
|
14
|
+
*
|
|
15
|
+
* Each annotation can be of type "LLM", "CODE", or "HUMAN" and can include a label, score, and metadata.
|
|
16
|
+
* If an identifier is provided and an annotation with that identifier already exists, it will be updated.
|
|
17
|
+
*
|
|
18
|
+
* @param params - The parameters to log span annotations
|
|
19
|
+
* @returns The IDs of the created or updated annotations
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* const results = await logSpanAnnotations({
|
|
24
|
+
* spanAnnotations: [
|
|
25
|
+
* {
|
|
26
|
+
* spanId: "123abc",
|
|
27
|
+
* name: "quality_score",
|
|
28
|
+
* label: "good",
|
|
29
|
+
* score: 0.95,
|
|
30
|
+
* annotatorKind: "LLM",
|
|
31
|
+
* identifier: "custom_id_123",
|
|
32
|
+
* metadata: {
|
|
33
|
+
* model: "gpt-4"
|
|
34
|
+
* }
|
|
35
|
+
* },
|
|
36
|
+
* {
|
|
37
|
+
* spanId: "456def",
|
|
38
|
+
* name: "sentiment",
|
|
39
|
+
* label: "positive",
|
|
40
|
+
* score: 0.8,
|
|
41
|
+
* annotatorKind: "CODE"
|
|
42
|
+
* }
|
|
43
|
+
* ]
|
|
44
|
+
* });
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare function logSpanAnnotations({ client: _client, spanAnnotations, }: LogSpanAnnotationsParams): Promise<{
|
|
48
|
+
id: string;
|
|
49
|
+
}[]>;
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=logSpanAnnotations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logSpanAnnotations.d.ts","sourceRoot":"","sources":["../../../src/spans/logSpanAnnotations.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAwB,MAAM,SAAS,CAAC;AAE/D;;GAEG;AACH,UAAU,wBAAyB,SAAQ,QAAQ;IACjD;;OAEG;IACH,eAAe,EAAE,cAAc,EAAE,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAsB,kBAAkB,CAAC,EACvC,MAAM,EAAE,OAAO,EACf,eAAe,GAChB,EAAE,wBAAwB,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAkBtD"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { createClient } from "../client.js";
|
|
2
|
+
import { toSpanAnnotationData } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Log multiple span annotations in a single request.
|
|
5
|
+
*
|
|
6
|
+
* Each annotation can be of type "LLM", "CODE", or "HUMAN" and can include a label, score, and metadata.
|
|
7
|
+
* If an identifier is provided and an annotation with that identifier already exists, it will be updated.
|
|
8
|
+
*
|
|
9
|
+
* @param params - The parameters to log span annotations
|
|
10
|
+
* @returns The IDs of the created or updated annotations
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* const results = await logSpanAnnotations({
|
|
15
|
+
* spanAnnotations: [
|
|
16
|
+
* {
|
|
17
|
+
* spanId: "123abc",
|
|
18
|
+
* name: "quality_score",
|
|
19
|
+
* label: "good",
|
|
20
|
+
* score: 0.95,
|
|
21
|
+
* annotatorKind: "LLM",
|
|
22
|
+
* identifier: "custom_id_123",
|
|
23
|
+
* metadata: {
|
|
24
|
+
* model: "gpt-4"
|
|
25
|
+
* }
|
|
26
|
+
* },
|
|
27
|
+
* {
|
|
28
|
+
* spanId: "456def",
|
|
29
|
+
* name: "sentiment",
|
|
30
|
+
* label: "positive",
|
|
31
|
+
* score: 0.8,
|
|
32
|
+
* annotatorKind: "CODE"
|
|
33
|
+
* }
|
|
34
|
+
* ]
|
|
35
|
+
* });
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export async function logSpanAnnotations({ client: _client, spanAnnotations, }) {
|
|
39
|
+
const client = _client ?? createClient();
|
|
40
|
+
const { data, error } = await client.POST("/v1/span_annotations", {
|
|
41
|
+
body: {
|
|
42
|
+
data: spanAnnotations.map(toSpanAnnotationData),
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
if (error) {
|
|
46
|
+
throw new Error(`Failed to log span annotations: ${error}`);
|
|
47
|
+
}
|
|
48
|
+
if (!data?.data?.length) {
|
|
49
|
+
throw new Error("No annotation IDs returned from server");
|
|
50
|
+
}
|
|
51
|
+
return data.data;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=logSpanAnnotations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logSpanAnnotations.js","sourceRoot":"","sources":["../../../src/spans/logSpanAnnotations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAkB,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAY/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EACvC,MAAM,EAAE,OAAO,EACf,eAAe,GACU;IACzB,MAAM,MAAM,GAAG,OAAO,IAAI,YAAY,EAAE,CAAC;IAEzC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;QAChE,IAAI,EAAE;YACJ,IAAI,EAAE,eAAe,CAAC,GAAG,CAAC,oBAAoB,CAAC;SAChD;KACF,CAAC,CAAC;IAEH,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { paths } from "../__generated__/api/v1.js";
|
|
2
|
+
type SpanAnnotationData = paths["/v1/span_annotations"]["post"]["requestBody"]["content"]["application/json"]["data"][0];
|
|
3
|
+
/**
|
|
4
|
+
* Parameters for a single span annotation
|
|
5
|
+
*/
|
|
6
|
+
export interface SpanAnnotation {
|
|
7
|
+
/**
|
|
8
|
+
* The OpenTelemetry Span ID (hex format without 0x prefix)
|
|
9
|
+
*/
|
|
10
|
+
spanId: string;
|
|
11
|
+
/**
|
|
12
|
+
* The name of the annotation
|
|
13
|
+
*/
|
|
14
|
+
name: string;
|
|
15
|
+
/**
|
|
16
|
+
* The label assigned by the annotation
|
|
17
|
+
*/
|
|
18
|
+
label?: string;
|
|
19
|
+
/**
|
|
20
|
+
* The score assigned by the annotation
|
|
21
|
+
*/
|
|
22
|
+
score?: number;
|
|
23
|
+
/**
|
|
24
|
+
* The identifier of the annotation. If provided, the annotation will be updated if it already exists.
|
|
25
|
+
*/
|
|
26
|
+
identifier?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Metadata for the annotation
|
|
29
|
+
*/
|
|
30
|
+
metadata?: Record<string, unknown>;
|
|
31
|
+
/**
|
|
32
|
+
* The kind of annotator used for the annotation
|
|
33
|
+
* Can be "HUMAN", "LLM", or "CODE"
|
|
34
|
+
* @default "HUMAN"
|
|
35
|
+
*/
|
|
36
|
+
annotatorKind?: SpanAnnotationData["annotator_kind"];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Convert a SpanAnnotation to the API format
|
|
40
|
+
*/
|
|
41
|
+
export declare function toSpanAnnotationData(annotation: SpanAnnotation): SpanAnnotationData;
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/spans/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAEhD,KAAK,kBAAkB,GACrB,KAAK,CAAC,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAEjG;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC;;;;OAIG;IACH,aAAa,CAAC,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;CACtD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,cAAc,GACzB,kBAAkB,CAapB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert a SpanAnnotation to the API format
|
|
3
|
+
*/
|
|
4
|
+
export function toSpanAnnotationData(annotation) {
|
|
5
|
+
return {
|
|
6
|
+
span_id: annotation.spanId,
|
|
7
|
+
name: annotation.name,
|
|
8
|
+
annotator_kind: annotation.annotatorKind ?? "HUMAN",
|
|
9
|
+
result: {
|
|
10
|
+
label: annotation.label ?? null,
|
|
11
|
+
score: annotation.score ?? null,
|
|
12
|
+
explanation: null,
|
|
13
|
+
},
|
|
14
|
+
metadata: annotation.metadata ?? null,
|
|
15
|
+
identifier: annotation.identifier ?? "",
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/spans/types.ts"],"names":[],"mappings":"AAyCA;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAA0B;IAE1B,OAAO;QACL,OAAO,EAAE,UAAU,CAAC,MAAM;QAC1B,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,cAAc,EAAE,UAAU,CAAC,aAAa,IAAI,OAAO;QACnD,MAAM,EAAE;YACN,KAAK,EAAE,UAAU,CAAC,KAAK,IAAI,IAAI;YAC/B,KAAK,EAAE,UAAU,CAAC,KAAK,IAAI,IAAI;YAC/B,WAAW,EAAE,IAAI;SAClB;QACD,QAAQ,EAAE,UAAU,CAAC,QAAQ,IAAI,IAAI;QACrC,UAAU,EAAE,UAAU,CAAC,UAAU,IAAI,EAAE;KACxC,CAAC;AACJ,CAAC"}
|