@arizeai/phoenix-client 7.6.0 → 7.7.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 (82) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +27 -3
  3. package/dist/esm/__generated__/api/v1.d.ts +1 -1
  4. package/dist/esm/__generated__/api/v1.d.ts.map +1 -1
  5. package/dist/esm/constants/serverRequirements.d.ts +1 -0
  6. package/dist/esm/constants/serverRequirements.d.ts.map +1 -1
  7. package/dist/esm/constants/serverRequirements.js +7 -0
  8. package/dist/esm/constants/serverRequirements.js.map +1 -1
  9. package/dist/esm/projects/index.d.ts +1 -0
  10. package/dist/esm/projects/index.d.ts.map +1 -1
  11. package/dist/esm/projects/index.js +1 -0
  12. package/dist/esm/projects/index.js.map +1 -1
  13. package/dist/esm/projects/setProjectRetentionPolicy.d.ts +49 -0
  14. package/dist/esm/projects/setProjectRetentionPolicy.d.ts.map +1 -0
  15. package/dist/esm/projects/setProjectRetentionPolicy.js +52 -0
  16. package/dist/esm/projects/setProjectRetentionPolicy.js.map +1 -0
  17. package/dist/esm/traces/getTraces.d.ts +1 -1
  18. package/dist/esm/traces/getTraces.d.ts.map +1 -1
  19. package/dist/esm/traces/index.d.ts +1 -0
  20. package/dist/esm/traces/index.d.ts.map +1 -1
  21. package/dist/esm/traces/index.js +1 -0
  22. package/dist/esm/traces/index.js.map +1 -1
  23. package/dist/esm/traces/transferTraces.d.ts +56 -0
  24. package/dist/esm/traces/transferTraces.d.ts.map +1 -0
  25. package/dist/esm/traces/transferTraces.js +56 -0
  26. package/dist/esm/traces/transferTraces.js.map +1 -0
  27. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  28. package/dist/esm/users/getCurrentUser.d.ts +25 -0
  29. package/dist/esm/users/getCurrentUser.d.ts.map +1 -0
  30. package/dist/esm/users/getCurrentUser.js +30 -0
  31. package/dist/esm/users/getCurrentUser.js.map +1 -0
  32. package/dist/esm/users/index.d.ts +2 -0
  33. package/dist/esm/users/index.d.ts.map +1 -0
  34. package/dist/esm/users/index.js +2 -0
  35. package/dist/esm/users/index.js.map +1 -0
  36. package/dist/src/__generated__/api/v1.d.ts +1 -1
  37. package/dist/src/__generated__/api/v1.d.ts.map +1 -1
  38. package/dist/src/constants/serverRequirements.d.ts +1 -0
  39. package/dist/src/constants/serverRequirements.d.ts.map +1 -1
  40. package/dist/src/constants/serverRequirements.js +8 -1
  41. package/dist/src/constants/serverRequirements.js.map +1 -1
  42. package/dist/src/projects/index.d.ts +1 -0
  43. package/dist/src/projects/index.d.ts.map +1 -1
  44. package/dist/src/projects/index.js +1 -0
  45. package/dist/src/projects/index.js.map +1 -1
  46. package/dist/src/projects/setProjectRetentionPolicy.d.ts +49 -0
  47. package/dist/src/projects/setProjectRetentionPolicy.d.ts.map +1 -0
  48. package/dist/src/projects/setProjectRetentionPolicy.js +59 -0
  49. package/dist/src/projects/setProjectRetentionPolicy.js.map +1 -0
  50. package/dist/src/traces/getTraces.d.ts +1 -1
  51. package/dist/src/traces/getTraces.d.ts.map +1 -1
  52. package/dist/src/traces/index.d.ts +1 -0
  53. package/dist/src/traces/index.d.ts.map +1 -1
  54. package/dist/src/traces/index.js +1 -0
  55. package/dist/src/traces/index.js.map +1 -1
  56. package/dist/src/traces/transferTraces.d.ts +56 -0
  57. package/dist/src/traces/transferTraces.d.ts.map +1 -0
  58. package/dist/src/traces/transferTraces.js +59 -0
  59. package/dist/src/traces/transferTraces.js.map +1 -0
  60. package/dist/src/users/getCurrentUser.d.ts +25 -0
  61. package/dist/src/users/getCurrentUser.d.ts.map +1 -0
  62. package/dist/src/users/getCurrentUser.js +36 -0
  63. package/dist/src/users/getCurrentUser.js.map +1 -0
  64. package/dist/src/users/index.d.ts +2 -0
  65. package/dist/src/users/index.d.ts.map +1 -0
  66. package/dist/src/users/index.js +18 -0
  67. package/dist/src/users/index.js.map +1 -0
  68. package/dist/tsconfig.tsbuildinfo +1 -1
  69. package/docs/overview.mdx +8 -4
  70. package/docs/projects.mdx +71 -0
  71. package/docs/traces.mdx +28 -2
  72. package/docs/users.mdx +44 -0
  73. package/package.json +6 -2
  74. package/src/__generated__/api/v1.ts +1 -1
  75. package/src/constants/serverRequirements.ts +8 -0
  76. package/src/projects/index.ts +1 -0
  77. package/src/projects/setProjectRetentionPolicy.ts +80 -0
  78. package/src/traces/getTraces.ts +1 -1
  79. package/src/traces/index.ts +1 -0
  80. package/src/traces/transferTraces.ts +89 -0
  81. package/src/users/getCurrentUser.ts +39 -0
  82. package/src/users/index.ts +1 -0
