@arizeai/phoenix-client

TypeScript client for the Arize Phoenix API. This package is still under active development and is subject to change.

Installation

npm install @arizeai/phoenix-client

Configuration

The client automatically reads environment variables from your environment, if available.

Environment Variables:

  • PHOENIX_HOST - The base URL of the Phoenix API

  • PHOENIX_API_KEY - The API key to use for authentication

  • PHOENIX_CLIENT_HEADERS - Custom headers to add to all requests (JSON stringified object)

PHOENIX_HOST='http://localhost:6006' PHOENIX_API_KEY='xxxxxx' npx tsx examples/list_datasets.ts
# emits the following request:
# GET http://localhost:6006/v1/datasets
# headers: {
#   "Authorization": "Bearer xxxxxx",
# }

You can also pass configuration options directly to the client, which take priority over environment variables:

const phoenix = createClient({
  options: {
    baseUrl: "http://localhost:6006",
    headers: {
      Authorization: "Bearer xxxxxx",
    },
  },
});

Prompts

The prompts export provides utilities for working with prompts for LLMs, including version control and reuse.

Creating a Prompt

Use createPrompt to create a prompt in Phoenix for version control and reuse:

import { createPrompt, promptVersion } from "@arizeai/phoenix-client/prompts";

const version = createPrompt({
  name: "my-prompt",
  description: "test-description",
  version: promptVersion({
    description: "version description here",
    modelProvider: "OPENAI",
    modelName: "gpt-3.5-turbo",
    template: [
      {
        role: "user",
        content: "{{ question }}",
      },
    ],
    invocationParameters: {
      temperature: 0.8,
    },
  }),
});

Prompts pushed to Phoenix are versioned and can be tagged.

Retrieving a Prompt

Use getPrompt to pull a prompt from Phoenix:

import { getPrompt } from "@arizeai/phoenix-client/prompts";

const prompt = await getPrompt({ name: "my-prompt" });
// Returns a strongly-typed prompt object

const promptByTag = await getPrompt({ tag: "production", name: "my-prompt" });
// Filter by tag

const promptByVersionId = await getPrompt({
  versionId: "1234567890",
});
// Filter by prompt version ID

Using Prompts with LLM Provider SDKs

The toSDK helper converts a Phoenix Prompt to the format expected by LLM provider SDKs.

Supported SDKs:

  • Vercel AI SDK: ai

  • OpenAI: openai

  • Anthropic: anthropic

import { generateText } from "ai";
import { openai } from "@ai-sdk/openai";
import { getPrompt, toSDK } from "@arizeai/phoenix-client/prompts";

const prompt = await getPrompt({ name: "my-prompt" });
const promptAsAI = toSDK({
  sdk: "ai",
  variables: {
    "my-variable": "my-value",
  },
  prompt,
});

const response = await generateText({
  model: openai(prompt.model_name),
  ...promptAsAI,
});

REST Endpoints

The client provides a REST API for all endpoints defined in the Phoenix OpenAPI spec.

Endpoints are accessible via strongly-typed string literals with TypeScript auto-completion:

import { createClient } from "@arizeai/phoenix-client";

const phoenix = createClient();

// Get all datasets
const datasets = await phoenix.GET("/v1/datasets");

// Get specific prompt
const prompt = await phoenix.GET("/v1/prompts/{prompt_identifier}/latest", {
  params: {
    path: {
      prompt_identifier: "my-prompt",
    },
  },
});

Datasets

Create and manage datasets, which are collections of examples used for experiments and evaluation.

Creating a Dataset

import { createDataset } from "@arizeai/phoenix-client/datasets";

const { datasetId } = await createDataset({
  name: "questions",
  description: "a simple dataset of questions",
  examples: [
    {
      input: { question: "What is the capital of France" },
      output: { answer: "Paris" },
      metadata: {},
    },
    {
      input: { question: "What is the capital of the USA" },
      output: { answer: "Washington D.C." },
      metadata: {},
    },
  ],
});

Experiments

Run and evaluate tasks on datasets for benchmarking models, evaluating outputs, and tracking experiment results.

Running an Experiment

import { createDataset } from "@arizeai/phoenix-client/datasets";
import { asEvaluator, runExperiment } from "@arizeai/phoenix-client/experiments";

// 1. Create a dataset
const { datasetId } = await createDataset({
  name: "names-dataset",
  description: "a simple dataset of names",
  examples: [
    {
      input: { name: "John" },
      output: { text: "Hello, John!" },
      metadata: {},
    },
    {
      input: { name: "Jane" },
      output: { text: "Hello, Jane!" },
      metadata: {},
    },
  ],
});

// 2. Define a task to run on each example
const task = async (example) => `hello ${example.input.name}`;

// 3. Define evaluators
const evaluators = [
  asEvaluator({
    name: "matches",
    kind: "CODE",
    evaluate: async ({ output, expected }) => {
      const matches = output === expected?.text;
      return {
        label: matches ? "matches" : "does not match",
        score: matches ? 1 : 0,
        explanation: matches
          ? "output matches expected"
          : "output does not match expected",
        metadata: {},
      };
    },
  }),
  asEvaluator({
    name: "contains-hello",
    kind: "CODE",
    evaluate: async ({ output }) => {
      const matches = typeof output === "string" && output.includes("hello");
      return {
        label: matches ? "contains hello" : "does not contain hello",
        score: matches ? 1 : 0,
        explanation: matches
          ? "output contains hello"
          : "output does not contain hello",
        metadata: {},
      };
    },
  }),
];

// 4. Run the experiment
const experiment = await runExperiment({
  dataset: { datasetId },
  task,
  evaluators,
});

Note: Tasks and evaluators are instrumented using OpenTelemetry. You can view detailed traces of experiment runs and evaluations directly in the Phoenix UI for debugging and performance analysis.

Compatibility

This package utilizes openapi-ts to generate types from the Phoenix OpenAPI spec.

Compatibility Table:

Phoenix Client Version
Phoenix Server Version

^2.0.0

^9.0.0

^1.0.0

^8.0.0

Requirements: This package only works with arize-phoenix server 8.0.0 and above.

Last updated

Was this helpful?