@arizeai/phoenix-client 2.3.3 → 2.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arizeai/phoenix-client",
3
- "version": "2.3.3",
3
+ "version": "2.3.4",
4
4
  "description": "A client for the Phoenix API",
5
5
  "main": "dist/src/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -57,10 +57,11 @@
57
57
  },
58
58
  "dependencies": {
59
59
  "@arizeai/openinference-semantic-conventions": "^1.1.0",
60
+ "@arizeai/openinference-vercel": "^2.3.1",
60
61
  "@opentelemetry/api": "^1.9.0",
61
62
  "@opentelemetry/core": "^1.25.1",
62
- "@opentelemetry/instrumentation": "^0.57.2",
63
63
  "@opentelemetry/exporter-trace-otlp-proto": "^0.57.2",
64
+ "@opentelemetry/instrumentation": "^0.57.2",
64
65
  "@opentelemetry/resources": "^2.0.0",
65
66
  "@opentelemetry/sdk-trace-base": "^1.30.1",
66
67
  "@opentelemetry/sdk-trace-node": "^1.30.1",
@@ -1,10 +1,10 @@
1
1
  import { diag, DiagConsoleLogger, DiagLogLevel } from "@opentelemetry/api";
2
2
  import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-proto";
3
3
  import { resourceFromAttributes } from "@opentelemetry/resources";
4
- import { SimpleSpanProcessor } from "@opentelemetry/sdk-trace-base";
5
4
  import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
6
5
  import { SEMRESATTRS_PROJECT_NAME } from "@arizeai/openinference-semantic-conventions";
7
6
  import { HeadersOptions } from "openapi-fetch";
7
+ import { OpenInferenceSimpleSpanProcessor } from "@arizeai/openinference-vercel";
8
8
 
9
9
  /**
10
10
  * Creates a provider that exports traces to Phoenix.
@@ -28,14 +28,16 @@ export function createProvider({
28
28
  [SEMRESATTRS_PROJECT_NAME]: projectName,
29
29
  }),
30
30
  spanProcessors: [
31
- new SimpleSpanProcessor(
32
- new OTLPTraceExporter({
31
+ // We opt to use the OpenInferenceSimpleSpanProcessor instead of the SimpleSpanProcessor
32
+ // Since so many AI applications use the AI SDK
33
+ new OpenInferenceSimpleSpanProcessor({
34
+ exporter: new OTLPTraceExporter({
33
35
  url: `${baseUrl}/v1/traces`,
34
36
  headers: Array.isArray(headers)
35
37
  ? Object.fromEntries(headers)
36
38
  : headers,
37
- })
38
- ),
39
+ }),
40
+ }),
39
41
  ],
40
42
  });
41
43
 
@@ -87,6 +87,13 @@ export type RunExperimentParams = ClientFn & {
87
87
  * @default false
88
88
  */
89
89
  dryRun?: number | boolean;
90
+ /**
91
+ * Whether to set the global tracer provider when running the task.
92
+ * If set to false, a locally scoped tracer will be created but will not get registered.
93
+ * This may cause certain spans to not be picked up by Phoenix. Notably libraries like the AI SDK that leverage the global tracer.
94
+ * @default true
95
+ */
96
+ setGlobalTracerProvider?: boolean;
90
97
  };
91
98
 
92
99
  /**
@@ -133,6 +140,7 @@ export async function runExperiment({
133
140
  record = true,
134
141
  concurrency = 5,
135
142
  dryRun = false,
143
+ setGlobalTracerProvider = true,
136
144
  }: RunExperimentParams): Promise<RanExperiment> {
137
145
  let provider: NodeTracerProvider | undefined;
138
146
  const isDryRun = typeof dryRun === "number" || dryRun === true;
@@ -194,6 +202,10 @@ export async function runExperiment({
194
202
  baseUrl,
195
203
  headers: client.config.headers ?? {},
196
204
  });
205
+ // Register the provider
206
+ if (setGlobalTracerProvider) {
207
+ provider.register();
208
+ }
197
209
  taskTracer = provider.getTracer(projectName);
198
210
  }
199
211
  if (!record) {
@@ -263,6 +275,7 @@ export async function runExperiment({
263
275
  logger,
264
276
  concurrency,
265
277
  dryRun,
278
+ setGlobalTracerProvider,
266
279
  });
267
280
  ranExperiment.evaluationRuns = evaluationRuns;
268
281
 
@@ -407,6 +420,7 @@ export async function evaluateExperiment({
407
420
  logger = console,
408
421
  concurrency = 5,
409
422
  dryRun = false,
423
+ setGlobalTracerProvider = true,
410
424
  }: {
411
425
  /**
412
426
  * The experiment to evaluate
@@ -426,6 +440,11 @@ export async function evaluateExperiment({
426
440
  * @default false
427
441
  * */
428
442
  dryRun?: boolean | number;
443
+ /**
444
+ * Whether to set the global tracer provider when running the evaluators
445
+ * @default true
446
+ */
447
+ setGlobalTracerProvider?: boolean;
429
448
  }): Promise<RanExperiment> {
430
449
  const isDryRun = typeof dryRun === "number" || dryRun === true;
431
450
  const client = _client ?? createClient();
@@ -441,6 +460,9 @@ export async function evaluateExperiment({
441
460
  baseUrl,
442
461
  headers: client.config.headers ?? {},
443
462
  });
463
+ if (setGlobalTracerProvider) {
464
+ provider.register();
465
+ }
444
466
  } else {
445
467
  provider = createNoOpProvider();
446
468
  }
@@ -449,7 +471,7 @@ export async function evaluateExperiment({
449
471
  : provider.getTracer("evaluators");
450
472
  const nRuns =
451
473
  typeof dryRun === "number"
452
- ? Math.max(dryRun, Object.keys(experiment.runs).length)
474
+ ? Math.min(dryRun, Object.keys(experiment.runs).length)
453
475
  : Object.keys(experiment.runs).length;
454
476
  const dataset = await getDataset({
455
477
  dataset: { datasetId: experiment.datasetId },