package/docs/overview.mdx CHANGED
@@ -3,7 +3,7 @@ title: "Overview"
3
3
  description: "Typed TypeScript client for Phoenix platform APIs"
4
4
  ---
5
5
 
6
- `@arizeai/phoenix-client` is the typed TypeScript client for Phoenix platform APIs. It ships a small root REST client plus focused module entrypoints for prompts, datasets, experiments, spans, sessions, traces, and CI-friendly dataset-backed eval tests.
6
+ `@arizeai/phoenix-client` is the typed TypeScript client for Phoenix platform APIs. It ships a small root REST client plus focused module entrypoints for projects, prompts, datasets, experiments, spans, sessions, traces, users, and CI-friendly dataset-backed eval tests.
7
7
 
8
8
  ## Install
9
9
 
@@ -37,12 +37,14 @@ That gives the agent version-matched docs plus the exact implementation and gene
37
37
  | Import | Purpose |
38
38
  |--------|---------|
39
39
  | `@arizeai/phoenix-client` | `createClient`, generated OpenAPI types, config helpers |
40
+ | `@arizeai/phoenix-client/projects` | Project listing and retention-policy assignment |
40
41
  | `@arizeai/phoenix-client/prompts` | Prompt CRUD plus `toSDK` conversion |
41
42
  | `@arizeai/phoenix-client/datasets` | Dataset creation and retrieval |
42
43
  | `@arizeai/phoenix-client/experiments` | Experiment execution and lifecycle |
43
44
  | `@arizeai/phoenix-client/spans` | Span search, notes, and span/document annotations |
44
45
  | `@arizeai/phoenix-client/sessions` | Session listing, retrieval, and session annotations |
45
- | `@arizeai/phoenix-client/traces` | Project trace retrieval and trace annotations |
46
+ | `@arizeai/phoenix-client/traces` | Project trace retrieval, transfers, and trace annotations |
47
+ | `@arizeai/phoenix-client/users` | Current authenticated user retrieval |
46
48
  | `@arizeai/phoenix-client/vitest` | Vitest entrypoint for dataset-backed eval tests |
47
49
  | `@arizeai/phoenix-client/vitest/reporter` | Vitest reporter for Phoenix eval summaries |
48
50
  | `@arizeai/phoenix-client/jest` | Jest entrypoint for dataset-backed eval tests |
@@ -158,10 +160,10 @@ Prefer this layer when:
158
160
 
159
161
  ## Where To Start
160
162
 
161
- - [Prompts](./prompts), [Datasets](./datasets), [Experiments](./experiments) — higher-level workflows
163
+ - [Projects](./projects), [Prompts](./prompts), [Datasets](./datasets), [Experiments](./experiments) — higher-level workflows
162
164
  - [Annotations](./annotations) — annotation concepts, then [Span](./span-annotations), [Document](./document-annotations), and [Session](./session-annotations) annotations for detailed usage
163
165
  - [CI Eval Tests](./ci-evals) — Vitest/Jest eval suites backed by Phoenix datasets and experiments
