@arizeai/phoenix-client 5.2.1 → 5.4.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 (151) hide show
  1. package/README.md +3 -3
  2. package/dist/esm/__generated__/api/v1.d.ts +321 -9
  3. package/dist/esm/__generated__/api/v1.d.ts.map +1 -1
  4. package/dist/esm/experiments/createExperiment.d.ts +39 -0
  5. package/dist/esm/experiments/createExperiment.d.ts.map +1 -0
  6. package/dist/esm/experiments/createExperiment.js +43 -0
  7. package/dist/esm/experiments/createExperiment.js.map +1 -0
  8. package/dist/esm/experiments/deleteExperiment.d.ts +36 -0
  9. package/dist/esm/experiments/deleteExperiment.d.ts.map +1 -0
  10. package/dist/esm/experiments/deleteExperiment.js +49 -0
  11. package/dist/esm/experiments/deleteExperiment.js.map +1 -0
  12. package/dist/esm/experiments/getExperimentInfo.d.ts.map +1 -1
  13. package/dist/esm/experiments/getExperimentInfo.js +9 -2
  14. package/dist/esm/experiments/getExperimentInfo.js.map +1 -1
  15. package/dist/esm/experiments/helpers/asExperimentEvaluator.d.ts +19 -0
  16. package/dist/esm/experiments/helpers/asExperimentEvaluator.d.ts.map +1 -0
  17. package/dist/esm/experiments/helpers/asExperimentEvaluator.js +19 -0
  18. package/dist/esm/experiments/helpers/asExperimentEvaluator.js.map +1 -0
  19. package/dist/esm/experiments/helpers/fromPhoenixLLMEvaluator.d.ts +9 -0
  20. package/dist/esm/experiments/helpers/fromPhoenixLLMEvaluator.d.ts.map +1 -0
  21. package/dist/esm/experiments/helpers/fromPhoenixLLMEvaluator.js +18 -0
  22. package/dist/esm/experiments/helpers/fromPhoenixLLMEvaluator.js.map +1 -0
  23. package/dist/esm/experiments/helpers/getExperimentEvaluators.d.ts +6 -0
  24. package/dist/esm/experiments/helpers/getExperimentEvaluators.d.ts.map +1 -0
  25. package/dist/esm/experiments/helpers/getExperimentEvaluators.js +58 -0
  26. package/dist/esm/experiments/helpers/getExperimentEvaluators.js.map +1 -0
  27. package/dist/esm/experiments/helpers/index.d.ts +4 -0
  28. package/dist/esm/experiments/helpers/index.d.ts.map +1 -0
  29. package/dist/esm/experiments/helpers/index.js +4 -0
  30. package/dist/esm/experiments/helpers/index.js.map +1 -0
  31. package/dist/esm/experiments/index.d.ts +6 -0
  32. package/dist/esm/experiments/index.d.ts.map +1 -1
  33. package/dist/esm/experiments/index.js +6 -0
  34. package/dist/esm/experiments/index.js.map +1 -1
  35. package/dist/esm/experiments/listExperiments.d.ts +29 -0
  36. package/dist/esm/experiments/listExperiments.d.ts.map +1 -0
  37. package/dist/esm/experiments/listExperiments.js +59 -0
  38. package/dist/esm/experiments/listExperiments.js.map +1 -0
  39. package/dist/esm/experiments/resumeEvaluation.d.ts +105 -0
  40. package/dist/esm/experiments/resumeEvaluation.d.ts.map +1 -0
  41. package/dist/esm/experiments/resumeEvaluation.js +559 -0
  42. package/dist/esm/experiments/resumeEvaluation.js.map +1 -0
  43. package/dist/esm/experiments/resumeExperiment.d.ts +102 -0
  44. package/dist/esm/experiments/resumeExperiment.d.ts.map +1 -0
  45. package/dist/esm/experiments/resumeExperiment.js +517 -0
  46. package/dist/esm/experiments/resumeExperiment.js.map +1 -0
  47. package/dist/esm/experiments/runExperiment.d.ts +4 -3
  48. package/dist/esm/experiments/runExperiment.d.ts.map +1 -1
  49. package/dist/esm/experiments/runExperiment.js +32 -3
  50. package/dist/esm/experiments/runExperiment.js.map +1 -1
  51. package/dist/esm/prompts/createPrompt.d.ts +19 -1
  52. package/dist/esm/prompts/createPrompt.d.ts.map +1 -1
  53. package/dist/esm/prompts/createPrompt.js +14 -1
  54. package/dist/esm/prompts/createPrompt.js.map +1 -1
  55. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  56. package/dist/esm/types/experiments.d.ts +66 -3
  57. package/dist/esm/types/experiments.d.ts.map +1 -1
  58. package/dist/esm/utils/channel.d.ts +229 -0
  59. package/dist/esm/utils/channel.d.ts.map +1 -0
  60. package/dist/esm/utils/channel.js +352 -0
  61. package/dist/esm/utils/channel.js.map +1 -0
  62. package/dist/esm/utils/formatPromptMessages.d.ts.map +1 -1
  63. package/dist/esm/utils/getPromptBySelector.d.ts.map +1 -1
  64. package/dist/esm/utils/isHttpError.d.ts +21 -0
  65. package/dist/esm/utils/isHttpError.d.ts.map +1 -0
  66. package/dist/esm/utils/isHttpError.js +33 -0
  67. package/dist/esm/utils/isHttpError.js.map +1 -0
  68. package/dist/src/__generated__/api/v1.d.ts +321 -9
  69. package/dist/src/__generated__/api/v1.d.ts.map +1 -1
  70. package/dist/src/experiments/createExperiment.d.ts +39 -0
  71. package/dist/src/experiments/createExperiment.d.ts.map +1 -0
  72. package/dist/src/experiments/createExperiment.js +43 -0
  73. package/dist/src/experiments/createExperiment.js.map +1 -0
  74. package/dist/src/experiments/deleteExperiment.d.ts +36 -0
  75. package/dist/src/experiments/deleteExperiment.d.ts.map +1 -0
  76. package/dist/src/experiments/deleteExperiment.js +52 -0
  77. package/dist/src/experiments/deleteExperiment.js.map +1 -0
  78. package/dist/src/experiments/getExperimentInfo.d.ts.map +1 -1
  79. package/dist/src/experiments/getExperimentInfo.js +9 -2
  80. package/dist/src/experiments/getExperimentInfo.js.map +1 -1
  81. package/dist/src/experiments/helpers/asExperimentEvaluator.d.ts +19 -0
  82. package/dist/src/experiments/helpers/asExperimentEvaluator.d.ts.map +1 -0
  83. package/dist/src/experiments/helpers/asExperimentEvaluator.js +22 -0
  84. package/dist/src/experiments/helpers/asExperimentEvaluator.js.map +1 -0
  85. package/dist/src/experiments/helpers/fromPhoenixLLMEvaluator.d.ts +9 -0
  86. package/dist/src/experiments/helpers/fromPhoenixLLMEvaluator.d.ts.map +1 -0
  87. package/dist/src/experiments/helpers/fromPhoenixLLMEvaluator.js +21 -0
  88. package/dist/src/experiments/helpers/fromPhoenixLLMEvaluator.js.map +1 -0
  89. package/dist/src/experiments/helpers/getExperimentEvaluators.d.ts +6 -0
  90. package/dist/src/experiments/helpers/getExperimentEvaluators.d.ts.map +1 -0
  91. package/dist/src/experiments/helpers/getExperimentEvaluators.js +61 -0
  92. package/dist/src/experiments/helpers/getExperimentEvaluators.js.map +1 -0
  93. package/dist/src/experiments/helpers/index.d.ts +4 -0
  94. package/dist/src/experiments/helpers/index.d.ts.map +1 -0
  95. package/dist/src/experiments/helpers/index.js +20 -0
  96. package/dist/src/experiments/helpers/index.js.map +1 -0
  97. package/dist/src/experiments/index.d.ts +6 -0
  98. package/dist/src/experiments/index.d.ts.map +1 -1
  99. package/dist/src/experiments/index.js +6 -0
  100. package/dist/src/experiments/index.js.map +1 -1
  101. package/dist/src/experiments/listExperiments.d.ts +29 -0
  102. package/dist/src/experiments/listExperiments.d.ts.map +1 -0
  103. package/dist/src/experiments/listExperiments.js +66 -0
  104. package/dist/src/experiments/listExperiments.js.map +1 -0
  105. package/dist/src/experiments/resumeEvaluation.d.ts +105 -0
  106. package/dist/src/experiments/resumeEvaluation.d.ts.map +1 -0
  107. package/dist/src/experiments/resumeEvaluation.js +585 -0
  108. package/dist/src/experiments/resumeEvaluation.js.map +1 -0
  109. package/dist/src/experiments/resumeExperiment.d.ts +102 -0
  110. package/dist/src/experiments/resumeExperiment.d.ts.map +1 -0
  111. package/dist/src/experiments/resumeExperiment.js +540 -0
  112. package/dist/src/experiments/resumeExperiment.js.map +1 -0
  113. package/dist/src/experiments/runExperiment.d.ts +4 -3
  114. package/dist/src/experiments/runExperiment.d.ts.map +1 -1
  115. package/dist/src/experiments/runExperiment.js +32 -3
  116. package/dist/src/experiments/runExperiment.js.map +1 -1
  117. package/dist/src/prompts/createPrompt.d.ts +19 -1
  118. package/dist/src/prompts/createPrompt.d.ts.map +1 -1
  119. package/dist/src/prompts/createPrompt.js +14 -1
  120. package/dist/src/prompts/createPrompt.js.map +1 -1
  121. package/dist/src/types/experiments.d.ts +66 -3
  122. package/dist/src/types/experiments.d.ts.map +1 -1
  123. package/dist/src/utils/channel.d.ts +229 -0
  124. package/dist/src/utils/channel.d.ts.map +1 -0
  125. package/dist/src/utils/channel.js +385 -0
  126. package/dist/src/utils/channel.js.map +1 -0
  127. package/dist/src/utils/formatPromptMessages.d.ts.map +1 -1
  128. package/dist/src/utils/getPromptBySelector.d.ts.map +1 -1
  129. package/dist/src/utils/isHttpError.d.ts +21 -0
  130. package/dist/src/utils/isHttpError.d.ts.map +1 -0
  131. package/dist/src/utils/isHttpError.js +37 -0
  132. package/dist/src/utils/isHttpError.js.map +1 -0
  133. package/dist/tsconfig.tsbuildinfo +1 -1
  134. package/package.json +6 -5
  135. package/src/__generated__/api/v1.ts +321 -9
  136. package/src/experiments/createExperiment.ts +90 -0
  137. package/src/experiments/deleteExperiment.ts +67 -0
  138. package/src/experiments/getExperimentInfo.ts +9 -2
  139. package/src/experiments/helpers/asExperimentEvaluator.ts +29 -0
  140. package/src/experiments/helpers/fromPhoenixLLMEvaluator.ts +24 -0
  141. package/src/experiments/helpers/getExperimentEvaluators.ts +74 -0
  142. package/src/experiments/helpers/index.ts +3 -0
  143. package/src/experiments/index.ts +6 -0
  144. package/src/experiments/listExperiments.ts +83 -0
  145. package/src/experiments/resumeEvaluation.ts +804 -0
  146. package/src/experiments/resumeExperiment.ts +745 -0
  147. package/src/experiments/runExperiment.ts +37 -5
  148. package/src/prompts/createPrompt.ts +19 -1
  149. package/src/types/experiments.ts +72 -3
  150. package/src/utils/channel.ts +397 -0
  151. package/src/utils/isHttpError.ts +45 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arizeai/phoenix-client",
