@arizeai/phoenix-client 6.10.0 → 6.11.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 (244) hide show
  1. package/README.md +62 -0
  2. package/dist/esm/__generated__/api/v1.d.ts +452 -28
  3. package/dist/esm/__generated__/api/v1.d.ts.map +1 -1
  4. package/dist/esm/experiments/helpers/getExampleGlobalId.d.ts +8 -0
  5. package/dist/esm/experiments/helpers/getExampleGlobalId.d.ts.map +1 -0
  6. package/dist/esm/experiments/helpers/getExampleGlobalId.js +9 -0
  7. package/dist/esm/experiments/helpers/getExampleGlobalId.js.map +1 -0
  8. package/dist/esm/experiments/resumeEvaluation.d.ts.map +1 -1
  9. package/dist/esm/experiments/resumeEvaluation.js +2 -1
  10. package/dist/esm/experiments/resumeEvaluation.js.map +1 -1
  11. package/dist/esm/experiments/resumeExperiment.d.ts.map +1 -1
  12. package/dist/esm/experiments/resumeExperiment.js +3 -2
  13. package/dist/esm/experiments/resumeExperiment.js.map +1 -1
  14. package/dist/esm/experiments/runExperiment.d.ts.map +1 -1
  15. package/dist/esm/experiments/runExperiment.js +6 -3
  16. package/dist/esm/experiments/runExperiment.js.map +1 -1
  17. package/dist/esm/jest/index.d.ts +5 -0
  18. package/dist/esm/jest/index.d.ts.map +1 -0
  19. package/dist/esm/jest/index.js +49 -0
  20. package/dist/esm/jest/index.js.map +1 -0
  21. package/dist/esm/jest/reporter.d.ts +13 -0
  22. package/dist/esm/jest/reporter.d.ts.map +1 -0
  23. package/dist/esm/jest/reporter.js +19 -0
  24. package/dist/esm/jest/reporter.js.map +1 -0
  25. package/dist/esm/prompts/sdks/toAI.d.ts +2 -2
  26. package/dist/esm/prompts/sdks/toAI.d.ts.map +1 -1
  27. package/dist/esm/prompts/sdks/toAI.js.map +1 -1
  28. package/dist/esm/prompts/sdks/toAnthropic.d.ts +2 -2
  29. package/dist/esm/prompts/sdks/toAnthropic.d.ts.map +1 -1
  30. package/dist/esm/prompts/sdks/toAnthropic.js.map +1 -1
  31. package/dist/esm/prompts/sdks/toOpenAI.d.ts +2 -2
  32. package/dist/esm/prompts/sdks/toOpenAI.d.ts.map +1 -1
  33. package/dist/esm/prompts/sdks/toOpenAI.js.map +1 -1
  34. package/dist/esm/prompts/sdks/toSDK.d.ts +8 -8
  35. package/dist/esm/prompts/sdks/toSDK.d.ts.map +1 -1
  36. package/dist/esm/prompts/sdks/toSDK.js.map +1 -1
  37. package/dist/esm/prompts/sdks/types.d.ts +2 -2
  38. package/dist/esm/prompts/sdks/types.d.ts.map +1 -1
  39. package/dist/esm/schemas/llm/anthropic/converters.d.ts +8 -8
  40. package/dist/esm/schemas/llm/anthropic/messagePartSchemas.d.ts +4 -4
  41. package/dist/esm/schemas/llm/anthropic/messageSchemas.d.ts +6 -6
  42. package/dist/esm/schemas/llm/constants.d.ts +3 -3
  43. package/dist/esm/schemas/llm/converters.d.ts +12 -12
  44. package/dist/esm/schemas/llm/openai/converters.d.ts +3 -3
  45. package/dist/esm/schemas/llm/schemas.d.ts +2 -2
  46. package/dist/esm/testing/acceptance.d.ts +20 -0
  47. package/dist/esm/testing/acceptance.d.ts.map +1 -0
  48. package/dist/esm/testing/acceptance.js +129 -0
  49. package/dist/esm/testing/acceptance.js.map +1 -0
  50. package/dist/esm/testing/define-api.d.ts +157 -0
  51. package/dist/esm/testing/define-api.d.ts.map +1 -0
  52. package/dist/esm/testing/define-api.js +78 -0
  53. package/dist/esm/testing/define-api.js.map +1 -0
  54. package/dist/esm/testing/helpers.d.ts +55 -0
  55. package/dist/esm/testing/helpers.d.ts.map +1 -0
  56. package/dist/esm/testing/helpers.js +179 -0
  57. package/dist/esm/testing/helpers.js.map +1 -0
  58. package/dist/esm/testing/phoenix-test-tracking.d.ts +68 -0
  59. package/dist/esm/testing/phoenix-test-tracking.d.ts.map +1 -0
  60. package/dist/esm/testing/phoenix-test-tracking.js +521 -0
  61. package/dist/esm/testing/phoenix-test-tracking.js.map +1 -0
  62. package/dist/esm/testing/report-artifacts.d.ts +45 -0
  63. package/dist/esm/testing/report-artifacts.d.ts.map +1 -0
  64. package/dist/esm/testing/report-artifacts.js +218 -0
  65. package/dist/esm/testing/report-artifacts.js.map +1 -0
  66. package/dist/esm/testing/report-run.d.ts +22 -0
  67. package/dist/esm/testing/report-run.d.ts.map +1 -0
  68. package/dist/esm/testing/report-run.js +41 -0
  69. package/dist/esm/testing/report-run.js.map +1 -0
  70. package/dist/esm/testing/reporter-format.d.ts +83 -0
  71. package/dist/esm/testing/reporter-format.d.ts.map +1 -0
  72. package/dist/esm/testing/reporter-format.js +852 -0
  73. package/dist/esm/testing/reporter-format.js.map +1 -0
  74. package/dist/esm/testing/runner.d.ts +31 -0
  75. package/dist/esm/testing/runner.d.ts.map +1 -0
  76. package/dist/esm/testing/runner.js +238 -0
  77. package/dist/esm/testing/runner.js.map +1 -0
  78. package/dist/esm/testing/state.d.ts +138 -0
  79. package/dist/esm/testing/state.d.ts.map +1 -0
  80. package/dist/esm/testing/state.js +31 -0
  81. package/dist/esm/testing/state.js.map +1 -0
  82. package/dist/esm/testing/types.d.ts +319 -0
  83. package/dist/esm/testing/types.d.ts.map +1 -0
  84. package/dist/esm/testing/types.js +9 -0
  85. package/dist/esm/testing/types.js.map +1 -0
  86. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  87. package/dist/esm/utils/channel.d.ts +7 -7
  88. package/dist/esm/utils/channel.d.ts.map +1 -1
  89. package/dist/esm/utils/channel.js +1 -1
  90. package/dist/esm/utils/channel.js.map +1 -1
  91. package/dist/esm/utils/formatPromptMessages.d.ts.map +1 -1
  92. package/dist/esm/utils/getPromptBySelector.d.ts.map +1 -1
  93. package/dist/esm/utils/promisifyResult.d.ts +1 -1
  94. package/dist/esm/utils/promisifyResult.d.ts.map +1 -1
  95. package/dist/esm/utils/promisifyResult.js.map +1 -1
  96. package/dist/esm/utils/schemaMatches.d.ts +5 -5
  97. package/dist/esm/utils/schemaMatches.d.ts.map +1 -1
  98. package/dist/esm/utils/schemaMatches.js.map +1 -1
  99. package/dist/esm/vitest/index.d.ts +5 -0
  100. package/dist/esm/vitest/index.d.ts.map +1 -0
  101. package/dist/esm/vitest/index.js +15 -0
  102. package/dist/esm/vitest/index.js.map +1 -0
  103. package/dist/esm/vitest/reporter.d.ts +19 -0
  104. package/dist/esm/vitest/reporter.d.ts.map +1 -0
  105. package/dist/esm/vitest/reporter.js +27 -0
  106. package/dist/esm/vitest/reporter.js.map +1 -0
  107. package/dist/src/__generated__/api/v1.d.ts +452 -28
  108. package/dist/src/__generated__/api/v1.d.ts.map +1 -1
  109. package/dist/src/experiments/helpers/getExampleGlobalId.d.ts +8 -0
  110. package/dist/src/experiments/helpers/getExampleGlobalId.d.ts.map +1 -0
  111. package/dist/src/experiments/helpers/getExampleGlobalId.js +13 -0
  112. package/dist/src/experiments/helpers/getExampleGlobalId.js.map +1 -0
  113. package/dist/src/experiments/resumeEvaluation.d.ts.map +1 -1
  114. package/dist/src/experiments/resumeEvaluation.js +2 -1
  115. package/dist/src/experiments/resumeEvaluation.js.map +1 -1
  116. package/dist/src/experiments/resumeExperiment.d.ts.map +1 -1
  117. package/dist/src/experiments/resumeExperiment.js +3 -2
  118. package/dist/src/experiments/resumeExperiment.js.map +1 -1
  119. package/dist/src/experiments/runExperiment.d.ts.map +1 -1
  120. package/dist/src/experiments/runExperiment.js +6 -3
  121. package/dist/src/experiments/runExperiment.js.map +1 -1
  122. package/dist/src/jest/index.d.ts +5 -0
  123. package/dist/src/jest/index.d.ts.map +1 -0
  124. package/dist/src/jest/index.js +58 -0
  125. package/dist/src/jest/index.js.map +1 -0
  126. package/dist/src/jest/reporter.d.ts +13 -0
  127. package/dist/src/jest/reporter.d.ts.map +1 -0
  128. package/dist/src/jest/reporter.js +23 -0
  129. package/dist/src/jest/reporter.js.map +1 -0
  130. package/dist/src/prompts/sdks/toAI.d.ts +2 -2
  131. package/dist/src/prompts/sdks/toAI.d.ts.map +1 -1
  132. package/dist/src/prompts/sdks/toAI.js.map +1 -1
  133. package/dist/src/prompts/sdks/toAnthropic.d.ts +2 -2
  134. package/dist/src/prompts/sdks/toAnthropic.d.ts.map +1 -1
  135. package/dist/src/prompts/sdks/toAnthropic.js.map +1 -1
  136. package/dist/src/prompts/sdks/toOpenAI.d.ts +2 -2
  137. package/dist/src/prompts/sdks/toOpenAI.d.ts.map +1 -1
  138. package/dist/src/prompts/sdks/toOpenAI.js.map +1 -1
  139. package/dist/src/prompts/sdks/toSDK.d.ts +8 -8
  140. package/dist/src/prompts/sdks/toSDK.d.ts.map +1 -1
  141. package/dist/src/prompts/sdks/toSDK.js.map +1 -1
  142. package/dist/src/prompts/sdks/types.d.ts +2 -2
  143. package/dist/src/prompts/sdks/types.d.ts.map +1 -1
  144. package/dist/src/schemas/llm/anthropic/converters.d.ts +8 -8
  145. package/dist/src/schemas/llm/anthropic/messagePartSchemas.d.ts +4 -4
  146. package/dist/src/schemas/llm/anthropic/messageSchemas.d.ts +6 -6
  147. package/dist/src/schemas/llm/constants.d.ts +3 -3
  148. package/dist/src/schemas/llm/converters.d.ts +12 -12
  149. package/dist/src/schemas/llm/openai/converters.d.ts +3 -3
  150. package/dist/src/schemas/llm/schemas.d.ts +2 -2
  151. package/dist/src/testing/acceptance.d.ts +20 -0
  152. package/dist/src/testing/acceptance.d.ts.map +1 -0
  153. package/dist/src/testing/acceptance.js +114 -0
  154. package/dist/src/testing/acceptance.js.map +1 -0
  155. package/dist/src/testing/define-api.d.ts +157 -0
  156. package/dist/src/testing/define-api.d.ts.map +1 -0
  157. package/dist/src/testing/define-api.js +81 -0
  158. package/dist/src/testing/define-api.js.map +1 -0
  159. package/dist/src/testing/helpers.d.ts +55 -0
  160. package/dist/src/testing/helpers.d.ts.map +1 -0
  161. package/dist/src/testing/helpers.js +182 -0
  162. package/dist/src/testing/helpers.js.map +1 -0
  163. package/dist/src/testing/phoenix-test-tracking.d.ts +68 -0
  164. package/dist/src/testing/phoenix-test-tracking.d.ts.map +1 -0
  165. package/dist/src/testing/phoenix-test-tracking.js +530 -0
  166. package/dist/src/testing/phoenix-test-tracking.js.map +1 -0
  167. package/dist/src/testing/report-artifacts.d.ts +45 -0
  168. package/dist/src/testing/report-artifacts.d.ts.map +1 -0
  169. package/dist/src/testing/report-artifacts.js +225 -0
  170. package/dist/src/testing/report-artifacts.js.map +1 -0
  171. package/dist/src/testing/report-run.d.ts +22 -0
  172. package/dist/src/testing/report-run.d.ts.map +1 -0
  173. package/dist/src/testing/report-run.js +47 -0
  174. package/dist/src/testing/report-run.js.map +1 -0
  175. package/dist/src/testing/reporter-format.d.ts +83 -0
  176. package/dist/src/testing/reporter-format.d.ts.map +1 -0
  177. package/dist/src/testing/reporter-format.js +870 -0
  178. package/dist/src/testing/reporter-format.js.map +1 -0
  179. package/dist/src/testing/runner.d.ts +31 -0
  180. package/dist/src/testing/runner.d.ts.map +1 -0
  181. package/dist/src/testing/runner.js +258 -0
  182. package/dist/src/testing/runner.js.map +1 -0
  183. package/dist/src/testing/state.d.ts +138 -0
  184. package/dist/src/testing/state.d.ts.map +1 -0
  185. package/dist/src/testing/state.js +38 -0
  186. package/dist/src/testing/state.js.map +1 -0
  187. package/dist/src/testing/types.d.ts +319 -0
  188. package/dist/src/testing/types.d.ts.map +1 -0
  189. package/dist/src/testing/types.js +13 -0
  190. package/dist/src/testing/types.js.map +1 -0
  191. package/dist/src/utils/channel.d.ts +7 -7
  192. package/dist/src/utils/channel.d.ts.map +1 -1
  193. package/dist/src/utils/channel.js +1 -1
  194. package/dist/src/utils/channel.js.map +1 -1
  195. package/dist/src/utils/formatPromptMessages.d.ts.map +1 -1
  196. package/dist/src/utils/getPromptBySelector.d.ts.map +1 -1
  197. package/dist/src/utils/promisifyResult.d.ts +1 -1
  198. package/dist/src/utils/promisifyResult.d.ts.map +1 -1
  199. package/dist/src/utils/promisifyResult.js.map +1 -1
  200. package/dist/src/utils/schemaMatches.d.ts +5 -5
  201. package/dist/src/utils/schemaMatches.d.ts.map +1 -1
  202. package/dist/src/utils/schemaMatches.js.map +1 -1
  203. package/dist/src/vitest/index.d.ts +5 -0
  204. package/dist/src/vitest/index.d.ts.map +1 -0
  205. package/dist/src/vitest/index.js +23 -0
  206. package/dist/src/vitest/index.js.map +1 -0
  207. package/dist/src/vitest/reporter.d.ts +19 -0
  208. package/dist/src/vitest/reporter.d.ts.map +1 -0
  209. package/dist/src/vitest/reporter.js +34 -0
  210. package/dist/src/vitest/reporter.js.map +1 -0
  211. package/dist/tsconfig.tsbuildinfo +1 -1
  212. package/docs/ci-evals-annotations.mdx +190 -0
  213. package/docs/ci-evals-jest.mdx +78 -0
  214. package/docs/ci-evals-vitest.mdx +240 -0
  215. package/docs/ci-evals.mdx +263 -0
  216. package/docs/overview.mdx +9 -1
  217. package/package.json +49 -17
  218. package/src/__generated__/api/v1.ts +452 -28
  219. package/src/experiments/helpers/getExampleGlobalId.ts +12 -0
  220. package/src/experiments/resumeEvaluation.ts +2 -1
  221. package/src/experiments/resumeExperiment.ts +3 -2
  222. package/src/experiments/runExperiment.ts +6 -3
  223. package/src/jest/index.ts +124 -0
  224. package/src/jest/reporter.ts +22 -0
  225. package/src/prompts/sdks/toAI.ts +4 -3
  226. package/src/prompts/sdks/toAnthropic.ts +4 -3
  227. package/src/prompts/sdks/toOpenAI.ts +4 -3
  228. package/src/prompts/sdks/toSDK.ts +16 -11
  229. package/src/prompts/sdks/types.ts +2 -2
  230. package/src/testing/acceptance.ts +190 -0
  231. package/src/testing/define-api.ts +279 -0
  232. package/src/testing/helpers.ts +251 -0
  233. package/src/testing/phoenix-test-tracking.ts +637 -0
  234. package/src/testing/report-artifacts.ts +272 -0
  235. package/src/testing/report-run.ts +44 -0
  236. package/src/testing/reporter-format.ts +1072 -0
  237. package/src/testing/runner.ts +350 -0
  238. package/src/testing/state.ts +165 -0
  239. package/src/testing/types.ts +366 -0
  240. package/src/utils/channel.ts +17 -15
  241. package/src/utils/promisifyResult.ts +6 -4
  242. package/src/utils/schemaMatches.ts +12 -10
  243. package/src/vitest/index.ts +57 -0
  244. package/src/vitest/reporter.ts +32 -0