164
- - [Spans](./spans), [Sessions](./sessions), [Traces](./traces) — retrieval and maintenance
166
+ - [Spans](./spans), [Sessions](./sessions), [Traces](./traces), [Users](./users) — retrieval and maintenance
165
167
 
166
168
  <section className="hidden" data-agent-context="source-map" aria-label="Source map">
167
169
  <h2>Source Map</h2>
@@ -171,12 +173,14 @@ Prefer this layer when:
171
173
  <li><code>src/config.ts</code></li>
172
174
  <li><code>src/__generated__/api/v1.ts</code></li>
173
175
  <li><code>src/types/core.ts</code></li>
176
+ <li><code>src/projects/</code></li>
174
177
  <li><code>src/prompts/</code></li>
175
178
  <li><code>src/datasets/</code></li>
176
179
  <li><code>src/experiments/</code></li>
177
180
  <li><code>src/spans/</code></li>
178
181
  <li><code>src/sessions/</code></li>
179
182
  <li><code>src/traces/</code></li>
183
+ <li><code>src/users/</code></li>
180
184
  <li><code>src/vitest/</code></li>
181
185
  <li><code>src/jest/</code></li>
182
186
  <li><code>src/testing/</code></li>
@@ -0,0 +1,71 @@
1
+ ---
2
+ title: "Projects"
3
+ description: "List projects and manage project retention-policy assignments"
4
+ ---
5
+
6
+ The projects module lists Phoenix projects and assigns existing trace retention policies to them.
7
+
8
+ <section className="hidden" data-agent-context="relevant-source-files" aria-label="Relevant source files">
9
+ <h2>Relevant Source Files</h2>
10
+ <ul>
11
+ <li><code>src/projects/getProjects.ts</code></li>
12
+ <li><code>src/projects/setProjectRetentionPolicy.ts</code></li>
13
+ <li><code>src/types/projects.ts</code></li>
14
+ </ul>
15
+ </section>
16
+
17
+ ## List Projects
18
+
19
+ `getProjects` handles cursor pagination automatically. Use `nameContains` for a case-insensitive, server-side substring filter.
20
+
21
+ ```ts
22
+ import { getProjects } from "@arizeai/phoenix-client/projects";
23
+
24
+ const projects = await getProjects({ nameContains: "support" });
25
+
26
+ for (const project of projects) {
27
+ console.log(`${project.name} (${project.id})`);
28
+ }
29
+ ```
30
+
31
+ ## Assign A Retention Policy
32
+
33
+ `setProjectRetentionPolicy` accepts a project name or project GlobalID and the GlobalID of an existing trace retention policy.
34
+
35
+ ```ts
36
+ import { setProjectRetentionPolicy } from "@arizeai/phoenix-client/projects";
37
+
38
+ const assignment = await setProjectRetentionPolicy({
39
+ projectName: "support-bot",
40
+ policyId: "UHJvamVjdFRyYWNlUmV0ZW50aW9uUG9saWN5OjI=",
41
+ });
42
+
43
+ console.log(assignment.project_id, assignment.policy_id);
44
+ ```
45
+
46
+ You can select the project with `projectName`, `projectId`, or the shorthand `project`. `projectId` must be the project's GlobalID.
47
+
48
+ This helper only changes which existing retention policy the project uses. It does not create, read, update, or delete retention policies; policy CRUD is outside the TypeScript client's projects helper.
49
+
50
+ ## Reset To The Default Policy
51
+
52
+ Pass `null` as `policyId` to remove the explicit assignment and return the project to Phoenix's default retention policy.
53
+
54
+ ```ts
55
+ await setProjectRetentionPolicy({
56
+ projectId: "UHJvamVjdDox",
57
+ policyId: null,
58
+ });
59
+ ```
60
+
61
+ Assigning or resetting a retention policy requires an admin when authentication is enabled. Invalid policy GlobalIDs produce a `422` response, while callers without permission receive `403`; both are surfaced as `HttpError` instances by the client.
62
+
63
+ <section className="hidden" data-agent-context="source-map" aria-label="Source map">
64
+ <h2>Source Map</h2>
65
+ <ul>
66
+ <li><code>src/projects/getProjects.ts</code></li>
67
+ <li><code>src/projects/setProjectRetentionPolicy.ts</code></li>
68
+ <li><code>src/projects/index.ts</code></li>
69
+ <li><code>src/types/projects.ts</code></li>
70
+ </ul>
71
+ </section>
package/docs/traces.mdx CHANGED
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  title: "Traces"
3
- description: "Retrieve traces and annotate them with @arizeai/phoenix-client"
3
+ description: "Retrieve, move, and annotate traces with @arizeai/phoenix-client"
4
4
  ---