3
- "version": "5.2.1",
3
+ "version": "5.4.0",
4
4
  "description": "A client for the Phoenix API",
5
5
  "main": "dist/src/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -66,8 +66,8 @@
66
66
  "openapi-typescript": "^7.6.1",
67
67
  "tsx": "^4.19.3",
68
68
  "typescript": "^5.8.2",
69
- "vitest": "^2.1.9",
70
- "@arizeai/phoenix-evals": "0.3.0"
69
+ "vitest": "^4.0.10",
70
+ "@arizeai/phoenix-evals": "0.4.0"
71
71
  },
72
72
  "dependencies": {
73
73
  "@arizeai/openinference-semantic-conventions": "^1.1.0",
@@ -75,7 +75,7 @@
75
75
  "async": "^3.2.6",
76
76
  "openapi-fetch": "^0.12.5",
77
77
  "tiny-invariant": "^1.3.3",
78
- "zod": "^3.24.2",
78
+ "zod": "^3.24.3",
79
79
  "zod-to-json-schema": "^3.24.3",
80
80
  "@arizeai/phoenix-otel": "0.3.0"
81
81
  },
@@ -94,6 +94,7 @@
94
94
  "build": "tsc --build tsconfig.json tsconfig.esm.json && tsc-alias -p tsconfig.esm.json",
