@arizeai/phoenix-client 1.2.0 → 2.0.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 +118 -0
- package/dist/esm/client.d.ts +13 -1
- package/dist/esm/client.d.ts.map +1 -1
- package/dist/esm/client.js +4 -1
- package/dist/esm/client.js.map +1 -1
- package/dist/esm/datasets/appendDatasetExamples.d.ts +21 -0
- package/dist/esm/datasets/appendDatasetExamples.d.ts.map +1 -0
- package/dist/esm/datasets/appendDatasetExamples.js +32 -0
- package/dist/esm/datasets/appendDatasetExamples.js.map +1 -0
- package/dist/esm/datasets/createDataset.d.ts +25 -0
- package/dist/esm/datasets/createDataset.d.ts.map +1 -0
- package/dist/esm/datasets/createDataset.js +34 -0
- package/dist/esm/datasets/createDataset.js.map +1 -0
- package/dist/esm/datasets/getDataset.d.ts +10 -0
- package/dist/esm/datasets/getDataset.d.ts.map +1 -0
- package/dist/esm/datasets/getDataset.js +18 -0
- package/dist/esm/datasets/getDataset.js.map +1 -0
- package/dist/esm/datasets/getDatasetExamples.d.ts +10 -0
- package/dist/esm/datasets/getDatasetExamples.d.ts.map +1 -0
- package/dist/esm/datasets/getDatasetExamples.js +25 -0
- package/dist/esm/datasets/getDatasetExamples.js.map +1 -0
- package/dist/esm/datasets/getDatasetInfo.d.ts +11 -0
- package/dist/esm/datasets/getDatasetInfo.d.ts.map +1 -0
- package/dist/esm/datasets/getDatasetInfo.js +25 -0
- package/dist/esm/datasets/getDatasetInfo.js.map +1 -0
- package/dist/esm/datasets/index.d.ts +7 -0
- package/dist/esm/datasets/index.d.ts.map +1 -0
- package/dist/esm/datasets/index.js +7 -0
- package/dist/esm/datasets/index.js.map +1 -0
- package/dist/esm/datasets/listDatasets.d.ts +23 -0
- package/dist/esm/datasets/listDatasets.d.ts.map +1 -0
- package/dist/esm/datasets/listDatasets.js +26 -0
- package/dist/esm/datasets/listDatasets.js.map +1 -0
- package/dist/esm/experiments/getExperiment.d.ts +14 -0
- package/dist/esm/experiments/getExperiment.d.ts.map +1 -0
- package/dist/esm/experiments/getExperiment.js +25 -0
- package/dist/esm/experiments/getExperiment.js.map +1 -0
- package/dist/esm/experiments/getExperimentInfo.d.ts +13 -0
- package/dist/esm/experiments/getExperimentInfo.d.ts.map +1 -0
- package/dist/esm/experiments/getExperimentInfo.js +24 -0
- package/dist/esm/experiments/getExperimentInfo.js.map +1 -0
- package/dist/esm/experiments/getExperimentRuns.d.ts +15 -0
- package/dist/esm/experiments/getExperimentRuns.d.ts.map +1 -0
- package/dist/esm/experiments/getExperimentRuns.js +33 -0
- package/dist/esm/experiments/getExperimentRuns.js.map +1 -0
- package/dist/esm/experiments/index.d.ts +3 -0
- package/dist/esm/experiments/index.d.ts.map +1 -1
- package/dist/esm/experiments/index.js +3 -0
- package/dist/esm/experiments/index.js.map +1 -1
- package/dist/esm/experiments/instrumention.d.ts +18 -0
- package/dist/esm/experiments/instrumention.d.ts.map +1 -0
- package/dist/esm/experiments/instrumention.js +34 -0
- package/dist/esm/experiments/instrumention.js.map +1 -0
- package/dist/esm/experiments/runExperiment.d.ts +24 -21
- package/dist/esm/experiments/runExperiment.d.ts.map +1 -1
- package/dist/esm/experiments/runExperiment.js +221 -108
- package/dist/esm/experiments/runExperiment.js.map +1 -1
- package/dist/esm/schemas/llm/anthropic/converters.d.ts +28 -28
- package/dist/esm/schemas/llm/anthropic/messagePartSchemas.d.ts +8 -8
- package/dist/esm/schemas/llm/anthropic/messageSchemas.d.ts +24 -24
- package/dist/esm/schemas/llm/anthropic/toolCallSchemas.d.ts +8 -8
- package/dist/esm/schemas/llm/constants.d.ts +6 -6
- package/dist/esm/schemas/llm/converters.d.ts +24 -24
- package/dist/esm/schemas/llm/openai/converters.d.ts +6 -6
- package/dist/esm/schemas/llm/schemas.d.ts +22 -22
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/esm/types/datasets.d.ts +33 -8
- package/dist/esm/types/datasets.d.ts.map +1 -1
- package/dist/esm/types/experiments.d.ts +17 -4
- package/dist/esm/types/experiments.d.ts.map +1 -1
- package/dist/esm/utils/ensureString.d.ts +8 -0
- package/dist/esm/utils/ensureString.d.ts.map +1 -0
- package/dist/esm/utils/ensureString.js +14 -0
- package/dist/esm/utils/ensureString.js.map +1 -0
- package/dist/esm/utils/objectAsAttributes.d.ts +3 -0
- package/dist/esm/utils/objectAsAttributes.d.ts.map +1 -0
- package/dist/esm/utils/objectAsAttributes.js +4 -0
- package/dist/esm/utils/objectAsAttributes.js.map +1 -0
- package/dist/src/client.d.ts +13 -1
- package/dist/src/client.d.ts.map +1 -1
- package/dist/src/client.js +1 -1
- package/dist/src/client.js.map +1 -1
- package/dist/src/datasets/appendDatasetExamples.d.ts +21 -0
- package/dist/src/datasets/appendDatasetExamples.d.ts.map +1 -0
- package/dist/src/datasets/appendDatasetExamples.js +50 -0
- package/dist/src/datasets/appendDatasetExamples.js.map +1 -0
- package/dist/src/datasets/createDataset.d.ts +25 -0
- package/dist/src/datasets/createDataset.d.ts.map +1 -0
- package/dist/src/datasets/createDataset.js +52 -0
- package/dist/src/datasets/createDataset.js.map +1 -0
- package/dist/src/datasets/getDataset.d.ts +10 -0
- package/dist/src/datasets/getDataset.d.ts.map +1 -0
- package/dist/src/datasets/getDataset.js +29 -0
- package/dist/src/datasets/getDataset.js.map +1 -0
- package/dist/src/datasets/getDatasetExamples.d.ts +10 -0
- package/dist/src/datasets/getDatasetExamples.d.ts.map +1 -0
- package/dist/src/datasets/getDatasetExamples.js +40 -0
- package/dist/src/datasets/getDatasetExamples.js.map +1 -0
- package/dist/src/datasets/getDatasetInfo.d.ts +11 -0
- package/dist/src/datasets/getDatasetInfo.d.ts.map +1 -0
- package/dist/src/datasets/getDatasetInfo.js +43 -0
- package/dist/src/datasets/getDatasetInfo.js.map +1 -0
- package/dist/src/datasets/index.d.ts +7 -0
- package/dist/src/datasets/index.d.ts.map +1 -0
- package/dist/src/datasets/index.js +23 -0
- package/dist/src/datasets/index.js.map +1 -0
- package/dist/src/datasets/listDatasets.d.ts +23 -0
- package/dist/src/datasets/listDatasets.d.ts.map +1 -0
- package/dist/src/datasets/listDatasets.js +40 -0
- package/dist/src/datasets/listDatasets.js.map +1 -0
- package/dist/src/experiments/getExperiment.d.ts +14 -0
- package/dist/src/experiments/getExperiment.d.ts.map +1 -0
- package/dist/src/experiments/getExperiment.js +36 -0
- package/dist/src/experiments/getExperiment.js.map +1 -0
- package/dist/src/experiments/getExperimentInfo.d.ts +13 -0
- package/dist/src/experiments/getExperimentInfo.d.ts.map +1 -0
- package/dist/src/experiments/getExperimentInfo.js +41 -0
- package/dist/src/experiments/getExperimentInfo.js.map +1 -0
- package/dist/src/experiments/getExperimentRuns.d.ts +15 -0
- package/dist/src/experiments/getExperimentRuns.d.ts.map +1 -0
- package/dist/src/experiments/getExperimentRuns.js +50 -0
- package/dist/src/experiments/getExperimentRuns.js.map +1 -0
- package/dist/src/experiments/index.d.ts +3 -0
- package/dist/src/experiments/index.d.ts.map +1 -1
- package/dist/src/experiments/index.js +3 -0
- package/dist/src/experiments/index.js.map +1 -1
- package/dist/src/experiments/instrumention.d.ts +18 -0
- package/dist/src/experiments/instrumention.d.ts.map +1 -0
- package/dist/src/experiments/instrumention.js +38 -0
- package/dist/src/experiments/instrumention.js.map +1 -0
- package/dist/src/experiments/runExperiment.d.ts +24 -21
- package/dist/src/experiments/runExperiment.d.ts.map +1 -1
- package/dist/src/experiments/runExperiment.js +222 -111
- package/dist/src/experiments/runExperiment.js.map +1 -1
- package/dist/src/schemas/llm/anthropic/converters.d.ts +28 -28
- package/dist/src/schemas/llm/anthropic/messagePartSchemas.d.ts +8 -8
- package/dist/src/schemas/llm/anthropic/messageSchemas.d.ts +24 -24
- package/dist/src/schemas/llm/anthropic/toolCallSchemas.d.ts +8 -8
- package/dist/src/schemas/llm/constants.d.ts +6 -6
- package/dist/src/schemas/llm/converters.d.ts +24 -24
- package/dist/src/schemas/llm/openai/converters.d.ts +6 -6
- package/dist/src/schemas/llm/schemas.d.ts +22 -22
- package/dist/src/types/datasets.d.ts +33 -8
- package/dist/src/types/datasets.d.ts.map +1 -1
- package/dist/src/types/experiments.d.ts +17 -4
- package/dist/src/types/experiments.d.ts.map +1 -1
- package/dist/src/utils/ensureString.d.ts +8 -0
- package/dist/src/utils/ensureString.d.ts.map +1 -0
- package/dist/src/utils/ensureString.js +18 -0
- package/dist/src/utils/ensureString.js.map +1 -0
- package/dist/src/utils/objectAsAttributes.d.ts +3 -0
- package/dist/src/utils/objectAsAttributes.d.ts.map +1 -0
- package/dist/src/utils/objectAsAttributes.js +7 -0
- package/dist/src/utils/objectAsAttributes.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +13 -1
- package/src/client.ts +4 -1
- package/src/datasets/appendDatasetExamples.ts +55 -0
- package/src/datasets/createDataset.ts +60 -0
- package/src/datasets/getDataset.ts +27 -0
- package/src/datasets/getDatasetExamples.ts +34 -0
- package/src/datasets/getDatasetInfo.ts +34 -0
- package/src/datasets/index.ts +6 -0
- package/src/datasets/listDatasets.ts +37 -0
- package/src/experiments/getExperiment.ts +40 -0
- package/src/experiments/getExperimentInfo.ts +39 -0
- package/src/experiments/getExperimentRuns.ts +45 -0
- package/src/experiments/index.ts +3 -0
- package/src/experiments/instrumention.ts +52 -0
- package/src/experiments/runExperiment.ts +277 -133
- package/src/types/datasets.ts +35 -9
- package/src/types/experiments.ts +19 -4
- package/src/utils/ensureString.ts +14 -0
- package/src/utils/objectAsAttributes.ts +9 -0
- package/dist/esm/utils/getDatasetBySelector.d.ts +0 -25
- package/dist/esm/utils/getDatasetBySelector.d.ts.map +0 -1
- package/dist/esm/utils/getDatasetBySelector.js +0 -37
- package/dist/esm/utils/getDatasetBySelector.js.map +0 -1
- package/dist/src/utils/getDatasetBySelector.d.ts +0 -25
- package/dist/src/utils/getDatasetBySelector.d.ts.map +0 -1
- package/dist/src/utils/getDatasetBySelector.js +0 -47
- package/dist/src/utils/getDatasetBySelector.js.map +0 -1
- package/src/utils/getDatasetBySelector.ts +0 -55
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@arizeai/phoenix-client",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "A client for the Phoenix API",
|
|
5
5
|
"main": "dist/src/index.js",
|
|
6
6
|
"module": "dist/esm/index.js",
|
|
@@ -22,6 +22,10 @@
|
|
|
22
22
|
"import": "./dist/esm/experiments/index.js",
|
|
23
23
|
"require": "./dist/src/experiments/index.js"
|
|
24
24
|
},
|
|
25
|
+
"./datasets": {
|
|
26
|
+
"import": "./dist/esm/datasets/index.js",
|
|
27
|
+
"require": "./dist/src/datasets/index.js"
|
|
28
|
+
},
|
|
25
29
|
"./utils/*": {
|
|
26
30
|
"import": "./dist/esm/utils/*.js",
|
|
27
31
|
"require": "./dist/src/utils/*.js"
|
|
@@ -52,6 +56,14 @@
|
|
|
52
56
|
"vitest": "^2.1.9"
|
|
53
57
|
},
|
|
54
58
|
"dependencies": {
|
|
59
|
+
"@arizeai/openinference-semantic-conventions": "^1.1.0",
|
|
60
|
+
"@opentelemetry/api": "^1.9.0",
|
|
61
|
+
"@opentelemetry/core": "^1.25.1",
|
|
62
|
+
"@opentelemetry/instrumentation": "^0.57.2",
|
|
63
|
+
"@opentelemetry/exporter-trace-otlp-proto": "^0.57.2",
|
|
64
|
+
"@opentelemetry/resources": "^2.0.0",
|
|
65
|
+
"@opentelemetry/sdk-trace-base": "^1.30.1",
|
|
66
|
+
"@opentelemetry/sdk-trace-node": "^1.30.1",
|
|
55
67
|
"async": "^3.2.6",
|
|
56
68
|
"openapi-fetch": "^0.12.5",
|
|
57
69
|
"tiny-invariant": "^1.3.3",
|
package/src/client.ts
CHANGED
|
@@ -79,7 +79,10 @@ export const createClient = (
|
|
|
79
79
|
} = {}
|
|
80
80
|
) => {
|
|
81
81
|
const mergedOptions = getMergedOptions(config);
|
|
82
|
-
return
|
|
82
|
+
return {
|
|
83
|
+
...createOpenApiClient<pathsV1>(mergedOptions),
|
|
84
|
+
config: mergedOptions,
|
|
85
|
+
};
|
|
83
86
|
};
|
|
84
87
|
|
|
85
88
|
/**
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { createClient } from "../client";
|
|
2
|
+
import { ClientFn } from "../types/core";
|
|
3
|
+
import { Example, DatasetSelector } from "../types/datasets";
|
|
4
|
+
import invariant from "tiny-invariant";
|
|
5
|
+
|
|
6
|
+
export type AppendDatasetExamplesParams = ClientFn & {
|
|
7
|
+
/**
|
|
8
|
+
* The dataset to append examples to
|
|
9
|
+
*/
|
|
10
|
+
dataset: DatasetSelector;
|
|
11
|
+
/**
|
|
12
|
+
* The examples to append to the dataset
|
|
13
|
+
*/
|
|
14
|
+
examples: Example[];
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export type AppendDatasetExamplesResponse = {
|
|
18
|
+
datasetId: string;
|
|
19
|
+
// TODO: respond with the versionId
|
|
20
|
+
// versionId: string;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Append examples to an existing dataset
|
|
25
|
+
* @experimental this interface may change in the future
|
|
26
|
+
*/
|
|
27
|
+
export async function appendDatasetExamples({
|
|
28
|
+
client: _client,
|
|
29
|
+
dataset,
|
|
30
|
+
examples,
|
|
31
|
+
}: AppendDatasetExamplesParams): Promise<AppendDatasetExamplesResponse> {
|
|
32
|
+
const client = _client || createClient();
|
|
33
|
+
const inputs = examples.map((example) => example.input);
|
|
34
|
+
const outputs = examples.map((example) => example.output ?? {}); // Treat null as an empty object
|
|
35
|
+
const metadata = examples.map((example) => example.metadata);
|
|
36
|
+
const appendResponse = await client.POST("/v1/datasets/upload", {
|
|
37
|
+
params: {
|
|
38
|
+
query: {
|
|
39
|
+
sync: true,
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
body: {
|
|
43
|
+
name: dataset.datasetId,
|
|
44
|
+
action: "append",
|
|
45
|
+
inputs,
|
|
46
|
+
outputs,
|
|
47
|
+
metadata,
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
invariant(appendResponse.data?.data, "Failed to append dataset examples");
|
|
51
|
+
const datasetId = appendResponse.data.data.dataset_id;
|
|
52
|
+
return {
|
|
53
|
+
datasetId,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { createClient } from "../client";
|
|
2
|
+
import { ClientFn } from "../types/core";
|
|
3
|
+
import { Example } from "../types/datasets";
|
|
4
|
+
import invariant from "tiny-invariant";
|
|
5
|
+
|
|
6
|
+
export type CreateDatasetParams = ClientFn & {
|
|
7
|
+
/**
|
|
8
|
+
* The name of the dataset
|
|
9
|
+
*/
|
|
10
|
+
name: string;
|
|
11
|
+
/**
|
|
12
|
+
* The description of the dataset
|
|
13
|
+
*/
|
|
14
|
+
description: string;
|
|
15
|
+
/**
|
|
16
|
+
* The examples to create in the dataset
|
|
17
|
+
*/
|
|
18
|
+
examples: Example[];
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export type CreateDatasetResponse = {
|
|
22
|
+
datasetId: string;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Create a new dataset
|
|
27
|
+
* @experimental this interface may change in the future
|
|
28
|
+
*/
|
|
29
|
+
export async function createDataset({
|
|
30
|
+
client: _client,
|
|
31
|
+
name,
|
|
32
|
+
description,
|
|
33
|
+
examples,
|
|
34
|
+
}: CreateDatasetParams): Promise<CreateDatasetResponse> {
|
|
35
|
+
const client = _client || createClient();
|
|
36
|
+
const inputs = examples.map((example) => example.input);
|
|
37
|
+
const outputs = examples.map((example) => example.output ?? {}); // Treat null as an empty object
|
|
38
|
+
const metadata = examples.map((example) => example.metadata);
|
|
39
|
+
const createDatasetResponse = await client.POST("/v1/datasets/upload", {
|
|
40
|
+
params: {
|
|
41
|
+
query: {
|
|
42
|
+
// TODO: parameterize this
|
|
43
|
+
sync: true,
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
body: {
|
|
47
|
+
name,
|
|
48
|
+
description,
|
|
49
|
+
action: "create",
|
|
50
|
+
inputs,
|
|
51
|
+
outputs,
|
|
52
|
+
metadata,
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
invariant(createDatasetResponse.data?.data, "Failed to create dataset");
|
|
56
|
+
const datasetId = createDatasetResponse.data.data.dataset_id;
|
|
57
|
+
return {
|
|
58
|
+
datasetId,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { createClient } from "../client";
|
|
2
|
+
import { ClientFn } from "../types/core";
|
|
3
|
+
import { DatasetSelector, Dataset } from "../types/datasets";
|
|
4
|
+
import { getDatasetExamples } from "./getDatasetExamples";
|
|
5
|
+
import { getDatasetInfo } from "./getDatasetInfo";
|
|
6
|
+
|
|
7
|
+
export type GetDatasetParams = ClientFn & {
|
|
8
|
+
dataset: DatasetSelector;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Get dataset info and the examples from the latest version of the dataset
|
|
13
|
+
*/
|
|
14
|
+
export async function getDataset({
|
|
15
|
+
client: _client,
|
|
16
|
+
dataset,
|
|
17
|
+
}: GetDatasetParams): Promise<Dataset> {
|
|
18
|
+
const client = _client || createClient();
|
|
19
|
+
const [datasetInfo, datasetExamples] = await Promise.all([
|
|
20
|
+
getDatasetInfo({ client, dataset }),
|
|
21
|
+
getDatasetExamples({ client, dataset }),
|
|
22
|
+
]);
|
|
23
|
+
return {
|
|
24
|
+
...datasetInfo,
|
|
25
|
+
...datasetExamples,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import invariant from "tiny-invariant";
|
|
2
|
+
import { createClient } from "../client";
|
|
3
|
+
import { ClientFn } from "../types/core";
|
|
4
|
+
import { DatasetSelector, DatasetExamples } from "../types/datasets";
|
|
5
|
+
|
|
6
|
+
export type GetDatasetExamplesParams = ClientFn & {
|
|
7
|
+
dataset: DatasetSelector;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Get the latest examples from a dataset
|
|
12
|
+
*/
|
|
13
|
+
export async function getDatasetExamples({
|
|
14
|
+
client: _client,
|
|
15
|
+
dataset,
|
|
16
|
+
}: GetDatasetExamplesParams): Promise<DatasetExamples> {
|
|
17
|
+
const client = _client || createClient();
|
|
18
|
+
const response = await client.GET("/v1/datasets/{id}/examples", {
|
|
19
|
+
params: {
|
|
20
|
+
path: {
|
|
21
|
+
id: dataset.datasetId,
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
invariant(response.data?.data, "Failed to get dataset examples");
|
|
26
|
+
const examplesData = response.data.data;
|
|
27
|
+
return {
|
|
28
|
+
versionId: examplesData.version_id,
|
|
29
|
+
examples: examplesData.examples.map((example) => ({
|
|
30
|
+
...example,
|
|
31
|
+
updatedAt: new Date(example.updated_at),
|
|
32
|
+
})),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import invariant from "tiny-invariant";
|
|
2
|
+
import { createClient } from "../client";
|
|
3
|
+
import { ClientFn } from "../types/core";
|
|
4
|
+
import { DatasetSelector, DatasetInfo } from "../types/datasets";
|
|
5
|
+
|
|
6
|
+
export type GetDatasetInfoParams = ClientFn & {
|
|
7
|
+
dataset: DatasetSelector;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Get an overview of the information in a dataset
|
|
12
|
+
* Note: this does not include the examples contained in the dataset
|
|
13
|
+
*/
|
|
14
|
+
export async function getDatasetInfo({
|
|
15
|
+
client: _client,
|
|
16
|
+
dataset,
|
|
17
|
+
}: GetDatasetInfoParams): Promise<DatasetInfo> {
|
|
18
|
+
const client = _client || createClient();
|
|
19
|
+
const datasetResponse = await client.GET("/v1/datasets/{id}", {
|
|
20
|
+
params: {
|
|
21
|
+
path: {
|
|
22
|
+
id: dataset.datasetId,
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
invariant(datasetResponse.data?.data, "Failed to get dataset info");
|
|
27
|
+
const datasetInfo = datasetResponse.data.data;
|
|
28
|
+
return {
|
|
29
|
+
id: datasetInfo.id,
|
|
30
|
+
name: datasetInfo.name,
|
|
31
|
+
description: datasetInfo.description || undefined,
|
|
32
|
+
metadata: datasetInfo.metadata,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { createClient } from "../client";
|
|
2
|
+
import { DatasetInfo } from "../types/datasets";
|
|
3
|
+
import { ClientFn } from "../types/core";
|
|
4
|
+
import invariant from "tiny-invariant";
|
|
5
|
+
|
|
6
|
+
export type ListDatasetsParams = ClientFn;
|
|
7
|
+
|
|
8
|
+
type FullDatasetInfo = DatasetInfo & {
|
|
9
|
+
startDate: Date;
|
|
10
|
+
endDate: Date;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* List the information about all datasets available to the client.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* import { listDatasets } from "@arizeai/phoenix-client/datasets";
|
|
19
|
+
*
|
|
20
|
+
* const datasets = await listDatasets({});
|
|
21
|
+
* console.log(datasets);
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @throws {Error} If the datasets cannot be listed or the response is invalid.
|
|
25
|
+
*/
|
|
26
|
+
export async function listDatasets({
|
|
27
|
+
client: _client,
|
|
28
|
+
}: ListDatasetsParams): Promise<FullDatasetInfo[]> {
|
|
29
|
+
const client = _client || createClient();
|
|
30
|
+
const response = await client.GET("/v1/datasets");
|
|
31
|
+
invariant(response.data?.data, "Failed to list datasets");
|
|
32
|
+
return response.data.data.map((dataset) => ({
|
|
33
|
+
...dataset,
|
|
34
|
+
startDate: new Date(dataset.created_at),
|
|
35
|
+
endDate: new Date(dataset.updated_at),
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { createClient } from "../client";
|
|
2
|
+
import { ClientFn } from "../types/core";
|
|
3
|
+
import { ExperimentRunsMap, RanExperiment } from "../types/experiments";
|
|
4
|
+
import { getExperimentInfo } from "./getExperimentInfo";
|
|
5
|
+
import { getExperimentRuns } from "./getExperimentRuns";
|
|
6
|
+
|
|
7
|
+
export type GetExperimentResultParams = ClientFn & {
|
|
8
|
+
/**
|
|
9
|
+
* The experiment ID.
|
|
10
|
+
*/
|
|
11
|
+
experimentId: string;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* A function that gets the result of a experiment.
|
|
16
|
+
* Fetches the experiment data as well as the runs.
|
|
17
|
+
*/
|
|
18
|
+
export async function getExperiment({
|
|
19
|
+
client: _client,
|
|
20
|
+
experimentId,
|
|
21
|
+
}: GetExperimentResultParams): Promise<RanExperiment> {
|
|
22
|
+
const client = _client || createClient();
|
|
23
|
+
const [experiment, experimentRuns] = await Promise.all([
|
|
24
|
+
getExperimentInfo({ client, experimentId }),
|
|
25
|
+
getExperimentRuns({ client, experimentId }),
|
|
26
|
+
]);
|
|
27
|
+
const experimentRunsMap: ExperimentRunsMap = {
|
|
28
|
+
runs: experimentRuns.runs.reduce(
|
|
29
|
+
(acc, run) => {
|
|
30
|
+
acc[run.id] = run;
|
|
31
|
+
return acc;
|
|
32
|
+
},
|
|
33
|
+
{} as ExperimentRunsMap["runs"]
|
|
34
|
+
),
|
|
35
|
+
};
|
|
36
|
+
return {
|
|
37
|
+
...experiment,
|
|
38
|
+
...experimentRunsMap,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import invariant from "tiny-invariant";
|
|
2
|
+
import { createClient } from "../client";
|
|
3
|
+
import { ClientFn } from "../types/core";
|
|
4
|
+
import { type ExperimentInfo } from "../types/experiments";
|
|
5
|
+
|
|
6
|
+
export type GetExperimentParams = ClientFn & {
|
|
7
|
+
/**
|
|
8
|
+
* The experiment ID
|
|
9
|
+
*/
|
|
10
|
+
experimentId: string;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Returns an object containing the high-level info about an experiment
|
|
15
|
+
*/
|
|
16
|
+
export async function getExperimentInfo({
|
|
17
|
+
client: _client,
|
|
18
|
+
experimentId: experiment_id,
|
|
19
|
+
}: GetExperimentParams): Promise<ExperimentInfo> {
|
|
20
|
+
const client = _client || createClient();
|
|
21
|
+
const { data: { data: experimentData } = {} } = await client.GET(
|
|
22
|
+
"/v1/experiments/{experiment_id}",
|
|
23
|
+
{
|
|
24
|
+
params: {
|
|
25
|
+
path: {
|
|
26
|
+
experiment_id,
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
invariant(experimentData, "Failed to get experiment");
|
|
32
|
+
return {
|
|
33
|
+
id: experimentData.id,
|
|
34
|
+
datasetId: experimentData.dataset_id,
|
|
35
|
+
datasetVersionId: experimentData.dataset_version_id,
|
|
36
|
+
projectName: experimentData.project_name || "", // This will never happen
|
|
37
|
+
metadata: experimentData.metadata,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { createClient } from "../client";
|
|
2
|
+
import invariant from "tiny-invariant";
|
|
3
|
+
import { ClientFn } from "../types/core";
|
|
4
|
+
import { ExperimentRun } from "../types/experiments";
|
|
5
|
+
|
|
6
|
+
export type GetExperimentRunsParams = ClientFn & {
|
|
7
|
+
/**
|
|
8
|
+
* The experiment ID.
|
|
9
|
+
*/
|
|
10
|
+
experimentId: string;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* A function that gets the runs (e.g. the results) of a experiment
|
|
15
|
+
*/
|
|
16
|
+
export async function getExperimentRuns({
|
|
17
|
+
client: _client,
|
|
18
|
+
experimentId,
|
|
19
|
+
}: GetExperimentRunsParams): Promise<{ runs: ExperimentRun[] }> {
|
|
20
|
+
const client = _client || createClient();
|
|
21
|
+
const getRunsPromise = client.GET("/v1/experiments/{experiment_id}/runs", {
|
|
22
|
+
params: {
|
|
23
|
+
path: {
|
|
24
|
+
experiment_id: experimentId,
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
const [experimentRunResponse] = await Promise.all([getRunsPromise]);
|
|
29
|
+
const { data: { data: experimentRunsData } = {} } = experimentRunResponse;
|
|
30
|
+
invariant(experimentRunsData, "Failed to retrieve experiment runs");
|
|
31
|
+
return {
|
|
32
|
+
runs: experimentRunsData.map((run) => {
|
|
33
|
+
return {
|
|
34
|
+
id: run.id,
|
|
35
|
+
traceId: run.trace_id || null,
|
|
36
|
+
experimentId: run.experiment_id,
|
|
37
|
+
datasetExampleId: run.dataset_example_id,
|
|
38
|
+
startTime: new Date(run.start_time),
|
|
39
|
+
endTime: new Date(run.end_time),
|
|
40
|
+
output: run.output as ExperimentRun["output"],
|
|
41
|
+
error: run.error || null,
|
|
42
|
+
};
|
|
43
|
+
}),
|
|
44
|
+
};
|
|
45
|
+
}
|
package/src/experiments/index.ts
CHANGED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { diag, DiagConsoleLogger, DiagLogLevel } from "@opentelemetry/api";
|
|
2
|
+
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-proto";
|
|
3
|
+
import { resourceFromAttributes } from "@opentelemetry/resources";
|
|
4
|
+
import { SimpleSpanProcessor } from "@opentelemetry/sdk-trace-base";
|
|
5
|
+
import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
|
|
6
|
+
import { SEMRESATTRS_PROJECT_NAME } from "@arizeai/openinference-semantic-conventions";
|
|
7
|
+
import { HeadersOptions } from "openapi-fetch";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Creates a provider that exports traces to Phoenix.
|
|
11
|
+
*/
|
|
12
|
+
export function createProvider({
|
|
13
|
+
projectName,
|
|
14
|
+
baseUrl,
|
|
15
|
+
headers,
|
|
16
|
+
}: {
|
|
17
|
+
projectName: string;
|
|
18
|
+
headers: HeadersOptions;
|
|
19
|
+
/**
|
|
20
|
+
* The base URL of the Phoenix. Doesn't include the /v1/traces path.
|
|
21
|
+
*/
|
|
22
|
+
baseUrl: string;
|
|
23
|
+
}) {
|
|
24
|
+
diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.ERROR);
|
|
25
|
+
|
|
26
|
+
const provider = new NodeTracerProvider({
|
|
27
|
+
resource: resourceFromAttributes({
|
|
28
|
+
[SEMRESATTRS_PROJECT_NAME]: projectName,
|
|
29
|
+
}),
|
|
30
|
+
spanProcessors: [
|
|
31
|
+
new SimpleSpanProcessor(
|
|
32
|
+
new OTLPTraceExporter({
|
|
33
|
+
url: `${baseUrl}/v1/traces`,
|
|
34
|
+
headers: Array.isArray(headers)
|
|
35
|
+
? Object.fromEntries(headers)
|
|
36
|
+
: headers,
|
|
37
|
+
})
|
|
38
|
+
),
|
|
39
|
+
],
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
return provider;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* For dry runs we create a provider that doesn't export traces.
|
|
47
|
+
*/
|
|
48
|
+
export function createNoOpProvider() {
|
|
49
|
+
const provider = new NodeTracerProvider({});
|
|
50
|
+
|
|
51
|
+
return provider;
|
|
52
|
+
}
|