5
5
 
6
- The traces module provides trace retrieval and trace-level annotation functions.
6
+ The traces module provides trace retrieval, project transfer, and trace-level annotation functions.
7
7
 
8
8
  <section className="hidden" data-agent-context="relevant-source-files" aria-label="Relevant source files">
9
9
  <h2>Relevant Source Files</h2>
@@ -18,6 +18,9 @@ The traces module provides trace retrieval and trace-level annotation functions.
18
18
  <li>
19
19
  <code>src/traces/logTraceAnnotations.ts</code> for batched annotation writes
20
20
  </li>
21
+ <li>
22
+ <code>src/traces/transferTraces.ts</code> for moving traces between projects
23
+ </li>
21
24
  <li>
22
25
  <code>src/traces/types.ts</code> for the <code>TraceAnnotation</code> type
23
26
  </li>
@@ -65,6 +68,28 @@ console.log(result.nextCursor);
65
68
  - Set `includeSpans` when you need a trace-centric fetch that also contains span details
66
69
  - `project` accepts `{ project }`, `{ projectId }`, or `{ projectName }`
67
70
 
71
+ ## Move Traces To Another Project
72
+
73
+ Use `transferTraces` to move one or more traces from their current project to a destination project. This operation **moves rather than copies** the traces: after a successful transfer, they no longer appear in the source project.
74
+
75
+ All traces in one call must currently belong to the same source project. Each trace identifier can be either an OpenTelemetry trace ID or a Phoenix trace GlobalID, and the destination can be either a project name or project GlobalID.
76
+
77
+ ```ts
78
+ import { transferTraces } from "@arizeai/phoenix-client/traces";
79
+
80
+ const result = await transferTraces({
81
+ traceIdentifiers: ["8f3a...", "VHJhY2U6Mg=="],
82
+ destinationProjectIdentifier: "production",
83
+ });
84
+
85
+ console.log(`Moved ${result.transferredTraceCount} traces`);
86
+ console.log(`Destination project: ${result.destinationProjectId}`);
87
+ ```
88
+
89
+ The result contains the number of distinct traces moved and the resolved GlobalID of the destination project. Phoenix rejects an empty list, trace or project identifiers that do not resolve, and requests that combine traces from multiple source projects.
90
+
91
+ `transferTraces` requires Phoenix server 20.4.0 or newer.
92
+
68
93
  ## Annotate a Single Trace
69
94
 
70
95
  Use `addTraceAnnotation` to attach a label, score, or explanation to one trace. If you supply an `identifier`, Phoenix upserts the annotation when an annotation with that identifier already exists.