95
95
  "postbuild": "echo '{\"type\": \"module\"}' > ./dist/esm/package.json",
96
96
  "type:check": "tsc --noEmit",
97
- "test": "vitest --typecheck"
97
+ "test": "vitest run",
98
+ "test:watch": "vitest watch"
98
99
  }
99
100
  }
@@ -255,7 +255,10 @@ export interface paths {
255
255
  path?: never;
256
256
  cookie?: never;
257
257
  };
258
- /** List experiments by dataset */
258
+ /**
259
+ * List experiments by dataset
260
+ * @description Retrieve a paginated list of experiments for the specified dataset.
261
+ */
259
262
  get: operations["listExperiments"];
260
263
  put?: never;
261
264
  /** Create experiment on a dataset */
@@ -277,6 +280,39 @@ export interface paths {
277
280
  get: operations["getExperiment"];
278
281
  put?: never;
279
282
  post?: never;
283
+ /** Delete experiment by ID */
284
+ delete: operations["deleteExperiment"];
285
+ options?: never;
286
+ head?: never;
287
+ patch?: never;
288
+ trace?: never;
289
+ };
290
+ "/v1/experiments/{experiment_id}/incomplete-runs": {
291
+ parameters: {
292
+ query?: never;
293
+ header?: never;
294
+ path?: never;
295
+ cookie?: never;
296
+ };
297
+ /**
298
+ * Get incomplete runs for an experiment
299
+ * @description Get runs that need to be completed for this experiment.
300
+ *
301
+ * Returns all incomplete runs, including both missing runs (not yet attempted)
302
+ * and failed runs (attempted but have errors).
303
+ *
304
+ * Args:
305
+ * experiment_id: The ID of the experiment
306
+ * cursor: Cursor for pagination
307
+ * limit: Maximum number of results to return
308
+ *
309
+ * Returns:
310
+ * Paginated list of incomplete runs grouped by dataset example,
311
+ * with repetition numbers that need to be run
312
+ */
313
+ get: operations["getIncompleteExperimentRuns"];
314
+ put?: never;
315
+ post?: never;
280
316
  delete?: never;
281
317
  options?: never;
282
318
  head?: never;
@@ -338,6 +374,39 @@ export interface paths {
338
374
  patch?: never;
339
375
  trace?: never;
340
376
  };
377
+ "/v1/experiments/{experiment_id}/incomplete-evaluations": {
378
+ parameters: {
379
+ query?: never;
380
+ header?: never;
381
+ path?: never;
382
+ cookie?: never;
383
+ };
384
+ /**
385
+ * Get incomplete evaluations for an experiment
386
+ * @description Get experiment runs that have incomplete evaluations.
387
+ *
388
+ * Returns runs with:
389
+ * - Missing evaluations (evaluator has not been run)
390
+ * - Failed evaluations (evaluator ran but has errors)
391
+ *
392
+ * Args:
393
+ * experiment_id: The ID of the experiment
394
+ * evaluation_name: List of evaluation names to check (required, at least one)
395
+ * cursor: Cursor for pagination
396
+ * limit: Maximum number of results to return
397
+ *
398
+ * Returns:
399
+ * Paginated list of runs with incomplete evaluations
400
+ */
401
+ get: operations["getIncompleteExperimentEvaluations"];
402
+ put?: never;
403
+ post?: never;
404
+ delete?: never;
405
+ options?: never;
406
+ head?: never;
407
+ patch?: never;
408
+ trace?: never;
409
+ };
341
410
  "/v1/experiment_evaluations": {
342
411
  parameters: {
343
412
  query?: never;
@@ -1199,6 +1268,26 @@ export interface components {
1199
1268
  * @description The last update timestamp of the experiment
1200
1269
  */
1201
1270
  updated_at: string;
1271
+ /**
1272
+ * Example Count
1273
+ * @description Number of examples in the experiment
1274
+ */
1275
+ example_count: number;
1276
+ /**
1277
+ * Successful Run Count
1278
+ * @description Number of successful runs in the experiment
1279
+ */
1280
+ successful_run_count: number;
1281
+ /**
1282
+ * Failed Run Count
1283
+ * @description Number of failed runs in the experiment
1284
+ */
1285
+ failed_run_count: number;
1286
+ /**
1287
+ * Missing Run Count
1288
+ * @description Number of missing (not yet executed) runs in the experiment
1289
+ */
1290
+ missing_run_count: number;
1202
1291
  };
1203
1292
  /** ExperimentEvaluationResult */
1204
1293
  ExperimentEvaluationResult: {
@@ -1218,8 +1307,8 @@ export interface components {
1218
1307
  */
1219
1308
  explanation?: string | null;
1220
1309
  };
1221
- /** ExperimentRunResponse */
1222
- ExperimentRunResponse: {
1310
+ /** ExperimentRun */
1311
+ ExperimentRun: {
1223
1312
  /**
1224
1313
  * Dataset Example Id
1225
1314
  * @description The ID of the dataset example used in the experiment run
@@ -1314,6 +1403,20 @@ export interface components {
1314
1403
  GetExperimentResponseBody: {
1315
1404
  data: components["schemas"]["Experiment"];
1316
1405
  };
1406
+ /** GetIncompleteEvaluationsResponseBody */
1407
+ GetIncompleteEvaluationsResponseBody: {
1408
+ /** Data */
1409
+ data: components["schemas"]["IncompleteExperimentEvaluation"][];
1410
+ /** Next Cursor */
1411
+ next_cursor: string | null;
1412
+ };
1413
+ /** GetIncompleteExperimentRunsResponseBody */
1414
+ GetIncompleteExperimentRunsResponseBody: {
1415
+ /** Data */
1416
+ data: components["schemas"]["IncompleteExperimentRun"][];
1417
+ /** Next Cursor */
1418
+ next_cursor: string | null;
1419
+ };
1317
1420
  /** GetProjectResponseBody */
1318
1421
  GetProjectResponseBody: {
1319
1422
  data: components["schemas"]["Project"];
@@ -1364,6 +1467,34 @@ export interface components {
1364
1467
  };
1365
1468
  /** Identifier */
1366
1469
  Identifier: string;
1470
+ /**
1471
+ * IncompleteExperimentEvaluation
1472
+ * @description Information about an experiment run with incomplete evaluations
1473
+ */
1474
+ IncompleteExperimentEvaluation: {
1475
+ /** @description The experiment run */
1476
+ experiment_run: components["schemas"]["ExperimentRun"];
1477
+ /** @description The dataset example */
1478
+ dataset_example: components["schemas"]["DatasetExample"];
1479
+ /**
1480
+ * Evaluation Names
1481
+ * @description List of evaluation names that are incomplete (either missing or failed)
1482
+ */
1483
+ evaluation_names: string[];
1484
+ };
1485
+ /**
1486
+ * IncompleteExperimentRun
1487
+ * @description Information about incomplete runs for a dataset example
1488
+ */
1489
+ IncompleteExperimentRun: {
1490
+ /** @description The dataset example */
1491
+ dataset_example: components["schemas"]["DatasetExample"];
1492
+ /**
1493
+ * Repetition Numbers
1494
+ * @description List of repetition numbers that need to be run
1495
+ */
1496
+ repetition_numbers: number[];
1497
+ };
1367
1498
  /** InsertedSessionAnnotation */
1368
1499
  InsertedSessionAnnotation: {
1369
1500
  /**
@@ -1428,7 +1559,7 @@ export interface components {
1428
1559
  /** ListExperimentRunsResponseBody */
1429
1560
  ListExperimentRunsResponseBody: {
1430
1561
  /** Data */
1431
- data: components["schemas"]["ExperimentRunResponse"][];
1562
+ data: components["schemas"]["ExperimentRun"][];
1432
1563
  /** Next Cursor */
1433
1564
  next_cursor: string | null;
1434
1565
  };
@@ -1436,6 +1567,8 @@ export interface components {
1436
1567
  ListExperimentsResponseBody: {
1437
1568
  /** Data */
1438
1569
  data: components["schemas"]["Experiment"][];
1570
+ /** Next Cursor */
1571
+ next_cursor: string | null;
1439
1572
  };
1440
1573
  /** LocalUser */
1441
1574
  LocalUser: {
@@ -1774,6 +1907,10 @@ export interface components {
1774
1907
  description?: string | null;
1775
1908
  /** Source Prompt Id */
1776
1909
  source_prompt_id?: string | null;
1910
+ /** Metadata */
1911
+ metadata?: {
1912
+ [key: string]: unknown;
1913
+ } | null;
1777
1914
  /** Id */
1778
1915
  id: string;
1779
1916
  };
@@ -1883,6 +2020,10 @@ export interface components {
1883
2020
  description?: string | null;
1884
2021
  /** Source Prompt Id */
1885
2022
  source_prompt_id?: string | null;
2023
+ /** Metadata */
2024
+ metadata?: {
2025
+ [key: string]: unknown;
2026
+ } | null;
1886
2027
  };
1887
2028
  /** PromptDeepSeekInvocationParameters */
1888
2029
  PromptDeepSeekInvocationParameters: {
@@ -3628,7 +3769,12 @@ export interface operations {
3628
3769
  };
3629
3770
  listExperiments: {
3630
3771
  parameters: {
3631
- query?: never;
3772
+ query?: {
3773
+ /** @description Cursor for pagination (base64-encoded experiment ID) */
3774
+ cursor?: string | null;
3775
+ /** @description The max number of experiments to return at a time. */
3776
+ limit?: number;
3777
+ };
3632
3778
  header?: never;
3633
3779
  path: {
3634
3780
  dataset_id: string;
@@ -3637,7 +3783,7 @@ export interface operations {
3637
3783
  };
3638
3784
  requestBody?: never;
3639
3785
  responses: {
3640
- /** @description Experiments retrieved successfully */
3786
+ /** @description Paginated list of experiments for the dataset */
3641
3787
  200: {
3642
3788
  headers: {
3643
3789
  [name: string]: unknown;
@@ -3655,13 +3801,13 @@ export interface operations {
3655
3801
  "text/plain": string;
3656
3802
  };
3657
3803
  };
3658
- /** @description Validation Error */
3804
+ /** @description Unprocessable Entity */
3659
3805
  422: {
3660
3806
  headers: {
3661
3807
  [name: string]: unknown;
3662
3808
  };
3663
3809
  content: {
3664
- "application/json": components["schemas"]["HTTPValidationError"];
3810
+ "text/plain": string;
3665
3811
  };
3666
3812
  };
3667
3813
  };
@@ -3768,6 +3914,107 @@ export interface operations {
3768
3914
  };
3769
3915
  };
3770
3916
  };
3917
+ deleteExperiment: {
3918
+ parameters: {
3919
+ query?: never;
3920
+ header?: never;
3921
+ path: {
3922
+ experiment_id: string;
3923
+ };
3924
+ cookie?: never;
3925
+ };
3926
+ requestBody?: never;
3927
+ responses: {
3928
+ /** @description Experiment deleted successfully */
3929
+ 204: {
3930
+ headers: {
3931
+ [name: string]: unknown;
3932
+ };
3933
+ content?: never;
3934
+ };
3935
+ /** @description Forbidden */
3936
+ 403: {
3937
+ headers: {
3938
+ [name: string]: unknown;
3939
+ };
3940
+ content: {
3941
+ "text/plain": string;
3942
+ };
3943
+ };
3944
+ /** @description Experiment not found */
3945
+ 404: {
3946
+ headers: {
3947
+ [name: string]: unknown;
3948
+ };
3949
+ content: {
3950
+ "text/plain": string;
3951
+ };
3952
+ };
3953
+ /** @description Validation Error */
3954
+ 422: {
3955
+ headers: {
3956
+ [name: string]: unknown;
3957
+ };
3958
+ content: {
3959
+ "application/json": components["schemas"]["HTTPValidationError"];
3960
+ };
3961
+ };
3962
+ };
3963
+ };
3964
+ getIncompleteExperimentRuns: {
3965
+ parameters: {
3966
+ query?: {
3967
+ /** @description Cursor for pagination */
3968
+ cursor?: string | null;
3969
+ /** @description Maximum number of examples with incomplete runs to return */
3970
+ limit?: number;
3971
+ };
3972
+ header?: never;
3973
+ path: {
3974
+ experiment_id: string;
3975
+ };
3976
+ cookie?: never;
3977
+ };
3978
+ requestBody?: never;
3979
+ responses: {
3980
+ /** @description Incomplete runs retrieved successfully */
3981
+ 200: {
3982
+ headers: {
3983
+ [name: string]: unknown;
3984
+ };
3985
+ content: {
3986
+ "application/json": components["schemas"]["GetIncompleteExperimentRunsResponseBody"];
3987
+ };
3988
+ };
3989
+ /** @description Forbidden */
3990
+ 403: {
3991
+ headers: {
3992
+ [name: string]: unknown;
3993
+ };
3994
+ content: {
3995
+ "text/plain": string;
3996
+ };
3997
+ };
3998
+ /** @description Experiment not found */
3999
+ 404: {
4000
+ headers: {
4001
+ [name: string]: unknown;
4002
+ };
4003
+ content: {
4004
+ "text/plain": string;
4005
+ };
4006
+ };
4007
+ /** @description Invalid cursor format */
4008
+ 422: {
4009
+ headers: {
4010
+ [name: string]: unknown;
4011
+ };
4012
+ content: {
4013
+ "text/plain": string;
4014
+ };
4015
+ };
4016
+ };
4017
+ };
3771
4018
  getExperimentJSON: {
3772
4019
  parameters: {
3773
4020
  query?: never;
@@ -3954,7 +4201,7 @@ export interface operations {
3954
4201
  "text/plain": string;
3955
4202
  };
3956
4203
  };
3957
- /** @description This experiment run has already been submitted */
4204
+ /** @description Experiment run already exists with a successful result and cannot be updated */
3958
4205
  409: {
3959
4206
  headers: {
3960
4207
  [name: string]: unknown;
@@ -3974,6 +4221,71 @@ export interface operations {
3974
4221
  };
3975
4222
  };
3976
4223
  };
4224
+ getIncompleteExperimentEvaluations: {
4225
+ parameters: {
4226
+ query?: {
4227
+ /** @description Evaluation names to check */
4228
+ evaluation_name?: string[];
4229
+ /** @description Cursor for pagination */
4230
+ cursor?: string | null;
4231
+ /** @description Maximum number of runs with incomplete evaluations to return */
4232
+ limit?: number;
4233
+ };
4234
+ header?: never;
4235
+ path: {
4236
+ experiment_id: string;
4237
+ };
4238
+ cookie?: never;
4239
+ };
4240
+ requestBody?: never;
4241
+ responses: {
4242
+ /** @description Incomplete evaluations retrieved successfully */
4243
+ 200: {
4244
+ headers: {
4245
+ [name: string]: unknown;
4246
+ };
4247
+ content: {
4248
+ "application/json": components["schemas"]["GetIncompleteEvaluationsResponseBody"];
4249
+ };
4250
+ };
4251
+ /** @description No evaluator names provided */
4252
+ 400: {
4253
+ headers: {
4254
+ [name: string]: unknown;
4255
+ };
4256
+ content: {
4257
+ "text/plain": string;
4258
+ };
4259
+ };
4260
+ /** @description Forbidden */
4261
+ 403: {
4262
+ headers: {
4263
+ [name: string]: unknown;
4264
+ };
4265
+ content: {
4266
+ "text/plain": string;
4267
+ };
4268
+ };
4269
+ /** @description Experiment not found */
4270
+ 404: {
4271
+ headers: {
4272
+ [name: string]: unknown;
4273
+ };
4274
+ content: {
4275
+ "text/plain": string;
4276
+ };
4277
+ };
4278
+ /** @description Invalid cursor format */
4279
+ 422: {
4280
+ headers: {
4281
+ [name: string]: unknown;
4282
+ };
4283
+ content: {
4284
+ "text/plain": string;
4285
+ };
4286
+ };
4287
+ };
4288
+ };
3977
4289
  upsertExperimentEvaluation: {
3978
4290
  parameters: {
3979
4291
  query?: never;
@@ -0,0 +1,90 @@
1
+ import { createClient } from "../client";
2
+ import { ClientFn } from "../types/core";
3
+ import { ExperimentInfo } from "../types/experiments";
4
+
5
+ import invariant from "tiny-invariant";
6
+
7
+ export type CreateExperimentParams = ClientFn & {
8
+ /**
9
+ * The dataset ID to create the experiment for
10
+ */
11
+ datasetId: string;
12
+ /**
13
+ * The dataset version ID (if omitted, the latest version will be used)
14
+ */
15
+ datasetVersionId?: string;
16
+ /**
17
+ * The name of the experiment (if omitted, a random name will be generated)
18
+ */
19
+ experimentName?: string;
20
+ /**
21
+ * An optional description of the experiment
22
+ */
23
+ experimentDescription?: string;
24
+ /**
25
+ * Metadata for the experiment
26
+ */
27
+ experimentMetadata?: Record<string, unknown>;
28
+ /**
29
+ * List of dataset split identifiers (GlobalIDs or names) to filter by
30
+ */
31
+ splits?: readonly string[];
32
+ /**
33
+ * Number of times the experiment should be repeated for each example
34
+ * @default 1
35
+ */
36
+ repetitions?: number;
37
+ };
38
+
39
+ /**
40
+ * Create a new experiment without running it.
41
+ * This creates an experiment record that can later be executed using resumeExperiment.
42
+ */
43
+ export async function createExperiment({
44
+ client: _client,
45
+ datasetId,
46
+ datasetVersionId,
47
+ experimentName,
48
+ experimentDescription,
49
+ experimentMetadata = {},
50
+ splits,
51
+ repetitions = 1,
52
+ }: CreateExperimentParams): Promise<ExperimentInfo> {
53
+ const client = _client || createClient();
54
+
55
+ const experimentResponse = await client
56
+ .POST("/v1/datasets/{dataset_id}/experiments", {
57
+ params: {
58
+ path: {
59
+ dataset_id: datasetId,
60
+ },
61
+ },
62
+ body: {
63
+ name: experimentName,
64
+ description: experimentDescription,
65
+ metadata: experimentMetadata,
66
+ repetitions,
67
+ ...(datasetVersionId ? { version_id: datasetVersionId } : {}),
68
+ ...(splits ? { splits: [...splits] } : {}),
69
+ },
70
+ })
71
+ .then((res) => res.data?.data);
72
+
73
+ invariant(experimentResponse, `Failed to create experiment`);
74
+
75
+ return {
76
+ id: experimentResponse.id,
77
+ datasetId: experimentResponse.dataset_id,
78
+ datasetVersionId: experimentResponse.dataset_version_id,
79
+ datasetSplits: splits ? [...splits] : [],
80
+ repetitions: experimentResponse.repetitions,
81
+ metadata: experimentResponse.metadata || {},
82
+ projectName: experimentResponse.project_name ?? null,
83
+ createdAt: experimentResponse.created_at,
84
+ updatedAt: experimentResponse.updated_at,
85
+ exampleCount: experimentResponse.example_count,
86
+ successfulRunCount: experimentResponse.successful_run_count,
87
+ failedRunCount: experimentResponse.failed_run_count,
88
+ missingRunCount: experimentResponse.missing_run_count,
89
+ };
90
+ }
@@ -0,0 +1,67 @@
1
+ import { createClient } from "../client";
2
+ import { ClientFn } from "../types/core";
3
+ import { ensureString } from "../utils/ensureString";
4
+
5
+ /**
6
+ * Parameters to delete an experiment
7
+ */
8
+ export interface DeleteExperimentParams extends ClientFn {
9
+ /**
10
+ * The ID of the experiment to delete
11
+ */
12
+ experimentId: string;
13
+ }
14
+
15
+ /**
16
+ * Delete an experiment by ID.
17
+ *
18
+ * **Important**: This operation permanently deletes the experiment and all its associated
19
+ * runs, evaluations, and annotations.
20
+ *
21
+ * Behavior:
22
+ * - Deletes the experiment and all its data
23
+ * - Returns successfully if experiment is found and deleted
24
+ * - Throws error if experiment is not found (404) or other errors occur
25
+ *
26
+ * @param params - The parameters to delete an experiment
27
+ * @returns Promise that resolves when the experiment is successfully deleted
28
+ * @throws Error if the experiment is not found or deletion fails
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * import { deleteExperiment } from "@arizeai/phoenix-client/experiments";
33
+ *
34
+ * await deleteExperiment({
35
+ * experimentId: "exp_123",
36
+ * });
37
+ * ```
38
+ */
39
+ export async function deleteExperiment({
40
+ client: _client,
41
+ experimentId,
42
+ }: DeleteExperimentParams): Promise<void> {
43
+ const client = _client ?? createClient();
44
+
45
+ const { error } = await client.DELETE("/v1/experiments/{experiment_id}", {
46
+ params: {
47
+ path: {
48
+ experiment_id: experimentId,
49
+ },
50
+ },
51
+ });
52
+
53
+ if (error) {
54
+ const isNotFound =
55
+ typeof error === "object" &&
56
+ error !== null &&
57
+ "status" in error &&
58
+ error.status === 404;
59
+ if (isNotFound) {
60
+ throw new Error(`Experiment not found: ${experimentId}`);
61
+ }
62
+
63
+ // Extract meaningful error information
64
+ const errorMessage = ensureString(error);
65
+ throw new Error(`Failed to delete experiment: ${errorMessage}`);
66
+ }
67
+ }
@@ -32,7 +32,14 @@ export async function getExperimentInfo({
32
32
  id: experimentData.id,
33
33
  datasetId: experimentData.dataset_id,
34
34
  datasetVersionId: experimentData.dataset_version_id,
35
- projectName: experimentData.project_name || "", // This will never happen
36
- metadata: experimentData.metadata,
35
+ repetitions: experimentData.repetitions,
36
+ metadata: experimentData.metadata || {},
37
+ projectName: experimentData.project_name || null,
38
+ createdAt: experimentData.created_at,
39
+ updatedAt: experimentData.updated_at,
40
+ exampleCount: experimentData.example_count,
41
+ successfulRunCount: experimentData.successful_run_count,
42
+ failedRunCount: experimentData.failed_run_count,
43
+ missingRunCount: experimentData.missing_run_count,
37
44
  };
38
45
  }
@@ -0,0 +1,29 @@
1
+ import { AnnotatorKind } from "../../types/annotations";
2
+ import { Evaluator } from "../../types/experiments";
3
+
4
+ /**
5
+ * Wrap an evaluator function in an object with a name property.
6
+ *
7
+ * @experimental This feature is not complete, and will change in the future.
8
+ *
9
+ * @param params - The parameters for creating the evaluator
10
+ * @param params.name - The name of the evaluator.
11
+ * @param params.kind - The kind of evaluator (e.g., "CODE", "LLM")
12
+ * @param params.evaluate - The evaluator function.
13
+ * @returns The evaluator object.
14
+ */
15
+ export function asExperimentEvaluator({
16
+ name,
17
+ kind,
18
+ evaluate,
19
+ }: {
20
+ name: string;
21
+ kind: AnnotatorKind;
22
+ evaluate: Evaluator["evaluate"];
23
+ }): Evaluator {
24
+ return {
25
+ name,
26
+ kind,
27
+ evaluate,
28
+ };
29
+ }