@@ -0,0 +1,530 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isTrackingEnabled = isTrackingEnabled;
4
+ exports.resolveRepetitions = resolveRepetitions;
5
+ exports.initializeSuite = initializeSuite;
6
+ exports.runTaskWithTracing = runTaskWithTracing;
7
+ exports.endTaskSpanForRun = endTaskSpanForRun;
8
+ exports.postExperimentRun = postExperimentRun;
9
+ exports.postAnnotation = postAnnotation;
10
+ exports.runEvaluatorWithTracing = runEvaluatorWithTracing;
11
+ exports.teardownSuite = teardownSuite;
12
+ const phoenix_otel_1 = require("@arizeai/phoenix-otel");
13
+ const datasets_1 = require("../datasets");
14
+ const tracing_1 = require("../experiments/tracing");
15
+ const index_1 = require("../index");
16
+ const ensureString_1 = require("../utils/ensureString");
17
+ const toObjectHeaders_1 = require("../utils/toObjectHeaders");
18
+ const urlUtils_1 = require("../utils/urlUtils");
19
+ const state_1 = require("./state");
20
+ function isFalsyFlag(value) {
21
+ const v = (value !== null && value !== void 0 ? value : "").toLowerCase();
22
+ return v === "false" || v === "0" || v === "off" || v === "no";
23
+ }
24
+ /**
25
+ * Decide whether tests should sync to Phoenix.
26
+ *
27
+ * Tracing is enabled by default. It can be disabled globally by setting
28
+ * `PHOENIX_TEST_TRACING=false`, or per suite via `SuiteConfig.dryRun`.
29
+ */
30
+ function isTrackingEnabled(suite) {
31
+ if (isFalsyFlag(process.env.PHOENIX_TEST_TRACING)) {
32
+ return { enabled: false, reason: "PHOENIX_TEST_TRACING is disabled" };
33
+ }
34
+ if (suite === null || suite === void 0 ? void 0 : suite.config.dryRun) {
35
+ return { enabled: false, reason: "suite configured dryRun" };
36
+ }
37
+ return { enabled: true };
38
+ }
39
+ /**
40
+ * Resolve the repetition count for a test: per-test value, else suite-level,
41
+ * else the `PHOENIX_TEST_REPETITIONS` env var, else `1`. Non-positive or
42
+ * non-finite values fall back to `1`.
43
+ */
44
+ function resolveRepetitions(perTest, suite) {
45
+ const envValue = Number(process.env.PHOENIX_TEST_REPETITIONS);
46
+ const candidates = [
47
+ perTest,
48
+ suite.config.repetitions,
49
+ Number.isFinite(envValue) ? envValue : undefined,
50
+ ];
51
+ for (const c of candidates) {
52
+ if (typeof c === "number" && Number.isFinite(c) && c >= 1) {
53
+ return Math.floor(c);
54
+ }
55
+ }
56
+ return 1;
57
+ }
58
+ /**
59
+ * Deterministic key for matching dataset examples by content. Uses sorted
60
+ * keys so two inputs that differ only in property order hash the same.
61
+ */
62
+ function stableKey(value) {
63
+ return stableStringify(value);
64
+ }
65
+ function stableStringify(value) {
66
+ if (value === null || typeof value !== "object") {
67
+ return JSON.stringify(value);
68
+ }
69
+ if (Array.isArray(value)) {
70
+ return "[" + value.map(stableStringify).join(",") + "]";
71
+ }
72
+ const keys = Object.keys(value).sort();
73
+ return ("{" +
74
+ keys
75
+ .map((k) => JSON.stringify(k) +
76
+ ":" +
77
+ stableStringify(value[k]))
78
+ .join(",") +
79
+ "}");
80
+ }
81
+ /** TEXT for raw strings, JSON for everything else. */
82
+ function mimeTypeFor(value) {
83
+ return typeof value === "string" ? phoenix_otel_1.MimeType.TEXT : phoenix_otel_1.MimeType.JSON;
84
+ }
85
+ const taskSpansByRun = new WeakMap();
86
+ /**
87
+ * Warn once when `PHOENIX_HOST` is plain `http:` while an `Authorization`
88
+ * header is being forwarded to the OTLP exporter — that combination
89
+ * exfiltrates the bearer token in cleartext.
90
+ */
91
+ let warnedAboutHttpScheme = false;
92
+ function maybeWarnHttpScheme(baseUrl, headers) {
93
+ if (warnedAboutHttpScheme || !baseUrl)
94
+ return;
95
+ let parsed;
96
+ try {
97
+ parsed = new URL(baseUrl);
98
+ }
99
+ catch (_a) {
100
+ return;
101
+ }
102
+ if (parsed.protocol !== "http:")
103
+ return;
104
+ if (parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1")
105
+ return;
106
+ if (!headers)
107
+ return;
108
+ const picked = (0, toObjectHeaders_1.toObjectHeaders)(headers);
109
+ const hasAuth = Object.keys(picked).some((h) => h.toLowerCase() === "authorization");
110
+ if (!hasAuth)
111
+ return;
112
+ warnedAboutHttpScheme = true;
113
+ // eslint-disable-next-line no-console
114
+ console.warn(`[@arizeai/phoenix-client] PHOENIX_HOST="${baseUrl}" uses http:// with ` +
115
+ `an Authorization header set; the bearer token will travel in cleartext. ` +
116
+ `Use https:// for non-localhost Phoenix endpoints.`);
117
+ }
118
+ function buildLinks(client, datasetId, experimentId) {
119
+ const baseUrl = client.config.baseUrl;
120
+ if (!baseUrl)
121
+ return [];
122
+ return [
123
+ { label: "Dataset", url: (0, urlUtils_1.getDatasetUrl)({ baseUrl, datasetId }) },
124
+ {
125
+ label: "Experiments",
126
+ url: (0, urlUtils_1.getDatasetExperimentsUrl)({ baseUrl, datasetId }),
127
+ },
128
+ {
129
+ label: "Experiment",
130
+ url: (0, urlUtils_1.getExperimentUrl)({ baseUrl, datasetId, experimentId }),
131
+ },
132
+ ];
133
+ }
134
+ /**
135
+ * Initialize the suite: upload the dataset, create the experiment, and
136
+ * register the OpenInference tracer.
137
+ *
138
+ * If tracing is disabled (no Phoenix env vars, or PHOENIX_TEST_TRACING=false),
139
+ * this populates a no-op tracer and exits without making any network calls.
140
+ */
141
+ async function initializeSuite(suite) {
142
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
143
+ const tracking = isTrackingEnabled(suite);
144
+ if (!tracking.enabled) {
145
+ suite.trackingDisabled = true;
146
+ suite.trackingDisabledReason = tracking.reason;
147
+ suite.tracer = (0, phoenix_otel_1.createNoOpProvider)().getTracer("no-op");
148
+ suite.evaluatorTracer = suite.tracer;
149
+ return;
150
+ }
151
+ const client = (_a = suite.config.client) !== null && _a !== void 0 ? _a : (0, index_1.createClient)();
152
+ suite.client = client;
153
+ const datasetName = (_b = suite.config.datasetName) !== null && _b !== void 0 ? _b : suite.name;
154
+ const description = (_c = suite.config.description) !== null && _c !== void 0 ? _c : `Phoenix test dataset auto-generated from ${suite.name}`;
155
+ const examples = Array.from(suite.registeredExamples.values()).map((registered) => {
156
+ var _a, _b, _c;
157
+ return ({
158
+ id: (_a = registered.params.id) !== null && _a !== void 0 ? _a : null,
159
+ input: registered.params.input,
160
+ output: (_b = registered.params.expected) !== null && _b !== void 0 ? _b : {},
161
+ metadata: (_c = registered.params.metadata) !== null && _c !== void 0 ? _c : {},
162
+ splits: registered.params.splits,
163
+ });
164
+ });
165
+ let datasetId;
166
+ try {
167
+ const created = await (0, datasets_1.createDataset)({
168
+ client,
169
+ name: datasetName,
170
+ description,
171
+ examples,
172
+ });
173
+ datasetId = created.datasetId;
174
+ }
175
+ catch (err) {
176
+ suite.trackingDisabled = true;
177
+ suite.setupError = err instanceof Error ? err : new Error(String(err));
178
+ suite.tracer = (0, phoenix_otel_1.createNoOpProvider)().getTracer("no-op");
179
+ suite.evaluatorTracer = suite.tracer;
180
+ return;
181
+ }
182
+ suite.datasetId = datasetId;
183
+ // Map test names to server-side example ids by re-fetching the dataset.
184
+ // The server doesn't promise that the GET response order matches the
185
+ // upload order, so we match by user-supplied `id` first, then by
186
+ // `JSON.stringify(input)` deep-equality with FIFO-on-collision.
187
+ try {
188
+ const { data: response } = await client.GET("/v1/datasets/{id}/examples", {
189
+ params: { path: { id: datasetId } },
190
+ });
191
+ const fetched = (_e = (_d = response === null || response === void 0 ? void 0 : response.data) === null || _d === void 0 ? void 0 : _d.examples) !== null && _e !== void 0 ? _e : [];
192
+ const idToTestName = new Map();
193
+ const inputKeyToTestNames = new Map();
194
+ for (const [testName, registered] of suite.registeredExamples.entries()) {
195
+ if (registered.params.id) {
196
+ idToTestName.set(registered.params.id, testName);
197
+ continue;
198
+ }
199
+ const key = stableKey(registered.params.input);
200
+ const arr = (_f = inputKeyToTestNames.get(key)) !== null && _f !== void 0 ? _f : [];
201
+ arr.push(testName);
202
+ inputKeyToTestNames.set(key, arr);
203
+ }
204
+ for (const ex of fetched) {
205
+ const byId = idToTestName.get(ex.id);
206
+ if (byId) {
207
+ suite.exampleIdsByTest.set(byId, {
208
+ exampleId: ex.id,
209
+ nodeId: ex.node_id,
210
+ });
211
+ idToTestName.delete(ex.id);
212
+ continue;
213
+ }
214
+ const queue = inputKeyToTestNames.get(stableKey(ex.input));
215
+ if (queue && queue.length) {
216
+ const testName = queue.shift();
217
+ suite.exampleIdsByTest.set(testName, {
218
+ exampleId: ex.id,
219
+ nodeId: ex.node_id,
220
+ });
221
+ }
222
+ }
223
+ }
224
+ catch (_l) {
225
+ // If we cannot resolve example ids, runs will be logged without one.
226
+ }
227
+ const projectName = `${datasetName}-${new Date().toISOString()}`;
228
+ suite.projectName = projectName;
229
+ try {
230
+ const experimentResponse = await client
231
+ .POST("/v1/datasets/{dataset_id}/experiments", {
232
+ params: { path: { dataset_id: datasetId } },
233
+ body: {
234
+ name: (_g = suite.config.datasetName) !== null && _g !== void 0 ? _g : suite.name,
235
+ description,
236
+ metadata: Object.assign(Object.assign({}, ((_h = suite.config.metadata) !== null && _h !== void 0 ? _h : {})), envMetadata()),
237
+ project_name: projectName,
238
+ repetitions: Math.max(1, (_j = suite.maxRepetitions) !== null && _j !== void 0 ? _j : 1),
239
+ },
240
+ })
241
+ .then((res) => { var _a; return (_a = res.data) === null || _a === void 0 ? void 0 : _a.data; });
242
+ if (!experimentResponse) {
243
+ throw new Error("Failed to create experiment");
244
+ }
245
+ suite.experimentId = experimentResponse.id;
246
+ suite.projectName = (_k = experimentResponse.project_name) !== null && _k !== void 0 ? _k : projectName;
247
+ }
248
+ catch (err) {
249
+ suite.trackingDisabled = true;
250
+ suite.setupError = err instanceof Error ? err : new Error(String(err));
251
+ suite.tracer = (0, phoenix_otel_1.createNoOpProvider)().getTracer("no-op");
252
+ suite.evaluatorTracer = suite.tracer;
253
+ return;
254
+ }
255
+ const baseUrl = client.config.baseUrl;
256
+ if (!baseUrl) {
257
+ suite.trackingDisabled = true;
258
+ suite.setupError = new Error("Phoenix base URL not found. Set PHOENIX_HOST or pass baseUrl on the client.");
259
+ suite.tracer = (0, phoenix_otel_1.createNoOpProvider)().getTracer("no-op");
260
+ suite.evaluatorTracer = suite.tracer;
261
+ return;
262
+ }
263
+ maybeWarnHttpScheme(baseUrl, client.config.headers);
264
+ let provider;
265
+ try {
266
+ provider = (0, phoenix_otel_1.register)({
267
+ projectName: suite.projectName,
268
+ url: baseUrl,
269
+ headers: client.config.headers
270
+ ? (0, toObjectHeaders_1.toObjectHeaders)(client.config.headers)
271
+ : undefined,
272
+ batch: false,
273
+ global: false,
274
+ });
275
+ suite.tracerProvider = provider;
276
+ suite.globalRegistration = (0, phoenix_otel_1.attachGlobalTracerProvider)(provider);
277
+ }
278
+ catch (err) {
279
+ suite.trackingDisabled = true;
280
+ suite.setupError = err instanceof Error ? err : new Error(String(err));
281
+ suite.tracer = (0, phoenix_otel_1.createNoOpProvider)().getTracer("no-op");
282
+ suite.evaluatorTracer = suite.tracer;
283
+ return;
284
+ }
285
+ suite.tracer = provider.getTracer(suite.projectName);
286
+ suite.evaluatorTracer = provider.getTracer(`${suite.projectName}-evaluators`);
287
+ if (suite.datasetId && suite.experimentId) {
288
+ suite.links = buildLinks(client, suite.datasetId, suite.experimentId);
289
+ }
290
+ }
291
+ /** Lazily-created no-op tracer reused for dry runs / fallbacks. */
292
+ let noOpTracer;
293
+ function getNoOpTracer() {
294
+ if (!noOpTracer)
295
+ noOpTracer = (0, phoenix_otel_1.createNoOpProvider)().getTracer("no-op");
296
+ return noOpTracer;
297
+ }
298
+ /** The tracer to use for the currently-running test — no-op when dry. */
299
+ function taskTracer(suite) {
300
+ var _a, _b;
301
+ if ((_a = (0, state_1.currentRun)()) === null || _a === void 0 ? void 0 : _a.dryRun)
302
+ return getNoOpTracer();
303
+ return (_b = suite.tracer) !== null && _b !== void 0 ? _b : getNoOpTracer();
304
+ }
305
+ /**
306
+ * Wrap the user's test body in an OpenInference task span and return the
307
+ * trace id so we can submit it with the experiment run.
308
+ */
309
+ async function runTaskWithTracing(suite, testName, fn) {
310
+ const tracer = taskTracer(suite);
311
+ return tracer.startActiveSpan(`Test: ${testName}`, async (span) => {
312
+ const traceId = span.spanContext().traceId;
313
+ const run = (0, state_1.currentRun)();
314
+ if (run) {
315
+ run.traceId = traceId;
316
+ taskSpansByRun.set(run, { span, traceId, ended: false });
317
+ }
318
+ try {
319
+ const result = await fn();
320
+ if (run) {
321
+ endTaskSpan({ run, fallbackOutput: result });
322
+ }
323
+ else {
324
+ endSpanAsTask({ span, input: undefined, output: result });
325
+ }
326
+ return { traceId, result };
327
+ }
328
+ catch (err) {
329
+ const error = err instanceof Error ? err : new Error(String(err));
330
+ const isTaskError = run ? !hasTaskSpanEnded(run) : true;
331
+ if (run && isTaskError) {
332
+ endTaskSpan({ run, error });
333
+ }
334
+ else if (!run) {
335
+ span.setStatus({ code: phoenix_otel_1.SpanStatusCode.ERROR, message: error.message });
336
+ span.end();
337
+ }
338
+ return { traceId, error, isTaskError };
339
+ }
340
+ finally {
341
+ if (run) {
342
+ taskSpansByRun.delete(run);
343
+ }
344
+ }
345
+ });
346
+ }
347
+ function hasTaskSpanEnded(run) {
348
+ var _a, _b;
349
+ return (_b = (_a = taskSpansByRun.get(run)) === null || _a === void 0 ? void 0 : _a.ended) !== null && _b !== void 0 ? _b : false;
350
+ }
351
+ /**
352
+ * End the current run's task span. `logOutput()` calls this immediately so
353
+ * evaluator work that follows is not included in the task span duration.
354
+ */
355
+ function endTaskSpanForRun(run) {
356
+ endTaskSpan({ run });
357
+ }
358
+ function endTaskSpan({ run, fallbackOutput, error, }) {
359
+ const lifecycle = taskSpansByRun.get(run);
360
+ if (!lifecycle || lifecycle.ended)
361
+ return;
362
+ const output = run.outputSet ? run.output : fallbackOutput;
363
+ if (error) {
364
+ lifecycle.span.setStatus({
365
+ code: phoenix_otel_1.SpanStatusCode.ERROR,
366
+ message: error.message,
367
+ });
368
+ lifecycle.span.setAttributes({
369
+ [phoenix_otel_1.SemanticConventions.OPENINFERENCE_SPAN_KIND]: phoenix_otel_1.OpenInferenceSpanKind.CHAIN,
370
+ [phoenix_otel_1.SemanticConventions.INPUT_MIME_TYPE]: mimeTypeFor(run.params.input),
371
+ [phoenix_otel_1.SemanticConventions.INPUT_VALUE]: (0, ensureString_1.ensureString)(run.params.input),
372
+ });
373
+ lifecycle.span.end();
374
+ }
375
+ else {
376
+ endSpanAsTask({ span: lifecycle.span, input: run.params.input, output });
377
+ }
378
+ run.traceId = lifecycle.traceId;
379
+ run.taskEndTime = new Date();
380
+ lifecycle.ended = true;
381
+ }
382
+ function endSpanAsTask({ span, input, output, }) {
383
+ span.setAttributes({
384
+ [phoenix_otel_1.SemanticConventions.OPENINFERENCE_SPAN_KIND]: phoenix_otel_1.OpenInferenceSpanKind.CHAIN,
385
+ [phoenix_otel_1.SemanticConventions.INPUT_MIME_TYPE]: mimeTypeFor(input),
386
+ [phoenix_otel_1.SemanticConventions.INPUT_VALUE]: (0, ensureString_1.ensureString)(input),
387
+ [phoenix_otel_1.SemanticConventions.OUTPUT_MIME_TYPE]: mimeTypeFor(output),
388
+ [phoenix_otel_1.SemanticConventions.OUTPUT_VALUE]: (0, ensureString_1.ensureString)(output),
389
+ });
390
+ span.setStatus({ code: phoenix_otel_1.SpanStatusCode.OK });
391
+ span.end();
392
+ }
393
+ /**
394
+ * POST a single experiment run for one test case to Phoenix.
395
+ *
396
+ * Best-effort: failures are captured and surfaced via the test reporter but
397
+ * do not fail the test itself.
398
+ */
399
+ async function postExperimentRun(suite, run) {
400
+ var _a, _b, _c, _d, _e, _f;
401
+ if (run.dryRun ||
402
+ suite.trackingDisabled ||
403
+ !suite.client ||
404
+ !suite.experimentId) {
405
+ return undefined;
406
+ }
407
+ const example = suite.exampleIdsByTest.get(run.logicalName);
408
+ if (!example) {
409
+ return undefined;
410
+ }
411
+ try {
412
+ const res = await suite.client.POST("/v1/experiments/{experiment_id}/runs", {
413
+ params: { path: { experiment_id: suite.experimentId } },
414
+ body: {
415
+ dataset_example_id: example.nodeId,
416
+ output: run.outputSet
417
+ ? run.output
418
+ : null,
419
+ repetition_number: run.repetitionNumber,
420
+ start_time: run.startTime.toISOString(),
421
+ end_time: ((_b = (_a = run.taskEndTime) !== null && _a !== void 0 ? _a : run.endTime) !== null && _b !== void 0 ? _b : new Date()).toISOString(),
422
+ error: (_c = run.error) !== null && _c !== void 0 ? _c : null,
423
+ trace_id: (_d = run.traceId) !== null && _d !== void 0 ? _d : null,
424
+ },
425
+ });
426
+ return (_e = res.data) === null || _e === void 0 ? void 0 : _e.data.id;
427
+ }
428
+ catch (_g) {
429
+ suite.uploadFailureCount = ((_f = suite.uploadFailureCount) !== null && _f !== void 0 ? _f : 0) + 1;
430
+ return undefined;
431
+ }
432
+ }
433
+ /**
434
+ * POST one annotation (an "experiment_evaluation") for a run.
435
+ */
436
+ async function postAnnotation(suite, runId, annotation) {
437
+ var _a, _b, _c, _d, _e, _f;
438
+ if (suite.trackingDisabled || !suite.client || !runId)
439
+ return;
440
+ const start = new Date();
441
+ const end = new Date();
442
+ try {
443
+ await suite.client.POST("/v1/experiment_evaluations", {
444
+ body: {
445
+ experiment_run_id: runId,
446
+ name: annotation.name,
447
+ annotator_kind: (_a = annotation.annotatorKind) !== null && _a !== void 0 ? _a : "CODE",
448
+ start_time: start.toISOString(),
449
+ end_time: end.toISOString(),
450
+ result: Object.assign({ score: typeof annotation.score === "boolean"
451
+ ? annotation.score
452
+ ? 1
453
+ : 0
454
+ : ((_b = annotation.score) !== null && _b !== void 0 ? _b : null), label: (_c = annotation.label) !== null && _c !== void 0 ? _c : null, explanation: (_d = annotation.explanation) !== null && _d !== void 0 ? _d : null }, (annotation.metadata ? { metadata: annotation.metadata } : {})),
455
+ error: null,
456
+ trace_id: (_e = annotation.traceId) !== null && _e !== void 0 ? _e : null,
457
+ },
458
+ });
459
+ }
460
+ catch (_g) {
461
+ suite.uploadFailureCount = ((_f = suite.uploadFailureCount) !== null && _f !== void 0 ? _f : 0) + 1;
462
+ }
463
+ }
464
+ /** Run an evaluator in an OpenInference evaluator span. */
465
+ async function runEvaluatorWithTracing(suite, name, params, fn) {
466
+ var _a, _b, _c, _d;
467
+ const isDryRun = (_b = (_a = (0, state_1.currentRun)()) === null || _a === void 0 ? void 0 : _a.dryRun) !== null && _b !== void 0 ? _b : false;
468
+ const tracer = isDryRun
469
+ ? getNoOpTracer()
470
+ : ((_d = (_c = suite.evaluatorTracer) !== null && _c !== void 0 ? _c : suite.tracer) !== null && _d !== void 0 ? _d : getNoOpTracer());
471
+ const parentlessContext = phoenix_otel_1.trace.deleteSpan(phoenix_otel_1.context.active());
472
+ const evaluatorContext = isDryRun
473
+ ? (0, phoenix_otel_1.suppressTracing)(parentlessContext)
474
+ : parentlessContext;
475
+ return phoenix_otel_1.context.with(evaluatorContext, () => tracer.startActiveSpan(`Evaluation: ${name}`, async (span) => {
476
+ const traceId = isDryRun ? null : span.spanContext().traceId;
477
+ try {
478
+ const result = await fn(params);
479
+ span.setAttributes({
480
+ [phoenix_otel_1.SemanticConventions.OPENINFERENCE_SPAN_KIND]: phoenix_otel_1.OpenInferenceSpanKind.EVALUATOR,
481
+ [phoenix_otel_1.SemanticConventions.INPUT_MIME_TYPE]: phoenix_otel_1.MimeType.JSON,
482
+ [phoenix_otel_1.SemanticConventions.INPUT_VALUE]: (0, ensureString_1.ensureString)(params),
483
+ [phoenix_otel_1.SemanticConventions.OUTPUT_MIME_TYPE]: phoenix_otel_1.MimeType.JSON,
484
+ [phoenix_otel_1.SemanticConventions.OUTPUT_VALUE]: (0, ensureString_1.ensureString)(result),
485
+ });
486
+ span.setStatus({ code: phoenix_otel_1.SpanStatusCode.OK });
487
+ return { result, traceId };
488
+ }
489
+ catch (err) {
490
+ const error = err instanceof Error ? err : new Error(String(err));
491
+ span.setStatus({ code: phoenix_otel_1.SpanStatusCode.ERROR, message: error.message });
492
+ throw error;
493
+ }
494
+ finally {
495
+ span.end();
496
+ }
497
+ }));
498
+ }
499
+ /**
500
+ * Tear down the tracer provider created for the suite, flushing any pending
501
+ * spans before the process exits.
502
+ */
503
+ async function teardownSuite(suite) {
504
+ const provider = suite.tracerProvider;
505
+ if (!provider)
506
+ return;
507
+ try {
508
+ await (0, tracing_1.cleanupOwnedTracerProvider)({
509
+ provider,
510
+ globalRegistration: suite.globalRegistration,
511
+ });
512
+ }
513
+ finally {
514
+ suite.tracerProvider = undefined;
515
+ suite.globalRegistration = null;
516
+ }
517
+ }
518
+ /**
519
+ * Snapshot environment-derived metadata recorded on the experiment so users
520
+ * can filter experiments by env in the Phoenix UI.
521
+ */
522
+ function envMetadata() {
523
+ var _a, _b;
524
+ const out = {};
525
+ const env = (_b = (_a = process.env.PHOENIX_ENVIRONMENT) !== null && _a !== void 0 ? _a : process.env.ENVIRONMENT) !== null && _b !== void 0 ? _b : process.env.NODE_ENV;
526
+ if (env)
527
+ out.environment = env;
528
+ return out;
529
+ }
530
+ //# sourceMappingURL=phoenix-test-tracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phoenix-test-tracking.js","sourceRoot":"","sources":["../../../src/testing/phoenix-test-tracking.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { SuiteSummary } from "./reporter-format";
2
+ import type { SuiteState } from "./state";
3
+ /**
4
+ * Env var that overrides where suite summary artifacts are written. When unset,
5
+ * a stable per-project subdirectory of the OS temp dir is used (see
6
+ * {@link getSuiteSummaryReportDir}).
7
+ */
8
+ export declare const PHOENIX_TEST_REPORT_DIR_ENV_VAR = "PHOENIX_TEST_REPORT_DIR";
9
+ /**
10
+ * Resolve the directory where suite summary artifacts are written and read.
11
+ *
12
+ * Honors {@link PHOENIX_TEST_REPORT_DIR_ENV_VAR} when set. Otherwise it derives
13
+ * a directory under the OS temp dir, namespaced by a hash of the current
14
+ * working directory so that concurrent test runs in different projects don't
15
+ * read each other's artifacts.
16
+ */
17
+ export declare function getSuiteSummaryReportDir(): string;
18
+ /**
19
+ * Delete any artifacts left over from a previous run. The reporter calls this
20
+ * at the start of every run so summaries from an earlier watch-mode invocation
21
+ * don't bleed into the next one.
22
+ */
23
+ export declare function clearSuiteSummaryArtifacts(): void;
24
+ /**
25
+ * Write one suite's summary to the report directory. Called from each worker
26
+ * when a suite finishes.
27
+ *
28
+ * The file is written to a `.tmp` path first and then atomically renamed into
29
+ * place, so the reader never observes a half-written artifact. Failures are
30
+ * intentionally swallowed — reporting must not break the user's tests.
31
+ */
32
+ export declare function writeSuiteSummaryArtifact(suite: SuiteState): void;
33
+ /**
34
+ * Read back all suite summaries the workers wrote during this run, sorted by
35
+ * suite name for stable output.
36
+ *
37
+ * @param sinceMs - When provided, only artifacts created at or after this
38
+ * timestamp are returned, so summaries from a previous run that share the
39
+ * report directory are ignored. A one-second slack is allowed to absorb
40
+ * small clock differences between worker processes.
41
+ */
42
+ export declare function readSuiteSummaryArtifacts({ sinceMs, }?: {
43
+ sinceMs?: number;
44
+ }): SuiteSummary[];
45
+ //# sourceMappingURL=report-artifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-artifacts.d.ts","sourceRoot":"","sources":["../../../src/testing/report-artifacts.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,SAAS,CAAC;AAEtD;;;;GAIG;AACH,eAAO,MAAM,+BAA+B,4BAA4B,CAAC;AAazE;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAUjD;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,IAAI,IAAI,CAajD;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAiBjE;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,EACxC,OAAO,GACR,GAAE;IACD,OAAO,CAAC,EAAE,MAAM,CAAC;CACb,GAAG,YAAY,EAAE,CAoCtB"}