@@ -128,6 +153,7 @@ for (const r of results) {
128
153
  <li><code>src/traces/getTraces.ts</code></li>
129
154
  <li><code>src/traces/addTraceAnnotation.ts</code></li>
130
155
  <li><code>src/traces/logTraceAnnotations.ts</code></li>
156
+ <li><code>src/traces/transferTraces.ts</code></li>
131
157
  <li><code>src/traces/types.ts</code></li>
132
158
  <li><code>src/types/projects.ts</code></li>
133
159
  </ul>
package/docs/users.mdx ADDED
@@ -0,0 +1,44 @@
1
+ ---
2
+ title: "Users"
3
+ description: "Get the current Phoenix user with @arizeai/phoenix-client"
4
+ ---
5
+
6
+ The users module identifies the user associated with the client's current credentials.
7
+
8
+ ## Get The Current User
9
+
10
+ ```ts
11
+ import { getCurrentUser } from "@arizeai/phoenix-client/users";
12
+
13
+ const user = await getCurrentUser();
14
+
15
+ if (user.auth_method === "ANONYMOUS") {
16
+ console.log("Authentication is disabled");
17
+ } else {
18
+ console.log(`${user.username} has the ${user.role} role`);
19
+ }
20
+ ```
21
+
22
+ `getCurrentUser()` returns the generated Phoenix API user union. Authenticated deployments return a local, OAuth 2, or LDAP user profile. When authentication is disabled, it returns `{ auth_method: "ANONYMOUS" }`. Invalid credentials reject with an `HttpError` whose `status` is `401`; other authorization failures retain their HTTP status as well.
23
+
24
+ Pass a client explicitly when you need custom configuration:
25
+
26
+ ```ts
27
+ import { createClient } from "@arizeai/phoenix-client";
28
+ import { getCurrentUser } from "@arizeai/phoenix-client/users";
29
+
30
+ const client = createClient({
31
+ options: { baseUrl: "https://phoenix.example.com" },
32
+ });
33
+
34
+ const user = await getCurrentUser({ client });
35
+ ```
36
+
37
+ <section className="hidden" data-agent-context="source-map" aria-label="Source map">
38
+ <h2>Source Map</h2>
39
+ <ul>
40
+ <li><code>src/users/getCurrentUser.ts</code></li>
41
+ <li><code>src/users/index.ts</code></li>
42
+ <li><code>src/__generated__/api/v1.ts</code></li>
43
+ </ul>
44
+ </section>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arizeai/phoenix-client",
3
- "version": "7.6.0",
3
+ "version": "7.7.0",
4
4
  "description": "A client for the Phoenix API",
5
5
  "keywords": [
6
6
  "arize",
@@ -57,6 +57,10 @@
57
57
  "import": "./dist/esm/projects/index.js",
58
58
  "require": "./dist/src/projects/index.js"
59
59
  },
60
+ "./users": {
61
+ "import": "./dist/esm/users/index.js",
62
+ "require": "./dist/src/users/index.js"
63
+ },
60
64
  "./traces": {
61
65
  "import": "./dist/esm/traces/index.js",
62
66
  "require": "./dist/src/traces/index.js"
@@ -129,7 +133,7 @@
129
133
  "@anthropic-ai/sdk": "^0.35.0",
130
134
  "ai": "^7.0.0",
131
135
  "jest": ">=27",
132
- "openai": "^6.10.0",
136
+ "openai": "^6.10.0 || ^7.0.0",
133
137
  "vitest": ">=1"
134
138
  },
135
139
  "peerDependenciesMeta": {
@@ -9987,7 +9987,7 @@ export interface operations {
9987
9987
  order?: "asc" | "desc";
9988
9988
  /** @description Maximum number of traces to return */
9989
9989
  limit?: number;
9990
- /** @description Pagination cursor (Trace GlobalID) */
9990
+ /** @description Pagination cursor returned by a previous request */
9991
9991
  cursor?: string | null;
9992
9992
  /** @description If true, include full span details for each trace. This significantly increases response size and query latency, especially with large page sizes. Prefer fetching spans lazily for individual traces when possible. */
9993
9993
  include_spans?: boolean;
@@ -98,6 +98,13 @@ export const LIST_PROJECT_TRACES: RouteRequirement = {
98
98
  minServerVersion: [13, 15, 0],
99
99
  };
100
100
 
101
+ export const TRANSFER_TRACES: RouteRequirement = {
102
+ kind: "route",
103
+ method: "POST",
104
+ path: "/v1/traces/transfer",
105
+ minServerVersion: [20, 4, 0],
106
+ };
107
+
101
108
  export const GET_SPANS_BY_ATTRIBUTE: ParameterRequirement = {
102
109
  kind: "parameter",
103
110
  parameterName: "attribute",
@@ -227,6 +234,7 @@ export const ALL_REQUIREMENTS: readonly CapabilityRequirement[] = [
227
234
  GET_SPANS_FILTERS,
228
235
  GET_SPANS_BY_ATTRIBUTE,
229
236
  LIST_PROJECT_TRACES,
237
+ TRANSFER_TRACES,
230
238
  DATASET_UPLOAD_EXAMPLE_IDS,
231
239
  ADD_TRACE_NOTE_IDENTIFIER,
232
240
  ADD_SPAN_NOTE_IDENTIFIER,
@@ -1 +1,2 @@
1
1
  export * from "./getProjects";
2
+ export * from "./setProjectRetentionPolicy";
@@ -0,0 +1,80 @@
1
+ import invariant from "tiny-invariant";
2
+
3
+ import type { components } from "../__generated__/api/v1";
4
+ import { createClient } from "../client";
5
+ import type { ClientFn } from "../types/core";
6
+ import type { ProjectIdentifier } from "../types/projects";
7
+ import { resolveProjectIdentifier } from "../types/projects";
8
+
9
+ /**
10
+ * The retention-policy assignment returned for a project.
11
+ */
12
+ export type ProjectRetentionPolicyAssignment =
13
+ components["schemas"]["ProjectRetentionPolicyData"];
14
+
15
+ /**
16
+ * Parameters for assigning or resetting a project's retention policy.
17
+ */
18
+ export type SetProjectRetentionPolicyParams = ClientFn &
19
+ ProjectIdentifier & {
20
+ /**
21
+ * The GlobalID of an existing trace retention policy, or `null` to reset
22
+ * the project to the default policy.
23
+ */
24
+ policyId: string | null;
25
+ };
26
+
27
+ /**
28
+ * Assign an existing trace retention policy to a project, or reset the project
29
+ * to the default policy.
30
+ *
31
+ * This helper only changes the project's assignment. It does not create,
32
+ * retrieve, update, or delete retention policies.
33
+ *
34
+ * @param params - The project and policy assignment.
35
+ * @param params.project - A project name or GlobalID.
36
+ * @param params.projectId - A project GlobalID.
37
+ * @param params.projectName - A project name.
38
+ * @param params.policyId - An existing policy GlobalID, or `null` to reset.
39
+ * @param params.client - An optional Phoenix client instance.
40
+ * @returns The project's resulting retention-policy assignment.
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * import { setProjectRetentionPolicy } from "@arizeai/phoenix-client/projects";
45
+ *
46
+ * await setProjectRetentionPolicy({
47
+ * projectName: "support-bot",
48
+ * policyId: "UHJvamVjdFRyYWNlUmV0ZW50aW9uUG9saWN5OjI=",
49
+ * });
50
+ *
51
+ * await setProjectRetentionPolicy({
52
+ * projectId: "UHJvamVjdDox",
53
+ * policyId: null,
54
+ * });
55
+ * ```
56
+ */
57
+ export async function setProjectRetentionPolicy(
58
+ params: SetProjectRetentionPolicyParams
59
+ ): Promise<ProjectRetentionPolicyAssignment> {
60
+ const client = params.client ?? createClient();
61
+ const projectIdentifier = resolveProjectIdentifier(params);
62
+
63
+ const { data, error } = await client.PATCH(
64
+ "/v1/projects/{project_identifier}/retention",
65
+ {
66
+ params: {
67
+ path: {
68
+ project_identifier: projectIdentifier,
69
+ },
70
+ },
71
+ body: {
72
+ policy_id: params.policyId,
73
+ },
74
+ }
75
+ );
76
+
77
+ if (error) throw error;
78
+ invariant(data?.data, "Failed to set project retention policy");
79
+ return data.data;
80
+ }
@@ -22,7 +22,7 @@ export interface GetTracesParams extends ClientFn {
22
22
  order?: "asc" | "desc";
23
23
  /** Maximum number of traces to return */
24
24
  limit?: number;
25
- /** Pagination cursor (Trace GlobalID) */
25
+ /** Pagination cursor */
26
26
  cursor?: string | null;
27
27
  /** If true, include full span details for each trace */
28
28
  includeSpans?: boolean;
@@ -2,4 +2,5 @@ export * from "./addTraceAnnotation";
2
2
  export * from "./addTraceNote";
3
3
  export * from "./getTraces";
4
4
  export * from "./logTraceAnnotations";
5
+ export * from "./transferTraces";
5
6
  export type { TraceAnnotation } from "./types";
@@ -0,0 +1,89 @@
1
+ import { createClient } from "../client";
2
+ import { TRANSFER_TRACES } from "../constants/serverRequirements";
3
+ import type { ClientFn } from "../types/core";
4
+ import { ensureServerCapability } from "../utils/serverVersionUtils";
5
+
6
+ /**
7
+ * Parameters for moving traces to another project.
8
+ */
9
+ export interface TransferTracesParams extends ClientFn {
10
+ /**
11
+ * Trace GlobalIDs or OpenTelemetry trace IDs to move. All traces must
12
+ * currently belong to the same source project.
13
+ */
14
+ traceIdentifiers: string[];
15
+ /**
16
+ * The destination project name or GlobalID.
17
+ */
18
+ destinationProjectIdentifier: string;
19
+ }
20
+
21
+ /**
22
+ * The result of moving traces to another project.
23
+ */
24
+ export interface TransferTracesResult {
25
+ /** The number of distinct traces moved. */
26
+ transferredTraceCount: number;
27
+ /** The destination project's GlobalID. */
28
+ destinationProjectId: string;
29
+ }
30
+
31
+ /**
32
+ * Move traces from one project to another.
33
+ *
34
+ * This operation re-parents the traces; it does not copy them. After the move,
35
+ * the traces no longer appear in their original project. Every trace must
36
+ * currently belong to the same source project.
37
+ *
38
+ * @param params - The parameters for moving traces.
39
+ * @param params.traceIdentifiers - Trace GlobalIDs or OpenTelemetry trace IDs to move.
40
+ * @param params.destinationProjectIdentifier - The destination project name or GlobalID.
41
+ * @returns The number of traces moved and the destination project's GlobalID.
42
+ * @throws {RangeError} If no trace identifiers are provided.
43
+ * @throws {HttpError} If a trace or destination project is missing, the traces
44
+ * belong to multiple source projects, or the transfer otherwise fails.
45
+ *
46
+ * @requires Phoenix server >= 20.4.0
47
+ *
48
+ * @example
49
+ * ```ts
50
+ * import { transferTraces } from "@arizeai/phoenix-client/traces";
51
+ *
52
+ * const result = await transferTraces({
53
+ * traceIdentifiers: ["8f3a...", "VHJhY2U6Mg=="],
54
+ * destinationProjectIdentifier: "production",
55
+ * });
56
+ *
57
+ * console.log(result.transferredTraceCount);
58
+ * console.log(result.destinationProjectId);
59
+ * ```
60
+ */
61
+ export async function transferTraces({
62
+ client: _client,
63
+ traceIdentifiers,
64
+ destinationProjectIdentifier,
65
+ }: TransferTracesParams): Promise<TransferTracesResult> {
66
+ if (traceIdentifiers.length === 0) {
67
+ throw new RangeError("At least one trace identifier is required");
68
+ }
69
+
70
+ const client = _client ?? createClient();
71
+ await ensureServerCapability({ client, requirement: TRANSFER_TRACES });
72
+
73
+ const { data, error } = await client.POST("/v1/traces/transfer", {
74
+ body: {
75
+ trace_identifiers: traceIdentifiers,
76
+ destination_project_identifier: destinationProjectIdentifier,
77
+ },
78
+ });
79
+
80
+ if (error) throw error;
81
+ if (!data?.data) {
82
+ throw new Error("Failed to transfer traces: no data returned");
83
+ }
84
+
85
+ return {
86
+ transferredTraceCount: data.data.transferred_trace_count,
87
+ destinationProjectId: data.data.destination_project_id,
88
+ };
89
+ }
@@ -0,0 +1,39 @@
1
+ import invariant from "tiny-invariant";
2
+
3
+ import type { components } from "../__generated__/api/v1";
4
+ import { createClient } from "../client";
5
+ import type { ClientFn } from "../types/core";
6
+
7
+ /** The user profile returned for the current Phoenix client credentials. */
8
+ export type CurrentUser =
9
+ components["schemas"]["GetViewerResponseBody"]["data"];
10
+
11
+ /**
12
+ * Get the currently authenticated user.
13
+ *
14
+ * When authentication is disabled, Phoenix returns an anonymous user with
15
+ * `auth_method: "ANONYMOUS"`.
16
+ *
17
+ * @param params - The parameters for fetching the current user.
18
+ * @param params.client - An optional Phoenix client instance.
19
+ * @returns The current user's generated API profile shape.
20
+ * @throws {HttpError} If the request is not authenticated or is forbidden.
21
+ *
22
+ * @example
23
+ * ```ts
24
+ * import { getCurrentUser } from "@arizeai/phoenix-client/users";
25
+ *
26
+ * const user = await getCurrentUser();
27
+ * console.log(user.auth_method);
28
+ * ```
29
+ */
30
+ export async function getCurrentUser({
31
+ client: _client,
32
+ }: ClientFn = {}): Promise<CurrentUser> {
33
+ const client = _client ?? createClient();
34
+ const { data, error } = await client.GET("/v1/user");
35
+
36
+ if (error) throw error;
37
+ invariant(data?.data, "Failed to get current user");
38
+ return data.data;
39
+ }
@@ -0,0 +1 @@
1
+ export * from "./getCurrentUser";