@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.
Files changed (183) hide show
  1. package/README.md +118 -0
  2. package/dist/esm/client.d.ts +13 -1
  3. package/dist/esm/client.d.ts.map +1 -1
  4. package/dist/esm/client.js +4 -1
  5. package/dist/esm/client.js.map +1 -1
  6. package/dist/esm/datasets/appendDatasetExamples.d.ts +21 -0
  7. package/dist/esm/datasets/appendDatasetExamples.d.ts.map +1 -0
  8. package/dist/esm/datasets/appendDatasetExamples.js +32 -0
  9. package/dist/esm/datasets/appendDatasetExamples.js.map +1 -0
  10. package/dist/esm/datasets/createDataset.d.ts +25 -0
  11. package/dist/esm/datasets/createDataset.d.ts.map +1 -0
  12. package/dist/esm/datasets/createDataset.js +34 -0
  13. package/dist/esm/datasets/createDataset.js.map +1 -0
  14. package/dist/esm/datasets/getDataset.d.ts +10 -0
  15. package/dist/esm/datasets/getDataset.d.ts.map +1 -0
  16. package/dist/esm/datasets/getDataset.js +18 -0
  17. package/dist/esm/datasets/getDataset.js.map +1 -0
  18. package/dist/esm/datasets/getDatasetExamples.d.ts +10 -0
  19. package/dist/esm/datasets/getDatasetExamples.d.ts.map +1 -0
  20. package/dist/esm/datasets/getDatasetExamples.js +25 -0
  21. package/dist/esm/datasets/getDatasetExamples.js.map +1 -0
  22. package/dist/esm/datasets/getDatasetInfo.d.ts +11 -0
  23. package/dist/esm/datasets/getDatasetInfo.d.ts.map +1 -0
  24. package/dist/esm/datasets/getDatasetInfo.js +25 -0
  25. package/dist/esm/datasets/getDatasetInfo.js.map +1 -0
  26. package/dist/esm/datasets/index.d.ts +7 -0
  27. package/dist/esm/datasets/index.d.ts.map +1 -0
  28. package/dist/esm/datasets/index.js +7 -0
  29. package/dist/esm/datasets/index.js.map +1 -0
  30. package/dist/esm/datasets/listDatasets.d.ts +23 -0
  31. package/dist/esm/datasets/listDatasets.d.ts.map +1 -0
  32. package/dist/esm/datasets/listDatasets.js +26 -0
  33. package/dist/esm/datasets/listDatasets.js.map +1 -0
  34. package/dist/esm/experiments/getExperiment.d.ts +14 -0
  35. package/dist/esm/experiments/getExperiment.d.ts.map +1 -0
  36. package/dist/esm/experiments/getExperiment.js +25 -0
  37. package/dist/esm/experiments/getExperiment.js.map +1 -0
  38. package/dist/esm/experiments/getExperimentInfo.d.ts +13 -0
  39. package/dist/esm/experiments/getExperimentInfo.d.ts.map +1 -0
  40. package/dist/esm/experiments/getExperimentInfo.js +24 -0
  41. package/dist/esm/experiments/getExperimentInfo.js.map +1 -0
  42. package/dist/esm/experiments/getExperimentRuns.d.ts +15 -0
  43. package/dist/esm/experiments/getExperimentRuns.d.ts.map +1 -0
  44. package/dist/esm/experiments/getExperimentRuns.js +33 -0
  45. package/dist/esm/experiments/getExperimentRuns.js.map +1 -0
  46. package/dist/esm/experiments/index.d.ts +3 -0
  47. package/dist/esm/experiments/index.d.ts.map +1 -1
  48. package/dist/esm/experiments/index.js +3 -0
  49. package/dist/esm/experiments/index.js.map +1 -1
  50. package/dist/esm/experiments/instrumention.d.ts +18 -0
  51. package/dist/esm/experiments/instrumention.d.ts.map +1 -0
  52. package/dist/esm/experiments/instrumention.js +34 -0
  53. package/dist/esm/experiments/instrumention.js.map +1 -0
  54. package/dist/esm/experiments/runExperiment.d.ts +24 -21
  55. package/dist/esm/experiments/runExperiment.d.ts.map +1 -1
  56. package/dist/esm/experiments/runExperiment.js +221 -108
  57. package/dist/esm/experiments/runExperiment.js.map +1 -1
  58. package/dist/esm/schemas/llm/anthropic/converters.d.ts +28 -28
  59. package/dist/esm/schemas/llm/anthropic/messagePartSchemas.d.ts +8 -8
  60. package/dist/esm/schemas/llm/anthropic/messageSchemas.d.ts +24 -24
  61. package/dist/esm/schemas/llm/anthropic/toolCallSchemas.d.ts +8 -8
  62. package/dist/esm/schemas/llm/constants.d.ts +6 -6
  63. package/dist/esm/schemas/llm/converters.d.ts +24 -24
  64. package/dist/esm/schemas/llm/openai/converters.d.ts +6 -6
  65. package/dist/esm/schemas/llm/schemas.d.ts +22 -22
  66. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  67. package/dist/esm/types/datasets.d.ts +33 -8
  68. package/dist/esm/types/datasets.d.ts.map +1 -1
  69. package/dist/esm/types/experiments.d.ts +17 -4
  70. package/dist/esm/types/experiments.d.ts.map +1 -1
  71. package/dist/esm/utils/ensureString.d.ts +8 -0
  72. package/dist/esm/utils/ensureString.d.ts.map +1 -0
  73. package/dist/esm/utils/ensureString.js +14 -0
  74. package/dist/esm/utils/ensureString.js.map +1 -0
  75. package/dist/esm/utils/objectAsAttributes.d.ts +3 -0
  76. package/dist/esm/utils/objectAsAttributes.d.ts.map +1 -0
  77. package/dist/esm/utils/objectAsAttributes.js +4 -0
  78. package/dist/esm/utils/objectAsAttributes.js.map +1 -0
  79. package/dist/src/client.d.ts +13 -1
  80. package/dist/src/client.d.ts.map +1 -1
  81. package/dist/src/client.js +1 -1
  82. package/dist/src/client.js.map +1 -1
  83. package/dist/src/datasets/appendDatasetExamples.d.ts +21 -0
  84. package/dist/src/datasets/appendDatasetExamples.d.ts.map +1 -0
  85. package/dist/src/datasets/appendDatasetExamples.js +50 -0
  86. package/dist/src/datasets/appendDatasetExamples.js.map +1 -0
  87. package/dist/src/datasets/createDataset.d.ts +25 -0
  88. package/dist/src/datasets/createDataset.d.ts.map +1 -0
  89. package/dist/src/datasets/createDataset.js +52 -0
  90. package/dist/src/datasets/createDataset.js.map +1 -0
  91. package/dist/src/datasets/getDataset.d.ts +10 -0
  92. package/dist/src/datasets/getDataset.d.ts.map +1 -0
  93. package/dist/src/datasets/getDataset.js +29 -0
  94. package/dist/src/datasets/getDataset.js.map +1 -0
  95. package/dist/src/datasets/getDatasetExamples.d.ts +10 -0
  96. package/dist/src/datasets/getDatasetExamples.d.ts.map +1 -0
  97. package/dist/src/datasets/getDatasetExamples.js +40 -0
  98. package/dist/src/datasets/getDatasetExamples.js.map +1 -0
  99. package/dist/src/datasets/getDatasetInfo.d.ts +11 -0
  100. package/dist/src/datasets/getDatasetInfo.d.ts.map +1 -0
  101. package/dist/src/datasets/getDatasetInfo.js +43 -0
  102. package/dist/src/datasets/getDatasetInfo.js.map +1 -0
  103. package/dist/src/datasets/index.d.ts +7 -0
  104. package/dist/src/datasets/index.d.ts.map +1 -0
  105. package/dist/src/datasets/index.js +23 -0
  106. package/dist/src/datasets/index.js.map +1 -0
  107. package/dist/src/datasets/listDatasets.d.ts +23 -0
  108. package/dist/src/datasets/listDatasets.d.ts.map +1 -0
  109. package/dist/src/datasets/listDatasets.js +40 -0
  110. package/dist/src/datasets/listDatasets.js.map +1 -0
  111. package/dist/src/experiments/getExperiment.d.ts +14 -0
  112. package/dist/src/experiments/getExperiment.d.ts.map +1 -0
  113. package/dist/src/experiments/getExperiment.js +36 -0
  114. package/dist/src/experiments/getExperiment.js.map +1 -0
  115. package/dist/src/experiments/getExperimentInfo.d.ts +13 -0
  116. package/dist/src/experiments/getExperimentInfo.d.ts.map +1 -0
  117. package/dist/src/experiments/getExperimentInfo.js +41 -0
  118. package/dist/src/experiments/getExperimentInfo.js.map +1 -0
  119. package/dist/src/experiments/getExperimentRuns.d.ts +15 -0
  120. package/dist/src/experiments/getExperimentRuns.d.ts.map +1 -0
  121. package/dist/src/experiments/getExperimentRuns.js +50 -0
  122. package/dist/src/experiments/getExperimentRuns.js.map +1 -0
  123. package/dist/src/experiments/index.d.ts +3 -0
  124. package/dist/src/experiments/index.d.ts.map +1 -1
  125. package/dist/src/experiments/index.js +3 -0
  126. package/dist/src/experiments/index.js.map +1 -1
  127. package/dist/src/experiments/instrumention.d.ts +18 -0
  128. package/dist/src/experiments/instrumention.d.ts.map +1 -0
  129. package/dist/src/experiments/instrumention.js +38 -0
  130. package/dist/src/experiments/instrumention.js.map +1 -0
  131. package/dist/src/experiments/runExperiment.d.ts +24 -21
  132. package/dist/src/experiments/runExperiment.d.ts.map +1 -1
  133. package/dist/src/experiments/runExperiment.js +222 -111
  134. package/dist/src/experiments/runExperiment.js.map +1 -1
  135. package/dist/src/schemas/llm/anthropic/converters.d.ts +28 -28
  136. package/dist/src/schemas/llm/anthropic/messagePartSchemas.d.ts +8 -8
  137. package/dist/src/schemas/llm/anthropic/messageSchemas.d.ts +24 -24
  138. package/dist/src/schemas/llm/anthropic/toolCallSchemas.d.ts +8 -8
  139. package/dist/src/schemas/llm/constants.d.ts +6 -6
  140. package/dist/src/schemas/llm/converters.d.ts +24 -24
  141. package/dist/src/schemas/llm/openai/converters.d.ts +6 -6
  142. package/dist/src/schemas/llm/schemas.d.ts +22 -22
  143. package/dist/src/types/datasets.d.ts +33 -8
  144. package/dist/src/types/datasets.d.ts.map +1 -1
  145. package/dist/src/types/experiments.d.ts +17 -4
  146. package/dist/src/types/experiments.d.ts.map +1 -1
  147. package/dist/src/utils/ensureString.d.ts +8 -0
  148. package/dist/src/utils/ensureString.d.ts.map +1 -0
  149. package/dist/src/utils/ensureString.js +18 -0
  150. package/dist/src/utils/ensureString.js.map +1 -0
  151. package/dist/src/utils/objectAsAttributes.d.ts +3 -0
  152. package/dist/src/utils/objectAsAttributes.d.ts.map +1 -0
  153. package/dist/src/utils/objectAsAttributes.js +7 -0
  154. package/dist/src/utils/objectAsAttributes.js.map +1 -0
  155. package/dist/tsconfig.tsbuildinfo +1 -1
  156. package/package.json +13 -1
  157. package/src/client.ts +4 -1
  158. package/src/datasets/appendDatasetExamples.ts +55 -0
  159. package/src/datasets/createDataset.ts +60 -0
  160. package/src/datasets/getDataset.ts +27 -0
  161. package/src/datasets/getDatasetExamples.ts +34 -0
  162. package/src/datasets/getDatasetInfo.ts +34 -0
  163. package/src/datasets/index.ts +6 -0
  164. package/src/datasets/listDatasets.ts +37 -0
  165. package/src/experiments/getExperiment.ts +40 -0
  166. package/src/experiments/getExperimentInfo.ts +39 -0
  167. package/src/experiments/getExperimentRuns.ts +45 -0
  168. package/src/experiments/index.ts +3 -0
  169. package/src/experiments/instrumention.ts +52 -0
  170. package/src/experiments/runExperiment.ts +277 -133
  171. package/src/types/datasets.ts +35 -9
  172. package/src/types/experiments.ts +19 -4
  173. package/src/utils/ensureString.ts +14 -0
  174. package/src/utils/objectAsAttributes.ts +9 -0
  175. package/dist/esm/utils/getDatasetBySelector.d.ts +0 -25
  176. package/dist/esm/utils/getDatasetBySelector.d.ts.map +0 -1
  177. package/dist/esm/utils/getDatasetBySelector.js +0 -37
  178. package/dist/esm/utils/getDatasetBySelector.js.map +0 -1
  179. package/dist/src/utils/getDatasetBySelector.d.ts +0 -25
  180. package/dist/src/utils/getDatasetBySelector.d.ts.map +0 -1
  181. package/dist/src/utils/getDatasetBySelector.js +0 -47
  182. package/dist/src/utils/getDatasetBySelector.js.map +0 -1
  183. 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": "1.2.0",
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 createOpenApiClient<pathsV1>(mergedOptions);
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,6 @@
1
+ export * from "./createDataset";
2
+ export * from "./getDataset";
3
+ export * from "./getDatasetExamples";
4
+ export * from "./appendDatasetExamples";
5
+ export * from "./getDatasetExamples";
6
+ export * from "./getDatasetInfo";
@@ -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
+ }
@@ -1 +1,4 @@
1
+ export * from "./getExperimentInfo";
2
+ export * from "./getExperiment";
3
+ export * from "./getExperimentRuns";
1
4
  export * from "./runExperiment";
@@ -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
+ }