@arizeai/phoenix-evals
Version:
A library for running evaluations for AI use cases
58 lines (54 loc) • 1.8 kB
text/typescript
import { generateObject } from "ai";
import { z } from "zod";
import { getTelemetryIntegrations, tracer } from "../telemetry";
import type { ClassificationResult, WithLLM } from "../types/evals";
import type { WithTelemetry } from "../types/otel";
import type { WithPrompt } from "../types/prompts";
export type ClassifyArgs = WithLLM &
WithTelemetry &
WithPrompt & {
/**
* The labels to classify the example into. E.x. ["correct", "incorrect"]
*/
labels: [string, ...string[]];
/**
* The name of the schema for generating the label and explanation.
*/
schemaName?: string;
/**
* The description of the schema for generating the label and explanation.
*/
schemaDescription?: string;
};
/**
* A function that leverages an llm to perform a classification
*/
export async function generateClassification(
args: ClassifyArgs
): Promise<ClassificationResult> {
const { labels, model, schemaName, schemaDescription, telemetry, ...prompt } =
args;
const telemetryOptions = {
isEnabled: telemetry?.isEnabled ?? true,
functionId: "generateClassification",
integrations: getTelemetryIntegrations(telemetry?.tracer ?? tracer),
};
const result = await generateObject({
model,
schemaName,
schemaDescription,
schema: z.object({
explanation: z.string(), // We place the explanation in hopes it uses reasoning to explain the label.
label: z.enum(labels),
}),
telemetry: telemetryOptions,
// AI SDK 7 rejects system messages inside `messages` by default; keep
// accepting them since prompt templates may include system messages.
allowSystemInMessages: true,
...prompt,
});
return {
label: result.object.label,
explanation: result.object.explanation,
};
}