@anvia/core 1.0.0 → 1.0.1
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/dist/agent/index.js +8 -8
- package/dist/{chunk-LTXABCOO.js → chunk-DHJL44R2.js} +2 -2
- package/dist/{chunk-3ZLM6OAZ.js → chunk-E2J7MLAB.js} +7 -7
- package/dist/{chunk-3ZLM6OAZ.js.map → chunk-E2J7MLAB.js.map} +1 -1
- package/dist/{chunk-SJMSS5SI.js → chunk-EO2GECYH.js} +3 -3
- package/dist/{chunk-6BBOCFHV.js → chunk-GBCKSWQF.js} +2 -2
- package/dist/{chunk-3SKZ2BKP.js → chunk-IWJK7JB5.js} +2 -2
- package/dist/{chunk-3RM57ZT2.js → chunk-IZNOP6JG.js} +2 -2
- package/dist/chunk-IZNOP6JG.js.map +1 -0
- package/dist/{chunk-ZA564323.js → chunk-K5L7R7XM.js} +2 -2
- package/dist/{chunk-7PHMK7W4.js → chunk-TB5EKZM7.js} +1 -1
- package/dist/chunk-TB5EKZM7.js.map +1 -0
- package/dist/{chunk-YA7BMX7D.js → chunk-XMVOBX43.js} +2 -2
- package/dist/{chunk-EMZKPRE6.js → chunk-YFJ4NHV6.js} +2 -2
- package/dist/chunk-YFJ4NHV6.js.map +1 -0
- package/dist/completion/index.js +1 -1
- package/dist/embeddings/index.js +2 -2
- package/dist/evals/index.js +5 -5
- package/dist/evals/index.js.map +1 -1
- package/dist/extractor/index.js +2 -2
- package/dist/index.js +9 -9
- package/dist/internal/agent.js +8 -8
- package/dist/memory/index.js +2 -2
- package/dist/observability/index.js +2 -2
- package/dist/pipeline/index.js +3 -3
- package/dist/skills/index.js +5 -5
- package/dist/tool/index.js +4 -4
- package/dist/vector-store/index.js +3 -3
- package/package.json +1 -1
- package/dist/chunk-3RM57ZT2.js.map +0 -1
- package/dist/chunk-7PHMK7W4.js.map +0 -1
- package/dist/chunk-EMZKPRE6.js.map +0 -1
- /package/dist/{chunk-LTXABCOO.js.map → chunk-DHJL44R2.js.map} +0 -0
- /package/dist/{chunk-SJMSS5SI.js.map → chunk-EO2GECYH.js.map} +0 -0
- /package/dist/{chunk-6BBOCFHV.js.map → chunk-GBCKSWQF.js.map} +0 -0
- /package/dist/{chunk-3SKZ2BKP.js.map → chunk-IWJK7JB5.js.map} +0 -0
- /package/dist/{chunk-ZA564323.js.map → chunk-K5L7R7XM.js.map} +0 -0
- /package/dist/{chunk-YA7BMX7D.js.map → chunk-XMVOBX43.js.map} +0 -0
package/dist/evals/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/evals/advanced-metrics.ts","../../src/evals/format.ts","../../src/evals/judge.ts","../../src/evals/outcome.ts","../../src/evals/selectors.ts","../../src/evals/agent-target.ts","../../src/evals/reporting.ts","../../src/evals/runner.ts","../../src/evals/cli.ts","../../src/evals/metric.ts","../../src/evals/metrics.ts","../../src/evals/suite.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type { CompletionModel, JsonObject, JsonValue, Message, Usage } from \"../completion\";\nimport { isJsonValue, Usage as UsageValue } from \"../completion\";\nimport { mapWithConcurrency } from \"../internal/concurrency\";\nimport type { ZodSchema } from \"../schema\";\nimport { errorMessage, formatValue } from \"./format\";\nimport { addUsage, evaluationMetadata, type JudgeResult, runJudge } from \"./judge\";\nimport { EvalOutcome, type EvalOutcome as EvalOutcomeType } from \"./outcome\";\nimport { resolveActualText, resolveExpected } from \"./selectors\";\nimport type {\n EvalCaseRequirements,\n EvalMetric,\n EvalMetricArgs,\n EvalTurn,\n SelectorOrValue,\n ValueSelector,\n} from \"./types\";\n\ntype Verdict = {\n verdict: \"yes\" | \"no\" | \"idk\";\n reason?: string | undefined;\n};\n\nconst statementsSchema = z.object({ statements: z.array(z.string()) });\nconst factsSchema = z.object({ facts: z.array(z.string()) });\nconst questionsSchema = z.object({ questions: z.array(z.string()) });\nconst answersSchema = z.object({ answers: z.array(z.enum([\"yes\", \"no\"])) });\nconst verdictsSchema = z.object({\n verdicts: z.array(\n z.object({\n verdict: z.enum([\"yes\", \"no\", \"idk\"]),\n reason: z.string().optional(),\n }),\n ),\n});\nconst binaryVerdictsSchema = z.object({\n verdicts: z.array(\n z.object({\n verdict: z.enum([\"yes\", \"no\"]),\n reason: z.string(),\n }),\n ),\n});\nconst binaryVerdictSchema = z.object({\n verdict: z.enum([\"yes\", \"no\"]),\n reason: z.string(),\n});\nconst reasonSchema = z.object({ reason: z.string() });\nconst abstentionJudgmentSchema = z.object({\n behavior: z.enum([\"abstention\", \"confident_answer\"]),\n grounded: z.boolean(),\n reason: z.string(),\n});\n\ntype LlmEvalOptions<Input, Output, Expected = unknown> = {\n name?: string | undefined;\n required?: boolean | undefined;\n model: CompletionModel;\n threshold?: number | undefined;\n strictMode?: boolean | undefined;\n includeReason?: boolean | undefined;\n retries?: number | undefined;\n input?: ValueSelector<Input, Output, Expected, string> | undefined;\n actual?: ValueSelector<Input, Output, Expected, string> | undefined;\n};\n\nexport type AnswerRelevancyOptions<Input, Output, Expected = unknown> = LlmEvalOptions<\n Input,\n Output,\n Expected\n>;\n\nexport function answerRelevancy<\n Input,\n Output,\n Expected = unknown,\n const Name extends string = string,\n>(\n options: AnswerRelevancyOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, number, Expected, Name> {\n const config = metricConfig<Name>(options, \"answer_relevancy\");\n return numericMetric(config.name, config, \"higher_is_better\", async (args) => {\n try {\n const input = await resolveInput(options.input, args);\n const actual = await resolveActualText(options.actual, args);\n const statementResult = await runJudge({\n model: options.model,\n schema: statementsSchema,\n instructions:\n \"Break the answer into concise, independently assessable statements. Return every substantive statement using the schema.\",\n prompt: `Answer:\\n${actual}`,\n retries: config.retries,\n });\n const statements = statementResult.data.statements;\n let verdicts: Verdict[] = [];\n let usage = statementResult.usage;\n if (statements.length > 0) {\n const verdictResult = await runJudge({\n model: options.model,\n schema: verdictsSchema,\n instructions:\n \"Classify each answer statement for relevance to the user input. Use yes for relevant, no for irrelevant, and idk only when relevance is genuinely indeterminate. Preserve order and return one verdict per statement.\",\n prompt: jsonPrompt({ input, statements }),\n retries: config.retries,\n });\n verdicts = verdictResult.data.verdicts;\n assertSameLength(\"answer relevancy verdicts\", statements, verdicts);\n usage = addUsage(usage, verdictResult.usage);\n }\n const score =\n verdicts.length === 0\n ? 1\n : verdicts.filter((verdict) => verdict.verdict !== \"no\").length / verdicts.length;\n const serializedVerdicts = serializeVerdicts(verdicts);\n const reasonResult = await maybeReason({\n model: options.model,\n includeReason: config.includeReason,\n retries: config.retries,\n metric: \"answer relevancy\",\n score,\n evidence: { input, verdicts: serializedVerdicts },\n });\n usage = addUsage(usage, reasonResult.usage);\n return higherOutcome({\n score,\n threshold: config.threshold,\n strictMode: config.strictMode,\n comment: reasonResult.reason,\n details: { statements, verdicts: serializedVerdicts },\n usage,\n });\n } catch (error) {\n return EvalOutcome.invalid(errorMessage(error));\n }\n });\n}\n\nexport type PromptAlignmentOptions<Input, Output, Expected = unknown> = LlmEvalOptions<\n Input,\n Output,\n Expected\n> & {\n promptInstructions: string[];\n};\n\nexport function promptAlignment<\n Input,\n Output,\n Expected = unknown,\n const Name extends string = string,\n>(\n options: PromptAlignmentOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, number, Expected, Name> {\n if (options.promptInstructions.length === 0) {\n throw new TypeError(\"promptAlignment requires at least one prompt instruction.\");\n }\n const config = metricConfig<Name>(options, \"prompt_alignment\");\n return numericMetric(config.name, config, \"higher_is_better\", async (args) => {\n try {\n const input = await resolveInput(options.input, args);\n const actual = await resolveActualText(options.actual, args);\n const verdictResult = await runJudge({\n model: options.model,\n schema: binaryVerdictsSchema,\n instructions:\n \"Determine whether the answer follows each prompt instruction. Preserve order and return exactly one yes or no verdict per instruction.\",\n prompt: jsonPrompt({ input, actual, instructions: options.promptInstructions }),\n retries: config.retries,\n });\n const verdicts = verdictResult.data.verdicts;\n assertSameLength(\"prompt alignment verdicts\", options.promptInstructions, verdicts);\n const score =\n verdicts.filter((verdict) => verdict.verdict === \"yes\").length / verdicts.length;\n const reasonResult = await maybeReason({\n model: options.model,\n includeReason: config.includeReason,\n retries: config.retries,\n metric: \"prompt alignment\",\n score,\n evidence: { verdicts },\n });\n const usage = addUsage(verdictResult.usage, reasonResult.usage);\n return higherOutcome({\n score,\n threshold: config.threshold,\n strictMode: config.strictMode,\n comment: reasonResult.reason,\n details: { promptInstructions: options.promptInstructions, verdicts },\n usage,\n });\n } catch (error) {\n return EvalOutcome.invalid(errorMessage(error));\n }\n });\n}\n\nexport type JsonCorrectnessOptions<Input, Output, SchemaOutput, Expected = unknown> = {\n name?: string | undefined;\n required?: boolean | undefined;\n schema: ZodSchema<SchemaOutput>;\n model?: CompletionModel | undefined;\n threshold?: number | undefined;\n strictMode?: boolean | undefined;\n includeReason?: boolean | undefined;\n retries?: number | undefined;\n actual?: ValueSelector<Input, Output, Expected, string> | undefined;\n};\n\nexport function jsonCorrectness<\n Input,\n Output,\n SchemaOutput,\n Expected = unknown,\n const Name extends string = string,\n>(\n options: JsonCorrectnessOptions<Input, Output, SchemaOutput, Expected> & {\n name?: Name | undefined;\n },\n): EvalMetric<Input, Output, number, Expected, Name> {\n const threshold = validateThreshold(options.threshold ?? 0.5);\n const retries = validateRetries(options.retries ?? 0);\n const includeReason = options.includeReason ?? true;\n const strictMode = options.strictMode ?? true;\n return numericMetric(\n (options.name ?? \"json_correctness\") as Name,\n {\n threshold: strictMode ? 1 : threshold,\n required: options.required ?? true,\n },\n \"higher_is_better\",\n async (args) => {\n try {\n const actual = await resolveActualText(options.actual, args);\n let parsed: unknown;\n let validationError: string | undefined;\n try {\n parsed = JSON.parse(actual);\n if (!isJsonValue(parsed)) {\n throw new TypeError(\"Generated output is not a JSON value.\");\n }\n const result = options.schema.safeParse(parsed);\n if (!result.success) {\n validationError = z.prettifyError(result.error);\n }\n } catch (error) {\n validationError = errorMessage(error);\n }\n const score = validationError === undefined ? 1 : 0;\n let comment: string | undefined;\n let usage = UsageValue.empty();\n if (includeReason) {\n if (score === 1) {\n comment = \"The generated JSON is syntactically valid and matches the expected schema.\";\n } else if (options.model === undefined) {\n comment = validationError;\n } else {\n const reasonResult = await runJudge({\n model: options.model,\n schema: reasonSchema,\n instructions:\n \"Briefly explain why the generated JSON does not match the expected schema. Focus on actionable syntax, field, and type problems.\",\n prompt: jsonPrompt({ actual, validationError }),\n retries,\n });\n comment = reasonResult.data.reason;\n usage = reasonResult.usage;\n }\n }\n return higherOutcome({\n score,\n threshold,\n strictMode,\n comment,\n details: validationError === undefined ? {} : { validationError },\n usage,\n });\n } catch (error) {\n return EvalOutcome.invalid(errorMessage(error));\n }\n },\n );\n}\n\nexport type HallucinationOptions<Input, Output, Expected = unknown> = LlmEvalOptions<\n Input,\n Output,\n Expected\n> & {\n context?: SelectorOrValue<Input, Output, Expected, string[]> | undefined;\n};\n\nexport function hallucination<\n Input,\n Output,\n Expected = unknown,\n const Name extends string = string,\n>(\n options: HallucinationOptions<Input, Output, Expected> & {\n context: Exclude<HallucinationOptions<Input, Output, Expected>[\"context\"], undefined>;\n name?: Name | undefined;\n },\n): EvalMetric<Input, Output, number, Expected, Name>;\nexport function hallucination<\n Input,\n Output,\n Expected = unknown,\n const Name extends string = string,\n>(\n options: Omit<HallucinationOptions<Input, Output, Expected>, \"context\"> & {\n context?: undefined;\n name?: Name | undefined;\n },\n): EvalMetric<Input, Output, number, Expected, Name, { context: string[] }>;\nexport function hallucination<\n Input,\n Output,\n Expected = unknown,\n const Name extends string = string,\n>(\n options: HallucinationOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, number, Expected, Name, EvalCaseRequirements> {\n const config = metricConfig<Name>(options, \"hallucination\");\n return numericMetric(config.name, config, \"lower_is_better\", async (args) => {\n try {\n const actual = await resolveActualText(options.actual, args);\n const context = await resolveStringList(options.context, args.case.context, args, \"context\");\n const verdictResult = await runJudge({\n model: options.model,\n schema: binaryVerdictsSchema,\n instructions:\n \"Compare the answer with each trusted context. Use yes when the answer is factually aligned with that context and no when it contradicts it. Preserve order and return one verdict per context.\",\n prompt: jsonPrompt({ actual, context }),\n retries: config.retries,\n });\n const verdicts = verdictResult.data.verdicts;\n assertSameLength(\"hallucination verdicts\", context, verdicts);\n const score = verdicts.filter((verdict) => verdict.verdict === \"no\").length / verdicts.length;\n const reasonResult = await maybeReason({\n model: options.model,\n includeReason: config.includeReason,\n retries: config.retries,\n metric: \"hallucination\",\n score,\n evidence: { verdicts },\n });\n const usage = addUsage(verdictResult.usage, reasonResult.usage);\n return lowerOutcome({\n score,\n threshold: config.threshold,\n strictMode: config.strictMode,\n comment: reasonResult.reason,\n details: { verdicts },\n usage,\n });\n } catch (error) {\n return EvalOutcome.invalid(errorMessage(error));\n }\n });\n}\n\nexport type FaithfulnessOptions<Input, Output, Expected = unknown> = LlmEvalOptions<\n Input,\n Output,\n Expected\n> & {\n retrievalContext?: SelectorOrValue<Input, Output, Expected, string[]> | undefined;\n truthsExtractionLimit?: number | undefined;\n penalizeAmbiguousClaims?: boolean | undefined;\n};\n\nexport function faithfulness<Input, Output, Expected = unknown, const Name extends string = string>(\n options: FaithfulnessOptions<Input, Output, Expected> & {\n name?: Name | undefined;\n retrievalContext: Exclude<\n FaithfulnessOptions<Input, Output, Expected>[\"retrievalContext\"],\n undefined\n >;\n },\n): EvalMetric<Input, Output, number, Expected, Name>;\nexport function faithfulness<Input, Output, Expected = unknown, const Name extends string = string>(\n options: Omit<FaithfulnessOptions<Input, Output, Expected>, \"retrievalContext\"> & {\n name?: Name | undefined;\n retrievalContext?: undefined;\n },\n): EvalMetric<Input, Output, number, Expected, Name, { retrievalContext: string[] }>;\nexport function faithfulness<Input, Output, Expected = unknown, const Name extends string = string>(\n options: FaithfulnessOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, number, Expected, Name, EvalCaseRequirements> {\n const config = metricConfig<Name>(options, \"faithfulness\");\n const truthsExtractionLimit = validateOptionalNonNegativeInteger(\n options.truthsExtractionLimit,\n \"truthsExtractionLimit\",\n );\n return numericMetric(config.name, config, \"higher_is_better\", async (args) => {\n try {\n const actual = await resolveActualText(options.actual, args);\n const retrievalContext = await resolveStringList(\n options.retrievalContext,\n args.case.retrievalContext,\n args,\n \"retrievalContext\",\n );\n const [truthResult, claimResult] = await Promise.all([\n runJudge({\n model: options.model,\n schema: factsSchema,\n instructions: truthsExtractionInstructions(truthsExtractionLimit),\n prompt: jsonPrompt({ retrievalContext }),\n retries: config.retries,\n }),\n runJudge({\n model: options.model,\n schema: factsSchema,\n instructions:\n \"Extract every concise factual claim made by the answer. Return claims in the facts array and omit opinions or purely stylistic text.\",\n prompt: `Answer:\\n${actual}`,\n retries: config.retries,\n }),\n ]);\n const truths = limitValues(truthResult.data.facts, truthsExtractionLimit);\n const claims = claimResult.data.facts;\n let verdicts: Verdict[] = [];\n let usage = addUsage(truthResult.usage, claimResult.usage);\n if (claims.length > 0) {\n const verdictResult = await runJudge({\n model: options.model,\n schema: verdictsSchema,\n instructions:\n \"Determine whether each answer claim is supported by the supplied truths. Use yes for supported, no for contradicted or unsupported, and idk for genuinely ambiguous support. Preserve order and return one verdict per claim.\",\n prompt: jsonPrompt({ truths, claims }),\n retries: config.retries,\n });\n verdicts = verdictResult.data.verdicts;\n assertSameLength(\"faithfulness verdicts\", claims, verdicts);\n usage = addUsage(usage, verdictResult.usage);\n }\n const penalizeAmbiguousClaims = options.penalizeAmbiguousClaims ?? false;\n const supported = verdicts.filter(\n (verdict) =>\n verdict.verdict === \"yes\" || (verdict.verdict === \"idk\" && !penalizeAmbiguousClaims),\n ).length;\n const score = verdicts.length === 0 ? 1 : supported / verdicts.length;\n const serializedVerdicts = serializeVerdicts(verdicts);\n const reasonResult = await maybeReason({\n model: options.model,\n includeReason: config.includeReason,\n retries: config.retries,\n metric: \"faithfulness\",\n score,\n evidence: { verdicts: serializedVerdicts, penalizeAmbiguousClaims },\n });\n usage = addUsage(usage, reasonResult.usage);\n return higherOutcome({\n score,\n threshold: config.threshold,\n strictMode: config.strictMode,\n comment: reasonResult.reason,\n details: { truths, claims, verdicts: serializedVerdicts, penalizeAmbiguousClaims },\n usage,\n });\n } catch (error) {\n return EvalOutcome.invalid(errorMessage(error));\n }\n });\n}\n\nexport type AbstentionCategory =\n | \"correct_abstention\"\n | \"unnecessary_abstention\"\n | \"unsupported_confident_answer\"\n | \"correct_grounded_answer\";\n\nexport type AbstentionOptions<Input, Output, Expected = unknown> = {\n name?: string | undefined;\n required?: boolean | undefined;\n model: CompletionModel;\n shouldAbstain: SelectorOrValue<Input, Output, Expected, boolean>;\n context?: SelectorOrValue<Input, Output, Expected, string[]> | undefined;\n actual?: ValueSelector<Input, Output, Expected, string> | undefined;\n includeReason?: boolean | undefined;\n retries?: number | undefined;\n};\n\nexport function abstention<Input, Output, Expected = unknown, const Name extends string = string>(\n options: AbstentionOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, AbstentionCategory, Expected, Name> {\n const retries = validateRetries(options.retries ?? 0);\n return {\n name: (options.name ?? \"abstention\") as Name,\n required: options.required ?? true,\n dataType: \"CATEGORICAL\",\n async evaluate(args) {\n try {\n const actual = await resolveActualText(options.actual, args);\n const shouldAbstain = await resolveExpected(options.shouldAbstain, args);\n if (typeof shouldAbstain !== \"boolean\") {\n return EvalOutcome.invalid(\"abstention shouldAbstain must resolve to a boolean.\");\n }\n const context = await resolveAbstentionContext(options.context, args);\n if (!shouldAbstain && context.length === 0) {\n return EvalOutcome.invalid(\n \"abstention context must be non-empty when shouldAbstain is false.\",\n );\n }\n const judgment = await runJudge({\n model: options.model,\n schema: abstentionJudgmentSchema,\n instructions:\n \"Classify whether the answer abstains or gives a confident answer. For a confident answer, grounded is true only when every substantive factual claim is supported by the supplied context. For an abstention, set grounded to false. Return a concise evidence-based reason.\",\n prompt: jsonPrompt({ actual, context }),\n retries,\n });\n const category = abstentionCategory(\n shouldAbstain,\n judgment.data.behavior,\n judgment.data.grounded,\n );\n const outcomeOptions = {\n comment: options.includeReason === false ? undefined : judgment.data.reason,\n metadata: evaluationMetadata(\n {\n behavior: judgment.data.behavior,\n grounded: judgment.data.grounded,\n shouldAbstain,\n },\n judgment.usage,\n ),\n usage: judgment.usage,\n };\n return category === \"correct_abstention\" || category === \"correct_grounded_answer\"\n ? EvalOutcome.pass(category, outcomeOptions)\n : EvalOutcome.fail(category, outcomeOptions);\n } catch (error) {\n return EvalOutcome.invalid(errorMessage(error));\n }\n },\n };\n}\n\nasync function resolveAbstentionContext<Input, Output, Expected>(\n selectorOrValue: SelectorOrValue<Input, Output, Expected, string[]> | undefined,\n args: EvalMetricArgs<Input, Output, Expected>,\n): Promise<string[]> {\n const context =\n selectorOrValue === undefined\n ? (args.case.retrievalContext ?? [])\n : typeof selectorOrValue === \"function\"\n ? await (selectorOrValue as ValueSelector<Input, Output, Expected, string[]>)(args)\n : selectorOrValue;\n if (!Array.isArray(context) || context.some((value) => typeof value !== \"string\")) {\n throw new TypeError(\"abstention context must be an array of strings.\");\n }\n return context;\n}\n\nfunction abstentionCategory(\n shouldAbstain: boolean,\n behavior: \"abstention\" | \"confident_answer\",\n grounded: boolean,\n): AbstentionCategory {\n if (behavior === \"abstention\") {\n return shouldAbstain ? \"correct_abstention\" : \"unnecessary_abstention\";\n }\n if (shouldAbstain || !grounded) return \"unsupported_confident_answer\";\n return \"correct_grounded_answer\";\n}\n\nexport type SummarizationOptions<Input, Output, Expected = unknown> = LlmEvalOptions<\n Input,\n Output,\n Expected\n> & {\n assessmentQuestions?: string[] | undefined;\n questionCount?: number | undefined;\n truthsExtractionLimit?: number | undefined;\n};\n\nexport function summarization<\n Input,\n Output,\n Expected = unknown,\n const Name extends string = string,\n>(\n options: SummarizationOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, number, Expected, Name> {\n const config = metricConfig<Name>(options, \"summarization\");\n const questionCount = validatePositiveInteger(options.questionCount ?? 5, \"questionCount\");\n const truthsExtractionLimit = validateOptionalNonNegativeInteger(\n options.truthsExtractionLimit,\n \"truthsExtractionLimit\",\n );\n const suppliedQuestions =\n options.assessmentQuestions !== undefined && options.assessmentQuestions.length > 0\n ? [...options.assessmentQuestions]\n : undefined;\n return numericMetric(config.name, config, \"higher_is_better\", async (args) => {\n try {\n const input = await resolveInput(options.input, args);\n const actual = await resolveActualText(options.actual, args);\n const questionPromise: Promise<JudgeResult<{ questions: string[] }>> =\n suppliedQuestions === undefined\n ? runJudge({\n model: options.model,\n schema: questionsSchema,\n instructions: `Generate exactly ${questionCount} important yes-or-no assessment questions whose answers capture the source text's essential information.`,\n prompt: `Source text:\\n${input}`,\n retries: config.retries,\n })\n : Promise.resolve({\n data: { questions: suppliedQuestions },\n usage: UsageValue.empty(),\n });\n const [truthResult, claimResult, questionResult] = await Promise.all([\n runJudge({\n model: options.model,\n schema: factsSchema,\n instructions: truthsExtractionInstructions(truthsExtractionLimit),\n prompt: `Source text:\\n${input}`,\n retries: config.retries,\n }),\n runJudge({\n model: options.model,\n schema: factsSchema,\n instructions:\n \"Extract every concise factual claim made by the summary. Return claims in the facts array.\",\n prompt: `Summary:\\n${actual}`,\n retries: config.retries,\n }),\n questionPromise,\n ]);\n const truths = limitValues(truthResult.data.facts, truthsExtractionLimit);\n const claims = claimResult.data.facts;\n const questions = questionResult.data.questions;\n if (questions.length === 0) {\n throw new Error(\"Summarization assessment questions must not be empty.\");\n }\n const sourceAnswerPromise = runJudge({\n model: options.model,\n schema: answersSchema,\n instructions:\n \"Answer each assessment question using only the supplied text. Return one yes or no answer per question in the same order.\",\n prompt: jsonPrompt({ questions, text: input }),\n retries: config.retries,\n });\n const summaryAnswerPromise = runJudge({\n model: options.model,\n schema: answersSchema,\n instructions:\n \"Answer each assessment question using only the supplied text. Return one yes or no answer per question in the same order.\",\n prompt: jsonPrompt({ questions, text: actual }),\n retries: config.retries,\n });\n const alignmentPromise: Promise<JudgeResult<{ verdicts: Verdict[] }>> =\n claims.length === 0\n ? Promise.resolve({ data: { verdicts: [] }, usage: UsageValue.empty() })\n : runJudge({\n model: options.model,\n schema: verdictsSchema,\n instructions:\n \"Determine whether each summary claim is supported by the source truths. Use yes for supported, no for contradicted, and idk for unsupported filler or ambiguity. Preserve order.\",\n prompt: jsonPrompt({ truths, claims }),\n retries: config.retries,\n });\n const [sourceAnswerResult, summaryAnswerResult, alignmentResult] = await Promise.all([\n sourceAnswerPromise,\n summaryAnswerPromise,\n alignmentPromise,\n ]);\n assertSameLength(\"source assessment answers\", questions, sourceAnswerResult.data.answers);\n assertSameLength(\"summary assessment answers\", questions, summaryAnswerResult.data.answers);\n assertSameLength(\"summarization alignment verdicts\", claims, alignmentResult.data.verdicts);\n const alignmentVerdicts = alignmentResult.data.verdicts;\n const alignmentScore =\n alignmentVerdicts.length === 0\n ? 0\n : alignmentVerdicts.filter((verdict) => verdict.verdict === \"yes\").length /\n alignmentVerdicts.length;\n let coverageTotal = 0;\n let coverageMatched = 0;\n const coverageVerdicts = questions.map((question, index) => {\n const originalVerdict = sourceAnswerResult.data.answers[index] as \"yes\" | \"no\";\n const summaryVerdict = summaryAnswerResult.data.answers[index] as \"yes\" | \"no\";\n if (originalVerdict === \"yes\") {\n coverageTotal += 1;\n if (summaryVerdict === \"yes\") coverageMatched += 1;\n }\n return { question, originalVerdict, summaryVerdict };\n });\n const coverageScore = coverageTotal === 0 ? 0 : coverageMatched / coverageTotal;\n const score = Math.min(alignmentScore, coverageScore);\n const serializedAlignmentVerdicts = serializeVerdicts(alignmentVerdicts);\n const reasonResult = await maybeReason({\n model: options.model,\n includeReason: config.includeReason,\n retries: config.retries,\n metric: \"summarization\",\n score,\n evidence: {\n alignmentVerdicts: serializedAlignmentVerdicts,\n coverageVerdicts,\n alignmentScore,\n coverageScore,\n },\n });\n const usage = addUsage(\n truthResult.usage,\n claimResult.usage,\n questionResult.usage,\n sourceAnswerResult.usage,\n summaryAnswerResult.usage,\n alignmentResult.usage,\n reasonResult.usage,\n );\n return higherOutcome({\n score,\n threshold: config.threshold,\n strictMode: config.strictMode,\n comment: reasonResult.reason,\n details: {\n truths,\n claims,\n assessmentQuestions: questions,\n alignmentVerdicts: serializedAlignmentVerdicts,\n coverageVerdicts,\n scoreBreakdown: { alignment: alignmentScore, coverage: coverageScore },\n },\n usage,\n });\n } catch (error) {\n return EvalOutcome.invalid(errorMessage(error));\n }\n });\n}\n\nexport type GEvalParameter =\n | \"input\"\n | \"actualOutput\"\n | \"expectedOutput\"\n | \"context\"\n | \"retrievalContext\"\n | \"metadata\";\n\nexport type GEvalRubric = {\n scoreRange: readonly [number, number];\n expectedOutcome: string;\n};\n\nexport type GEvalOptions<Input, Output, Expected = unknown> = Omit<\n LlmEvalOptions<Input, Output, Expected>,\n \"name\"\n> & {\n name: string;\n evaluationParams: GEvalParameter[];\n criteria?: string | undefined;\n evaluationSteps?: string[] | undefined;\n rubric?: GEvalRubric[] | undefined;\n expected?: ValueSelector<Input, Output, Expected, unknown> | undefined;\n context?: SelectorOrValue<Input, Output, Expected, string[]> | undefined;\n retrievalContext?: SelectorOrValue<Input, Output, Expected, string[]> | undefined;\n};\n\nexport function gEval<Input, Output, Expected = unknown, const Name extends string = string>(\n options: GEvalOptions<Input, Output, Expected> & { name: Name },\n): EvalMetric<Input, Output, number, Expected, Name> {\n if (options.name.trim().length === 0) throw new TypeError(\"gEval name must not be empty.\");\n if (options.evaluationParams.length === 0) {\n throw new TypeError(\"gEval requires at least one evaluation parameter.\");\n }\n if ((options.criteria === undefined) === (options.evaluationSteps === undefined)) {\n throw new TypeError(\"gEval requires exactly one of criteria or evaluationSteps.\");\n }\n if (options.criteria !== undefined && options.criteria.trim().length === 0) {\n throw new TypeError(\"gEval criteria must not be empty.\");\n }\n if (options.evaluationSteps !== undefined && options.evaluationSteps.length === 0) {\n throw new TypeError(\"gEval evaluationSteps must not be empty.\");\n }\n const config = metricConfig<Name>(options, options.name);\n const rubric = validateRubric(options.rubric);\n const scoreRange =\n rubric.length === 0\n ? ([0, 10] as const)\n : ([rubric[0]?.scoreRange[0] ?? 0, rubric.at(-1)?.scoreRange[1] ?? 10] as const);\n let generatedStepsPromise: Promise<JudgeResult<{ steps: string[] }>> | undefined;\n let generatedUsageClaimed = false;\n\n async function resolveSteps(): Promise<{ steps: string[]; usage: Usage }> {\n if (options.evaluationSteps !== undefined) {\n return { steps: options.evaluationSteps, usage: UsageValue.empty() };\n }\n if (generatedStepsPromise === undefined) {\n generatedStepsPromise = runJudge({\n model: options.model,\n schema: z.object({ steps: z.array(z.string()) }),\n instructions:\n \"Generate three or four concise evaluation steps from the criteria. Explain how the selected parameters should be judged in relation to one another.\",\n prompt: jsonPrompt({ criteria: options.criteria, parameters: options.evaluationParams }),\n retries: config.retries,\n }).catch((error) => {\n generatedStepsPromise = undefined;\n throw error;\n });\n }\n const result = await generatedStepsPromise;\n if (result.data.steps.length === 0) throw new Error(\"G-Eval generated no evaluation steps.\");\n const usage = generatedUsageClaimed ? UsageValue.empty() : result.usage;\n generatedUsageClaimed = true;\n return { steps: result.data.steps, usage };\n }\n\n return numericMetric(config.name, config, \"higher_is_better\", async (args) => {\n try {\n const parameters = await resolveGEvalParameters(options, args);\n const stepsResult = await resolveSteps();\n const scoreResult = await runJudge({\n model: options.model,\n schema: z.object({ score: z.number(), reason: z.string() }),\n instructions: config.strictMode\n ? \"Apply the evaluation steps and return score 1 only for complete compliance, otherwise 0. Give a concise evidence-based reason.\"\n : `Apply the evaluation steps and return an integer score from ${scoreRange[0]} through ${scoreRange[1]}, plus a concise evidence-based reason.`,\n prompt: jsonPrompt({\n evaluationSteps: stepsResult.steps,\n rubric,\n parameters,\n }),\n retries: config.retries,\n });\n const rawScore = scoreResult.data.score;\n if (\n !Number.isFinite(rawScore) ||\n (config.strictMode && rawScore !== 0 && rawScore !== 1) ||\n (!config.strictMode && (rawScore < scoreRange[0] || rawScore > scoreRange[1]))\n ) {\n throw new RangeError(`G-Eval score ${rawScore} is outside the requested range.`);\n }\n const score = config.strictMode\n ? rawScore\n : (rawScore - scoreRange[0]) / (scoreRange[1] - scoreRange[0]);\n const usage = addUsage(stepsResult.usage, scoreResult.usage);\n return higherOutcome({\n score,\n threshold: config.threshold,\n strictMode: config.strictMode,\n comment: config.includeReason ? scoreResult.data.reason : undefined,\n details: {\n evaluationSteps: stepsResult.steps,\n evaluationParams: options.evaluationParams,\n rawScore,\n scoreRange: [scoreRange[0], scoreRange[1]],\n rubric: rubric.map((entry) => ({\n scoreRange: [entry.scoreRange[0], entry.scoreRange[1]],\n expectedOutcome: entry.expectedOutcome,\n })),\n },\n usage,\n });\n } catch (error) {\n return EvalOutcome.invalid(errorMessage(error));\n }\n });\n}\n\ntype ConversationEvalOptions<Input, Output, Expected = unknown> = {\n name?: string | undefined;\n required?: boolean | undefined;\n model: CompletionModel;\n threshold?: number | undefined;\n strictMode?: boolean | undefined;\n includeReason?: boolean | undefined;\n retries?: number | undefined;\n concurrency?: number | undefined;\n turns?: ValueSelector<Input, Output, Expected, ConversationSource> | undefined;\n};\n\nexport type TurnRelevancyOptions<Input, Output, Expected = unknown> = ConversationEvalOptions<\n Input,\n Output,\n Expected\n> & {\n windowSize?: number | undefined;\n};\n\nexport function turnRelevancy<\n Input,\n Output,\n Expected = unknown,\n const Name extends string = string,\n>(\n options: TurnRelevancyOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, number, Expected, Name> {\n const config = metricConfig<Name>(options, \"turn_relevancy\");\n const windowSize = validatePositiveInteger(options.windowSize ?? 10, \"windowSize\");\n const concurrency = validatePositiveInteger(options.concurrency ?? 4, \"concurrency\");\n return numericMetric(config.name, config, \"higher_is_better\", async (args) => {\n try {\n const turns = await resolveTurns(options.turns, args);\n const interactions = unitInteractions(turns);\n const windows = interactions.map((_, index) =>\n interactions.slice(Math.max(0, index - windowSize + 1), index + 1).flat(),\n );\n const verdictResults = await mapWithConcurrency(windows, concurrency, (window) =>\n runJudge({\n model: options.model,\n schema: binaryVerdictSchema,\n instructions:\n \"Judge whether the final assistant reply is relevant to the preceding conversation. Return yes for relevant and no for irrelevant, with a concise reason.\",\n prompt: jsonPrompt({ turns: window }),\n retries: config.retries,\n }),\n );\n const verdicts = verdictResults.map((result, index) => ({\n interaction: index + 1,\n ...result.data,\n }));\n const score =\n verdicts.length === 0\n ? 1\n : verdicts.filter((verdict) => verdict.verdict === \"yes\").length / verdicts.length;\n const reasonResult = await maybeReason({\n model: options.model,\n includeReason: config.includeReason,\n retries: config.retries,\n metric: \"turn relevancy\",\n score,\n evidence: { verdicts },\n });\n const usage = addUsage(...verdictResults.map((result) => result.usage), reasonResult.usage);\n return higherOutcome({\n score,\n threshold: config.threshold,\n strictMode: config.strictMode,\n comment: reasonResult.reason,\n details: { windowSize, concurrency, interactionCount: interactions.length, verdicts },\n usage,\n });\n } catch (error) {\n return EvalOutcome.invalid(errorMessage(error));\n }\n });\n}\n\nexport type KnowledgeRetentionOptions<Input, Output, Expected = unknown> = ConversationEvalOptions<\n Input,\n Output,\n Expected\n>;\n\nexport function knowledgeRetention<\n Input,\n Output,\n Expected = unknown,\n const Name extends string = string,\n>(\n options: KnowledgeRetentionOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, number, Expected, Name> {\n const config = metricConfig<Name>(options, \"knowledge_retention\");\n const concurrency = validatePositiveInteger(options.concurrency ?? 4, \"concurrency\");\n return numericMetric(config.name, config, \"higher_is_better\", async (args) => {\n try {\n const turns = await resolveTurns(options.turns, args);\n const userTurns = turns\n .map((turn, index) => ({ turn, index }))\n .filter((entry) => entry.turn.role === \"user\");\n const knowledgeResults = await mapWithConcurrency(userTurns, concurrency, (entry) =>\n runJudge({\n model: options.model,\n schema: factsSchema,\n instructions:\n \"Extract durable factual information newly supplied by the final user message. Use prior turns only to resolve references. Return concise facts; return an empty array when nothing new was supplied.\",\n prompt: jsonPrompt({\n previousTurns: turns.slice(0, entry.index),\n userMessage: entry.turn.content,\n }),\n retries: config.retries,\n }),\n );\n const knowledge = userTurns.map((entry, index) => ({\n turnIndex: entry.index,\n facts: knowledgeResults[index]?.data.facts ?? [],\n }));\n const assistantChecks = turns\n .map((turn, index) => ({ turn, index }))\n .filter((entry) => entry.turn.role === \"assistant\")\n .map((entry) => ({\n ...entry,\n facts: knowledge\n .filter((item) => item.turnIndex < entry.index)\n .flatMap((item) => item.facts),\n }))\n .filter((entry) => entry.facts.length > 0);\n const verdictResults = await mapWithConcurrency(assistantChecks, concurrency, (entry) =>\n runJudge({\n model: options.model,\n schema: z.object({ attrition: z.boolean(), reason: z.string() }),\n instructions:\n \"Determine whether the assistant reply forgets, contradicts, or unnecessarily asks again for information already supplied by the user. Set attrition true only when knowledge was lost.\",\n prompt: jsonPrompt({ knownFacts: entry.facts, assistantReply: entry.turn.content }),\n retries: config.retries,\n }),\n );\n const verdicts = assistantChecks.map((entry, index) => ({\n turnIndex: entry.index,\n attrition: verdictResults[index]?.data.attrition ?? true,\n reason: verdictResults[index]?.data.reason ?? \"Missing knowledge-retention verdict.\",\n }));\n const score =\n verdicts.length === 0\n ? 1\n : verdicts.filter((verdict) => !verdict.attrition).length / verdicts.length;\n const reasonResult = await maybeReason({\n model: options.model,\n includeReason: config.includeReason,\n retries: config.retries,\n metric: \"knowledge retention\",\n score,\n evidence: { verdicts },\n });\n const usage = addUsage(\n ...knowledgeResults.map((result) => result.usage),\n ...verdictResults.map((result) => result.usage),\n reasonResult.usage,\n );\n return higherOutcome({\n score,\n threshold: config.threshold,\n strictMode: config.strictMode,\n comment: reasonResult.reason,\n details: { concurrency, knowledge, verdicts },\n usage,\n });\n } catch (error) {\n return EvalOutcome.invalid(errorMessage(error));\n }\n });\n}\n\nfunction numericMetric<Input, Output, Expected, const Name extends string>(\n name: Name,\n config: { threshold: number; required: boolean; strictMode?: boolean | undefined },\n direction: \"higher_is_better\" | \"lower_is_better\",\n evaluate: (args: EvalMetricArgs<Input, Output, Expected>) => Promise<EvalOutcomeType<number>>,\n): EvalMetric<Input, Output, number, Expected, Name> {\n return {\n name,\n required: config.required,\n direction,\n threshold:\n config.strictMode === true ? (direction === \"higher_is_better\" ? 1 : 0) : config.threshold,\n dataType: \"NUMERIC\",\n evaluate,\n };\n}\n\ntype MetricConfig<Name extends string = string> = {\n name: Name;\n threshold: number;\n strictMode: boolean;\n includeReason: boolean;\n retries: number;\n required: boolean;\n};\n\nfunction metricConfig<const Name extends string>(\n options: {\n name?: string | undefined;\n threshold?: number | undefined;\n strictMode?: boolean | undefined;\n includeReason?: boolean | undefined;\n retries?: number | undefined;\n required?: boolean | undefined;\n },\n defaultName: string,\n): MetricConfig<Name> {\n return {\n name: (options.name ?? defaultName) as Name,\n threshold: validateThreshold(options.threshold ?? 0.5),\n strictMode: options.strictMode ?? false,\n includeReason: options.includeReason ?? true,\n retries: validateRetries(options.retries ?? 0),\n required: options.required ?? true,\n };\n}\n\nfunction higherOutcome(args: {\n score: number;\n threshold: number;\n strictMode: boolean;\n comment?: string | undefined;\n details: JsonObject;\n usage: Usage;\n}) {\n const score = args.strictMode ? (args.score === 1 ? 1 : 0) : args.score;\n const threshold = args.strictMode ? 1 : args.threshold;\n const options = {\n comment: args.comment,\n usage: args.usage,\n metadata: evaluationMetadata(\n {\n ...args.details,\n scoreDirection: \"higher_is_better\",\n threshold,\n strictMode: args.strictMode,\n },\n args.usage,\n ),\n };\n return score >= threshold ? EvalOutcome.pass(score, options) : EvalOutcome.fail(score, options);\n}\n\nfunction lowerOutcome(args: {\n score: number;\n threshold: number;\n strictMode: boolean;\n comment?: string | undefined;\n details: JsonObject;\n usage: Usage;\n}) {\n const score = args.strictMode ? (args.score === 0 ? 0 : 1) : args.score;\n const threshold = args.strictMode ? 0 : args.threshold;\n const options = {\n comment: args.comment,\n usage: args.usage,\n metadata: evaluationMetadata(\n {\n ...args.details,\n scoreDirection: \"lower_is_better\",\n threshold,\n strictMode: args.strictMode,\n },\n args.usage,\n ),\n };\n return score <= threshold ? EvalOutcome.pass(score, options) : EvalOutcome.fail(score, options);\n}\n\nasync function maybeReason(args: {\n model: CompletionModel;\n includeReason: boolean;\n retries: number;\n metric: string;\n score: number;\n evidence: JsonObject;\n}): Promise<{ reason?: string | undefined; usage: Usage }> {\n if (!args.includeReason) return { usage: UsageValue.empty() };\n const result = await runJudge({\n model: args.model,\n schema: reasonSchema,\n instructions: `Write a concise final explanation for the ${args.metric} score. Ground it only in the supplied evidence and do not repeat the numeric score.`,\n prompt: jsonPrompt({ score: args.score, evidence: args.evidence }),\n retries: args.retries,\n });\n return { reason: result.data.reason, usage: result.usage };\n}\n\nasync function resolveInput<Input, Output, Expected>(\n selector: ValueSelector<Input, Output, Expected, string> | undefined,\n args: EvalMetricArgs<Input, Output, Expected>,\n): Promise<string> {\n return selector === undefined ? formatValue(args.case.input) : selector(args);\n}\n\nasync function resolveStringList<Input, Output, Expected>(\n selectorOrValue: SelectorOrValue<Input, Output, Expected, string[]> | undefined,\n fallback: string[] | undefined,\n args: EvalMetricArgs<Input, Output, Expected>,\n label: string,\n): Promise<string[]> {\n const value =\n selectorOrValue === undefined\n ? fallback\n : typeof selectorOrValue === \"function\"\n ? await (selectorOrValue as ValueSelector<Input, Output, Expected, string[]>)(args)\n : selectorOrValue;\n if (\n !Array.isArray(value) ||\n value.length === 0 ||\n value.some((item) => typeof item !== \"string\")\n ) {\n throw new TypeError(`${label} must be a non-empty array of strings.`);\n }\n return value;\n}\n\nasync function resolveGEvalParameters<Input, Output, Expected>(\n options: GEvalOptions<Input, Output, Expected>,\n args: EvalMetricArgs<Input, Output, Expected>,\n): Promise<JsonObject> {\n const parameters: JsonObject = {};\n for (const parameter of options.evaluationParams) {\n if (parameter === \"input\") parameters.input = await resolveInput(options.input, args);\n if (parameter === \"actualOutput\") {\n parameters.actualOutput = await resolveActualText(options.actual, args);\n }\n if (parameter === \"expectedOutput\") {\n const expected =\n options.expected === undefined ? args.case.expected : await options.expected(args);\n if (expected === undefined) throw new Error(\"G-Eval expectedOutput is missing.\");\n parameters.expectedOutput = toJsonValue(expected);\n }\n if (parameter === \"context\") {\n parameters.context = await resolveStringList(\n options.context,\n args.case.context,\n args,\n \"context\",\n );\n }\n if (parameter === \"retrievalContext\") {\n parameters.retrievalContext = await resolveStringList(\n options.retrievalContext,\n args.case.retrievalContext,\n args,\n \"retrievalContext\",\n );\n }\n if (parameter === \"metadata\") parameters.metadata = args.case.metadata ?? {};\n }\n return parameters;\n}\n\nfunction validateRubric(rubric: GEvalRubric[] | undefined): GEvalRubric[] {\n if (rubric === undefined || rubric.length === 0) return [];\n const sorted = [...rubric].sort((left, right) => left.scoreRange[0] - right.scoreRange[0]);\n for (const [index, entry] of sorted.entries()) {\n const [start, end] = entry.scoreRange;\n if (\n !Number.isInteger(start) ||\n !Number.isInteger(end) ||\n start < 0 ||\n end > 10 ||\n start > end\n ) {\n throw new RangeError(\n \"G-Eval rubric score ranges must be ordered integers from 0 through 10.\",\n );\n }\n if (entry.expectedOutcome.trim().length === 0) {\n throw new TypeError(\"G-Eval rubric expectedOutcome must not be empty.\");\n }\n const next = sorted[index + 1];\n if (next !== undefined && end >= next.scoreRange[0]) {\n throw new RangeError(\"G-Eval rubric score ranges must not overlap.\");\n }\n }\n const first = sorted[0];\n const last = sorted.at(-1);\n if (first !== undefined && last !== undefined && first.scoreRange[0] === last.scoreRange[1]) {\n throw new RangeError(\"G-Eval rubric score range must span more than one value.\");\n }\n return sorted;\n}\n\nfunction truthsExtractionInstructions(limit: number | undefined): string {\n return limit === undefined\n ? \"Extract concise, factual, undisputed truths from the supplied source material, ordered by importance. Return them in the facts array.\"\n : `Extract at most ${limit} concise, factual, undisputed truths from the supplied source material, ordered by importance. Return them in the facts array.`;\n}\n\nfunction limitValues(values: string[], limit: number | undefined): string[] {\n return limit === undefined ? values : values.slice(0, limit);\n}\n\nfunction validateThreshold(value: number): number {\n if (!Number.isFinite(value) || value < 0 || value > 1) {\n throw new RangeError(\"Eval metric threshold must be between 0 and 1.\");\n }\n return value;\n}\n\nfunction validateRetries(value: number): number {\n if (!Number.isInteger(value) || value < 0) {\n throw new RangeError(\"Eval metric retries must be a non-negative integer.\");\n }\n return value;\n}\n\nfunction validatePositiveInteger(value: number, label: string): number {\n if (!Number.isInteger(value) || value < 1) {\n throw new RangeError(`${label} must be a positive integer.`);\n }\n return value;\n}\n\nfunction validateOptionalNonNegativeInteger(\n value: number | undefined,\n label: string,\n): number | undefined {\n if (value === undefined) return undefined;\n if (!Number.isInteger(value) || value < 0) {\n throw new RangeError(`${label} must be a non-negative integer.`);\n }\n return value;\n}\n\nfunction assertSameLength(label: string, inputs: unknown[], outputs: unknown[]): void {\n if (inputs.length !== outputs.length) {\n throw new Error(`${label} count ${outputs.length} did not match input count ${inputs.length}.`);\n }\n}\n\nfunction serializeVerdicts(verdicts: readonly Verdict[]): JsonObject[] {\n return verdicts.map((verdict) => {\n const serialized: JsonObject = { verdict: verdict.verdict };\n if (verdict.reason !== undefined) serialized.reason = verdict.reason;\n return serialized;\n });\n}\n\nfunction jsonPrompt(value: unknown): string {\n return JSON.stringify(value, null, 2);\n}\n\nfunction toJsonValue(value: unknown): JsonValue {\n if (!isJsonValue(value)) {\n throw new TypeError(\"G-Eval expectedOutput must be a JSON value.\");\n }\n return cloneJsonValue(value);\n}\n\nfunction cloneJsonValue(value: JsonValue): JsonValue {\n if (value === null || typeof value !== \"object\") return value;\n if (Array.isArray(value)) return value.map(cloneJsonValue);\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => {\n if (item === undefined) {\n throw new TypeError(\"G-Eval expectedOutput must be a JSON value.\");\n }\n return [key, cloneJsonValue(item)];\n }),\n );\n}\n\ntype ConversationSource = EvalTurn[] | Message[];\n\nfunction normalizeEvalTurns(value: unknown): EvalTurn[] | undefined {\n const source = conversationArray(value);\n if (source === undefined) return undefined;\n const turns: EvalTurn[] = [];\n for (const entry of source) {\n if (typeof entry !== \"object\" || entry === null) continue;\n const role = (entry as { role?: unknown }).role;\n if (role !== \"user\" && role !== \"assistant\") continue;\n const content = (entry as { content?: unknown }).content;\n const text = contentText(content);\n if (text.length === 0) continue;\n const metadata = (entry as { metadata?: unknown }).metadata;\n turns.push(\n typeof metadata === \"object\" && metadata !== null && !Array.isArray(metadata)\n ? { role, content: text, metadata: metadata as EvalTurn[\"metadata\"] }\n : { role, content: text },\n );\n }\n return turns.length === 0 ? undefined : turns;\n}\n\nasync function resolveTurns<Input, Output, Expected>(\n selector: ValueSelector<Input, Output, Expected, ConversationSource> | undefined,\n args: EvalMetricArgs<Input, Output, Expected>,\n): Promise<EvalTurn[]> {\n const source = selector === undefined ? args.output : await selector(args);\n const turns = normalizeEvalTurns(source);\n if (turns === undefined) {\n throw new TypeError(\n \"Conversational eval requires non-empty EvalTurn[], Message[], or an output with messages.\",\n );\n }\n return turns;\n}\n\nfunction unitInteractions(turns: EvalTurn[]): EvalTurn[][] {\n const interactions: EvalTurn[][] = [];\n let current: EvalTurn[] = [];\n let hasUser = false;\n for (const turn of turns) {\n if (current.at(-1)?.role === \"assistant\" && turn.role === \"user\" && hasUser) {\n interactions.push(current);\n current = [turn];\n hasUser = true;\n continue;\n }\n current.push(turn);\n if (turn.role === \"user\") hasUser = true;\n }\n if (current.length > 1 && current.at(-1)?.role === \"assistant\" && hasUser) {\n interactions.push(current);\n }\n return interactions;\n}\n\nfunction conversationArray(value: unknown): unknown[] | undefined {\n if (Array.isArray(value)) return value;\n if (typeof value === \"object\" && value !== null && \"messages\" in value) {\n const messages = (value as { messages?: unknown }).messages;\n return Array.isArray(messages) ? messages : undefined;\n }\n return undefined;\n}\n\nfunction contentText(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n return content\n .flatMap((part) =>\n typeof part === \"object\" &&\n part !== null &&\n \"type\" in part &&\n part.type === \"text\" &&\n \"text\" in part &&\n typeof part.text === \"string\"\n ? [part.text]\n : [],\n )\n .join(\"\\n\");\n}\n","export function defaultOutputValue(output: unknown): unknown {\n if (typeof output === \"object\" && output !== null && \"output\" in output) {\n return (output as { output: unknown }).output;\n }\n return output;\n}\n\nexport function stableComparable(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n return JSON.stringify(value);\n}\n\nexport function formatValue(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nexport function errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import type { CompletionModel, JsonObject, Usage } from \"../completion\";\nimport { Usage as UsageValue } from \"../completion\";\nimport { extract } from \"../extractor\";\nimport type { ZodSchema } from \"../schema\";\nimport type { EvalMetadata } from \"./types\";\n\nexport type JudgeResult<T> = {\n data: T;\n usage: Usage;\n};\n\nexport async function runJudge<T>(args: {\n model: CompletionModel;\n schema: ZodSchema<T>;\n instructions: string;\n prompt: string;\n retries: number;\n}): Promise<JudgeResult<T>> {\n const result = await extract({\n model: args.model,\n outputSchema: args.schema,\n instructions: args.instructions,\n text: args.prompt,\n temperature: 0,\n retries: args.retries <= 0 ? undefined : { maxAttempts: Math.trunc(args.retries) + 1 },\n });\n return { data: result.output, usage: result.usage };\n}\n\nexport function addUsage(...values: Usage[]): Usage {\n return values.reduce((total, usage) => UsageValue.add(total, usage), UsageValue.empty());\n}\n\nexport function evaluationMetadata(details: JsonObject, usage: Usage): EvalMetadata {\n const evaluation: JsonObject = {\n ...details,\n usage: usageToJson(usage),\n };\n return { evaluation };\n}\n\nfunction usageToJson(usage: Usage): JsonObject {\n const value: JsonObject = {\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n totalTokens: usage.totalTokens,\n cachedInputTokens: usage.cachedInputTokens,\n cacheCreationInputTokens: usage.cacheCreationInputTokens,\n };\n if (usage.details !== undefined) {\n value.details = { ...usage.details };\n }\n return value;\n}\n","import type { Usage } from \"../completion\";\nimport type { EvalMetadata } from \"./types\";\n\nexport type EvalOutcome<Score = unknown> =\n | {\n outcome: \"pass\";\n score?: Score | undefined;\n comment?: string | undefined;\n metadata?: EvalMetadata | undefined;\n usage?: Usage | undefined;\n }\n | {\n outcome: \"fail\";\n score?: Score | undefined;\n comment?: string | undefined;\n metadata?: EvalMetadata | undefined;\n usage?: Usage | undefined;\n }\n | {\n outcome: \"invalid\";\n reason: string;\n score?: Score | undefined;\n comment?: string | undefined;\n metadata?: EvalMetadata | undefined;\n usage?: Usage | undefined;\n };\n\nexport const EvalOutcome = {\n pass<Score>(\n score?: Score,\n options: {\n comment?: string | undefined;\n metadata?: EvalMetadata | undefined;\n usage?: Usage | undefined;\n } = {},\n ): EvalOutcome<Score> {\n const outcome: EvalOutcome<Score> = {\n outcome: \"pass\" as const,\n };\n if (score !== undefined) {\n outcome.score = score;\n }\n if (options.comment !== undefined) {\n outcome.comment = options.comment;\n }\n if (options.metadata !== undefined) {\n outcome.metadata = options.metadata;\n }\n if (options.usage !== undefined) {\n outcome.usage = options.usage;\n }\n return outcome;\n },\n\n fail<Score>(\n score?: Score,\n options: {\n comment?: string | undefined;\n metadata?: EvalMetadata | undefined;\n usage?: Usage | undefined;\n } = {},\n ): EvalOutcome<Score> {\n const outcome: EvalOutcome<Score> = {\n outcome: \"fail\" as const,\n };\n if (score !== undefined) {\n outcome.score = score;\n }\n if (options.comment !== undefined) {\n outcome.comment = options.comment;\n }\n if (options.metadata !== undefined) {\n outcome.metadata = options.metadata;\n }\n if (options.usage !== undefined) {\n outcome.usage = options.usage;\n }\n return outcome;\n },\n\n invalid<Score = never>(\n reason: string,\n options: {\n score?: Score | undefined;\n comment?: string | undefined;\n metadata?: EvalMetadata | undefined;\n usage?: Usage | undefined;\n } = {},\n ): EvalOutcome<Score> {\n const outcome: EvalOutcome<Score> = {\n outcome: \"invalid\" as const,\n reason,\n };\n if (options.score !== undefined) {\n outcome.score = options.score;\n }\n if (options.comment !== undefined) {\n outcome.comment = options.comment;\n }\n if (options.metadata !== undefined) {\n outcome.metadata = options.metadata;\n }\n if (options.usage !== undefined) {\n outcome.usage = options.usage;\n }\n return outcome;\n },\n};\n","import { defaultOutputValue, formatValue } from \"./format\";\nimport type { EvalMetricArgs, SelectorOrValue, ValueSelector } from \"./types\";\n\nexport function selectPromptOutput(args: EvalMetricArgs<unknown, unknown, unknown>): string {\n if (\n typeof args.output !== \"object\" ||\n args.output === null ||\n !(\"output\" in args.output) ||\n typeof args.output.output !== \"string\"\n ) {\n throw new TypeError(\"selectPromptOutput requires an output object with a string output field.\");\n }\n return args.output.output;\n}\n\nexport async function resolveActual<Input, Output, Expected>(\n selector: ValueSelector<Input, Output, Expected, unknown> | undefined,\n args: EvalMetricArgs<Input, Output, Expected>,\n): Promise<unknown> {\n return selector === undefined ? defaultOutputValue(args.output) : selector(args);\n}\n\nexport async function resolveActualText<Input, Output, Expected>(\n selector: ValueSelector<Input, Output, Expected, string> | undefined,\n args: EvalMetricArgs<Input, Output, Expected>,\n): Promise<string> {\n const value = selector === undefined ? defaultOutputValue(args.output) : await selector(args);\n return typeof value === \"string\" ? value : JSON.stringify(value);\n}\n\nexport async function resolveExpected<Input, Output, Expected, Value>(\n selectorOrValue: SelectorOrValue<Input, Output, Expected, Value> | undefined,\n args: EvalMetricArgs<Input, Output, Expected>,\n): Promise<Value | Expected | undefined> {\n if (selectorOrValue === undefined) {\n return args.case.expected;\n }\n return typeof selectorOrValue === \"function\"\n ? (selectorOrValue as ValueSelector<Input, Output, Expected, Value>)(args)\n : selectorOrValue;\n}\n\nexport async function resolveJudgePrompt<Input, Output, Expected>(\n selector: ValueSelector<Input, Output, Expected, string> | undefined,\n args: EvalMetricArgs<Input, Output, Expected>,\n): Promise<string> {\n if (selector !== undefined) {\n return selector(args);\n }\n return [\n `Suite: ${args.suiteName}`,\n `Case: ${args.case.id}`,\n `Input: ${formatValue(args.case.input)}`,\n `Expected: ${formatValue(args.case.expected)}`,\n `Output: ${formatValue(defaultOutputValue(args.output))}`,\n ].join(\"\\n\\n\");\n}\n","import { AgentRunBlockedError } from \"../agent/errors\";\nimport type { AgentInteractionRequest, AgentInteractionResponse } from \"../agent/interactions\";\nimport type {\n AgentInteractionOutcome,\n AgentOutcome,\n AgentResponse,\n AgentRunOptions,\n AgentRunSettings,\n} from \"../agent/run-types\";\nimport type { EvalCase, EvalTarget } from \"./types\";\n\ntype EvaluableAgent<Output> = {\n generate(input: AgentRunOptions<Output>): Promise<AgentOutcome<Output>>;\n};\n\ntype IsAny<Value> = 0 extends 1 & Value ? true : false;\ntype IsExactly<Left, Right> =\n IsAny<Left> extends true\n ? false\n : [Left] extends [Right]\n ? [Right] extends [Left]\n ? true\n : false\n : false;\n\nexport type AgentEvalTargetOptions<\n Input,\n AgentOutput = string,\n Output = AgentResponse<AgentOutput>,\n Expected = unknown,\n> = {\n agent: EvaluableAgent<AgentOutput>;\n request(args: {\n input: Input;\n testCase: EvalCase<Input, Expected>;\n }): AgentRunOptions<AgentOutput> | Promise<AgentRunOptions<AgentOutput>>;\n interactions?:\n | {\n maxResponses?: number | undefined;\n respond(args: {\n interaction: AgentInteractionRequest;\n testCase: EvalCase<Input, Expected>;\n phase: number;\n }): AgentInteractionResponse | Promise<AgentInteractionResponse>;\n }\n | undefined;\n} & (IsExactly<Output, AgentResponse<AgentOutput>> extends true\n ? {\n output?(args: {\n response: AgentResponse<AgentOutput>;\n testCase: EvalCase<Input, Expected>;\n }): Output | Promise<Output>;\n }\n : {\n output(args: {\n response: AgentResponse<AgentOutput>;\n testCase: EvalCase<Input, Expected>;\n }): Output | Promise<Output>;\n });\n\nexport class AgentEvalSuspensionError extends Error {\n constructor(\n readonly result: AgentInteractionOutcome,\n message = \"Agent eval target suspended without an interaction responder.\",\n ) {\n super(message);\n this.name = \"AgentEvalSuspensionError\";\n }\n}\n\nexport function agentEvalTarget<\n Input,\n AgentOutput = string,\n Output = AgentResponse<AgentOutput>,\n Expected = unknown,\n>(\n options: AgentEvalTargetOptions<Input, AgentOutput, Output, Expected>,\n): EvalTarget<Input, Output, Expected> {\n return async (input, testCase) => {\n const maxResponses = options.interactions?.maxResponses ?? 10;\n if (!Number.isSafeInteger(maxResponses) || maxResponses < 1) {\n throw new TypeError(\"Agent eval interactions.maxResponses must be a positive integer.\");\n }\n const request = await options.request({ input, testCase });\n const runSettings = agentRunSettings(request);\n let response = await options.agent.generate(request);\n let phase = 0;\n while (response.type === \"interaction\") {\n if (options.interactions === undefined) {\n throw new AgentEvalSuspensionError(response);\n }\n if (phase >= maxResponses) {\n throw new AgentEvalSuspensionError(\n response,\n `Agent eval target exceeded the interaction response limit of ${maxResponses}.`,\n );\n }\n phase += 1;\n const interactionResponse = await options.interactions.respond({\n interaction: response.interaction,\n testCase,\n phase,\n });\n response = await options.agent.generate({\n continuation: response.continuation,\n response: interactionResponse,\n ...runSettings,\n });\n }\n if (response.type === \"blocked\") throw new AgentRunBlockedError(response);\n return options.output === undefined\n ? (response as Output)\n : await options.output({ response, testCase });\n };\n}\n\nfunction agentRunSettings<Output>(request: AgentRunOptions<Output>): AgentRunSettings<Output> {\n const {\n prompt: _prompt,\n messages: _messages,\n session: _session,\n continuation: _continuation,\n response: _response,\n ...settings\n } = request;\n return settings;\n}\n","import type { EvalOutcome } from \"./outcome\";\nimport type {\n EvalMetadata,\n EvalMetric,\n EvalScoreProjection,\n EvalTraceRef,\n EvalTraceSelectorArgs,\n} from \"./types\";\n\nexport function projectEvalOutcome<Score>(\n outcome: EvalOutcome<Score>,\n dataType: EvalMetric<unknown, unknown>[\"dataType\"],\n projectScore?: ((score: Score) => number | string | boolean) | undefined,\n): EvalScoreProjection {\n const value = projectScoreValue(outcome, dataType, projectScore);\n const projection: EvalScoreProjection = {\n outcome: outcome.outcome,\n value,\n label: typeof value === \"string\" ? value : outcome.outcome,\n };\n if (typeof value === \"number\") projection.numericValue = value;\n if (typeof value === \"string\") projection.categoricalValue = value;\n const explanation =\n outcome.comment ?? (outcome.outcome === \"invalid\" ? outcome.reason : undefined);\n if (explanation !== undefined) projection.explanation = explanation;\n return projection;\n}\n\nexport function resolveEvalTraceRef(args: {\n output?: unknown;\n input?: unknown;\n metadata?: EvalMetadata | undefined;\n}): EvalTraceRef | undefined {\n return (\n traceFromCarrier(args.output) ??\n traceFromCarrier(args.input) ??\n traceFromMetadata(args.metadata)\n );\n}\n\nexport function defaultEvalTraceSelector<Input, Output, Expected>(\n args: EvalTraceSelectorArgs<Input, Output, Expected>,\n): EvalTraceRef | undefined {\n return resolveEvalTraceRef({\n output: args.output,\n input: args.case.input,\n metadata: args.case.metadata,\n });\n}\n\nfunction projectScoreValue<Score>(\n outcome: EvalOutcome<Score>,\n dataType: EvalMetric<unknown, unknown>[\"dataType\"],\n projectScore: ((score: Score) => number | string | boolean) | undefined,\n): number | string {\n const score = outcome.score;\n if (score !== undefined && projectScore !== undefined) {\n const projected = projectScore(score);\n if (typeof projected === \"boolean\") return projected ? 1 : 0;\n return projected;\n }\n if (dataType === \"CATEGORICAL\") {\n if (typeof score === \"string\") return score;\n if (typeof score === \"number\") return String(score);\n if (typeof score === \"boolean\") return score ? \"true\" : \"false\";\n if (score === null || score === undefined) return outcome.outcome;\n try {\n return JSON.stringify(score) ?? outcome.outcome;\n } catch {\n return outcome.outcome;\n }\n }\n if (dataType === \"BOOLEAN\") {\n if (typeof score === \"boolean\") return score ? 1 : 0;\n if (typeof score === \"number\") return score === 0 ? 0 : 1;\n return outcome.outcome === \"pass\" ? 1 : 0;\n }\n if (typeof score === \"number\") return score;\n if (typeof score === \"boolean\") return score ? 1 : 0;\n if (\n typeof score === \"object\" &&\n score !== null &&\n \"score\" in score &&\n typeof (score as { score?: unknown }).score === \"number\"\n ) {\n return (score as { score: number }).score;\n }\n return outcome.outcome === \"pass\" ? 1 : 0;\n}\n\nfunction traceFromCarrier(value: unknown): EvalTraceRef | undefined {\n if (typeof value !== \"object\" || value === null || !(\"trace\" in value)) return undefined;\n return readTraceRef((value as { trace?: unknown }).trace);\n}\n\nfunction traceFromMetadata(metadata: EvalMetadata | undefined): EvalTraceRef | undefined {\n if (metadata === undefined) return undefined;\n return readTraceRef({\n observer: metadata.traceObserver,\n traceId: metadata.traceId,\n observationId: metadata.observationId,\n responseId: metadata.responseId,\n });\n}\n\nfunction readTraceRef(value: unknown): EvalTraceRef | undefined {\n if (typeof value !== \"object\" || value === null) return undefined;\n const traceId = (value as { traceId?: unknown }).traceId;\n if (typeof traceId !== \"string\" || traceId.length === 0) return undefined;\n const observer = (value as { observer?: unknown }).observer;\n const observationId = (value as { observationId?: unknown }).observationId;\n const responseId = (value as { responseId?: unknown }).responseId;\n const trace: EvalTraceRef = { traceId };\n if (typeof observer === \"string\" && observer.length > 0) trace.observer = observer;\n if (typeof observationId === \"string\" && observationId.length > 0) {\n trace.observationId = observationId;\n }\n if (typeof responseId === \"string\" && responseId.length > 0) trace.responseId = responseId;\n return trace;\n}\n","import { type Usage, Usage as UsageValue } from \"../completion\";\nimport { errorMessage } from \"./format\";\nimport { EvalOutcome, type EvalOutcome as EvalOutcomeType } from \"./outcome\";\nimport { defaultEvalTraceSelector } from \"./reporting\";\nimport type {\n EvalCase,\n EvalCaseResult,\n EvalCostSummary,\n EvalMetric,\n EvalMetricResult,\n EvalReporter,\n EvalRunContext,\n EvalRunEndArgs,\n EvalRunStartArgs,\n EvalSuiteResult,\n EvalTotals,\n EvalTraceRef,\n RunEvalSuiteOptions,\n} from \"./types\";\n\nexport class EvalReporterDispatchError extends AggregateError {\n readonly phase: string;\n\n constructor(phase: string, errors: readonly unknown[]) {\n super(errors, `Evaluation reporter ${phase} failed ${errors.length} time(s).`);\n this.name = \"EvalReporterDispatchError\";\n this.phase = phase;\n }\n}\n\nexport async function runEvalSuite<\n Input,\n Output,\n Expected = unknown,\n const Metrics extends readonly EvalMetric<\n NoInfer<Input>,\n NoInfer<Output>,\n unknown,\n NoInfer<Expected>,\n string\n >[] = readonly EvalMetric<NoInfer<Input>, NoInfer<Output>, unknown, NoInfer<Expected>, string>[],\n>(\n options: RunEvalSuiteOptions<Input, Output, Expected, Metrics>,\n): Promise<EvalSuiteResult<Input, Output, Expected, Metrics>>;\nexport async function runEvalSuite<\n Input,\n Output,\n Expected,\n Metrics extends readonly EvalMetric<Input, Output, unknown, Expected, string>[],\n>(\n options: RunEvalSuiteOptions<Input, Output, Expected, Metrics>,\n): Promise<EvalSuiteResult<Input, Output, Expected, Metrics>> {\n validateSuiteOptions(options);\n const startedAtMs = Date.now();\n const run = resolveRun(options, startedAtMs);\n const reporters = options.reporters ?? [];\n const lifecycle = {\n run,\n suiteName: options.name,\n caseCount: options.cases.length,\n metricNames: options.metrics.map((metric) => metric.name),\n } satisfies EvalRunStartArgs;\n let reporterErrors: unknown[];\n try {\n reporterErrors = await notifyRunStart(\n reporters,\n lifecycle,\n options.reporterErrorPolicy ?? \"collect\",\n );\n } catch (error) {\n await notifyRunEnd(reporters, {\n ...lifecycle,\n status: \"failed\",\n completedAt: new Date().toISOString(),\n durationMs: Date.now() - startedAtMs,\n error,\n });\n throw error;\n }\n let results: Array<EvalCaseResult<Input, Output, Expected, Metrics>>;\n let aggregates: Awaited<ReturnType<typeof aggregateResult>>;\n try {\n results = await runEvalCases(options, run);\n aggregates = await aggregateResult(options, results);\n } catch (error) {\n await notifyRunEnd(reporters, {\n ...lifecycle,\n status: \"failed\",\n completedAt: new Date().toISOString(),\n durationMs: Date.now() - startedAtMs,\n error,\n });\n throw error;\n }\n const completedAt = new Date().toISOString();\n const result: EvalSuiteResult<Input, Output, Expected, Metrics> = {\n name: options.name,\n run: { ...run, completedAt },\n results,\n metrics: aggregates.metrics,\n cases: aggregates.cases,\n usage: aggregates.usage,\n durationMs: Date.now() - startedAtMs,\n reporterErrors,\n };\n if (aggregates.cost !== undefined) {\n result.cost = aggregates.cost;\n }\n const runEndArgs: EvalRunEndArgs = {\n ...lifecycle,\n status: \"completed\",\n completedAt,\n durationMs: result.durationMs,\n metrics: result.metrics,\n cases: result.cases,\n usage: result.usage,\n };\n if (result.cost !== undefined) {\n runEndArgs.cost = result.cost;\n }\n result.reporterErrors.push(\n ...(await notifyRunEnd(reporters, runEndArgs, options.reporterErrorPolicy ?? \"collect\")),\n );\n return result;\n}\n\nasync function runEvalCases<\n Input,\n Output,\n Expected,\n Metrics extends readonly EvalMetric<Input, Output, unknown, Expected, string>[],\n>(\n options: RunEvalSuiteOptions<Input, Output, Expected, Metrics>,\n run: EvalRunContext,\n): Promise<Array<EvalCaseResult<Input, Output, Expected, Metrics>>> {\n const concurrency = Math.max(1, Math.trunc(options.concurrency ?? 1));\n const results = new Array<EvalCaseResult<Input, Output, Expected, Metrics>>(options.cases.length);\n let nextIndex = 0;\n let failure: { error: unknown } | undefined;\n\n async function worker(): Promise<void> {\n while (failure === undefined && nextIndex < options.cases.length) {\n const index = nextIndex;\n nextIndex += 1;\n try {\n results[index] = await runEvalCase(\n options,\n options.cases[index] as EvalCase<Input, Expected>,\n run,\n );\n } catch (error) {\n failure ??= { error };\n }\n }\n }\n\n await Promise.all(\n Array.from({ length: Math.min(concurrency, options.cases.length) }, () => worker()),\n );\n if (failure !== undefined) throw failure.error;\n return results;\n}\n\nasync function runEvalCase<\n Input,\n Output,\n Expected,\n Metrics extends readonly EvalMetric<Input, Output, unknown, Expected, string>[],\n>(\n options: RunEvalSuiteOptions<Input, Output, Expected, Metrics>,\n testCase: EvalCase<Input, Expected>,\n run: EvalRunContext,\n): Promise<EvalCaseResult<Input, Output, Expected, Metrics>> {\n let output: Output | undefined;\n let targetError: unknown;\n try {\n output = await options.target(testCase.input, testCase);\n } catch (error) {\n targetError = error;\n }\n const traceResult = await resolveTrace(options, testCase, output, targetError);\n\n const metrics: EvalMetricResult[] = [];\n for (const metric of options.metrics) {\n const outcome =\n targetError === undefined\n ? await safeEvaluate(options.name, testCase, output as Output, metric)\n : EvalOutcome.invalid(`Target failed: ${errorMessage(targetError)}`);\n const reporterErrors = await reportOutcome({\n run,\n suiteName: options.name,\n testCase,\n output,\n targetError,\n metric,\n outcome,\n trace: traceResult.trace,\n traceError: traceResult.error,\n reporters: options.reporters ?? [],\n reporterErrorPolicy: options.reporterErrorPolicy ?? \"collect\",\n });\n const metricResult: EvalMetricResult = {\n metricName: metric.name,\n required: metric.required ?? true,\n outcome,\n reporterErrors,\n };\n if (metric.direction !== undefined) metricResult.direction = metric.direction;\n if (metric.threshold !== undefined) metricResult.threshold = metric.threshold;\n metrics.push(metricResult);\n }\n\n const scores = Object.fromEntries(\n metrics.map((metric) => [metric.metricName, metric.outcome]),\n ) as EvalCaseResult<Input, Output, Expected, Metrics>[\"scores\"];\n const result: EvalCaseResult<Input, Output, Expected, Metrics> = {\n case: testCase,\n outcome: caseOutcome(targetError, metrics),\n metrics: metrics as EvalCaseResult<Input, Output, Expected, Metrics>[\"metrics\"],\n scores,\n };\n if (output !== undefined) {\n result.output = output;\n }\n if (targetError !== undefined) {\n result.targetError = targetError;\n }\n return result;\n}\n\nasync function resolveTrace<Input, Output, Expected>(\n options: RunEvalSuiteOptions<Input, Output, Expected>,\n testCase: EvalCase<Input, Expected>,\n output: Output | undefined,\n targetError: unknown,\n): Promise<{ trace?: EvalTraceRef | undefined; error?: unknown }> {\n try {\n const selector = options.trace ?? defaultEvalTraceSelector;\n const trace = await selector({\n suiteName: options.name,\n case: testCase,\n output,\n targetError,\n });\n return trace === undefined ? {} : { trace };\n } catch (error) {\n return { error };\n }\n}\n\nasync function safeEvaluate<Input, Output, Expected>(\n suiteName: string,\n testCase: EvalCase<Input, Expected>,\n output: Output,\n metric: EvalMetric<Input, Output, unknown, Expected>,\n): Promise<EvalOutcomeType> {\n try {\n return await metric.evaluate({ suiteName, case: testCase, output });\n } catch (error) {\n return EvalOutcome.invalid(errorMessage(error));\n }\n}\n\nasync function reportOutcome<Input, Output, Expected>(args: {\n run: EvalRunContext;\n suiteName: string;\n testCase: EvalCase<Input, Expected>;\n output: Output | undefined;\n targetError: unknown;\n metric: EvalMetric<Input, Output, unknown, Expected>;\n outcome: EvalOutcomeType;\n trace: EvalTraceRef | undefined;\n traceError: unknown;\n reporters: readonly EvalReporter<Input, Output, Expected>[];\n reporterErrorPolicy: \"collect\" | \"throw\";\n}): Promise<unknown[]> {\n const errors: unknown[] = [];\n if (args.traceError !== undefined) {\n errors.push(args.traceError);\n }\n for (const reporter of args.reporters) {\n try {\n await reporter.report({\n run: args.run,\n suiteName: args.suiteName,\n case: args.testCase,\n output: args.output,\n targetError: args.targetError,\n trace: args.trace,\n metric: args.metric,\n outcome: args.outcome,\n });\n } catch (error) {\n errors.push(error);\n }\n }\n throwReporterErrors(\"report\", errors, args.reporterErrorPolicy);\n return errors;\n}\n\nfunction resolveRun<Input, Output, Expected>(\n options: RunEvalSuiteOptions<Input, Output, Expected>,\n startedAtMs: number,\n): EvalRunContext {\n const id = options.run?.id ?? globalThis.crypto.randomUUID();\n if (id.trim().length === 0 || id.length > 128) {\n throw new TypeError(\"Evaluation run id must contain 1 to 128 characters\");\n }\n for (const [label, value] of [\n [\"dataset name\", options.run?.datasetName],\n [\"dataset version\", options.run?.datasetVersion],\n ] as const) {\n if (value !== undefined && (value.trim().length === 0 || value.length > 256)) {\n throw new TypeError(`Evaluation run ${label} must contain 1 to 256 characters`);\n }\n }\n const run: EvalRunContext = {\n id,\n startedAt: new Date(startedAtMs).toISOString(),\n };\n if (options.run?.datasetName !== undefined) run.datasetName = options.run.datasetName;\n if (options.run?.datasetVersion !== undefined) run.datasetVersion = options.run.datasetVersion;\n if (options.run?.metadata !== undefined) run.metadata = options.run.metadata;\n return run;\n}\n\nasync function notifyRunStart<Input, Output, Expected>(\n reporters: readonly EvalReporter<Input, Output, Expected>[],\n args: EvalRunStartArgs,\n errorPolicy: \"collect\" | \"throw\",\n): Promise<unknown[]> {\n const errors: unknown[] = [];\n for (const reporter of reporters) {\n if (reporter.onRunStart === undefined) continue;\n try {\n await reporter.onRunStart(args);\n } catch (error) {\n errors.push(error);\n }\n }\n throwReporterErrors(\"onRunStart\", errors, errorPolicy);\n return errors;\n}\n\nasync function notifyRunEnd<Input, Output, Expected>(\n reporters: readonly EvalReporter<Input, Output, Expected>[],\n args: EvalRunEndArgs,\n errorPolicy: \"collect\" | \"throw\" = \"collect\",\n): Promise<unknown[]> {\n const errors: unknown[] = [];\n for (const reporter of reporters) {\n if (reporter.onRunEnd === undefined) continue;\n try {\n await reporter.onRunEnd(args);\n } catch (error) {\n errors.push(error);\n }\n }\n throwReporterErrors(\"onRunEnd\", errors, errorPolicy);\n return errors;\n}\n\nfunction throwReporterErrors(\n phase: string,\n errors: readonly unknown[],\n errorPolicy: \"collect\" | \"throw\",\n): void {\n if (errorPolicy === \"throw\" && errors.length > 0) {\n throw new EvalReporterDispatchError(phase, errors);\n }\n}\n\nfunction countMetricOutcomes(\n results: Array<EvalCaseResult<unknown, unknown, unknown>>,\n): EvalTotals {\n const totals = emptyTotals();\n for (const result of results) {\n for (const metric of result.metrics) {\n totals.total += 1;\n totals[statusKey(metric.outcome.outcome)] += 1;\n }\n }\n return totals;\n}\n\nfunction countCaseOutcomes(results: Array<EvalCaseResult<unknown, unknown, unknown>>): EvalTotals {\n const totals = emptyTotals();\n for (const result of results) {\n totals.total += 1;\n totals[statusKey(result.outcome)] += 1;\n }\n return totals;\n}\n\nfunction emptyTotals(): EvalTotals {\n return { total: 0, passed: 0, failed: 0, invalid: 0 };\n}\n\nfunction statusKey(status: \"pass\" | \"fail\" | \"invalid\"): \"passed\" | \"failed\" | \"invalid\" {\n if (status === \"pass\") return \"passed\";\n if (status === \"fail\") return \"failed\";\n return \"invalid\";\n}\n\nfunction caseOutcome(\n targetError: unknown,\n metrics: EvalMetricResult[],\n): \"pass\" | \"fail\" | \"invalid\" {\n if (targetError !== undefined) return \"invalid\";\n const required = metrics.filter((metric) => metric.required);\n if (required.some((metric) => metric.outcome.outcome === \"invalid\")) return \"invalid\";\n if (required.some((metric) => metric.outcome.outcome === \"fail\")) return \"fail\";\n return \"pass\";\n}\n\nasync function aggregateResult<\n Input,\n Output,\n Expected,\n Metrics extends readonly EvalMetric<Input, Output, unknown, Expected, string>[],\n>(\n options: RunEvalSuiteOptions<Input, Output, Expected, Metrics>,\n results: Array<EvalCaseResult<Input, Output, Expected, Metrics>>,\n): Promise<{\n metrics: EvalTotals;\n cases: EvalTotals;\n usage: { target: Usage; evaluation: Usage; total: Usage };\n cost?: EvalCostSummary | undefined;\n}> {\n let targetUsage = UsageValue.empty();\n let evaluationUsage = UsageValue.empty();\n let targetCost = 0;\n let evaluationCost = 0;\n\n for (const result of results) {\n if (result.output !== undefined) {\n const usage = await resolveTargetUsage(options, result.case, result.output);\n if (usage !== undefined) {\n targetUsage = UsageValue.add(targetUsage, usage);\n if (options.cost !== undefined) {\n targetCost += await calculateCost(\n options.cost.calculate({\n kind: \"target\",\n suiteName: options.name,\n case: result.case,\n output: result.output,\n usage,\n }),\n );\n }\n }\n }\n for (const metricResult of result.metrics) {\n const usage = metricResult.outcome.usage;\n if (usage === undefined) continue;\n assertUsage(usage, `Evaluation usage for metric ${metricResult.metricName}`);\n evaluationUsage = UsageValue.add(evaluationUsage, usage);\n if (options.cost !== undefined && result.output !== undefined) {\n const metric = options.metrics.find(\n (candidate) => candidate.name === metricResult.metricName,\n );\n if (metric !== undefined) {\n evaluationCost += await calculateCost(\n options.cost.calculate({\n kind: \"evaluation\",\n suiteName: options.name,\n case: result.case,\n output: result.output,\n metric,\n usage,\n }),\n );\n }\n }\n }\n }\n\n const usage = {\n target: targetUsage,\n evaluation: evaluationUsage,\n total: UsageValue.add(targetUsage, evaluationUsage),\n };\n const aggregates: {\n metrics: EvalTotals;\n cases: EvalTotals;\n usage: typeof usage;\n cost?: EvalCostSummary | undefined;\n } = {\n metrics: countMetricOutcomes(results),\n cases: countCaseOutcomes(results),\n usage,\n };\n if (options.cost !== undefined) {\n aggregates.cost = {\n currency: options.cost.currency,\n target: targetCost,\n evaluation: evaluationCost,\n total: targetCost + evaluationCost,\n };\n }\n return aggregates;\n}\n\nasync function resolveTargetUsage<Input, Output, Expected>(\n options: RunEvalSuiteOptions<Input, Output, Expected>,\n testCase: EvalCase<Input, Expected>,\n output: Output,\n): Promise<Usage | undefined> {\n const usage =\n options.targetUsage === undefined\n ? usageFromOutput(output)\n : await options.targetUsage({ suiteName: options.name, case: testCase, output });\n if (usage !== undefined) assertUsage(usage, `Target usage for case ${testCase.id}`);\n return usage;\n}\n\nfunction usageFromOutput(output: unknown): Usage | undefined {\n if (typeof output !== \"object\" || output === null || !(\"usage\" in output)) return undefined;\n return (output as { usage?: Usage | undefined }).usage;\n}\n\nfunction assertUsage(usage: Usage, label: string): void {\n for (const [key, value] of Object.entries(usage)) {\n if (key === \"details\") continue;\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n throw new TypeError(`${label} must contain finite, non-negative token counts`);\n }\n }\n}\n\nasync function calculateCost(value: number | Promise<number>): Promise<number> {\n const cost = await value;\n if (!Number.isFinite(cost) || cost < 0) {\n throw new TypeError(\"Evaluation cost calculator must return a finite, non-negative number\");\n }\n return cost;\n}\n\nfunction validateSuiteOptions<Input, Output, Expected>(\n options: RunEvalSuiteOptions<Input, Output, Expected>,\n): void {\n assertUnique(\n options.cases.map((testCase) => testCase.id),\n \"Evaluation case id\",\n );\n assertUnique(\n options.metrics.map((metric) => metric.name),\n \"Evaluation metric name\",\n );\n if (options.cost !== undefined && options.cost.currency.trim().length === 0) {\n throw new TypeError(\"Evaluation cost currency must not be empty\");\n }\n}\n\nfunction assertUnique(values: string[], label: string): void {\n const seen = new Set<string>();\n for (const value of values) {\n if (seen.has(value)) throw new TypeError(`${label} must be unique: ${value}`);\n seen.add(value);\n }\n}\n","import { runEvalSuite } from \"./runner\";\nimport type {\n EvalMetric,\n EvalOutcomeStatus,\n EvalSuiteResult,\n EvalTotals,\n RunEvalSuiteOptions,\n} from \"./types\";\n\nexport type EvalOutputFormat = \"pretty\" | \"json\" | \"quiet\";\n\nexport type EvalExpectedTotals = Partial<EvalTotals> & {\n metrics?: Partial<EvalTotals> | undefined;\n cases?: Partial<EvalTotals> | undefined;\n};\n\nexport type EvalExpectedOutcomes = Record<string, Record<string, EvalOutcomeStatus>>;\n\nexport type EvalExpectations = {\n totals?: EvalExpectedTotals | undefined;\n outcomes?: EvalExpectedOutcomes | undefined;\n};\n\nexport type EvalOutputWriters = {\n stdout?(text: string): void;\n stderr?(text: string): void;\n};\n\nexport type PrintEvalResultOptions = {\n format?: EvalOutputFormat | undefined;\n output?: EvalOutputWriters | undefined;\n};\n\nexport type RunEvalCliOptions<\n Input,\n Output,\n Expected = unknown,\n Metrics extends readonly EvalMetric<\n NoInfer<Input>,\n NoInfer<Output>,\n unknown,\n NoInfer<Expected>,\n string\n >[] = readonly EvalMetric<NoInfer<Input>, NoInfer<Output>, unknown, NoInfer<Expected>, string>[],\n> = RunEvalSuiteOptions<Input, Output, Expected, Metrics> & {\n format?: EvalOutputFormat | undefined;\n exitCode?: boolean | undefined;\n expectations?: EvalExpectations | undefined;\n output?: EvalOutputWriters | undefined;\n};\n\nexport class EvalAssertionError extends Error {\n readonly mismatches: string[];\n\n constructor(message: string, mismatches: string[]) {\n super(`${message}\\n${mismatches.map((mismatch) => `- ${mismatch}`).join(\"\\n\")}`);\n this.name = \"EvalAssertionError\";\n this.mismatches = mismatches;\n }\n}\n\nexport function printEvalResult(\n result: EvalSuiteResult<unknown, unknown, unknown>,\n options: PrintEvalResultOptions = {},\n): void {\n const format = options.format ?? \"pretty\";\n if (format === \"quiet\") return;\n const write = options.output?.stdout ?? ((text: string) => process.stdout.write(text));\n write(`${format === \"json\" ? jsonResult(result) : prettyResult(result)}\\n`);\n}\n\nexport function evalExitCode(\n result: EvalSuiteResult<unknown, unknown, unknown>,\n expectations?: EvalExpectations,\n): 0 | 1 | 2 {\n const hasExpectations =\n expectations?.totals !== undefined || expectations?.outcomes !== undefined;\n const mismatches = hasExpectations ? expectationMismatches(result, expectations) : [];\n if (hasExpectations && mismatches.length === 0) return 0;\n if (hasExpectations && hasUnexpectedInvalid(result, expectations)) return 2;\n if (hasExpectations) return 1;\n if (requiredMetricCount(result, \"invalid\") > 0) return 2;\n return requiredMetricCount(result, \"fail\") > 0 ? 1 : 0;\n}\n\nexport function assertEvalTotals(\n result: EvalSuiteResult<unknown, unknown, unknown>,\n expected: EvalExpectedTotals,\n): void {\n const mismatches = totalMismatches(result, expected);\n if (mismatches.length > 0) {\n throw new EvalAssertionError(\"Evaluation totals did not match expectations.\", mismatches);\n }\n}\n\nexport function assertEvalOutcomes(\n result: EvalSuiteResult<unknown, unknown, unknown>,\n expected: EvalExpectedOutcomes,\n): void {\n const mismatches = outcomeMismatches(result, expected);\n if (mismatches.length > 0) {\n throw new EvalAssertionError(\"Evaluation outcomes did not match expectations.\", mismatches);\n }\n}\n\nexport async function runEvalCli<\n Input,\n Output,\n Expected = unknown,\n const Metrics extends readonly EvalMetric<\n NoInfer<Input>,\n NoInfer<Output>,\n unknown,\n NoInfer<Expected>,\n string\n >[] = readonly EvalMetric<NoInfer<Input>, NoInfer<Output>, unknown, NoInfer<Expected>, string>[],\n>(\n options: RunEvalCliOptions<Input, Output, Expected, Metrics>,\n): Promise<EvalSuiteResult<Input, Output, Expected, Metrics>> {\n const { format, exitCode, expectations, output, ...suiteOptions } = options;\n const result = await runEvalSuite(\n suiteOptions as RunEvalSuiteOptions<Input, Output, Expected, Metrics>,\n );\n printEvalResult(result, { format, output });\n const code = evalExitCode(result, expectations);\n const mismatches = expectationMismatches(result, expectations);\n if (mismatches.length > 0 && format !== \"quiet\") {\n const write = output?.stderr ?? ((text: string) => process.stderr.write(text));\n write(\n `Evaluation expectation mismatches:\\n${mismatches.map((value) => `- ${value}`).join(\"\\n\")}\\n`,\n );\n }\n const currentExitCode =\n typeof process.exitCode === \"number\" ? process.exitCode : Number(process.exitCode ?? 0);\n if (exitCode === true && code > currentExitCode) process.exitCode = code;\n return result;\n}\n\nfunction prettyResult(result: EvalSuiteResult<unknown, unknown, unknown>): string {\n const lines = [\n `${result.name} (${result.run.id})`,\n `Cases: ${totalsText(result.cases)}`,\n `Metrics: ${totalsText(result.metrics)}`,\n ];\n for (const caseResult of result.results) {\n lines.push(``, `[${caseResult.outcome.toUpperCase()}] ${caseResult.case.id}`);\n if (caseResult.output !== undefined) lines.push(` output: ${displayValue(caseResult.output)}`);\n if (caseResult.targetError !== undefined) {\n lines.push(` target error: ${errorText(caseResult.targetError)}`);\n }\n for (const metric of caseResult.metrics) {\n const parts = [` - ${metric.metricName}: ${metric.outcome.outcome}`];\n if (metric.outcome.score !== undefined)\n parts.push(`score=${displayValue(metric.outcome.score)}`);\n if (metric.threshold !== undefined) parts.push(`threshold=${metric.threshold}`);\n if (metric.direction !== undefined) parts.push(`direction=${metric.direction}`);\n if (!metric.required) parts.push(\"optional\");\n lines.push(parts.join(\" | \"));\n const explanation =\n metric.outcome.comment ??\n (metric.outcome.outcome === \"invalid\" ? metric.outcome.reason : undefined);\n if (explanation !== undefined) lines.push(` ${explanation}`);\n }\n }\n lines.push(\n ``,\n `Usage: target=${result.usage.target.totalTokens} evaluation=${result.usage.evaluation.totalTokens} total=${result.usage.total.totalTokens} tokens`,\n );\n if (result.cost !== undefined) {\n lines.push(\n `Cost: target=${result.cost.target} evaluation=${result.cost.evaluation} total=${result.cost.total} ${result.cost.currency}`,\n );\n }\n lines.push(`Duration: ${result.durationMs}ms`);\n return lines.join(\"\\n\");\n}\n\nfunction jsonResult(result: EvalSuiteResult<unknown, unknown, unknown>): string {\n return JSON.stringify(\n result,\n (_key, value: unknown) => {\n if (value instanceof Error) {\n return { name: value.name, message: value.message, stack: value.stack };\n }\n if (value instanceof RegExp) return String(value);\n return value;\n },\n 2,\n );\n}\n\nfunction expectationMismatches(\n result: EvalSuiteResult<unknown, unknown, unknown>,\n expectations?: EvalExpectations,\n): string[] {\n if (expectations === undefined) return [];\n const mismatches: string[] = [];\n if (expectations.totals !== undefined) {\n mismatches.push(...totalMismatches(result, expectations.totals));\n }\n if (expectations.outcomes !== undefined) {\n mismatches.push(...outcomeMismatches(result, expectations.outcomes));\n }\n return mismatches;\n}\n\nfunction totalMismatches(\n result: EvalSuiteResult<unknown, unknown, unknown>,\n expected: EvalExpectedTotals,\n): string[] {\n const directMetrics: Partial<EvalTotals> = {};\n if (expected.total !== undefined) directMetrics.total = expected.total;\n if (expected.passed !== undefined) directMetrics.passed = expected.passed;\n if (expected.failed !== undefined) directMetrics.failed = expected.failed;\n if (expected.invalid !== undefined) directMetrics.invalid = expected.invalid;\n return [\n ...totalsGroupMismatches(\"metrics\", result.metrics, {\n ...directMetrics,\n ...expected.metrics,\n }),\n ...totalsGroupMismatches(\"cases\", result.cases, expected.cases),\n ];\n}\n\nfunction totalsGroupMismatches(\n label: string,\n actual: EvalTotals,\n expected: Partial<EvalTotals> | undefined,\n): string[] {\n if (expected === undefined) return [];\n const mismatches: string[] = [];\n for (const key of [\"total\", \"passed\", \"failed\", \"invalid\"] as const) {\n if (expected[key] !== undefined && actual[key] !== expected[key]) {\n mismatches.push(`${label}.${key}: expected ${expected[key]}, received ${actual[key]}`);\n }\n }\n return mismatches;\n}\n\nfunction outcomeMismatches(\n result: EvalSuiteResult<unknown, unknown, unknown>,\n expected: EvalExpectedOutcomes,\n): string[] {\n const mismatches: string[] = [];\n const actualCases = new Map(result.results.map((caseResult) => [caseResult.case.id, caseResult]));\n for (const [caseId, metrics] of Object.entries(expected)) {\n const caseResult = actualCases.get(caseId);\n if (caseResult === undefined) {\n mismatches.push(`${caseId}: expected case was not present`);\n continue;\n }\n for (const [metricName, expectedOutcome] of Object.entries(metrics)) {\n const metric = caseResult.metrics.find((candidate) => candidate.metricName === metricName);\n if (metric === undefined) {\n mismatches.push(`${caseId}.${metricName}: expected metric was not present`);\n } else if (metric.outcome.outcome !== expectedOutcome) {\n mismatches.push(\n `${caseId}.${metricName}: expected ${expectedOutcome}, received ${metric.outcome.outcome}`,\n );\n }\n }\n }\n for (const caseResult of result.results) {\n for (const metric of caseResult.metrics) {\n if (!metric.required) continue;\n const expectedOutcome = expected[caseResult.case.id]?.[metric.metricName] ?? \"pass\";\n if (metric.outcome.outcome !== expectedOutcome) {\n const message = `${caseResult.case.id}.${metric.metricName}: expected ${expectedOutcome}, received ${metric.outcome.outcome}`;\n if (!mismatches.includes(message)) mismatches.push(message);\n }\n }\n }\n return mismatches;\n}\n\nfunction hasUnexpectedInvalid(\n result: EvalSuiteResult<unknown, unknown, unknown>,\n expectations: EvalExpectations | undefined,\n): boolean {\n if (expectations?.outcomes !== undefined) {\n return result.results.some((caseResult) =>\n caseResult.metrics.some(\n (metric) =>\n metric.required &&\n metric.outcome.outcome === \"invalid\" &&\n expectations.outcomes?.[caseResult.case.id]?.[metric.metricName] !== \"invalid\",\n ),\n );\n }\n const expectedInvalid = expectations?.totals?.metrics?.invalid ?? expectations?.totals?.invalid;\n return result.metrics.invalid > (expectedInvalid ?? 0);\n}\n\nfunction requiredMetricCount(\n result: EvalSuiteResult<unknown, unknown, unknown>,\n status: \"fail\" | \"invalid\",\n): number {\n return result.results.reduce(\n (total, caseResult) =>\n total +\n caseResult.metrics.filter((metric) => metric.required && metric.outcome.outcome === status)\n .length,\n 0,\n );\n}\n\nfunction totalsText(totals: EvalTotals): string {\n return `${totals.total} total / ${totals.passed} pass / ${totals.failed} fail / ${totals.invalid} invalid`;\n}\n\nfunction displayValue(value: unknown): string {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof Error ? error.message : displayValue(error);\n}\n","import type { EvalMetric } from \"./types\";\n\nexport function defineMetric<Input, Output, Score, Expected, const Name extends string = string>(\n metric: EvalMetric<Input, Output, Score, Expected, Name>,\n): EvalMetric<Input, Output, Score, Expected, Name> {\n return metric;\n}\n","import { z } from \"zod\";\nimport type { CompletionModel } from \"../completion\";\nimport { cosineSimilarity, type EmbeddingModel, embedText } from \"../embeddings\";\nimport { extract } from \"../extractor\";\nimport type { ZodSchema } from \"../schema\";\nimport { errorMessage, formatValue, stableComparable } from \"./format\";\nimport { EvalOutcome } from \"./outcome\";\nimport { resolveActual, resolveActualText, resolveExpected, resolveJudgePrompt } from \"./selectors\";\nimport type { EvalCaseRequirements, EvalMetric, SelectorOrValue, ValueSelector } from \"./types\";\n\nexport type ExactMatchOptions<Input, Output, Expected = unknown> = {\n name?: string | undefined;\n required?: boolean | undefined;\n actual?: ValueSelector<Input, Output, Expected, unknown> | undefined;\n expected?: SelectorOrValue<Input, Output, Expected, unknown> | undefined;\n};\n\nexport function exactMatch<Input, Output, Expected = unknown, const Name extends string = string>(\n options: ExactMatchOptions<Input, Output, Expected> & {\n expected: Exclude<ExactMatchOptions<Input, Output, Expected>[\"expected\"], undefined>;\n name?: Name | undefined;\n },\n): EvalMetric<Input, Output, boolean, Expected, Name>;\nexport function exactMatch<Input, Output, Expected = unknown, const Name extends string = string>(\n options?: Omit<ExactMatchOptions<Input, Output, Expected>, \"expected\"> & {\n expected?: undefined;\n name?: Name | undefined;\n },\n): EvalMetric<Input, Output, boolean, Expected, Name, { expected: unknown }>;\nexport function exactMatch<Input, Output, Expected = unknown, const Name extends string = string>(\n options: ExactMatchOptions<Input, Output, Expected> & { name?: Name | undefined } = {},\n): EvalMetric<Input, Output, boolean, Expected, Name, EvalCaseRequirements> {\n return {\n name: (options.name ?? \"exact_match\") as Name,\n required: options.required ?? true,\n dataType: \"BOOLEAN\",\n direction: \"higher_is_better\",\n threshold: 1,\n async evaluate(args) {\n const actual = await resolveActual(options.actual, args);\n const expected = await resolveExpected(options.expected, args);\n if (expected === undefined) {\n return EvalOutcome.invalid(\"No expected value provided for exact match.\");\n }\n const passed = stableComparable(actual) === stableComparable(expected);\n return passed\n ? EvalOutcome.pass(true)\n : EvalOutcome.fail(false, { comment: `Expected ${formatValue(expected)}.` });\n },\n };\n}\n\nexport type ContainsOptions<Input, Output, Expected = unknown> = {\n name?: string | undefined;\n required?: boolean | undefined;\n actual?: ValueSelector<Input, Output, Expected, string> | undefined;\n expected?: SelectorOrValue<Input, Output, Expected, string | RegExp> | undefined;\n};\n\nexport function contains<Input, Output, Expected = unknown, const Name extends string = string>(\n options: ContainsOptions<Input, Output, Expected> & {\n expected: Exclude<ContainsOptions<Input, Output, Expected>[\"expected\"], undefined>;\n name?: Name | undefined;\n },\n): EvalMetric<Input, Output, boolean, Expected, Name>;\nexport function contains<Input, Output, Expected = unknown, const Name extends string = string>(\n options?: Omit<ContainsOptions<Input, Output, Expected>, \"expected\"> & {\n expected?: undefined;\n name?: Name | undefined;\n },\n): EvalMetric<Input, Output, boolean, Expected, Name, { expected: string | RegExp }>;\nexport function contains<Input, Output, Expected = unknown, const Name extends string = string>(\n options: ContainsOptions<Input, Output, Expected> & { name?: Name | undefined } = {},\n): EvalMetric<Input, Output, boolean, Expected, Name, EvalCaseRequirements> {\n return {\n name: (options.name ?? \"contains\") as Name,\n required: options.required ?? true,\n dataType: \"BOOLEAN\",\n direction: \"higher_is_better\",\n threshold: 1,\n async evaluate(args) {\n const actual = await resolveActualText(options.actual, args);\n const expected = await resolveExpected(options.expected, args);\n if (expected === undefined) {\n return EvalOutcome.invalid(\"No expected value provided for contains.\");\n }\n if (typeof expected !== \"string\" && !(expected instanceof RegExp)) {\n return EvalOutcome.invalid(\"Contains expected value must be a string or RegExp.\");\n }\n const passed =\n expected instanceof RegExp ? regexMatches(expected, actual) : actual.includes(expected);\n return passed\n ? EvalOutcome.pass(true)\n : EvalOutcome.fail(false, { comment: `Output did not contain ${String(expected)}.` });\n },\n };\n}\n\nexport type NotContainsOptions<Input, Output, Expected = unknown> = ContainsOptions<\n Input,\n Output,\n Expected\n>;\n\nexport function notContains<Input, Output, Expected = unknown, const Name extends string = string>(\n options: NotContainsOptions<Input, Output, Expected> & { name?: Name | undefined } = {},\n): EvalMetric<Input, Output, boolean, Expected, Name> {\n return {\n name: (options.name ?? \"not_contains\") as Name,\n required: options.required ?? true,\n dataType: \"BOOLEAN\",\n direction: \"higher_is_better\",\n threshold: 1,\n async evaluate(args) {\n const actual = await resolveActualText(options.actual, args);\n const expected = await resolveExpected(options.expected, args);\n if (expected === undefined) {\n return EvalOutcome.invalid(\"No expected value provided for notContains.\");\n }\n if (typeof expected !== \"string\" && !(expected instanceof RegExp)) {\n return EvalOutcome.invalid(\"notContains expected value must be a string or RegExp.\");\n }\n const found = textExpectationMatches(expected, actual);\n return found\n ? EvalOutcome.fail(false, {\n comment: `Output contained forbidden value ${String(expected)}.`,\n })\n : EvalOutcome.pass(true);\n },\n };\n}\n\nexport type ContainsListOptions<Input, Output, Expected = unknown> = {\n name?: string | undefined;\n required?: boolean | undefined;\n actual?: ValueSelector<Input, Output, Expected, string> | undefined;\n expected?: SelectorOrValue<Input, Output, Expected, ReadonlyArray<string | RegExp>> | undefined;\n};\n\nexport type ContainsAllOptions<Input, Output, Expected = unknown> = ContainsListOptions<\n Input,\n Output,\n Expected\n>;\n\nexport function containsAll<Input, Output, Expected = unknown, const Name extends string = string>(\n options: ContainsAllOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, boolean, Expected, Name> {\n return containsListMetric(\"contains_all\", \"all\", options);\n}\n\nexport type ContainsAnyOptions<Input, Output, Expected = unknown> = ContainsListOptions<\n Input,\n Output,\n Expected\n>;\n\nexport function containsAny<Input, Output, Expected = unknown, const Name extends string = string>(\n options: ContainsAnyOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, boolean, Expected, Name> {\n return containsListMetric(\"contains_any\", \"any\", options);\n}\n\nfunction containsListMetric<Input, Output, Expected, const Name extends string>(\n defaultName: string,\n mode: \"all\" | \"any\",\n options: ContainsListOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, boolean, Expected, Name> {\n return {\n name: (options.name ?? defaultName) as Name,\n required: options.required ?? true,\n dataType: \"BOOLEAN\",\n direction: \"higher_is_better\",\n threshold: 1,\n async evaluate(args) {\n const actual = await resolveActualText(options.actual, args);\n const expected = await resolveExpected(options.expected, args);\n if (!Array.isArray(expected) || expected.length === 0) {\n return EvalOutcome.invalid(`${defaultName} expected value must be a non-empty array.`);\n }\n if (expected.some((value) => typeof value !== \"string\" && !(value instanceof RegExp))) {\n return EvalOutcome.invalid(`${defaultName} expected values must be strings or RegExp.`);\n }\n const matches = expected.map((value) => textExpectationMatches(value, actual));\n const passed = mode === \"all\" ? matches.every(Boolean) : matches.some(Boolean);\n if (passed) return EvalOutcome.pass(true);\n const missing = expected.filter((_, index) => !matches[index]).map(String);\n const comment =\n mode === \"all\"\n ? `Output was missing: ${missing.join(\", \")}.`\n : `Output matched none of: ${expected.map(String).join(\", \")}.`;\n return EvalOutcome.fail(false, { comment });\n },\n };\n}\n\nexport type MatchesOptions<Input, Output, Expected = unknown> = {\n name?: string | undefined;\n required?: boolean | undefined;\n actual?: ValueSelector<Input, Output, Expected, string> | undefined;\n expected?: SelectorOrValue<Input, Output, Expected, RegExp> | undefined;\n};\n\nexport function matches<Input, Output, Expected = unknown, const Name extends string = string>(\n options: MatchesOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, boolean, Expected, Name> {\n return regexMetric(\"matches\", false, options);\n}\n\nexport type DoesNotMatchOptions<Input, Output, Expected = unknown> = MatchesOptions<\n Input,\n Output,\n Expected\n>;\n\nexport function doesNotMatch<Input, Output, Expected = unknown, const Name extends string = string>(\n options: DoesNotMatchOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, boolean, Expected, Name> {\n return regexMetric(\"does_not_match\", true, options);\n}\n\nfunction regexMetric<Input, Output, Expected, const Name extends string>(\n defaultName: string,\n negate: boolean,\n options: MatchesOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, boolean, Expected, Name> {\n return {\n name: (options.name ?? defaultName) as Name,\n required: options.required ?? true,\n dataType: \"BOOLEAN\",\n direction: \"higher_is_better\",\n threshold: 1,\n async evaluate(args) {\n const actual = await resolveActualText(options.actual, args);\n const expected = await resolveExpected(options.expected, args);\n if (!(expected instanceof RegExp)) {\n return EvalOutcome.invalid(`${defaultName} expected value must be a RegExp.`);\n }\n const matched = regexMatches(expected, actual);\n const passed = negate ? !matched : matched;\n return passed\n ? EvalOutcome.pass(true)\n : EvalOutcome.fail(false, {\n comment: negate\n ? `Output matched forbidden pattern ${String(expected)}.`\n : `Output did not match ${String(expected)}.`,\n });\n },\n };\n}\n\nexport type MaxLengthOptions<Input, Output, Expected = unknown> = {\n name?: string | undefined;\n required?: boolean | undefined;\n actual?: ValueSelector<Input, Output, Expected, string> | undefined;\n max: SelectorOrValue<Input, Output, Expected, number>;\n};\n\nexport function maxLength<Input, Output, Expected = unknown, const Name extends string = string>(\n options: MaxLengthOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, boolean, Expected, Name> {\n return {\n name: (options.name ?? \"max_length\") as Name,\n required: options.required ?? true,\n dataType: \"BOOLEAN\",\n direction: \"higher_is_better\",\n threshold: 1,\n async evaluate(args) {\n const actual = await resolveActualText(options.actual, args);\n const max = await resolveOption(options.max, args);\n if (!Number.isInteger(max) || max < 0) {\n return EvalOutcome.invalid(\"maxLength max must be a non-negative integer.\");\n }\n const length = Array.from(actual).length;\n return length <= max\n ? EvalOutcome.pass(true)\n : EvalOutcome.fail(false, { comment: `Output length ${length} exceeded maximum ${max}.` });\n },\n };\n}\n\nexport type RequiredFieldsOptions<Input, Output, Expected = unknown> = {\n name?: string | undefined;\n required?: boolean | undefined;\n actual?: ValueSelector<Input, Output, Expected, unknown> | undefined;\n expected: SelectorOrValue<Input, Output, Expected, readonly string[]>;\n};\n\nexport function requiredFields<\n Input,\n Output,\n Expected = unknown,\n const Name extends string = string,\n>(\n options: RequiredFieldsOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, boolean, Expected, Name> {\n return {\n name: (options.name ?? \"required_fields\") as Name,\n required: options.required ?? true,\n dataType: \"BOOLEAN\",\n direction: \"higher_is_better\",\n threshold: 1,\n async evaluate(args) {\n const actual = await resolveActual(options.actual, args);\n const expected = await resolveOption(options.expected, args);\n if (\n !Array.isArray(expected) ||\n expected.length === 0 ||\n expected.some((field) => typeof field !== \"string\" || field.length === 0)\n ) {\n return EvalOutcome.invalid(\n \"requiredFields expected value must be a non-empty string array.\",\n );\n }\n if (typeof actual !== \"object\" || actual === null || Array.isArray(actual)) {\n return EvalOutcome.invalid(\"requiredFields actual value must be an object.\");\n }\n const missing = expected.filter((field) => !Object.hasOwn(actual, field));\n return missing.length === 0\n ? EvalOutcome.pass(true)\n : EvalOutcome.fail(false, { comment: `Missing required fields: ${missing.join(\", \")}.` });\n },\n };\n}\n\nfunction regexMatches(pattern: RegExp, text: string): boolean {\n pattern.lastIndex = 0;\n const matched = pattern.test(text);\n pattern.lastIndex = 0;\n return matched;\n}\n\nfunction textExpectationMatches(expected: string | RegExp, actual: string): boolean {\n return expected instanceof RegExp ? regexMatches(expected, actual) : actual.includes(expected);\n}\n\nasync function resolveOption<Input, Output, Expected, Value>(\n value: SelectorOrValue<Input, Output, Expected, Value>,\n args: Parameters<ValueSelector<Input, Output, Expected, Value>>[0],\n): Promise<Value> {\n return typeof value === \"function\"\n ? (value as ValueSelector<Input, Output, Expected, Value>)(args)\n : value;\n}\n\nexport type SemanticSimilarityOptions<Input, Output, Expected = unknown> = {\n name?: string | undefined;\n required?: boolean | undefined;\n model: EmbeddingModel;\n threshold: number;\n actual?: ValueSelector<Input, Output, Expected, string> | undefined;\n expected?: SelectorOrValue<Input, Output, Expected, string> | undefined;\n};\n\nexport function semanticSimilarity<\n Input,\n Output,\n Expected = unknown,\n const Name extends string = string,\n>(\n options: SemanticSimilarityOptions<Input, Output, Expected> & {\n expected: Exclude<SemanticSimilarityOptions<Input, Output, Expected>[\"expected\"], undefined>;\n name?: Name | undefined;\n },\n): EvalMetric<Input, Output, number, Expected, Name>;\nexport function semanticSimilarity<\n Input,\n Output,\n Expected = unknown,\n const Name extends string = string,\n>(\n options: Omit<SemanticSimilarityOptions<Input, Output, Expected>, \"expected\"> & {\n expected?: undefined;\n name?: Name | undefined;\n },\n): EvalMetric<Input, Output, number, Expected, Name, { expected: string }>;\nexport function semanticSimilarity<\n Input,\n Output,\n Expected = unknown,\n const Name extends string = string,\n>(\n options: SemanticSimilarityOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, number, Expected, Name, EvalCaseRequirements> {\n return {\n name: (options.name ?? \"semantic_similarity\") as Name,\n required: options.required ?? true,\n dataType: \"NUMERIC\",\n direction: \"higher_is_better\",\n threshold: options.threshold,\n async evaluate(args) {\n const actual = await resolveActualText(options.actual, args);\n const expected = await resolveExpected(options.expected, args);\n if (expected === undefined) {\n return EvalOutcome.invalid(\"No expected value provided for semantic similarity.\");\n }\n if (typeof expected !== \"string\") {\n return EvalOutcome.invalid(\"Semantic similarity expected value must be a string.\");\n }\n const [{ embedding: actualEmbedding }, { embedding: expectedEmbedding }] = await Promise.all([\n embedText({ model: options.model, text: actual }),\n embedText({ model: options.model, text: expected }),\n ]);\n const score = cosineSimilarity(actualEmbedding.vector, expectedEmbedding.vector);\n return score >= options.threshold\n ? EvalOutcome.pass(score)\n : EvalOutcome.fail(score, { comment: `Similarity below threshold ${options.threshold}.` });\n },\n };\n}\n\nexport type LlmJudgeOptions<Input, Output, SchemaOutput, Expected = unknown> = {\n name?: string | undefined;\n required?: boolean | undefined;\n model: CompletionModel;\n schema: ZodSchema<SchemaOutput>;\n passes(value: SchemaOutput): boolean;\n instructions?: string | undefined;\n retries?: number | undefined;\n prompt?: ValueSelector<Input, Output, Expected, string> | undefined;\n};\n\nexport function llmJudge<\n Input,\n Output,\n SchemaOutput,\n Expected = unknown,\n const Name extends string = string,\n>(\n options: LlmJudgeOptions<Input, Output, SchemaOutput, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, SchemaOutput, Expected, Name> {\n return {\n name: (options.name ?? \"llm_judge\") as Name,\n required: options.required ?? true,\n async evaluate(args) {\n try {\n const result = await extract({\n model: options.model,\n outputSchema: options.schema,\n instructions:\n options.instructions ??\n \"Judge the eval case by the requested schema. Submit the judgment using the schema.\",\n text: await resolveJudgePrompt(options.prompt, args),\n retries: evalExtractionRetries(options.retries),\n });\n return options.passes(result.output)\n ? EvalOutcome.pass(result.output, { usage: result.usage })\n : EvalOutcome.fail(result.output, { usage: result.usage });\n } catch (error) {\n return EvalOutcome.invalid(errorMessage(error));\n }\n },\n };\n}\n\nexport type LlmScoreMetricScore = {\n score: number;\n feedback: string;\n};\n\nexport type LlmScoreOptions<Input, Output, Expected = unknown> = {\n name?: string | undefined;\n required?: boolean | undefined;\n model: CompletionModel;\n threshold: number;\n criteria: string | string[];\n instructions?: string | undefined;\n retries?: number | undefined;\n prompt?: ValueSelector<Input, Output, Expected, string> | undefined;\n};\n\nexport function llmScore<Input, Output, Expected = unknown, const Name extends string = string>(\n options: LlmScoreOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, LlmScoreMetricScore, Expected, Name> {\n const criteria = Array.isArray(options.criteria) ? options.criteria.join(\"\\n\") : options.criteria;\n return {\n name: (options.name ?? \"llm_score\") as Name,\n required: options.required ?? true,\n dataType: \"NUMERIC\",\n projectScore: (score) => score.score,\n direction: \"higher_is_better\",\n threshold: options.threshold,\n async evaluate(args) {\n try {\n const result = await extract({\n model: options.model,\n outputSchema: z.object({\n score: z.number(),\n feedback: z.string(),\n }),\n instructions:\n options.instructions ??\n `Score the eval case against these criteria:\\n${criteria}\\n\\nReturn a score between 0 and 1 and brief feedback.`,\n text: await resolveJudgePrompt(options.prompt, args),\n retries: evalExtractionRetries(options.retries),\n });\n const score = result.output;\n if (score.score < 0 || score.score > 1) {\n return EvalOutcome.invalid(`Score ${score.score} outside valid range [0, 1].`, {\n score,\n usage: result.usage,\n });\n }\n return score.score >= options.threshold\n ? EvalOutcome.pass(score, { comment: score.feedback, usage: result.usage })\n : EvalOutcome.fail(score, { comment: score.feedback, usage: result.usage });\n } catch (error) {\n return EvalOutcome.invalid(errorMessage(error));\n }\n },\n };\n}\n\nfunction evalExtractionRetries(retries: number | undefined): { maxAttempts: number } | undefined {\n const retryCount = Math.max(0, Math.trunc(retries ?? 0));\n if (retryCount === 0) {\n return undefined;\n }\n return { maxAttempts: retryCount + 1 };\n}\n","import type { EvalCase, EvalMetric, EvalTarget, RunEvalSuiteOptions } from \"./types\";\n\ntype EvalCaseLike = EvalCase<unknown, unknown>;\n\nexport type EvalCasesInput<Cases extends readonly EvalCaseLike[]> = Cases[number][\"input\"];\n\ntype EvalCaseExpected<Case> = Case extends { expected: infer Expected } ? Expected : unknown;\n\nexport type EvalCasesExpected<Cases extends readonly EvalCaseLike[]> = EvalCaseExpected<\n Cases[number]\n>;\n\ntype EvalMetricRequirements<Metric> =\n Metric extends EvalMetric<\n infer _Input,\n infer _Output,\n infer _Score,\n infer _Expected,\n infer _Name,\n infer Requirements\n >\n ? Requirements\n : Record<never, never>;\n\ntype RequiredExpected<Metrics extends readonly EvalMetric<never, never>[]> = Extract<\n EvalMetricRequirements<Metrics[number]>,\n { expected: unknown }\n>;\n\ntype RequiredContext<Metrics extends readonly EvalMetric<never, never>[]> = Extract<\n EvalMetricRequirements<Metrics[number]>,\n { context: string[] }\n>;\n\ntype RequiredRetrievalContext<Metrics extends readonly EvalMetric<never, never>[]> = Extract<\n EvalMetricRequirements<Metrics[number]>,\n { retrievalContext: string[] }\n>;\n\ntype EvalCaseFieldsForMetrics<Metrics extends readonly EvalMetric<never, never>[]> = ([\n RequiredExpected<Metrics>,\n] extends [never]\n ? Record<never, never>\n : { expected: RequiredExpected<Metrics>[\"expected\"] }) &\n ([RequiredContext<Metrics>] extends [never] ? Record<never, never> : { context: string[] }) &\n ([RequiredRetrievalContext<Metrics>] extends [never]\n ? Record<never, never>\n : { retrievalContext: string[] });\n\nexport type EvalCasesForMetrics<\n Cases extends readonly EvalCaseLike[],\n Metrics extends readonly EvalMetric<never, never>[],\n> = {\n readonly [Index in keyof Cases]: Cases[Index] & EvalCaseFieldsForMetrics<Metrics>;\n};\n\nexport type DefinedEvalSuite<\n Cases extends readonly EvalCaseLike[],\n Output,\n Metrics extends readonly EvalMetric<\n EvalCasesInput<Cases>,\n Output,\n unknown,\n EvalCasesExpected<Cases>,\n string\n >[],\n> = Omit<\n RunEvalSuiteOptions<EvalCasesInput<Cases>, Output, EvalCasesExpected<Cases>, Metrics>,\n \"cases\" | \"target\" | \"metrics\"\n> & {\n cases: Cases & EvalCasesForMetrics<NoInfer<Cases>, NoInfer<Metrics>>;\n target: EvalTarget<EvalCasesInput<Cases>, Output, EvalCasesExpected<Cases>>;\n metrics: Metrics;\n};\n\ntype EvalMetricFactory<Input, Output, Expected = unknown> = {\n defineMetric<const Name extends string = string>(\n metric: EvalMetric<Input, Output, boolean, Expected, Name> & { dataType: \"BOOLEAN\" },\n ): EvalMetric<Input, Output, boolean, Expected, Name>;\n defineMetric<const Name extends string = string>(\n metric: EvalMetric<Input, Output, number, Expected, Name> & { dataType: \"NUMERIC\" },\n ): EvalMetric<Input, Output, number, Expected, Name>;\n defineMetric<const Name extends string = string>(\n metric: EvalMetric<Input, Output, string, Expected, Name> & { dataType: \"CATEGORICAL\" },\n ): EvalMetric<Input, Output, string, Expected, Name>;\n defineMetric<Score, const Name extends string = string>(\n metric: EvalMetric<Input, Output, Score, Expected, Name> & {\n dataType: \"BOOLEAN\";\n projectScore(score: Score): boolean;\n },\n ): EvalMetric<Input, Output, Score, Expected, Name>;\n defineMetric<Score, const Name extends string = string>(\n metric: EvalMetric<Input, Output, Score, Expected, Name> & {\n dataType: \"NUMERIC\";\n projectScore(score: Score): number;\n },\n ): EvalMetric<Input, Output, Score, Expected, Name>;\n defineMetric<Score, const Name extends string = string>(\n metric: EvalMetric<Input, Output, Score, Expected, Name> & {\n dataType: \"CATEGORICAL\";\n projectScore(score: Score): string;\n },\n ): EvalMetric<Input, Output, Score, Expected, Name>;\n defineMetric<Score, const Name extends string = string>(\n metric: EvalMetric<Input, Output, Score, Expected, Name> & { dataType?: undefined },\n ): EvalMetric<Input, Output, Score, Expected, Name>;\n};\n\nexport function defineEvalCases<const Cases extends readonly EvalCaseLike[]>(cases: Cases): Cases {\n return cases;\n}\n\nexport function defineEvalSuite<Input, Output, Expected = unknown>(): EvalMetricFactory<\n Input,\n Output,\n Expected\n>;\nexport function defineEvalSuite<\n const Cases extends readonly EvalCaseLike[],\n const Target extends (\n input: EvalCasesInput<Cases>,\n testCase: EvalCase<EvalCasesInput<Cases>, EvalCasesExpected<Cases>>,\n ) => unknown,\n const Metrics extends readonly EvalMetric<\n EvalCasesInput<Cases>,\n Awaited<ReturnType<Target>>,\n unknown,\n EvalCasesExpected<Cases>,\n string\n >[],\n>(\n options: DefinedEvalSuite<Cases, Awaited<ReturnType<Target>>, Metrics> & { target: Target },\n): DefinedEvalSuite<Cases, Awaited<ReturnType<Target>>, Metrics> & { target: Target };\nexport function defineEvalSuite(\n options?: DefinedEvalSuite<\n readonly EvalCaseLike[],\n unknown,\n readonly EvalMetric<unknown, unknown>[]\n >,\n):\n | DefinedEvalSuite<readonly EvalCaseLike[], unknown, readonly EvalMetric<unknown, unknown>[]>\n | EvalMetricFactory<unknown, unknown, unknown> {\n if (options !== undefined) return options;\n return {\n defineMetric(metric: EvalMetric<unknown, unknown>) {\n return metric;\n },\n } as EvalMetricFactory<unknown, unknown, unknown>;\n}\n"],"mappings":"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","names":["usage","z","matches","z"]}
|
|
1
|
+
{"version":3,"sources":["../../src/evals/advanced-metrics.ts","../../src/evals/format.ts","../../src/evals/judge.ts","../../src/evals/outcome.ts","../../src/evals/selectors.ts","../../src/evals/agent-target.ts","../../src/evals/reporting.ts","../../src/evals/runner.ts","../../src/evals/cli.ts","../../src/evals/metric.ts","../../src/evals/metrics.ts","../../src/evals/suite.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type { CompletionModel, JsonObject, JsonValue, Message, Usage } from \"../completion\";\nimport { isJsonValue, Usage as UsageValue } from \"../completion\";\nimport { mapWithConcurrency } from \"../internal/concurrency\";\nimport type { ZodSchema } from \"../schema\";\nimport { errorMessage, formatValue } from \"./format\";\nimport { addUsage, evaluationMetadata, type JudgeResult, runJudge } from \"./judge\";\nimport { EvalOutcome, type EvalOutcome as EvalOutcomeType } from \"./outcome\";\nimport { resolveActualText, resolveExpected } from \"./selectors\";\nimport type {\n EvalCaseRequirements,\n EvalMetric,\n EvalMetricArgs,\n EvalTurn,\n SelectorOrValue,\n ValueSelector,\n} from \"./types\";\n\ntype Verdict = {\n verdict: \"yes\" | \"no\" | \"idk\";\n reason?: string | undefined;\n};\n\nconst statementsSchema = z.object({ statements: z.array(z.string()) });\nconst factsSchema = z.object({ facts: z.array(z.string()) });\nconst questionsSchema = z.object({ questions: z.array(z.string()) });\nconst answersSchema = z.object({ answers: z.array(z.enum([\"yes\", \"no\"])) });\nconst verdictsSchema = z.object({\n verdicts: z.array(\n z.object({\n verdict: z.enum([\"yes\", \"no\", \"idk\"]),\n reason: z.string().optional(),\n }),\n ),\n});\nconst binaryVerdictsSchema = z.object({\n verdicts: z.array(\n z.object({\n verdict: z.enum([\"yes\", \"no\"]),\n reason: z.string(),\n }),\n ),\n});\nconst binaryVerdictSchema = z.object({\n verdict: z.enum([\"yes\", \"no\"]),\n reason: z.string(),\n});\nconst reasonSchema = z.object({ reason: z.string() });\nconst abstentionJudgmentSchema = z.object({\n behavior: z.enum([\"abstention\", \"confident_answer\"]),\n grounded: z.boolean(),\n reason: z.string(),\n});\n\ntype LlmEvalOptions<Input, Output, Expected = unknown> = {\n name?: string | undefined;\n required?: boolean | undefined;\n model: CompletionModel;\n threshold?: number | undefined;\n strictMode?: boolean | undefined;\n includeReason?: boolean | undefined;\n retries?: number | undefined;\n input?: ValueSelector<Input, Output, Expected, string> | undefined;\n actual?: ValueSelector<Input, Output, Expected, string> | undefined;\n};\n\nexport type AnswerRelevancyOptions<Input, Output, Expected = unknown> = LlmEvalOptions<\n Input,\n Output,\n Expected\n>;\n\nexport function answerRelevancy<\n Input,\n Output,\n Expected = unknown,\n const Name extends string = string,\n>(\n options: AnswerRelevancyOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, number, Expected, Name> {\n const config = metricConfig<Name>(options, \"answer_relevancy\");\n return numericMetric(config.name, config, \"higher_is_better\", async (args) => {\n try {\n const input = await resolveInput(options.input, args);\n const actual = await resolveActualText(options.actual, args);\n const statementResult = await runJudge({\n model: options.model,\n schema: statementsSchema,\n instructions:\n \"Break the answer into concise, independently assessable statements. Return every substantive statement using the schema.\",\n prompt: `Answer:\\n${actual}`,\n retries: config.retries,\n });\n const statements = statementResult.data.statements;\n let verdicts: Verdict[] = [];\n let usage = statementResult.usage;\n if (statements.length > 0) {\n const verdictResult = await runJudge({\n model: options.model,\n schema: verdictsSchema,\n instructions:\n \"Classify each answer statement for relevance to the user input. Use yes for relevant, no for irrelevant, and idk only when relevance is genuinely indeterminate. Preserve order and return one verdict per statement.\",\n prompt: jsonPrompt({ input, statements }),\n retries: config.retries,\n });\n verdicts = verdictResult.data.verdicts;\n assertSameLength(\"answer relevancy verdicts\", statements, verdicts);\n usage = addUsage(usage, verdictResult.usage);\n }\n const score =\n verdicts.length === 0\n ? 1\n : verdicts.filter((verdict) => verdict.verdict !== \"no\").length / verdicts.length;\n const serializedVerdicts = serializeVerdicts(verdicts);\n const reasonResult = await maybeReason({\n model: options.model,\n includeReason: config.includeReason,\n retries: config.retries,\n metric: \"answer relevancy\",\n score,\n evidence: { input, verdicts: serializedVerdicts },\n });\n usage = addUsage(usage, reasonResult.usage);\n return higherOutcome({\n score,\n threshold: config.threshold,\n strictMode: config.strictMode,\n comment: reasonResult.reason,\n details: { statements, verdicts: serializedVerdicts },\n usage,\n });\n } catch (error) {\n return EvalOutcome.invalid(errorMessage(error));\n }\n });\n}\n\nexport type PromptAlignmentOptions<Input, Output, Expected = unknown> = LlmEvalOptions<\n Input,\n Output,\n Expected\n> & {\n promptInstructions: string[];\n};\n\nexport function promptAlignment<\n Input,\n Output,\n Expected = unknown,\n const Name extends string = string,\n>(\n options: PromptAlignmentOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, number, Expected, Name> {\n if (options.promptInstructions.length === 0) {\n throw new TypeError(\"promptAlignment requires at least one prompt instruction.\");\n }\n const config = metricConfig<Name>(options, \"prompt_alignment\");\n return numericMetric(config.name, config, \"higher_is_better\", async (args) => {\n try {\n const input = await resolveInput(options.input, args);\n const actual = await resolveActualText(options.actual, args);\n const verdictResult = await runJudge({\n model: options.model,\n schema: binaryVerdictsSchema,\n instructions:\n \"Determine whether the answer follows each prompt instruction. Preserve order and return exactly one yes or no verdict per instruction.\",\n prompt: jsonPrompt({ input, actual, instructions: options.promptInstructions }),\n retries: config.retries,\n });\n const verdicts = verdictResult.data.verdicts;\n assertSameLength(\"prompt alignment verdicts\", options.promptInstructions, verdicts);\n const score =\n verdicts.filter((verdict) => verdict.verdict === \"yes\").length / verdicts.length;\n const reasonResult = await maybeReason({\n model: options.model,\n includeReason: config.includeReason,\n retries: config.retries,\n metric: \"prompt alignment\",\n score,\n evidence: { verdicts },\n });\n const usage = addUsage(verdictResult.usage, reasonResult.usage);\n return higherOutcome({\n score,\n threshold: config.threshold,\n strictMode: config.strictMode,\n comment: reasonResult.reason,\n details: { promptInstructions: options.promptInstructions, verdicts },\n usage,\n });\n } catch (error) {\n return EvalOutcome.invalid(errorMessage(error));\n }\n });\n}\n\nexport type JsonCorrectnessOptions<Input, Output, SchemaOutput, Expected = unknown> = {\n name?: string | undefined;\n required?: boolean | undefined;\n schema: ZodSchema<SchemaOutput>;\n model?: CompletionModel | undefined;\n threshold?: number | undefined;\n strictMode?: boolean | undefined;\n includeReason?: boolean | undefined;\n retries?: number | undefined;\n actual?: ValueSelector<Input, Output, Expected, string> | undefined;\n};\n\nexport function jsonCorrectness<\n Input,\n Output,\n SchemaOutput,\n Expected = unknown,\n const Name extends string = string,\n>(\n options: JsonCorrectnessOptions<Input, Output, SchemaOutput, Expected> & {\n name?: Name | undefined;\n },\n): EvalMetric<Input, Output, number, Expected, Name> {\n const threshold = validateThreshold(options.threshold ?? 0.5);\n const retries = validateRetries(options.retries ?? 0);\n const includeReason = options.includeReason ?? true;\n const strictMode = options.strictMode ?? true;\n return numericMetric(\n (options.name ?? \"json_correctness\") as Name,\n {\n threshold: strictMode ? 1 : threshold,\n required: options.required ?? true,\n },\n \"higher_is_better\",\n async (args) => {\n try {\n const actual = await resolveActualText(options.actual, args);\n let parsed: unknown;\n let validationError: string | undefined;\n try {\n parsed = JSON.parse(actual);\n if (!isJsonValue(parsed)) {\n throw new TypeError(\"Generated output is not a JSON value.\");\n }\n const result = options.schema.safeParse(parsed);\n if (!result.success) {\n validationError = z.prettifyError(result.error);\n }\n } catch (error) {\n validationError = errorMessage(error);\n }\n const score = validationError === undefined ? 1 : 0;\n let comment: string | undefined;\n let usage = UsageValue.empty();\n if (includeReason) {\n if (score === 1) {\n comment = \"The generated JSON is syntactically valid and matches the expected schema.\";\n } else if (options.model === undefined) {\n comment = validationError;\n } else {\n const reasonResult = await runJudge({\n model: options.model,\n schema: reasonSchema,\n instructions:\n \"Briefly explain why the generated JSON does not match the expected schema. Focus on actionable syntax, field, and type problems.\",\n prompt: jsonPrompt({ actual, validationError }),\n retries,\n });\n comment = reasonResult.data.reason;\n usage = reasonResult.usage;\n }\n }\n return higherOutcome({\n score,\n threshold,\n strictMode,\n comment,\n details: validationError === undefined ? {} : { validationError },\n usage,\n });\n } catch (error) {\n return EvalOutcome.invalid(errorMessage(error));\n }\n },\n );\n}\n\nexport type HallucinationOptions<Input, Output, Expected = unknown> = LlmEvalOptions<\n Input,\n Output,\n Expected\n> & {\n context?: SelectorOrValue<Input, Output, Expected, string[]> | undefined;\n};\n\nexport function hallucination<\n Input,\n Output,\n Expected = unknown,\n const Name extends string = string,\n>(\n options: HallucinationOptions<Input, Output, Expected> & {\n context: Exclude<HallucinationOptions<Input, Output, Expected>[\"context\"], undefined>;\n name?: Name | undefined;\n },\n): EvalMetric<Input, Output, number, Expected, Name>;\nexport function hallucination<\n Input,\n Output,\n Expected = unknown,\n const Name extends string = string,\n>(\n options: Omit<HallucinationOptions<Input, Output, Expected>, \"context\"> & {\n context?: undefined;\n name?: Name | undefined;\n },\n): EvalMetric<Input, Output, number, Expected, Name, { context: string[] }>;\nexport function hallucination<\n Input,\n Output,\n Expected = unknown,\n const Name extends string = string,\n>(\n options: HallucinationOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, number, Expected, Name, EvalCaseRequirements> {\n const config = metricConfig<Name>(options, \"hallucination\");\n return numericMetric(config.name, config, \"lower_is_better\", async (args) => {\n try {\n const actual = await resolveActualText(options.actual, args);\n const context = await resolveStringList(options.context, args.case.context, args, \"context\");\n const verdictResult = await runJudge({\n model: options.model,\n schema: binaryVerdictsSchema,\n instructions:\n \"Compare the answer with each trusted context. Use yes when the answer is factually aligned with that context and no when it contradicts it. Preserve order and return one verdict per context.\",\n prompt: jsonPrompt({ actual, context }),\n retries: config.retries,\n });\n const verdicts = verdictResult.data.verdicts;\n assertSameLength(\"hallucination verdicts\", context, verdicts);\n const score = verdicts.filter((verdict) => verdict.verdict === \"no\").length / verdicts.length;\n const reasonResult = await maybeReason({\n model: options.model,\n includeReason: config.includeReason,\n retries: config.retries,\n metric: \"hallucination\",\n score,\n evidence: { verdicts },\n });\n const usage = addUsage(verdictResult.usage, reasonResult.usage);\n return lowerOutcome({\n score,\n threshold: config.threshold,\n strictMode: config.strictMode,\n comment: reasonResult.reason,\n details: { verdicts },\n usage,\n });\n } catch (error) {\n return EvalOutcome.invalid(errorMessage(error));\n }\n });\n}\n\nexport type FaithfulnessOptions<Input, Output, Expected = unknown> = LlmEvalOptions<\n Input,\n Output,\n Expected\n> & {\n retrievalContext?: SelectorOrValue<Input, Output, Expected, string[]> | undefined;\n truthsExtractionLimit?: number | undefined;\n penalizeAmbiguousClaims?: boolean | undefined;\n};\n\nexport function faithfulness<Input, Output, Expected = unknown, const Name extends string = string>(\n options: FaithfulnessOptions<Input, Output, Expected> & {\n name?: Name | undefined;\n retrievalContext: Exclude<\n FaithfulnessOptions<Input, Output, Expected>[\"retrievalContext\"],\n undefined\n >;\n },\n): EvalMetric<Input, Output, number, Expected, Name>;\nexport function faithfulness<Input, Output, Expected = unknown, const Name extends string = string>(\n options: Omit<FaithfulnessOptions<Input, Output, Expected>, \"retrievalContext\"> & {\n name?: Name | undefined;\n retrievalContext?: undefined;\n },\n): EvalMetric<Input, Output, number, Expected, Name, { retrievalContext: string[] }>;\nexport function faithfulness<Input, Output, Expected = unknown, const Name extends string = string>(\n options: FaithfulnessOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, number, Expected, Name, EvalCaseRequirements> {\n const config = metricConfig<Name>(options, \"faithfulness\");\n const truthsExtractionLimit = validateOptionalNonNegativeInteger(\n options.truthsExtractionLimit,\n \"truthsExtractionLimit\",\n );\n return numericMetric(config.name, config, \"higher_is_better\", async (args) => {\n try {\n const actual = await resolveActualText(options.actual, args);\n const retrievalContext = await resolveStringList(\n options.retrievalContext,\n args.case.retrievalContext,\n args,\n \"retrievalContext\",\n );\n const [truthResult, claimResult] = await Promise.all([\n runJudge({\n model: options.model,\n schema: factsSchema,\n instructions: truthsExtractionInstructions(truthsExtractionLimit),\n prompt: jsonPrompt({ retrievalContext }),\n retries: config.retries,\n }),\n runJudge({\n model: options.model,\n schema: factsSchema,\n instructions:\n \"Extract every concise factual claim made by the answer. Return claims in the facts array and omit opinions or purely stylistic text.\",\n prompt: `Answer:\\n${actual}`,\n retries: config.retries,\n }),\n ]);\n const truths = limitValues(truthResult.data.facts, truthsExtractionLimit);\n const claims = claimResult.data.facts;\n let verdicts: Verdict[] = [];\n let usage = addUsage(truthResult.usage, claimResult.usage);\n if (claims.length > 0) {\n const verdictResult = await runJudge({\n model: options.model,\n schema: verdictsSchema,\n instructions:\n \"Determine whether each answer claim is supported by the supplied truths. Use yes for supported, no for contradicted or unsupported, and idk for genuinely ambiguous support. Preserve order and return one verdict per claim.\",\n prompt: jsonPrompt({ truths, claims }),\n retries: config.retries,\n });\n verdicts = verdictResult.data.verdicts;\n assertSameLength(\"faithfulness verdicts\", claims, verdicts);\n usage = addUsage(usage, verdictResult.usage);\n }\n const penalizeAmbiguousClaims = options.penalizeAmbiguousClaims ?? false;\n const supported = verdicts.filter(\n (verdict) =>\n verdict.verdict === \"yes\" || (verdict.verdict === \"idk\" && !penalizeAmbiguousClaims),\n ).length;\n const score = verdicts.length === 0 ? 1 : supported / verdicts.length;\n const serializedVerdicts = serializeVerdicts(verdicts);\n const reasonResult = await maybeReason({\n model: options.model,\n includeReason: config.includeReason,\n retries: config.retries,\n metric: \"faithfulness\",\n score,\n evidence: { verdicts: serializedVerdicts, penalizeAmbiguousClaims },\n });\n usage = addUsage(usage, reasonResult.usage);\n return higherOutcome({\n score,\n threshold: config.threshold,\n strictMode: config.strictMode,\n comment: reasonResult.reason,\n details: { truths, claims, verdicts: serializedVerdicts, penalizeAmbiguousClaims },\n usage,\n });\n } catch (error) {\n return EvalOutcome.invalid(errorMessage(error));\n }\n });\n}\n\nexport type AbstentionCategory =\n | \"correct_abstention\"\n | \"unnecessary_abstention\"\n | \"unsupported_confident_answer\"\n | \"correct_grounded_answer\";\n\nexport type AbstentionOptions<Input, Output, Expected = unknown> = {\n name?: string | undefined;\n required?: boolean | undefined;\n model: CompletionModel;\n shouldAbstain: SelectorOrValue<Input, Output, Expected, boolean>;\n context?: SelectorOrValue<Input, Output, Expected, string[]> | undefined;\n actual?: ValueSelector<Input, Output, Expected, string> | undefined;\n includeReason?: boolean | undefined;\n retries?: number | undefined;\n};\n\nexport function abstention<Input, Output, Expected = unknown, const Name extends string = string>(\n options: AbstentionOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, AbstentionCategory, Expected, Name> {\n const retries = validateRetries(options.retries ?? 0);\n return {\n name: (options.name ?? \"abstention\") as Name,\n required: options.required ?? true,\n dataType: \"CATEGORICAL\",\n async evaluate(args) {\n try {\n const actual = await resolveActualText(options.actual, args);\n const shouldAbstain = await resolveExpected(options.shouldAbstain, args);\n if (typeof shouldAbstain !== \"boolean\") {\n return EvalOutcome.invalid(\"abstention shouldAbstain must resolve to a boolean.\");\n }\n const context = await resolveAbstentionContext(options.context, args);\n if (!shouldAbstain && context.length === 0) {\n return EvalOutcome.invalid(\n \"abstention context must be non-empty when shouldAbstain is false.\",\n );\n }\n const judgment = await runJudge({\n model: options.model,\n schema: abstentionJudgmentSchema,\n instructions:\n \"Classify whether the answer abstains or gives a confident answer. For a confident answer, grounded is true only when every substantive factual claim is supported by the supplied context. For an abstention, set grounded to false. Return a concise evidence-based reason.\",\n prompt: jsonPrompt({ actual, context }),\n retries,\n });\n const category = abstentionCategory(\n shouldAbstain,\n judgment.data.behavior,\n judgment.data.grounded,\n );\n const outcomeOptions = {\n comment: options.includeReason === false ? undefined : judgment.data.reason,\n metadata: evaluationMetadata(\n {\n behavior: judgment.data.behavior,\n grounded: judgment.data.grounded,\n shouldAbstain,\n },\n judgment.usage,\n ),\n usage: judgment.usage,\n };\n return category === \"correct_abstention\" || category === \"correct_grounded_answer\"\n ? EvalOutcome.pass(category, outcomeOptions)\n : EvalOutcome.fail(category, outcomeOptions);\n } catch (error) {\n return EvalOutcome.invalid(errorMessage(error));\n }\n },\n };\n}\n\nasync function resolveAbstentionContext<Input, Output, Expected>(\n selectorOrValue: SelectorOrValue<Input, Output, Expected, string[]> | undefined,\n args: EvalMetricArgs<Input, Output, Expected>,\n): Promise<string[]> {\n const context =\n selectorOrValue === undefined\n ? (args.case.retrievalContext ?? [])\n : typeof selectorOrValue === \"function\"\n ? await (selectorOrValue as ValueSelector<Input, Output, Expected, string[]>)(args)\n : selectorOrValue;\n if (!Array.isArray(context) || context.some((value) => typeof value !== \"string\")) {\n throw new TypeError(\"abstention context must be an array of strings.\");\n }\n return context;\n}\n\nfunction abstentionCategory(\n shouldAbstain: boolean,\n behavior: \"abstention\" | \"confident_answer\",\n grounded: boolean,\n): AbstentionCategory {\n if (behavior === \"abstention\") {\n return shouldAbstain ? \"correct_abstention\" : \"unnecessary_abstention\";\n }\n if (shouldAbstain || !grounded) return \"unsupported_confident_answer\";\n return \"correct_grounded_answer\";\n}\n\nexport type SummarizationOptions<Input, Output, Expected = unknown> = LlmEvalOptions<\n Input,\n Output,\n Expected\n> & {\n assessmentQuestions?: string[] | undefined;\n questionCount?: number | undefined;\n truthsExtractionLimit?: number | undefined;\n};\n\nexport function summarization<\n Input,\n Output,\n Expected = unknown,\n const Name extends string = string,\n>(\n options: SummarizationOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, number, Expected, Name> {\n const config = metricConfig<Name>(options, \"summarization\");\n const questionCount = validatePositiveInteger(options.questionCount ?? 5, \"questionCount\");\n const truthsExtractionLimit = validateOptionalNonNegativeInteger(\n options.truthsExtractionLimit,\n \"truthsExtractionLimit\",\n );\n const suppliedQuestions =\n options.assessmentQuestions !== undefined && options.assessmentQuestions.length > 0\n ? [...options.assessmentQuestions]\n : undefined;\n return numericMetric(config.name, config, \"higher_is_better\", async (args) => {\n try {\n const input = await resolveInput(options.input, args);\n const actual = await resolveActualText(options.actual, args);\n const questionPromise: Promise<JudgeResult<{ questions: string[] }>> =\n suppliedQuestions === undefined\n ? runJudge({\n model: options.model,\n schema: questionsSchema,\n instructions: `Generate exactly ${questionCount} important yes-or-no assessment questions whose answers capture the source text's essential information.`,\n prompt: `Source text:\\n${input}`,\n retries: config.retries,\n })\n : Promise.resolve({\n data: { questions: suppliedQuestions },\n usage: UsageValue.empty(),\n });\n const [truthResult, claimResult, questionResult] = await Promise.all([\n runJudge({\n model: options.model,\n schema: factsSchema,\n instructions: truthsExtractionInstructions(truthsExtractionLimit),\n prompt: `Source text:\\n${input}`,\n retries: config.retries,\n }),\n runJudge({\n model: options.model,\n schema: factsSchema,\n instructions:\n \"Extract every concise factual claim made by the summary. Return claims in the facts array.\",\n prompt: `Summary:\\n${actual}`,\n retries: config.retries,\n }),\n questionPromise,\n ]);\n const truths = limitValues(truthResult.data.facts, truthsExtractionLimit);\n const claims = claimResult.data.facts;\n const questions = questionResult.data.questions;\n if (questions.length === 0) {\n throw new Error(\"Summarization assessment questions must not be empty.\");\n }\n const sourceAnswerPromise = runJudge({\n model: options.model,\n schema: answersSchema,\n instructions:\n \"Answer each assessment question using only the supplied text. Return one yes or no answer per question in the same order.\",\n prompt: jsonPrompt({ questions, text: input }),\n retries: config.retries,\n });\n const summaryAnswerPromise = runJudge({\n model: options.model,\n schema: answersSchema,\n instructions:\n \"Answer each assessment question using only the supplied text. Return one yes or no answer per question in the same order.\",\n prompt: jsonPrompt({ questions, text: actual }),\n retries: config.retries,\n });\n const alignmentPromise: Promise<JudgeResult<{ verdicts: Verdict[] }>> =\n claims.length === 0\n ? Promise.resolve({ data: { verdicts: [] }, usage: UsageValue.empty() })\n : runJudge({\n model: options.model,\n schema: verdictsSchema,\n instructions:\n \"Determine whether each summary claim is supported by the source truths. Use yes for supported, no for contradicted, and idk for unsupported filler or ambiguity. Preserve order.\",\n prompt: jsonPrompt({ truths, claims }),\n retries: config.retries,\n });\n const [sourceAnswerResult, summaryAnswerResult, alignmentResult] = await Promise.all([\n sourceAnswerPromise,\n summaryAnswerPromise,\n alignmentPromise,\n ]);\n assertSameLength(\"source assessment answers\", questions, sourceAnswerResult.data.answers);\n assertSameLength(\"summary assessment answers\", questions, summaryAnswerResult.data.answers);\n assertSameLength(\"summarization alignment verdicts\", claims, alignmentResult.data.verdicts);\n const alignmentVerdicts = alignmentResult.data.verdicts;\n const alignmentScore =\n alignmentVerdicts.length === 0\n ? 0\n : alignmentVerdicts.filter((verdict) => verdict.verdict === \"yes\").length /\n alignmentVerdicts.length;\n let coverageTotal = 0;\n let coverageMatched = 0;\n const coverageVerdicts = questions.map((question, index) => {\n const originalVerdict = sourceAnswerResult.data.answers[index] as \"yes\" | \"no\";\n const summaryVerdict = summaryAnswerResult.data.answers[index] as \"yes\" | \"no\";\n if (originalVerdict === \"yes\") {\n coverageTotal += 1;\n if (summaryVerdict === \"yes\") coverageMatched += 1;\n }\n return { question, originalVerdict, summaryVerdict };\n });\n const coverageScore = coverageTotal === 0 ? 0 : coverageMatched / coverageTotal;\n const score = Math.min(alignmentScore, coverageScore);\n const serializedAlignmentVerdicts = serializeVerdicts(alignmentVerdicts);\n const reasonResult = await maybeReason({\n model: options.model,\n includeReason: config.includeReason,\n retries: config.retries,\n metric: \"summarization\",\n score,\n evidence: {\n alignmentVerdicts: serializedAlignmentVerdicts,\n coverageVerdicts,\n alignmentScore,\n coverageScore,\n },\n });\n const usage = addUsage(\n truthResult.usage,\n claimResult.usage,\n questionResult.usage,\n sourceAnswerResult.usage,\n summaryAnswerResult.usage,\n alignmentResult.usage,\n reasonResult.usage,\n );\n return higherOutcome({\n score,\n threshold: config.threshold,\n strictMode: config.strictMode,\n comment: reasonResult.reason,\n details: {\n truths,\n claims,\n assessmentQuestions: questions,\n alignmentVerdicts: serializedAlignmentVerdicts,\n coverageVerdicts,\n scoreBreakdown: { alignment: alignmentScore, coverage: coverageScore },\n },\n usage,\n });\n } catch (error) {\n return EvalOutcome.invalid(errorMessage(error));\n }\n });\n}\n\nexport type GEvalParameter =\n | \"input\"\n | \"actualOutput\"\n | \"expectedOutput\"\n | \"context\"\n | \"retrievalContext\"\n | \"metadata\";\n\nexport type GEvalRubric = {\n scoreRange: readonly [number, number];\n expectedOutcome: string;\n};\n\nexport type GEvalOptions<Input, Output, Expected = unknown> = Omit<\n LlmEvalOptions<Input, Output, Expected>,\n \"name\"\n> & {\n name: string;\n evaluationParams: GEvalParameter[];\n criteria?: string | undefined;\n evaluationSteps?: string[] | undefined;\n rubric?: GEvalRubric[] | undefined;\n expected?: ValueSelector<Input, Output, Expected, unknown> | undefined;\n context?: SelectorOrValue<Input, Output, Expected, string[]> | undefined;\n retrievalContext?: SelectorOrValue<Input, Output, Expected, string[]> | undefined;\n};\n\nexport function gEval<Input, Output, Expected = unknown, const Name extends string = string>(\n options: GEvalOptions<Input, Output, Expected> & { name: Name },\n): EvalMetric<Input, Output, number, Expected, Name> {\n if (options.name.trim().length === 0) throw new TypeError(\"gEval name must not be empty.\");\n if (options.evaluationParams.length === 0) {\n throw new TypeError(\"gEval requires at least one evaluation parameter.\");\n }\n if ((options.criteria === undefined) === (options.evaluationSteps === undefined)) {\n throw new TypeError(\"gEval requires exactly one of criteria or evaluationSteps.\");\n }\n if (options.criteria !== undefined && options.criteria.trim().length === 0) {\n throw new TypeError(\"gEval criteria must not be empty.\");\n }\n if (options.evaluationSteps !== undefined && options.evaluationSteps.length === 0) {\n throw new TypeError(\"gEval evaluationSteps must not be empty.\");\n }\n const config = metricConfig<Name>(options, options.name);\n const rubric = validateRubric(options.rubric);\n const scoreRange =\n rubric.length === 0\n ? ([0, 10] as const)\n : ([rubric[0]?.scoreRange[0] ?? 0, rubric.at(-1)?.scoreRange[1] ?? 10] as const);\n let generatedStepsPromise: Promise<JudgeResult<{ steps: string[] }>> | undefined;\n let generatedUsageClaimed = false;\n\n async function resolveSteps(): Promise<{ steps: string[]; usage: Usage }> {\n if (options.evaluationSteps !== undefined) {\n return { steps: options.evaluationSteps, usage: UsageValue.empty() };\n }\n if (generatedStepsPromise === undefined) {\n generatedStepsPromise = runJudge({\n model: options.model,\n schema: z.object({ steps: z.array(z.string()) }),\n instructions:\n \"Generate three or four concise evaluation steps from the criteria. Explain how the selected parameters should be judged in relation to one another.\",\n prompt: jsonPrompt({ criteria: options.criteria, parameters: options.evaluationParams }),\n retries: config.retries,\n }).catch((error) => {\n generatedStepsPromise = undefined;\n throw error;\n });\n }\n const result = await generatedStepsPromise;\n if (result.data.steps.length === 0) throw new Error(\"G-Eval generated no evaluation steps.\");\n const usage = generatedUsageClaimed ? UsageValue.empty() : result.usage;\n generatedUsageClaimed = true;\n return { steps: result.data.steps, usage };\n }\n\n return numericMetric(config.name, config, \"higher_is_better\", async (args) => {\n try {\n const parameters = await resolveGEvalParameters(options, args);\n const stepsResult = await resolveSteps();\n const scoreResult = await runJudge({\n model: options.model,\n schema: z.object({ score: z.number(), reason: z.string() }),\n instructions: config.strictMode\n ? \"Apply the evaluation steps and return score 1 only for complete compliance, otherwise 0. Give a concise evidence-based reason.\"\n : `Apply the evaluation steps and return an integer score from ${scoreRange[0]} through ${scoreRange[1]}, plus a concise evidence-based reason.`,\n prompt: jsonPrompt({\n evaluationSteps: stepsResult.steps,\n rubric,\n parameters,\n }),\n retries: config.retries,\n });\n const rawScore = scoreResult.data.score;\n if (\n !Number.isFinite(rawScore) ||\n (config.strictMode && rawScore !== 0 && rawScore !== 1) ||\n (!config.strictMode && (rawScore < scoreRange[0] || rawScore > scoreRange[1]))\n ) {\n throw new RangeError(`G-Eval score ${rawScore} is outside the requested range.`);\n }\n const score = config.strictMode\n ? rawScore\n : (rawScore - scoreRange[0]) / (scoreRange[1] - scoreRange[0]);\n const usage = addUsage(stepsResult.usage, scoreResult.usage);\n return higherOutcome({\n score,\n threshold: config.threshold,\n strictMode: config.strictMode,\n comment: config.includeReason ? scoreResult.data.reason : undefined,\n details: {\n evaluationSteps: stepsResult.steps,\n evaluationParams: options.evaluationParams,\n rawScore,\n scoreRange: [scoreRange[0], scoreRange[1]],\n rubric: rubric.map((entry) => ({\n scoreRange: [entry.scoreRange[0], entry.scoreRange[1]],\n expectedOutcome: entry.expectedOutcome,\n })),\n },\n usage,\n });\n } catch (error) {\n return EvalOutcome.invalid(errorMessage(error));\n }\n });\n}\n\ntype ConversationEvalOptions<Input, Output, Expected = unknown> = {\n name?: string | undefined;\n required?: boolean | undefined;\n model: CompletionModel;\n threshold?: number | undefined;\n strictMode?: boolean | undefined;\n includeReason?: boolean | undefined;\n retries?: number | undefined;\n concurrency?: number | undefined;\n turns?: ValueSelector<Input, Output, Expected, ConversationSource> | undefined;\n};\n\nexport type TurnRelevancyOptions<Input, Output, Expected = unknown> = ConversationEvalOptions<\n Input,\n Output,\n Expected\n> & {\n windowSize?: number | undefined;\n};\n\nexport function turnRelevancy<\n Input,\n Output,\n Expected = unknown,\n const Name extends string = string,\n>(\n options: TurnRelevancyOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, number, Expected, Name> {\n const config = metricConfig<Name>(options, \"turn_relevancy\");\n const windowSize = validatePositiveInteger(options.windowSize ?? 10, \"windowSize\");\n const concurrency = validatePositiveInteger(options.concurrency ?? 4, \"concurrency\");\n return numericMetric(config.name, config, \"higher_is_better\", async (args) => {\n try {\n const turns = await resolveTurns(options.turns, args);\n const interactions = unitInteractions(turns);\n const windows = interactions.map((_, index) =>\n interactions.slice(Math.max(0, index - windowSize + 1), index + 1).flat(),\n );\n const verdictResults = await mapWithConcurrency(windows, concurrency, (window) =>\n runJudge({\n model: options.model,\n schema: binaryVerdictSchema,\n instructions:\n \"Judge whether the final assistant reply is relevant to the preceding conversation. Return yes for relevant and no for irrelevant, with a concise reason.\",\n prompt: jsonPrompt({ turns: window }),\n retries: config.retries,\n }),\n );\n const verdicts = verdictResults.map((result, index) => ({\n interaction: index + 1,\n ...result.data,\n }));\n const score =\n verdicts.length === 0\n ? 1\n : verdicts.filter((verdict) => verdict.verdict === \"yes\").length / verdicts.length;\n const reasonResult = await maybeReason({\n model: options.model,\n includeReason: config.includeReason,\n retries: config.retries,\n metric: \"turn relevancy\",\n score,\n evidence: { verdicts },\n });\n const usage = addUsage(...verdictResults.map((result) => result.usage), reasonResult.usage);\n return higherOutcome({\n score,\n threshold: config.threshold,\n strictMode: config.strictMode,\n comment: reasonResult.reason,\n details: { windowSize, concurrency, interactionCount: interactions.length, verdicts },\n usage,\n });\n } catch (error) {\n return EvalOutcome.invalid(errorMessage(error));\n }\n });\n}\n\nexport type KnowledgeRetentionOptions<Input, Output, Expected = unknown> = ConversationEvalOptions<\n Input,\n Output,\n Expected\n>;\n\nexport function knowledgeRetention<\n Input,\n Output,\n Expected = unknown,\n const Name extends string = string,\n>(\n options: KnowledgeRetentionOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, number, Expected, Name> {\n const config = metricConfig<Name>(options, \"knowledge_retention\");\n const concurrency = validatePositiveInteger(options.concurrency ?? 4, \"concurrency\");\n return numericMetric(config.name, config, \"higher_is_better\", async (args) => {\n try {\n const turns = await resolveTurns(options.turns, args);\n const userTurns = turns\n .map((turn, index) => ({ turn, index }))\n .filter((entry) => entry.turn.role === \"user\");\n const knowledgeResults = await mapWithConcurrency(userTurns, concurrency, (entry) =>\n runJudge({\n model: options.model,\n schema: factsSchema,\n instructions:\n \"Extract durable factual information newly supplied by the final user message. Use prior turns only to resolve references. Return concise facts; return an empty array when nothing new was supplied.\",\n prompt: jsonPrompt({\n previousTurns: turns.slice(0, entry.index),\n userMessage: entry.turn.content,\n }),\n retries: config.retries,\n }),\n );\n const knowledge = userTurns.map((entry, index) => ({\n turnIndex: entry.index,\n facts: knowledgeResults[index]?.data.facts ?? [],\n }));\n const assistantChecks = turns\n .map((turn, index) => ({ turn, index }))\n .filter((entry) => entry.turn.role === \"assistant\")\n .map((entry) => ({\n ...entry,\n facts: knowledge\n .filter((item) => item.turnIndex < entry.index)\n .flatMap((item) => item.facts),\n }))\n .filter((entry) => entry.facts.length > 0);\n const verdictResults = await mapWithConcurrency(assistantChecks, concurrency, (entry) =>\n runJudge({\n model: options.model,\n schema: z.object({ attrition: z.boolean(), reason: z.string() }),\n instructions:\n \"Determine whether the assistant reply forgets, contradicts, or unnecessarily asks again for information already supplied by the user. Set attrition true only when knowledge was lost.\",\n prompt: jsonPrompt({ knownFacts: entry.facts, assistantReply: entry.turn.content }),\n retries: config.retries,\n }),\n );\n const verdicts = assistantChecks.map((entry, index) => ({\n turnIndex: entry.index,\n attrition: verdictResults[index]?.data.attrition ?? true,\n reason: verdictResults[index]?.data.reason ?? \"Missing knowledge-retention verdict.\",\n }));\n const score =\n verdicts.length === 0\n ? 1\n : verdicts.filter((verdict) => !verdict.attrition).length / verdicts.length;\n const reasonResult = await maybeReason({\n model: options.model,\n includeReason: config.includeReason,\n retries: config.retries,\n metric: \"knowledge retention\",\n score,\n evidence: { verdicts },\n });\n const usage = addUsage(\n ...knowledgeResults.map((result) => result.usage),\n ...verdictResults.map((result) => result.usage),\n reasonResult.usage,\n );\n return higherOutcome({\n score,\n threshold: config.threshold,\n strictMode: config.strictMode,\n comment: reasonResult.reason,\n details: { concurrency, knowledge, verdicts },\n usage,\n });\n } catch (error) {\n return EvalOutcome.invalid(errorMessage(error));\n }\n });\n}\n\nfunction numericMetric<Input, Output, Expected, const Name extends string>(\n name: Name,\n config: { threshold: number; required: boolean; strictMode?: boolean | undefined },\n direction: \"higher_is_better\" | \"lower_is_better\",\n evaluate: (args: EvalMetricArgs<Input, Output, Expected>) => Promise<EvalOutcomeType<number>>,\n): EvalMetric<Input, Output, number, Expected, Name> {\n return {\n name,\n required: config.required,\n direction,\n threshold:\n config.strictMode === true ? (direction === \"higher_is_better\" ? 1 : 0) : config.threshold,\n dataType: \"NUMERIC\",\n evaluate,\n };\n}\n\ntype MetricConfig<Name extends string = string> = {\n name: Name;\n threshold: number;\n strictMode: boolean;\n includeReason: boolean;\n retries: number;\n required: boolean;\n};\n\nfunction metricConfig<const Name extends string>(\n options: {\n name?: string | undefined;\n threshold?: number | undefined;\n strictMode?: boolean | undefined;\n includeReason?: boolean | undefined;\n retries?: number | undefined;\n required?: boolean | undefined;\n },\n defaultName: string,\n): MetricConfig<Name> {\n return {\n name: (options.name ?? defaultName) as Name,\n threshold: validateThreshold(options.threshold ?? 0.5),\n strictMode: options.strictMode ?? false,\n includeReason: options.includeReason ?? true,\n retries: validateRetries(options.retries ?? 0),\n required: options.required ?? true,\n };\n}\n\nfunction higherOutcome(args: {\n score: number;\n threshold: number;\n strictMode: boolean;\n comment?: string | undefined;\n details: JsonObject;\n usage: Usage;\n}) {\n const score = args.strictMode ? (args.score === 1 ? 1 : 0) : args.score;\n const threshold = args.strictMode ? 1 : args.threshold;\n const options = {\n comment: args.comment,\n usage: args.usage,\n metadata: evaluationMetadata(\n {\n ...args.details,\n scoreDirection: \"higher_is_better\",\n threshold,\n strictMode: args.strictMode,\n },\n args.usage,\n ),\n };\n return score >= threshold ? EvalOutcome.pass(score, options) : EvalOutcome.fail(score, options);\n}\n\nfunction lowerOutcome(args: {\n score: number;\n threshold: number;\n strictMode: boolean;\n comment?: string | undefined;\n details: JsonObject;\n usage: Usage;\n}) {\n const score = args.strictMode ? (args.score === 0 ? 0 : 1) : args.score;\n const threshold = args.strictMode ? 0 : args.threshold;\n const options = {\n comment: args.comment,\n usage: args.usage,\n metadata: evaluationMetadata(\n {\n ...args.details,\n scoreDirection: \"lower_is_better\",\n threshold,\n strictMode: args.strictMode,\n },\n args.usage,\n ),\n };\n return score <= threshold ? EvalOutcome.pass(score, options) : EvalOutcome.fail(score, options);\n}\n\nasync function maybeReason(args: {\n model: CompletionModel;\n includeReason: boolean;\n retries: number;\n metric: string;\n score: number;\n evidence: JsonObject;\n}): Promise<{ reason?: string | undefined; usage: Usage }> {\n if (!args.includeReason) return { usage: UsageValue.empty() };\n const result = await runJudge({\n model: args.model,\n schema: reasonSchema,\n instructions: `Write a concise final explanation for the ${args.metric} score. Ground it only in the supplied evidence and do not repeat the numeric score.`,\n prompt: jsonPrompt({ score: args.score, evidence: args.evidence }),\n retries: args.retries,\n });\n return { reason: result.data.reason, usage: result.usage };\n}\n\nasync function resolveInput<Input, Output, Expected>(\n selector: ValueSelector<Input, Output, Expected, string> | undefined,\n args: EvalMetricArgs<Input, Output, Expected>,\n): Promise<string> {\n return selector === undefined ? formatValue(args.case.input) : selector(args);\n}\n\nasync function resolveStringList<Input, Output, Expected>(\n selectorOrValue: SelectorOrValue<Input, Output, Expected, string[]> | undefined,\n fallback: string[] | undefined,\n args: EvalMetricArgs<Input, Output, Expected>,\n label: string,\n): Promise<string[]> {\n const value =\n selectorOrValue === undefined\n ? fallback\n : typeof selectorOrValue === \"function\"\n ? await (selectorOrValue as ValueSelector<Input, Output, Expected, string[]>)(args)\n : selectorOrValue;\n if (\n !Array.isArray(value) ||\n value.length === 0 ||\n value.some((item) => typeof item !== \"string\")\n ) {\n throw new TypeError(`${label} must be a non-empty array of strings.`);\n }\n return value;\n}\n\nasync function resolveGEvalParameters<Input, Output, Expected>(\n options: GEvalOptions<Input, Output, Expected>,\n args: EvalMetricArgs<Input, Output, Expected>,\n): Promise<JsonObject> {\n const parameters: JsonObject = {};\n for (const parameter of options.evaluationParams) {\n if (parameter === \"input\") parameters.input = await resolveInput(options.input, args);\n if (parameter === \"actualOutput\") {\n parameters.actualOutput = await resolveActualText(options.actual, args);\n }\n if (parameter === \"expectedOutput\") {\n const expected =\n options.expected === undefined ? args.case.expected : await options.expected(args);\n if (expected === undefined) throw new Error(\"G-Eval expectedOutput is missing.\");\n parameters.expectedOutput = toJsonValue(expected);\n }\n if (parameter === \"context\") {\n parameters.context = await resolveStringList(\n options.context,\n args.case.context,\n args,\n \"context\",\n );\n }\n if (parameter === \"retrievalContext\") {\n parameters.retrievalContext = await resolveStringList(\n options.retrievalContext,\n args.case.retrievalContext,\n args,\n \"retrievalContext\",\n );\n }\n if (parameter === \"metadata\") parameters.metadata = args.case.metadata ?? {};\n }\n return parameters;\n}\n\nfunction validateRubric(rubric: GEvalRubric[] | undefined): GEvalRubric[] {\n if (rubric === undefined || rubric.length === 0) return [];\n const sorted = [...rubric].sort((left, right) => left.scoreRange[0] - right.scoreRange[0]);\n for (const [index, entry] of sorted.entries()) {\n const [start, end] = entry.scoreRange;\n if (\n !Number.isInteger(start) ||\n !Number.isInteger(end) ||\n start < 0 ||\n end > 10 ||\n start > end\n ) {\n throw new RangeError(\n \"G-Eval rubric score ranges must be ordered integers from 0 through 10.\",\n );\n }\n if (entry.expectedOutcome.trim().length === 0) {\n throw new TypeError(\"G-Eval rubric expectedOutcome must not be empty.\");\n }\n const next = sorted[index + 1];\n if (next !== undefined && end >= next.scoreRange[0]) {\n throw new RangeError(\"G-Eval rubric score ranges must not overlap.\");\n }\n }\n const first = sorted[0];\n const last = sorted.at(-1);\n if (first !== undefined && last !== undefined && first.scoreRange[0] === last.scoreRange[1]) {\n throw new RangeError(\"G-Eval rubric score range must span more than one value.\");\n }\n return sorted;\n}\n\nfunction truthsExtractionInstructions(limit: number | undefined): string {\n return limit === undefined\n ? \"Extract concise, factual, undisputed truths from the supplied source material, ordered by importance. Return them in the facts array.\"\n : `Extract at most ${limit} concise, factual, undisputed truths from the supplied source material, ordered by importance. Return them in the facts array.`;\n}\n\nfunction limitValues(values: string[], limit: number | undefined): string[] {\n return limit === undefined ? values : values.slice(0, limit);\n}\n\nfunction validateThreshold(value: number): number {\n if (!Number.isFinite(value) || value < 0 || value > 1) {\n throw new RangeError(\"Eval metric threshold must be between 0 and 1.\");\n }\n return value;\n}\n\nfunction validateRetries(value: number): number {\n if (!Number.isInteger(value) || value < 0) {\n throw new RangeError(\"Eval metric retries must be a non-negative integer.\");\n }\n return value;\n}\n\nfunction validatePositiveInteger(value: number, label: string): number {\n if (!Number.isInteger(value) || value < 1) {\n throw new RangeError(`${label} must be a positive integer.`);\n }\n return value;\n}\n\nfunction validateOptionalNonNegativeInteger(\n value: number | undefined,\n label: string,\n): number | undefined {\n if (value === undefined) return undefined;\n if (!Number.isInteger(value) || value < 0) {\n throw new RangeError(`${label} must be a non-negative integer.`);\n }\n return value;\n}\n\nfunction assertSameLength(label: string, inputs: unknown[], outputs: unknown[]): void {\n if (inputs.length !== outputs.length) {\n throw new Error(`${label} count ${outputs.length} did not match input count ${inputs.length}.`);\n }\n}\n\nfunction serializeVerdicts(verdicts: readonly Verdict[]): JsonObject[] {\n return verdicts.map((verdict) => {\n const serialized: JsonObject = { verdict: verdict.verdict };\n if (verdict.reason !== undefined) serialized.reason = verdict.reason;\n return serialized;\n });\n}\n\nfunction jsonPrompt(value: unknown): string {\n return JSON.stringify(value, null, 2);\n}\n\nfunction toJsonValue(value: unknown): JsonValue {\n if (!isJsonValue(value)) {\n throw new TypeError(\"G-Eval expectedOutput must be a JSON value.\");\n }\n return cloneJsonValue(value);\n}\n\nfunction cloneJsonValue(value: JsonValue): JsonValue {\n if (value === null || typeof value !== \"object\") return value;\n if (Array.isArray(value)) return value.map(cloneJsonValue);\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => {\n if (item === undefined) {\n throw new TypeError(\"G-Eval expectedOutput must be a JSON value.\");\n }\n return [key, cloneJsonValue(item)];\n }),\n );\n}\n\ntype ConversationSource = EvalTurn[] | Message[];\n\nfunction normalizeEvalTurns(value: unknown): EvalTurn[] | undefined {\n const source = conversationArray(value);\n if (source === undefined) return undefined;\n const turns: EvalTurn[] = [];\n for (const entry of source) {\n if (typeof entry !== \"object\" || entry === null) continue;\n const role = (entry as { role?: unknown }).role;\n if (role !== \"user\" && role !== \"assistant\") continue;\n const content = (entry as { content?: unknown }).content;\n const text = contentText(content);\n if (text.length === 0) continue;\n const metadata = (entry as { metadata?: unknown }).metadata;\n turns.push(\n typeof metadata === \"object\" && metadata !== null && !Array.isArray(metadata)\n ? { role, content: text, metadata: metadata as EvalTurn[\"metadata\"] }\n : { role, content: text },\n );\n }\n return turns.length === 0 ? undefined : turns;\n}\n\nasync function resolveTurns<Input, Output, Expected>(\n selector: ValueSelector<Input, Output, Expected, ConversationSource> | undefined,\n args: EvalMetricArgs<Input, Output, Expected>,\n): Promise<EvalTurn[]> {\n const source = selector === undefined ? args.output : await selector(args);\n const turns = normalizeEvalTurns(source);\n if (turns === undefined) {\n throw new TypeError(\n \"Conversational eval requires non-empty EvalTurn[], Message[], or an output with messages.\",\n );\n }\n return turns;\n}\n\nfunction unitInteractions(turns: EvalTurn[]): EvalTurn[][] {\n const interactions: EvalTurn[][] = [];\n let current: EvalTurn[] = [];\n let hasUser = false;\n for (const turn of turns) {\n if (current.at(-1)?.role === \"assistant\" && turn.role === \"user\" && hasUser) {\n interactions.push(current);\n current = [turn];\n hasUser = true;\n continue;\n }\n current.push(turn);\n if (turn.role === \"user\") hasUser = true;\n }\n if (current.length > 1 && current.at(-1)?.role === \"assistant\" && hasUser) {\n interactions.push(current);\n }\n return interactions;\n}\n\nfunction conversationArray(value: unknown): unknown[] | undefined {\n if (Array.isArray(value)) return value;\n if (typeof value === \"object\" && value !== null && \"messages\" in value) {\n const messages = (value as { messages?: unknown }).messages;\n return Array.isArray(messages) ? messages : undefined;\n }\n return undefined;\n}\n\nfunction contentText(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n return content\n .flatMap((part) =>\n typeof part === \"object\" &&\n part !== null &&\n \"type\" in part &&\n part.type === \"text\" &&\n \"text\" in part &&\n typeof part.text === \"string\"\n ? [part.text]\n : [],\n )\n .join(\"\\n\");\n}\n","export function defaultOutputValue(output: unknown): unknown {\n if (typeof output === \"object\" && output !== null && \"output\" in output) {\n return (output as { output: unknown }).output;\n }\n return output;\n}\n\nexport function stableComparable(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n return JSON.stringify(value);\n}\n\nexport function formatValue(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nexport function errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import type { CompletionModel, JsonObject, Usage } from \"../completion\";\nimport { Usage as UsageValue } from \"../completion\";\nimport { extract } from \"../extractor\";\nimport type { ZodSchema } from \"../schema\";\nimport type { EvalMetadata } from \"./types\";\n\nexport type JudgeResult<T> = {\n data: T;\n usage: Usage;\n};\n\nexport async function runJudge<T>(args: {\n model: CompletionModel;\n schema: ZodSchema<T>;\n instructions: string;\n prompt: string;\n retries: number;\n}): Promise<JudgeResult<T>> {\n const result = await extract({\n model: args.model,\n outputSchema: args.schema,\n instructions: args.instructions,\n text: args.prompt,\n temperature: 0,\n retries: args.retries <= 0 ? undefined : { maxAttempts: Math.trunc(args.retries) + 1 },\n });\n return { data: result.output, usage: result.usage };\n}\n\nexport function addUsage(...values: Usage[]): Usage {\n return values.reduce((total, usage) => UsageValue.add(total, usage), UsageValue.empty());\n}\n\nexport function evaluationMetadata(details: JsonObject, usage: Usage): EvalMetadata {\n const evaluation: JsonObject = {\n ...details,\n usage: usageToJson(usage),\n };\n return { evaluation };\n}\n\nfunction usageToJson(usage: Usage): JsonObject {\n const value: JsonObject = {\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n totalTokens: usage.totalTokens,\n cachedInputTokens: usage.cachedInputTokens,\n cacheCreationInputTokens: usage.cacheCreationInputTokens,\n };\n if (usage.details !== undefined) {\n value.details = { ...usage.details };\n }\n return value;\n}\n","import type { Usage } from \"../completion\";\nimport type { EvalMetadata } from \"./types\";\n\nexport type EvalOutcome<Score = unknown> =\n | {\n outcome: \"pass\";\n score?: Score | undefined;\n comment?: string | undefined;\n metadata?: EvalMetadata | undefined;\n usage?: Usage | undefined;\n }\n | {\n outcome: \"fail\";\n score?: Score | undefined;\n comment?: string | undefined;\n metadata?: EvalMetadata | undefined;\n usage?: Usage | undefined;\n }\n | {\n outcome: \"invalid\";\n reason: string;\n score?: Score | undefined;\n comment?: string | undefined;\n metadata?: EvalMetadata | undefined;\n usage?: Usage | undefined;\n };\n\nexport const EvalOutcome = {\n pass<Score>(\n score?: Score,\n options: {\n comment?: string | undefined;\n metadata?: EvalMetadata | undefined;\n usage?: Usage | undefined;\n } = {},\n ): EvalOutcome<Score> {\n const outcome: EvalOutcome<Score> = {\n outcome: \"pass\" as const,\n };\n if (score !== undefined) {\n outcome.score = score;\n }\n if (options.comment !== undefined) {\n outcome.comment = options.comment;\n }\n if (options.metadata !== undefined) {\n outcome.metadata = options.metadata;\n }\n if (options.usage !== undefined) {\n outcome.usage = options.usage;\n }\n return outcome;\n },\n\n fail<Score>(\n score?: Score,\n options: {\n comment?: string | undefined;\n metadata?: EvalMetadata | undefined;\n usage?: Usage | undefined;\n } = {},\n ): EvalOutcome<Score> {\n const outcome: EvalOutcome<Score> = {\n outcome: \"fail\" as const,\n };\n if (score !== undefined) {\n outcome.score = score;\n }\n if (options.comment !== undefined) {\n outcome.comment = options.comment;\n }\n if (options.metadata !== undefined) {\n outcome.metadata = options.metadata;\n }\n if (options.usage !== undefined) {\n outcome.usage = options.usage;\n }\n return outcome;\n },\n\n invalid<Score = never>(\n reason: string,\n options: {\n score?: Score | undefined;\n comment?: string | undefined;\n metadata?: EvalMetadata | undefined;\n usage?: Usage | undefined;\n } = {},\n ): EvalOutcome<Score> {\n const outcome: EvalOutcome<Score> = {\n outcome: \"invalid\" as const,\n reason,\n };\n if (options.score !== undefined) {\n outcome.score = options.score;\n }\n if (options.comment !== undefined) {\n outcome.comment = options.comment;\n }\n if (options.metadata !== undefined) {\n outcome.metadata = options.metadata;\n }\n if (options.usage !== undefined) {\n outcome.usage = options.usage;\n }\n return outcome;\n },\n};\n","import { defaultOutputValue, formatValue } from \"./format\";\nimport type { EvalMetricArgs, SelectorOrValue, ValueSelector } from \"./types\";\n\nexport function selectPromptOutput(args: EvalMetricArgs<unknown, unknown, unknown>): string {\n if (\n typeof args.output !== \"object\" ||\n args.output === null ||\n !(\"output\" in args.output) ||\n typeof args.output.output !== \"string\"\n ) {\n throw new TypeError(\"selectPromptOutput requires an output object with a string output field.\");\n }\n return args.output.output;\n}\n\nexport async function resolveActual<Input, Output, Expected>(\n selector: ValueSelector<Input, Output, Expected, unknown> | undefined,\n args: EvalMetricArgs<Input, Output, Expected>,\n): Promise<unknown> {\n return selector === undefined ? defaultOutputValue(args.output) : selector(args);\n}\n\nexport async function resolveActualText<Input, Output, Expected>(\n selector: ValueSelector<Input, Output, Expected, string> | undefined,\n args: EvalMetricArgs<Input, Output, Expected>,\n): Promise<string> {\n const value = selector === undefined ? defaultOutputValue(args.output) : await selector(args);\n return typeof value === \"string\" ? value : JSON.stringify(value);\n}\n\nexport async function resolveExpected<Input, Output, Expected, Value>(\n selectorOrValue: SelectorOrValue<Input, Output, Expected, Value> | undefined,\n args: EvalMetricArgs<Input, Output, Expected>,\n): Promise<Value | Expected | undefined> {\n if (selectorOrValue === undefined) {\n return args.case.expected;\n }\n return typeof selectorOrValue === \"function\"\n ? (selectorOrValue as ValueSelector<Input, Output, Expected, Value>)(args)\n : selectorOrValue;\n}\n\nexport async function resolveJudgePrompt<Input, Output, Expected>(\n selector: ValueSelector<Input, Output, Expected, string> | undefined,\n args: EvalMetricArgs<Input, Output, Expected>,\n): Promise<string> {\n if (selector !== undefined) {\n return selector(args);\n }\n return [\n `Suite: ${args.suiteName}`,\n `Case: ${args.case.id}`,\n `Input: ${formatValue(args.case.input)}`,\n `Expected: ${formatValue(args.case.expected)}`,\n `Output: ${formatValue(defaultOutputValue(args.output))}`,\n ].join(\"\\n\\n\");\n}\n","import { AgentRunBlockedError } from \"../agent/errors\";\nimport type { AgentInteractionRequest, AgentInteractionResponse } from \"../agent/interactions\";\nimport type {\n AgentInteractionOutcome,\n AgentOutcome,\n AgentResponse,\n AgentRunOptions,\n AgentRunSettings,\n} from \"../agent/run-types\";\nimport type { EvalCase, EvalTarget } from \"./types\";\n\ntype EvaluableAgent<Output> = {\n generate(input: AgentRunOptions<Output>): Promise<AgentOutcome<Output>>;\n};\n\ntype IsAny<Value> = 0 extends 1 & Value ? true : false;\ntype IsExactly<Left, Right> =\n IsAny<Left> extends true\n ? false\n : [Left] extends [Right]\n ? [Right] extends [Left]\n ? true\n : false\n : false;\n\nexport type AgentEvalTargetOptions<\n Input,\n AgentOutput = string,\n Output = AgentResponse<AgentOutput>,\n Expected = unknown,\n> = {\n agent: EvaluableAgent<AgentOutput>;\n request(args: {\n input: Input;\n testCase: EvalCase<Input, Expected>;\n }): AgentRunOptions<AgentOutput> | Promise<AgentRunOptions<AgentOutput>>;\n interactions?:\n | {\n maxResponses?: number | undefined;\n respond(args: {\n interaction: AgentInteractionRequest;\n testCase: EvalCase<Input, Expected>;\n phase: number;\n }): AgentInteractionResponse | Promise<AgentInteractionResponse>;\n }\n | undefined;\n} & (IsExactly<Output, AgentResponse<AgentOutput>> extends true\n ? {\n output?(args: {\n response: AgentResponse<AgentOutput>;\n testCase: EvalCase<Input, Expected>;\n }): Output | Promise<Output>;\n }\n : {\n output(args: {\n response: AgentResponse<AgentOutput>;\n testCase: EvalCase<Input, Expected>;\n }): Output | Promise<Output>;\n });\n\nexport class AgentEvalSuspensionError extends Error {\n constructor(\n readonly result: AgentInteractionOutcome,\n message = \"Agent eval target suspended without an interaction responder.\",\n ) {\n super(message);\n this.name = \"AgentEvalSuspensionError\";\n }\n}\n\nexport function agentEvalTarget<\n Input,\n AgentOutput = string,\n Output = AgentResponse<AgentOutput>,\n Expected = unknown,\n>(\n options: AgentEvalTargetOptions<Input, AgentOutput, Output, Expected>,\n): EvalTarget<Input, Output, Expected> {\n return async (input, testCase) => {\n const maxResponses = options.interactions?.maxResponses ?? 10;\n if (!Number.isSafeInteger(maxResponses) || maxResponses < 1) {\n throw new TypeError(\"Agent eval interactions.maxResponses must be a positive integer.\");\n }\n const request = await options.request({ input, testCase });\n const runSettings = agentRunSettings(request);\n let response = await options.agent.generate(request);\n let phase = 0;\n while (response.type === \"interaction\") {\n if (options.interactions === undefined) {\n throw new AgentEvalSuspensionError(response);\n }\n if (phase >= maxResponses) {\n throw new AgentEvalSuspensionError(\n response,\n `Agent eval target exceeded the interaction response limit of ${maxResponses}.`,\n );\n }\n phase += 1;\n const interactionResponse = await options.interactions.respond({\n interaction: response.interaction,\n testCase,\n phase,\n });\n response = await options.agent.generate({\n continuation: response.continuation,\n response: interactionResponse,\n ...runSettings,\n });\n }\n if (response.type === \"blocked\") throw new AgentRunBlockedError(response);\n return options.output === undefined\n ? (response as Output)\n : await options.output({ response, testCase });\n };\n}\n\nfunction agentRunSettings<Output>(request: AgentRunOptions<Output>): AgentRunSettings<Output> {\n const {\n prompt: _prompt,\n messages: _messages,\n session: _session,\n continuation: _continuation,\n response: _response,\n ...settings\n } = request;\n return settings;\n}\n","import type { EvalOutcome } from \"./outcome\";\nimport type {\n EvalMetadata,\n EvalMetric,\n EvalScoreProjection,\n EvalTraceRef,\n EvalTraceSelectorArgs,\n} from \"./types\";\n\nexport function projectEvalOutcome<Score>(\n outcome: EvalOutcome<Score>,\n dataType: EvalMetric<unknown, unknown>[\"dataType\"],\n projectScore?: ((score: Score) => number | string | boolean) | undefined,\n): EvalScoreProjection {\n const value = projectScoreValue(outcome, dataType, projectScore);\n const projection: EvalScoreProjection = {\n outcome: outcome.outcome,\n value,\n label: typeof value === \"string\" ? value : outcome.outcome,\n };\n if (typeof value === \"number\") projection.numericValue = value;\n if (typeof value === \"string\") projection.categoricalValue = value;\n const explanation =\n outcome.comment ?? (outcome.outcome === \"invalid\" ? outcome.reason : undefined);\n if (explanation !== undefined) projection.explanation = explanation;\n return projection;\n}\n\nexport function resolveEvalTraceRef(args: {\n output?: unknown;\n input?: unknown;\n metadata?: EvalMetadata | undefined;\n}): EvalTraceRef | undefined {\n return (\n traceFromCarrier(args.output) ??\n traceFromCarrier(args.input) ??\n traceFromMetadata(args.metadata)\n );\n}\n\nexport function defaultEvalTraceSelector<Input, Output, Expected>(\n args: EvalTraceSelectorArgs<Input, Output, Expected>,\n): EvalTraceRef | undefined {\n return resolveEvalTraceRef({\n output: args.output,\n input: args.case.input,\n metadata: args.case.metadata,\n });\n}\n\nfunction projectScoreValue<Score>(\n outcome: EvalOutcome<Score>,\n dataType: EvalMetric<unknown, unknown>[\"dataType\"],\n projectScore: ((score: Score) => number | string | boolean) | undefined,\n): number | string {\n const score = outcome.score;\n if (score !== undefined && projectScore !== undefined) {\n const projected = projectScore(score);\n if (typeof projected === \"boolean\") return projected ? 1 : 0;\n return projected;\n }\n if (dataType === \"CATEGORICAL\") {\n if (typeof score === \"string\") return score;\n if (typeof score === \"number\") return String(score);\n if (typeof score === \"boolean\") return score ? \"true\" : \"false\";\n if (score === null || score === undefined) return outcome.outcome;\n try {\n return JSON.stringify(score) ?? outcome.outcome;\n } catch {\n return outcome.outcome;\n }\n }\n if (dataType === \"BOOLEAN\") {\n if (typeof score === \"boolean\") return score ? 1 : 0;\n if (typeof score === \"number\") return score === 0 ? 0 : 1;\n return outcome.outcome === \"pass\" ? 1 : 0;\n }\n if (typeof score === \"number\") return score;\n if (typeof score === \"boolean\") return score ? 1 : 0;\n if (\n typeof score === \"object\" &&\n score !== null &&\n \"score\" in score &&\n typeof (score as { score?: unknown }).score === \"number\"\n ) {\n return (score as { score: number }).score;\n }\n return outcome.outcome === \"pass\" ? 1 : 0;\n}\n\nfunction traceFromCarrier(value: unknown): EvalTraceRef | undefined {\n if (typeof value !== \"object\" || value === null || !(\"trace\" in value)) return undefined;\n return readTraceRef((value as { trace?: unknown }).trace);\n}\n\nfunction traceFromMetadata(metadata: EvalMetadata | undefined): EvalTraceRef | undefined {\n if (metadata === undefined) return undefined;\n return readTraceRef({\n observer: metadata.traceObserver,\n traceId: metadata.traceId,\n observationId: metadata.observationId,\n responseId: metadata.responseId,\n });\n}\n\nfunction readTraceRef(value: unknown): EvalTraceRef | undefined {\n if (typeof value !== \"object\" || value === null) return undefined;\n const traceId = (value as { traceId?: unknown }).traceId;\n if (typeof traceId !== \"string\" || traceId.length === 0) return undefined;\n const observer = (value as { observer?: unknown }).observer;\n const observationId = (value as { observationId?: unknown }).observationId;\n const responseId = (value as { responseId?: unknown }).responseId;\n const trace: EvalTraceRef = { traceId };\n if (typeof observer === \"string\" && observer.length > 0) trace.observer = observer;\n if (typeof observationId === \"string\" && observationId.length > 0) {\n trace.observationId = observationId;\n }\n if (typeof responseId === \"string\" && responseId.length > 0) trace.responseId = responseId;\n return trace;\n}\n","import { type Usage, Usage as UsageValue } from \"../completion\";\nimport { errorMessage } from \"./format\";\nimport { EvalOutcome, type EvalOutcome as EvalOutcomeType } from \"./outcome\";\nimport { defaultEvalTraceSelector } from \"./reporting\";\nimport type {\n EvalCase,\n EvalCaseResult,\n EvalCostSummary,\n EvalMetric,\n EvalMetricResult,\n EvalReporter,\n EvalRunContext,\n EvalRunEndArgs,\n EvalRunStartArgs,\n EvalSuiteResult,\n EvalTotals,\n EvalTraceRef,\n RunEvalSuiteOptions,\n} from \"./types\";\n\nexport class EvalReporterDispatchError extends AggregateError {\n readonly phase: string;\n\n constructor(phase: string, errors: readonly unknown[]) {\n super(errors, `Evaluation reporter ${phase} failed ${errors.length} time(s).`);\n this.name = \"EvalReporterDispatchError\";\n this.phase = phase;\n }\n}\n\nexport async function runEvalSuite<\n Input,\n Output,\n Expected = unknown,\n const Metrics extends readonly EvalMetric<\n NoInfer<Input>,\n NoInfer<Output>,\n unknown,\n NoInfer<Expected>,\n string\n >[] = readonly EvalMetric<NoInfer<Input>, NoInfer<Output>, unknown, NoInfer<Expected>, string>[],\n>(\n options: RunEvalSuiteOptions<Input, Output, Expected, Metrics>,\n): Promise<EvalSuiteResult<Input, Output, Expected, Metrics>>;\nexport async function runEvalSuite<\n Input,\n Output,\n Expected,\n Metrics extends readonly EvalMetric<Input, Output, unknown, Expected, string>[],\n>(\n options: RunEvalSuiteOptions<Input, Output, Expected, Metrics>,\n): Promise<EvalSuiteResult<Input, Output, Expected, Metrics>> {\n validateSuiteOptions(options);\n const startedAtMs = Date.now();\n const run = resolveRun(options, startedAtMs);\n const reporters = options.reporters ?? [];\n const lifecycle = {\n run,\n suiteName: options.name,\n caseCount: options.cases.length,\n metricNames: options.metrics.map((metric) => metric.name),\n } satisfies EvalRunStartArgs;\n let reporterErrors: unknown[];\n try {\n reporterErrors = await notifyRunStart(\n reporters,\n lifecycle,\n options.reporterErrorPolicy ?? \"collect\",\n );\n } catch (error) {\n await notifyRunEnd(reporters, {\n ...lifecycle,\n status: \"failed\",\n completedAt: new Date().toISOString(),\n durationMs: Date.now() - startedAtMs,\n error,\n });\n throw error;\n }\n let results: Array<EvalCaseResult<Input, Output, Expected, Metrics>>;\n let aggregates: Awaited<ReturnType<typeof aggregateResult>>;\n try {\n results = await runEvalCases(options, run);\n aggregates = await aggregateResult(options, results);\n } catch (error) {\n await notifyRunEnd(reporters, {\n ...lifecycle,\n status: \"failed\",\n completedAt: new Date().toISOString(),\n durationMs: Date.now() - startedAtMs,\n error,\n });\n throw error;\n }\n const completedAt = new Date().toISOString();\n const result: EvalSuiteResult<Input, Output, Expected, Metrics> = {\n name: options.name,\n run: { ...run, completedAt },\n results,\n metrics: aggregates.metrics,\n cases: aggregates.cases,\n usage: aggregates.usage,\n durationMs: Date.now() - startedAtMs,\n reporterErrors,\n };\n if (aggregates.cost !== undefined) {\n result.cost = aggregates.cost;\n }\n const runEndArgs: EvalRunEndArgs = {\n ...lifecycle,\n status: \"completed\",\n completedAt,\n durationMs: result.durationMs,\n metrics: result.metrics,\n cases: result.cases,\n usage: result.usage,\n };\n if (result.cost !== undefined) {\n runEndArgs.cost = result.cost;\n }\n result.reporterErrors.push(\n ...(await notifyRunEnd(reporters, runEndArgs, options.reporterErrorPolicy ?? \"collect\")),\n );\n return result;\n}\n\nasync function runEvalCases<\n Input,\n Output,\n Expected,\n Metrics extends readonly EvalMetric<Input, Output, unknown, Expected, string>[],\n>(\n options: RunEvalSuiteOptions<Input, Output, Expected, Metrics>,\n run: EvalRunContext,\n): Promise<Array<EvalCaseResult<Input, Output, Expected, Metrics>>> {\n const concurrency = Math.max(1, Math.trunc(options.concurrency ?? 1));\n const results = Array<EvalCaseResult<Input, Output, Expected, Metrics>>(options.cases.length);\n let nextIndex = 0;\n let failure: { error: unknown } | undefined;\n\n async function worker(): Promise<void> {\n while (failure === undefined && nextIndex < options.cases.length) {\n const index = nextIndex;\n nextIndex += 1;\n try {\n results[index] = await runEvalCase(\n options,\n options.cases[index] as EvalCase<Input, Expected>,\n run,\n );\n } catch (error) {\n failure ??= { error };\n }\n }\n }\n\n await Promise.all(\n Array.from({ length: Math.min(concurrency, options.cases.length) }, () => worker()),\n );\n if (failure !== undefined) throw failure.error;\n return results;\n}\n\nasync function runEvalCase<\n Input,\n Output,\n Expected,\n Metrics extends readonly EvalMetric<Input, Output, unknown, Expected, string>[],\n>(\n options: RunEvalSuiteOptions<Input, Output, Expected, Metrics>,\n testCase: EvalCase<Input, Expected>,\n run: EvalRunContext,\n): Promise<EvalCaseResult<Input, Output, Expected, Metrics>> {\n let output: Output | undefined;\n let targetError: unknown;\n try {\n output = await options.target(testCase.input, testCase);\n } catch (error) {\n targetError = error;\n }\n const traceResult = await resolveTrace(options, testCase, output, targetError);\n\n const metrics: EvalMetricResult[] = [];\n for (const metric of options.metrics) {\n const outcome =\n targetError === undefined\n ? await safeEvaluate(options.name, testCase, output as Output, metric)\n : EvalOutcome.invalid(`Target failed: ${errorMessage(targetError)}`);\n const reporterErrors = await reportOutcome({\n run,\n suiteName: options.name,\n testCase,\n output,\n targetError,\n metric,\n outcome,\n trace: traceResult.trace,\n traceError: traceResult.error,\n reporters: options.reporters ?? [],\n reporterErrorPolicy: options.reporterErrorPolicy ?? \"collect\",\n });\n const metricResult: EvalMetricResult = {\n metricName: metric.name,\n required: metric.required ?? true,\n outcome,\n reporterErrors,\n };\n if (metric.direction !== undefined) metricResult.direction = metric.direction;\n if (metric.threshold !== undefined) metricResult.threshold = metric.threshold;\n metrics.push(metricResult);\n }\n\n const scores = Object.fromEntries(\n metrics.map((metric) => [metric.metricName, metric.outcome]),\n ) as EvalCaseResult<Input, Output, Expected, Metrics>[\"scores\"];\n const result: EvalCaseResult<Input, Output, Expected, Metrics> = {\n case: testCase,\n outcome: caseOutcome(targetError, metrics),\n metrics: metrics as EvalCaseResult<Input, Output, Expected, Metrics>[\"metrics\"],\n scores,\n };\n if (output !== undefined) {\n result.output = output;\n }\n if (targetError !== undefined) {\n result.targetError = targetError;\n }\n return result;\n}\n\nasync function resolveTrace<Input, Output, Expected>(\n options: RunEvalSuiteOptions<Input, Output, Expected>,\n testCase: EvalCase<Input, Expected>,\n output: Output | undefined,\n targetError: unknown,\n): Promise<{ trace?: EvalTraceRef | undefined; error?: unknown }> {\n try {\n const selector = options.trace ?? defaultEvalTraceSelector;\n const trace = await selector({\n suiteName: options.name,\n case: testCase,\n output,\n targetError,\n });\n return trace === undefined ? {} : { trace };\n } catch (error) {\n return { error };\n }\n}\n\nasync function safeEvaluate<Input, Output, Expected>(\n suiteName: string,\n testCase: EvalCase<Input, Expected>,\n output: Output,\n metric: EvalMetric<Input, Output, unknown, Expected>,\n): Promise<EvalOutcomeType> {\n try {\n return await metric.evaluate({ suiteName, case: testCase, output });\n } catch (error) {\n return EvalOutcome.invalid(errorMessage(error));\n }\n}\n\nasync function reportOutcome<Input, Output, Expected>(args: {\n run: EvalRunContext;\n suiteName: string;\n testCase: EvalCase<Input, Expected>;\n output: Output | undefined;\n targetError: unknown;\n metric: EvalMetric<Input, Output, unknown, Expected>;\n outcome: EvalOutcomeType;\n trace: EvalTraceRef | undefined;\n traceError: unknown;\n reporters: readonly EvalReporter<Input, Output, Expected>[];\n reporterErrorPolicy: \"collect\" | \"throw\";\n}): Promise<unknown[]> {\n const errors: unknown[] = [];\n if (args.traceError !== undefined) {\n errors.push(args.traceError);\n }\n for (const reporter of args.reporters) {\n try {\n await reporter.report({\n run: args.run,\n suiteName: args.suiteName,\n case: args.testCase,\n output: args.output,\n targetError: args.targetError,\n trace: args.trace,\n metric: args.metric,\n outcome: args.outcome,\n });\n } catch (error) {\n errors.push(error);\n }\n }\n throwReporterErrors(\"report\", errors, args.reporterErrorPolicy);\n return errors;\n}\n\nfunction resolveRun<Input, Output, Expected>(\n options: RunEvalSuiteOptions<Input, Output, Expected>,\n startedAtMs: number,\n): EvalRunContext {\n const id = options.run?.id ?? globalThis.crypto.randomUUID();\n if (id.trim().length === 0 || id.length > 128) {\n throw new TypeError(\"Evaluation run id must contain 1 to 128 characters\");\n }\n for (const [label, value] of [\n [\"dataset name\", options.run?.datasetName],\n [\"dataset version\", options.run?.datasetVersion],\n ] as const) {\n if (value !== undefined && (value.trim().length === 0 || value.length > 256)) {\n throw new TypeError(`Evaluation run ${label} must contain 1 to 256 characters`);\n }\n }\n const run: EvalRunContext = {\n id,\n startedAt: new Date(startedAtMs).toISOString(),\n };\n if (options.run?.datasetName !== undefined) run.datasetName = options.run.datasetName;\n if (options.run?.datasetVersion !== undefined) run.datasetVersion = options.run.datasetVersion;\n if (options.run?.metadata !== undefined) run.metadata = options.run.metadata;\n return run;\n}\n\nasync function notifyRunStart<Input, Output, Expected>(\n reporters: readonly EvalReporter<Input, Output, Expected>[],\n args: EvalRunStartArgs,\n errorPolicy: \"collect\" | \"throw\",\n): Promise<unknown[]> {\n const errors: unknown[] = [];\n for (const reporter of reporters) {\n if (reporter.onRunStart === undefined) continue;\n try {\n await reporter.onRunStart(args);\n } catch (error) {\n errors.push(error);\n }\n }\n throwReporterErrors(\"onRunStart\", errors, errorPolicy);\n return errors;\n}\n\nasync function notifyRunEnd<Input, Output, Expected>(\n reporters: readonly EvalReporter<Input, Output, Expected>[],\n args: EvalRunEndArgs,\n errorPolicy: \"collect\" | \"throw\" = \"collect\",\n): Promise<unknown[]> {\n const errors: unknown[] = [];\n for (const reporter of reporters) {\n if (reporter.onRunEnd === undefined) continue;\n try {\n await reporter.onRunEnd(args);\n } catch (error) {\n errors.push(error);\n }\n }\n throwReporterErrors(\"onRunEnd\", errors, errorPolicy);\n return errors;\n}\n\nfunction throwReporterErrors(\n phase: string,\n errors: readonly unknown[],\n errorPolicy: \"collect\" | \"throw\",\n): void {\n if (errorPolicy === \"throw\" && errors.length > 0) {\n throw new EvalReporterDispatchError(phase, errors);\n }\n}\n\nfunction countMetricOutcomes(\n results: Array<EvalCaseResult<unknown, unknown, unknown>>,\n): EvalTotals {\n const totals = emptyTotals();\n for (const result of results) {\n for (const metric of result.metrics) {\n totals.total += 1;\n totals[statusKey(metric.outcome.outcome)] += 1;\n }\n }\n return totals;\n}\n\nfunction countCaseOutcomes(results: Array<EvalCaseResult<unknown, unknown, unknown>>): EvalTotals {\n const totals = emptyTotals();\n for (const result of results) {\n totals.total += 1;\n totals[statusKey(result.outcome)] += 1;\n }\n return totals;\n}\n\nfunction emptyTotals(): EvalTotals {\n return { total: 0, passed: 0, failed: 0, invalid: 0 };\n}\n\nfunction statusKey(status: \"pass\" | \"fail\" | \"invalid\"): \"passed\" | \"failed\" | \"invalid\" {\n if (status === \"pass\") return \"passed\";\n if (status === \"fail\") return \"failed\";\n return \"invalid\";\n}\n\nfunction caseOutcome(\n targetError: unknown,\n metrics: EvalMetricResult[],\n): \"pass\" | \"fail\" | \"invalid\" {\n if (targetError !== undefined) return \"invalid\";\n const required = metrics.filter((metric) => metric.required);\n if (required.some((metric) => metric.outcome.outcome === \"invalid\")) return \"invalid\";\n if (required.some((metric) => metric.outcome.outcome === \"fail\")) return \"fail\";\n return \"pass\";\n}\n\nasync function aggregateResult<\n Input,\n Output,\n Expected,\n Metrics extends readonly EvalMetric<Input, Output, unknown, Expected, string>[],\n>(\n options: RunEvalSuiteOptions<Input, Output, Expected, Metrics>,\n results: Array<EvalCaseResult<Input, Output, Expected, Metrics>>,\n): Promise<{\n metrics: EvalTotals;\n cases: EvalTotals;\n usage: { target: Usage; evaluation: Usage; total: Usage };\n cost?: EvalCostSummary | undefined;\n}> {\n let targetUsage = UsageValue.empty();\n let evaluationUsage = UsageValue.empty();\n let targetCost = 0;\n let evaluationCost = 0;\n\n for (const result of results) {\n if (result.output !== undefined) {\n const usage = await resolveTargetUsage(options, result.case, result.output);\n if (usage !== undefined) {\n targetUsage = UsageValue.add(targetUsage, usage);\n if (options.cost !== undefined) {\n targetCost += await calculateCost(\n options.cost.calculate({\n kind: \"target\",\n suiteName: options.name,\n case: result.case,\n output: result.output,\n usage,\n }),\n );\n }\n }\n }\n for (const metricResult of result.metrics) {\n const usage = metricResult.outcome.usage;\n if (usage === undefined) continue;\n assertUsage(usage, `Evaluation usage for metric ${metricResult.metricName}`);\n evaluationUsage = UsageValue.add(evaluationUsage, usage);\n if (options.cost !== undefined && result.output !== undefined) {\n const metric = options.metrics.find(\n (candidate) => candidate.name === metricResult.metricName,\n );\n if (metric !== undefined) {\n evaluationCost += await calculateCost(\n options.cost.calculate({\n kind: \"evaluation\",\n suiteName: options.name,\n case: result.case,\n output: result.output,\n metric,\n usage,\n }),\n );\n }\n }\n }\n }\n\n const usage = {\n target: targetUsage,\n evaluation: evaluationUsage,\n total: UsageValue.add(targetUsage, evaluationUsage),\n };\n const aggregates: {\n metrics: EvalTotals;\n cases: EvalTotals;\n usage: typeof usage;\n cost?: EvalCostSummary | undefined;\n } = {\n metrics: countMetricOutcomes(results),\n cases: countCaseOutcomes(results),\n usage,\n };\n if (options.cost !== undefined) {\n aggregates.cost = {\n currency: options.cost.currency,\n target: targetCost,\n evaluation: evaluationCost,\n total: targetCost + evaluationCost,\n };\n }\n return aggregates;\n}\n\nasync function resolveTargetUsage<Input, Output, Expected>(\n options: RunEvalSuiteOptions<Input, Output, Expected>,\n testCase: EvalCase<Input, Expected>,\n output: Output,\n): Promise<Usage | undefined> {\n const usage =\n options.targetUsage === undefined\n ? usageFromOutput(output)\n : await options.targetUsage({ suiteName: options.name, case: testCase, output });\n if (usage !== undefined) assertUsage(usage, `Target usage for case ${testCase.id}`);\n return usage;\n}\n\nfunction usageFromOutput(output: unknown): Usage | undefined {\n if (typeof output !== \"object\" || output === null || !(\"usage\" in output)) return undefined;\n return (output as { usage?: Usage | undefined }).usage;\n}\n\nfunction assertUsage(usage: Usage, label: string): void {\n for (const [key, value] of Object.entries(usage)) {\n if (key === \"details\") continue;\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n throw new TypeError(`${label} must contain finite, non-negative token counts`);\n }\n }\n}\n\nasync function calculateCost(value: number | Promise<number>): Promise<number> {\n const cost = await value;\n if (!Number.isFinite(cost) || cost < 0) {\n throw new TypeError(\"Evaluation cost calculator must return a finite, non-negative number\");\n }\n return cost;\n}\n\nfunction validateSuiteOptions<Input, Output, Expected>(\n options: RunEvalSuiteOptions<Input, Output, Expected>,\n): void {\n assertUnique(\n options.cases.map((testCase) => testCase.id),\n \"Evaluation case id\",\n );\n assertUnique(\n options.metrics.map((metric) => metric.name),\n \"Evaluation metric name\",\n );\n if (options.cost !== undefined && options.cost.currency.trim().length === 0) {\n throw new TypeError(\"Evaluation cost currency must not be empty\");\n }\n}\n\nfunction assertUnique(values: string[], label: string): void {\n const seen = new Set<string>();\n for (const value of values) {\n if (seen.has(value)) throw new TypeError(`${label} must be unique: ${value}`);\n seen.add(value);\n }\n}\n","import { runEvalSuite } from \"./runner\";\nimport type {\n EvalMetric,\n EvalOutcomeStatus,\n EvalSuiteResult,\n EvalTotals,\n RunEvalSuiteOptions,\n} from \"./types\";\n\nexport type EvalOutputFormat = \"pretty\" | \"json\" | \"quiet\";\n\nexport type EvalExpectedTotals = Partial<EvalTotals> & {\n metrics?: Partial<EvalTotals> | undefined;\n cases?: Partial<EvalTotals> | undefined;\n};\n\nexport type EvalExpectedOutcomes = Record<string, Record<string, EvalOutcomeStatus>>;\n\nexport type EvalExpectations = {\n totals?: EvalExpectedTotals | undefined;\n outcomes?: EvalExpectedOutcomes | undefined;\n};\n\nexport type EvalOutputWriters = {\n stdout?(text: string): void;\n stderr?(text: string): void;\n};\n\nexport type PrintEvalResultOptions = {\n format?: EvalOutputFormat | undefined;\n output?: EvalOutputWriters | undefined;\n};\n\nexport type RunEvalCliOptions<\n Input,\n Output,\n Expected = unknown,\n Metrics extends readonly EvalMetric<\n NoInfer<Input>,\n NoInfer<Output>,\n unknown,\n NoInfer<Expected>,\n string\n >[] = readonly EvalMetric<NoInfer<Input>, NoInfer<Output>, unknown, NoInfer<Expected>, string>[],\n> = RunEvalSuiteOptions<Input, Output, Expected, Metrics> & {\n format?: EvalOutputFormat | undefined;\n exitCode?: boolean | undefined;\n expectations?: EvalExpectations | undefined;\n output?: EvalOutputWriters | undefined;\n};\n\nexport class EvalAssertionError extends Error {\n readonly mismatches: string[];\n\n constructor(message: string, mismatches: string[]) {\n super(`${message}\\n${mismatches.map((mismatch) => `- ${mismatch}`).join(\"\\n\")}`);\n this.name = \"EvalAssertionError\";\n this.mismatches = mismatches;\n }\n}\n\nexport function printEvalResult(\n result: EvalSuiteResult<unknown, unknown, unknown>,\n options: PrintEvalResultOptions = {},\n): void {\n const format = options.format ?? \"pretty\";\n if (format === \"quiet\") return;\n const write = options.output?.stdout ?? ((text: string) => process.stdout.write(text));\n write(`${format === \"json\" ? jsonResult(result) : prettyResult(result)}\\n`);\n}\n\nexport function evalExitCode(\n result: EvalSuiteResult<unknown, unknown, unknown>,\n expectations?: EvalExpectations,\n): 0 | 1 | 2 {\n const hasExpectations =\n expectations?.totals !== undefined || expectations?.outcomes !== undefined;\n const mismatches = hasExpectations ? expectationMismatches(result, expectations) : [];\n if (hasExpectations && mismatches.length === 0) return 0;\n if (hasExpectations && hasUnexpectedInvalid(result, expectations)) return 2;\n if (hasExpectations) return 1;\n if (requiredMetricCount(result, \"invalid\") > 0) return 2;\n return requiredMetricCount(result, \"fail\") > 0 ? 1 : 0;\n}\n\nexport function assertEvalTotals(\n result: EvalSuiteResult<unknown, unknown, unknown>,\n expected: EvalExpectedTotals,\n): void {\n const mismatches = totalMismatches(result, expected);\n if (mismatches.length > 0) {\n throw new EvalAssertionError(\"Evaluation totals did not match expectations.\", mismatches);\n }\n}\n\nexport function assertEvalOutcomes(\n result: EvalSuiteResult<unknown, unknown, unknown>,\n expected: EvalExpectedOutcomes,\n): void {\n const mismatches = outcomeMismatches(result, expected);\n if (mismatches.length > 0) {\n throw new EvalAssertionError(\"Evaluation outcomes did not match expectations.\", mismatches);\n }\n}\n\nexport async function runEvalCli<\n Input,\n Output,\n Expected = unknown,\n const Metrics extends readonly EvalMetric<\n NoInfer<Input>,\n NoInfer<Output>,\n unknown,\n NoInfer<Expected>,\n string\n >[] = readonly EvalMetric<NoInfer<Input>, NoInfer<Output>, unknown, NoInfer<Expected>, string>[],\n>(\n options: RunEvalCliOptions<Input, Output, Expected, Metrics>,\n): Promise<EvalSuiteResult<Input, Output, Expected, Metrics>> {\n const { format, exitCode, expectations, output, ...suiteOptions } = options;\n const result = await runEvalSuite(\n suiteOptions as RunEvalSuiteOptions<Input, Output, Expected, Metrics>,\n );\n printEvalResult(result, { format, output });\n const code = evalExitCode(result, expectations);\n const mismatches = expectationMismatches(result, expectations);\n if (mismatches.length > 0 && format !== \"quiet\") {\n const write = output?.stderr ?? ((text: string) => process.stderr.write(text));\n write(\n `Evaluation expectation mismatches:\\n${mismatches.map((value) => `- ${value}`).join(\"\\n\")}\\n`,\n );\n }\n const currentExitCode =\n typeof process.exitCode === \"number\" ? process.exitCode : Number(process.exitCode ?? 0);\n if (exitCode === true && code > currentExitCode) process.exitCode = code;\n return result;\n}\n\nfunction prettyResult(result: EvalSuiteResult<unknown, unknown, unknown>): string {\n const lines = [\n `${result.name} (${result.run.id})`,\n `Cases: ${totalsText(result.cases)}`,\n `Metrics: ${totalsText(result.metrics)}`,\n ];\n for (const caseResult of result.results) {\n lines.push(``, `[${caseResult.outcome.toUpperCase()}] ${caseResult.case.id}`);\n if (caseResult.output !== undefined) lines.push(` output: ${displayValue(caseResult.output)}`);\n if (caseResult.targetError !== undefined) {\n lines.push(` target error: ${errorText(caseResult.targetError)}`);\n }\n for (const metric of caseResult.metrics) {\n const parts = [` - ${metric.metricName}: ${metric.outcome.outcome}`];\n if (metric.outcome.score !== undefined)\n parts.push(`score=${displayValue(metric.outcome.score)}`);\n if (metric.threshold !== undefined) parts.push(`threshold=${metric.threshold}`);\n if (metric.direction !== undefined) parts.push(`direction=${metric.direction}`);\n if (!metric.required) parts.push(\"optional\");\n lines.push(parts.join(\" | \"));\n const explanation =\n metric.outcome.comment ??\n (metric.outcome.outcome === \"invalid\" ? metric.outcome.reason : undefined);\n if (explanation !== undefined) lines.push(` ${explanation}`);\n }\n }\n lines.push(\n ``,\n `Usage: target=${result.usage.target.totalTokens} evaluation=${result.usage.evaluation.totalTokens} total=${result.usage.total.totalTokens} tokens`,\n );\n if (result.cost !== undefined) {\n lines.push(\n `Cost: target=${result.cost.target} evaluation=${result.cost.evaluation} total=${result.cost.total} ${result.cost.currency}`,\n );\n }\n lines.push(`Duration: ${result.durationMs}ms`);\n return lines.join(\"\\n\");\n}\n\nfunction jsonResult(result: EvalSuiteResult<unknown, unknown, unknown>): string {\n return JSON.stringify(\n result,\n (_key, value: unknown) => {\n if (value instanceof Error) {\n return { name: value.name, message: value.message, stack: value.stack };\n }\n if (value instanceof RegExp) return String(value);\n return value;\n },\n 2,\n );\n}\n\nfunction expectationMismatches(\n result: EvalSuiteResult<unknown, unknown, unknown>,\n expectations?: EvalExpectations,\n): string[] {\n if (expectations === undefined) return [];\n const mismatches: string[] = [];\n if (expectations.totals !== undefined) {\n mismatches.push(...totalMismatches(result, expectations.totals));\n }\n if (expectations.outcomes !== undefined) {\n mismatches.push(...outcomeMismatches(result, expectations.outcomes));\n }\n return mismatches;\n}\n\nfunction totalMismatches(\n result: EvalSuiteResult<unknown, unknown, unknown>,\n expected: EvalExpectedTotals,\n): string[] {\n const directMetrics: Partial<EvalTotals> = {};\n if (expected.total !== undefined) directMetrics.total = expected.total;\n if (expected.passed !== undefined) directMetrics.passed = expected.passed;\n if (expected.failed !== undefined) directMetrics.failed = expected.failed;\n if (expected.invalid !== undefined) directMetrics.invalid = expected.invalid;\n return [\n ...totalsGroupMismatches(\"metrics\", result.metrics, {\n ...directMetrics,\n ...expected.metrics,\n }),\n ...totalsGroupMismatches(\"cases\", result.cases, expected.cases),\n ];\n}\n\nfunction totalsGroupMismatches(\n label: string,\n actual: EvalTotals,\n expected: Partial<EvalTotals> | undefined,\n): string[] {\n if (expected === undefined) return [];\n const mismatches: string[] = [];\n for (const key of [\"total\", \"passed\", \"failed\", \"invalid\"] as const) {\n if (expected[key] !== undefined && actual[key] !== expected[key]) {\n mismatches.push(`${label}.${key}: expected ${expected[key]}, received ${actual[key]}`);\n }\n }\n return mismatches;\n}\n\nfunction outcomeMismatches(\n result: EvalSuiteResult<unknown, unknown, unknown>,\n expected: EvalExpectedOutcomes,\n): string[] {\n const mismatches: string[] = [];\n const actualCases = new Map(result.results.map((caseResult) => [caseResult.case.id, caseResult]));\n for (const [caseId, metrics] of Object.entries(expected)) {\n const caseResult = actualCases.get(caseId);\n if (caseResult === undefined) {\n mismatches.push(`${caseId}: expected case was not present`);\n continue;\n }\n for (const [metricName, expectedOutcome] of Object.entries(metrics)) {\n const metric = caseResult.metrics.find((candidate) => candidate.metricName === metricName);\n if (metric === undefined) {\n mismatches.push(`${caseId}.${metricName}: expected metric was not present`);\n } else if (metric.outcome.outcome !== expectedOutcome) {\n mismatches.push(\n `${caseId}.${metricName}: expected ${expectedOutcome}, received ${metric.outcome.outcome}`,\n );\n }\n }\n }\n for (const caseResult of result.results) {\n for (const metric of caseResult.metrics) {\n if (!metric.required) continue;\n const expectedOutcome = expected[caseResult.case.id]?.[metric.metricName] ?? \"pass\";\n if (metric.outcome.outcome !== expectedOutcome) {\n const message = `${caseResult.case.id}.${metric.metricName}: expected ${expectedOutcome}, received ${metric.outcome.outcome}`;\n if (!mismatches.includes(message)) mismatches.push(message);\n }\n }\n }\n return mismatches;\n}\n\nfunction hasUnexpectedInvalid(\n result: EvalSuiteResult<unknown, unknown, unknown>,\n expectations: EvalExpectations | undefined,\n): boolean {\n if (expectations?.outcomes !== undefined) {\n return result.results.some((caseResult) =>\n caseResult.metrics.some(\n (metric) =>\n metric.required &&\n metric.outcome.outcome === \"invalid\" &&\n expectations.outcomes?.[caseResult.case.id]?.[metric.metricName] !== \"invalid\",\n ),\n );\n }\n const expectedInvalid = expectations?.totals?.metrics?.invalid ?? expectations?.totals?.invalid;\n return result.metrics.invalid > (expectedInvalid ?? 0);\n}\n\nfunction requiredMetricCount(\n result: EvalSuiteResult<unknown, unknown, unknown>,\n status: \"fail\" | \"invalid\",\n): number {\n return result.results.reduce(\n (total, caseResult) =>\n total +\n caseResult.metrics.filter((metric) => metric.required && metric.outcome.outcome === status)\n .length,\n 0,\n );\n}\n\nfunction totalsText(totals: EvalTotals): string {\n return `${totals.total} total / ${totals.passed} pass / ${totals.failed} fail / ${totals.invalid} invalid`;\n}\n\nfunction displayValue(value: unknown): string {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof Error ? error.message : displayValue(error);\n}\n","import type { EvalMetric } from \"./types\";\n\nexport function defineMetric<Input, Output, Score, Expected, const Name extends string = string>(\n metric: EvalMetric<Input, Output, Score, Expected, Name>,\n): EvalMetric<Input, Output, Score, Expected, Name> {\n return metric;\n}\n","import { z } from \"zod\";\nimport type { CompletionModel } from \"../completion\";\nimport { cosineSimilarity, type EmbeddingModel, embedText } from \"../embeddings\";\nimport { extract } from \"../extractor\";\nimport type { ZodSchema } from \"../schema\";\nimport { errorMessage, formatValue, stableComparable } from \"./format\";\nimport { EvalOutcome } from \"./outcome\";\nimport { resolveActual, resolveActualText, resolveExpected, resolveJudgePrompt } from \"./selectors\";\nimport type { EvalCaseRequirements, EvalMetric, SelectorOrValue, ValueSelector } from \"./types\";\n\nexport type ExactMatchOptions<Input, Output, Expected = unknown> = {\n name?: string | undefined;\n required?: boolean | undefined;\n actual?: ValueSelector<Input, Output, Expected, unknown> | undefined;\n expected?: SelectorOrValue<Input, Output, Expected, unknown> | undefined;\n};\n\nexport function exactMatch<Input, Output, Expected = unknown, const Name extends string = string>(\n options: ExactMatchOptions<Input, Output, Expected> & {\n expected: Exclude<ExactMatchOptions<Input, Output, Expected>[\"expected\"], undefined>;\n name?: Name | undefined;\n },\n): EvalMetric<Input, Output, boolean, Expected, Name>;\nexport function exactMatch<Input, Output, Expected = unknown, const Name extends string = string>(\n options?: Omit<ExactMatchOptions<Input, Output, Expected>, \"expected\"> & {\n expected?: undefined;\n name?: Name | undefined;\n },\n): EvalMetric<Input, Output, boolean, Expected, Name, { expected: unknown }>;\nexport function exactMatch<Input, Output, Expected = unknown, const Name extends string = string>(\n options: ExactMatchOptions<Input, Output, Expected> & { name?: Name | undefined } = {},\n): EvalMetric<Input, Output, boolean, Expected, Name, EvalCaseRequirements> {\n return {\n name: (options.name ?? \"exact_match\") as Name,\n required: options.required ?? true,\n dataType: \"BOOLEAN\",\n direction: \"higher_is_better\",\n threshold: 1,\n async evaluate(args) {\n const actual = await resolveActual(options.actual, args);\n const expected = await resolveExpected(options.expected, args);\n if (expected === undefined) {\n return EvalOutcome.invalid(\"No expected value provided for exact match.\");\n }\n const passed = stableComparable(actual) === stableComparable(expected);\n return passed\n ? EvalOutcome.pass(true)\n : EvalOutcome.fail(false, { comment: `Expected ${formatValue(expected)}.` });\n },\n };\n}\n\nexport type ContainsOptions<Input, Output, Expected = unknown> = {\n name?: string | undefined;\n required?: boolean | undefined;\n actual?: ValueSelector<Input, Output, Expected, string> | undefined;\n expected?: SelectorOrValue<Input, Output, Expected, string | RegExp> | undefined;\n};\n\nexport function contains<Input, Output, Expected = unknown, const Name extends string = string>(\n options: ContainsOptions<Input, Output, Expected> & {\n expected: Exclude<ContainsOptions<Input, Output, Expected>[\"expected\"], undefined>;\n name?: Name | undefined;\n },\n): EvalMetric<Input, Output, boolean, Expected, Name>;\nexport function contains<Input, Output, Expected = unknown, const Name extends string = string>(\n options?: Omit<ContainsOptions<Input, Output, Expected>, \"expected\"> & {\n expected?: undefined;\n name?: Name | undefined;\n },\n): EvalMetric<Input, Output, boolean, Expected, Name, { expected: string | RegExp }>;\nexport function contains<Input, Output, Expected = unknown, const Name extends string = string>(\n options: ContainsOptions<Input, Output, Expected> & { name?: Name | undefined } = {},\n): EvalMetric<Input, Output, boolean, Expected, Name, EvalCaseRequirements> {\n return {\n name: (options.name ?? \"contains\") as Name,\n required: options.required ?? true,\n dataType: \"BOOLEAN\",\n direction: \"higher_is_better\",\n threshold: 1,\n async evaluate(args) {\n const actual = await resolveActualText(options.actual, args);\n const expected = await resolveExpected(options.expected, args);\n if (expected === undefined) {\n return EvalOutcome.invalid(\"No expected value provided for contains.\");\n }\n if (typeof expected !== \"string\" && !(expected instanceof RegExp)) {\n return EvalOutcome.invalid(\"Contains expected value must be a string or RegExp.\");\n }\n const passed =\n expected instanceof RegExp ? regexMatches(expected, actual) : actual.includes(expected);\n return passed\n ? EvalOutcome.pass(true)\n : EvalOutcome.fail(false, { comment: `Output did not contain ${String(expected)}.` });\n },\n };\n}\n\nexport type NotContainsOptions<Input, Output, Expected = unknown> = ContainsOptions<\n Input,\n Output,\n Expected\n>;\n\nexport function notContains<Input, Output, Expected = unknown, const Name extends string = string>(\n options: NotContainsOptions<Input, Output, Expected> & { name?: Name | undefined } = {},\n): EvalMetric<Input, Output, boolean, Expected, Name> {\n return {\n name: (options.name ?? \"not_contains\") as Name,\n required: options.required ?? true,\n dataType: \"BOOLEAN\",\n direction: \"higher_is_better\",\n threshold: 1,\n async evaluate(args) {\n const actual = await resolveActualText(options.actual, args);\n const expected = await resolveExpected(options.expected, args);\n if (expected === undefined) {\n return EvalOutcome.invalid(\"No expected value provided for notContains.\");\n }\n if (typeof expected !== \"string\" && !(expected instanceof RegExp)) {\n return EvalOutcome.invalid(\"notContains expected value must be a string or RegExp.\");\n }\n const found = textExpectationMatches(expected, actual);\n return found\n ? EvalOutcome.fail(false, {\n comment: `Output contained forbidden value ${String(expected)}.`,\n })\n : EvalOutcome.pass(true);\n },\n };\n}\n\nexport type ContainsListOptions<Input, Output, Expected = unknown> = {\n name?: string | undefined;\n required?: boolean | undefined;\n actual?: ValueSelector<Input, Output, Expected, string> | undefined;\n expected?: SelectorOrValue<Input, Output, Expected, ReadonlyArray<string | RegExp>> | undefined;\n};\n\nexport type ContainsAllOptions<Input, Output, Expected = unknown> = ContainsListOptions<\n Input,\n Output,\n Expected\n>;\n\nexport function containsAll<Input, Output, Expected = unknown, const Name extends string = string>(\n options: ContainsAllOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, boolean, Expected, Name> {\n return containsListMetric(\"contains_all\", \"all\", options);\n}\n\nexport type ContainsAnyOptions<Input, Output, Expected = unknown> = ContainsListOptions<\n Input,\n Output,\n Expected\n>;\n\nexport function containsAny<Input, Output, Expected = unknown, const Name extends string = string>(\n options: ContainsAnyOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, boolean, Expected, Name> {\n return containsListMetric(\"contains_any\", \"any\", options);\n}\n\nfunction containsListMetric<Input, Output, Expected, const Name extends string>(\n defaultName: string,\n mode: \"all\" | \"any\",\n options: ContainsListOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, boolean, Expected, Name> {\n return {\n name: (options.name ?? defaultName) as Name,\n required: options.required ?? true,\n dataType: \"BOOLEAN\",\n direction: \"higher_is_better\",\n threshold: 1,\n async evaluate(args) {\n const actual = await resolveActualText(options.actual, args);\n const expected = await resolveExpected(options.expected, args);\n if (!Array.isArray(expected) || expected.length === 0) {\n return EvalOutcome.invalid(`${defaultName} expected value must be a non-empty array.`);\n }\n if (expected.some((value) => typeof value !== \"string\" && !(value instanceof RegExp))) {\n return EvalOutcome.invalid(`${defaultName} expected values must be strings or RegExp.`);\n }\n const matches = expected.map((value) => textExpectationMatches(value, actual));\n const passed = mode === \"all\" ? matches.every(Boolean) : matches.some(Boolean);\n if (passed) return EvalOutcome.pass(true);\n const missing = expected.filter((_, index) => !matches[index]).map(String);\n const comment =\n mode === \"all\"\n ? `Output was missing: ${missing.join(\", \")}.`\n : `Output matched none of: ${expected.map(String).join(\", \")}.`;\n return EvalOutcome.fail(false, { comment });\n },\n };\n}\n\nexport type MatchesOptions<Input, Output, Expected = unknown> = {\n name?: string | undefined;\n required?: boolean | undefined;\n actual?: ValueSelector<Input, Output, Expected, string> | undefined;\n expected?: SelectorOrValue<Input, Output, Expected, RegExp> | undefined;\n};\n\nexport function matches<Input, Output, Expected = unknown, const Name extends string = string>(\n options: MatchesOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, boolean, Expected, Name> {\n return regexMetric(\"matches\", false, options);\n}\n\nexport type DoesNotMatchOptions<Input, Output, Expected = unknown> = MatchesOptions<\n Input,\n Output,\n Expected\n>;\n\nexport function doesNotMatch<Input, Output, Expected = unknown, const Name extends string = string>(\n options: DoesNotMatchOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, boolean, Expected, Name> {\n return regexMetric(\"does_not_match\", true, options);\n}\n\nfunction regexMetric<Input, Output, Expected, const Name extends string>(\n defaultName: string,\n negate: boolean,\n options: MatchesOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, boolean, Expected, Name> {\n return {\n name: (options.name ?? defaultName) as Name,\n required: options.required ?? true,\n dataType: \"BOOLEAN\",\n direction: \"higher_is_better\",\n threshold: 1,\n async evaluate(args) {\n const actual = await resolveActualText(options.actual, args);\n const expected = await resolveExpected(options.expected, args);\n if (!(expected instanceof RegExp)) {\n return EvalOutcome.invalid(`${defaultName} expected value must be a RegExp.`);\n }\n const matched = regexMatches(expected, actual);\n const passed = negate ? !matched : matched;\n return passed\n ? EvalOutcome.pass(true)\n : EvalOutcome.fail(false, {\n comment: negate\n ? `Output matched forbidden pattern ${String(expected)}.`\n : `Output did not match ${String(expected)}.`,\n });\n },\n };\n}\n\nexport type MaxLengthOptions<Input, Output, Expected = unknown> = {\n name?: string | undefined;\n required?: boolean | undefined;\n actual?: ValueSelector<Input, Output, Expected, string> | undefined;\n max: SelectorOrValue<Input, Output, Expected, number>;\n};\n\nexport function maxLength<Input, Output, Expected = unknown, const Name extends string = string>(\n options: MaxLengthOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, boolean, Expected, Name> {\n return {\n name: (options.name ?? \"max_length\") as Name,\n required: options.required ?? true,\n dataType: \"BOOLEAN\",\n direction: \"higher_is_better\",\n threshold: 1,\n async evaluate(args) {\n const actual = await resolveActualText(options.actual, args);\n const max = await resolveOption(options.max, args);\n if (!Number.isInteger(max) || max < 0) {\n return EvalOutcome.invalid(\"maxLength max must be a non-negative integer.\");\n }\n const length = Array.from(actual).length;\n return length <= max\n ? EvalOutcome.pass(true)\n : EvalOutcome.fail(false, { comment: `Output length ${length} exceeded maximum ${max}.` });\n },\n };\n}\n\nexport type RequiredFieldsOptions<Input, Output, Expected = unknown> = {\n name?: string | undefined;\n required?: boolean | undefined;\n actual?: ValueSelector<Input, Output, Expected, unknown> | undefined;\n expected: SelectorOrValue<Input, Output, Expected, readonly string[]>;\n};\n\nexport function requiredFields<\n Input,\n Output,\n Expected = unknown,\n const Name extends string = string,\n>(\n options: RequiredFieldsOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, boolean, Expected, Name> {\n return {\n name: (options.name ?? \"required_fields\") as Name,\n required: options.required ?? true,\n dataType: \"BOOLEAN\",\n direction: \"higher_is_better\",\n threshold: 1,\n async evaluate(args) {\n const actual = await resolveActual(options.actual, args);\n const expected = await resolveOption(options.expected, args);\n if (\n !Array.isArray(expected) ||\n expected.length === 0 ||\n expected.some((field) => typeof field !== \"string\" || field.length === 0)\n ) {\n return EvalOutcome.invalid(\n \"requiredFields expected value must be a non-empty string array.\",\n );\n }\n if (typeof actual !== \"object\" || actual === null || Array.isArray(actual)) {\n return EvalOutcome.invalid(\"requiredFields actual value must be an object.\");\n }\n const missing = expected.filter((field) => !Object.hasOwn(actual, field));\n return missing.length === 0\n ? EvalOutcome.pass(true)\n : EvalOutcome.fail(false, { comment: `Missing required fields: ${missing.join(\", \")}.` });\n },\n };\n}\n\nfunction regexMatches(pattern: RegExp, text: string): boolean {\n pattern.lastIndex = 0;\n const matched = pattern.test(text);\n pattern.lastIndex = 0;\n return matched;\n}\n\nfunction textExpectationMatches(expected: string | RegExp, actual: string): boolean {\n return expected instanceof RegExp ? regexMatches(expected, actual) : actual.includes(expected);\n}\n\nasync function resolveOption<Input, Output, Expected, Value>(\n value: SelectorOrValue<Input, Output, Expected, Value>,\n args: Parameters<ValueSelector<Input, Output, Expected, Value>>[0],\n): Promise<Value> {\n return typeof value === \"function\"\n ? (value as ValueSelector<Input, Output, Expected, Value>)(args)\n : value;\n}\n\nexport type SemanticSimilarityOptions<Input, Output, Expected = unknown> = {\n name?: string | undefined;\n required?: boolean | undefined;\n model: EmbeddingModel;\n threshold: number;\n actual?: ValueSelector<Input, Output, Expected, string> | undefined;\n expected?: SelectorOrValue<Input, Output, Expected, string> | undefined;\n};\n\nexport function semanticSimilarity<\n Input,\n Output,\n Expected = unknown,\n const Name extends string = string,\n>(\n options: SemanticSimilarityOptions<Input, Output, Expected> & {\n expected: Exclude<SemanticSimilarityOptions<Input, Output, Expected>[\"expected\"], undefined>;\n name?: Name | undefined;\n },\n): EvalMetric<Input, Output, number, Expected, Name>;\nexport function semanticSimilarity<\n Input,\n Output,\n Expected = unknown,\n const Name extends string = string,\n>(\n options: Omit<SemanticSimilarityOptions<Input, Output, Expected>, \"expected\"> & {\n expected?: undefined;\n name?: Name | undefined;\n },\n): EvalMetric<Input, Output, number, Expected, Name, { expected: string }>;\nexport function semanticSimilarity<\n Input,\n Output,\n Expected = unknown,\n const Name extends string = string,\n>(\n options: SemanticSimilarityOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, number, Expected, Name, EvalCaseRequirements> {\n return {\n name: (options.name ?? \"semantic_similarity\") as Name,\n required: options.required ?? true,\n dataType: \"NUMERIC\",\n direction: \"higher_is_better\",\n threshold: options.threshold,\n async evaluate(args) {\n const actual = await resolveActualText(options.actual, args);\n const expected = await resolveExpected(options.expected, args);\n if (expected === undefined) {\n return EvalOutcome.invalid(\"No expected value provided for semantic similarity.\");\n }\n if (typeof expected !== \"string\") {\n return EvalOutcome.invalid(\"Semantic similarity expected value must be a string.\");\n }\n const [{ embedding: actualEmbedding }, { embedding: expectedEmbedding }] = await Promise.all([\n embedText({ model: options.model, text: actual }),\n embedText({ model: options.model, text: expected }),\n ]);\n const score = cosineSimilarity(actualEmbedding.vector, expectedEmbedding.vector);\n return score >= options.threshold\n ? EvalOutcome.pass(score)\n : EvalOutcome.fail(score, { comment: `Similarity below threshold ${options.threshold}.` });\n },\n };\n}\n\nexport type LlmJudgeOptions<Input, Output, SchemaOutput, Expected = unknown> = {\n name?: string | undefined;\n required?: boolean | undefined;\n model: CompletionModel;\n schema: ZodSchema<SchemaOutput>;\n passes(value: SchemaOutput): boolean;\n instructions?: string | undefined;\n retries?: number | undefined;\n prompt?: ValueSelector<Input, Output, Expected, string> | undefined;\n};\n\nexport function llmJudge<\n Input,\n Output,\n SchemaOutput,\n Expected = unknown,\n const Name extends string = string,\n>(\n options: LlmJudgeOptions<Input, Output, SchemaOutput, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, SchemaOutput, Expected, Name> {\n return {\n name: (options.name ?? \"llm_judge\") as Name,\n required: options.required ?? true,\n async evaluate(args) {\n try {\n const result = await extract({\n model: options.model,\n outputSchema: options.schema,\n instructions:\n options.instructions ??\n \"Judge the eval case by the requested schema. Submit the judgment using the schema.\",\n text: await resolveJudgePrompt(options.prompt, args),\n retries: evalExtractionRetries(options.retries),\n });\n return options.passes(result.output)\n ? EvalOutcome.pass(result.output, { usage: result.usage })\n : EvalOutcome.fail(result.output, { usage: result.usage });\n } catch (error) {\n return EvalOutcome.invalid(errorMessage(error));\n }\n },\n };\n}\n\nexport type LlmScoreMetricScore = {\n score: number;\n feedback: string;\n};\n\nexport type LlmScoreOptions<Input, Output, Expected = unknown> = {\n name?: string | undefined;\n required?: boolean | undefined;\n model: CompletionModel;\n threshold: number;\n criteria: string | string[];\n instructions?: string | undefined;\n retries?: number | undefined;\n prompt?: ValueSelector<Input, Output, Expected, string> | undefined;\n};\n\nexport function llmScore<Input, Output, Expected = unknown, const Name extends string = string>(\n options: LlmScoreOptions<Input, Output, Expected> & { name?: Name | undefined },\n): EvalMetric<Input, Output, LlmScoreMetricScore, Expected, Name> {\n const criteria = Array.isArray(options.criteria) ? options.criteria.join(\"\\n\") : options.criteria;\n return {\n name: (options.name ?? \"llm_score\") as Name,\n required: options.required ?? true,\n dataType: \"NUMERIC\",\n projectScore: (score) => score.score,\n direction: \"higher_is_better\",\n threshold: options.threshold,\n async evaluate(args) {\n try {\n const result = await extract({\n model: options.model,\n outputSchema: z.object({\n score: z.number(),\n feedback: z.string(),\n }),\n instructions:\n options.instructions ??\n `Score the eval case against these criteria:\\n${criteria}\\n\\nReturn a score between 0 and 1 and brief feedback.`,\n text: await resolveJudgePrompt(options.prompt, args),\n retries: evalExtractionRetries(options.retries),\n });\n const score = result.output;\n if (score.score < 0 || score.score > 1) {\n return EvalOutcome.invalid(`Score ${score.score} outside valid range [0, 1].`, {\n score,\n usage: result.usage,\n });\n }\n return score.score >= options.threshold\n ? EvalOutcome.pass(score, { comment: score.feedback, usage: result.usage })\n : EvalOutcome.fail(score, { comment: score.feedback, usage: result.usage });\n } catch (error) {\n return EvalOutcome.invalid(errorMessage(error));\n }\n },\n };\n}\n\nfunction evalExtractionRetries(retries: number | undefined): { maxAttempts: number } | undefined {\n const retryCount = Math.max(0, Math.trunc(retries ?? 0));\n if (retryCount === 0) {\n return undefined;\n }\n return { maxAttempts: retryCount + 1 };\n}\n","import type { EvalCase, EvalMetric, EvalTarget, RunEvalSuiteOptions } from \"./types\";\n\ntype EvalCaseLike = EvalCase<unknown, unknown>;\n\nexport type EvalCasesInput<Cases extends readonly EvalCaseLike[]> = Cases[number][\"input\"];\n\ntype EvalCaseExpected<Case> = Case extends { expected: infer Expected } ? Expected : unknown;\n\nexport type EvalCasesExpected<Cases extends readonly EvalCaseLike[]> = EvalCaseExpected<\n Cases[number]\n>;\n\ntype EvalMetricRequirements<Metric> =\n Metric extends EvalMetric<\n infer _Input,\n infer _Output,\n infer _Score,\n infer _Expected,\n infer _Name,\n infer Requirements\n >\n ? Requirements\n : Record<never, never>;\n\ntype RequiredExpected<Metrics extends readonly EvalMetric<never, never>[]> = Extract<\n EvalMetricRequirements<Metrics[number]>,\n { expected: unknown }\n>;\n\ntype RequiredContext<Metrics extends readonly EvalMetric<never, never>[]> = Extract<\n EvalMetricRequirements<Metrics[number]>,\n { context: string[] }\n>;\n\ntype RequiredRetrievalContext<Metrics extends readonly EvalMetric<never, never>[]> = Extract<\n EvalMetricRequirements<Metrics[number]>,\n { retrievalContext: string[] }\n>;\n\ntype EvalCaseFieldsForMetrics<Metrics extends readonly EvalMetric<never, never>[]> = ([\n RequiredExpected<Metrics>,\n] extends [never]\n ? Record<never, never>\n : { expected: RequiredExpected<Metrics>[\"expected\"] }) &\n ([RequiredContext<Metrics>] extends [never] ? Record<never, never> : { context: string[] }) &\n ([RequiredRetrievalContext<Metrics>] extends [never]\n ? Record<never, never>\n : { retrievalContext: string[] });\n\nexport type EvalCasesForMetrics<\n Cases extends readonly EvalCaseLike[],\n Metrics extends readonly EvalMetric<never, never>[],\n> = {\n readonly [Index in keyof Cases]: Cases[Index] & EvalCaseFieldsForMetrics<Metrics>;\n};\n\nexport type DefinedEvalSuite<\n Cases extends readonly EvalCaseLike[],\n Output,\n Metrics extends readonly EvalMetric<\n EvalCasesInput<Cases>,\n Output,\n unknown,\n EvalCasesExpected<Cases>,\n string\n >[],\n> = Omit<\n RunEvalSuiteOptions<EvalCasesInput<Cases>, Output, EvalCasesExpected<Cases>, Metrics>,\n \"cases\" | \"target\" | \"metrics\"\n> & {\n cases: Cases & EvalCasesForMetrics<NoInfer<Cases>, NoInfer<Metrics>>;\n target: EvalTarget<EvalCasesInput<Cases>, Output, EvalCasesExpected<Cases>>;\n metrics: Metrics;\n};\n\ntype EvalMetricFactory<Input, Output, Expected = unknown> = {\n defineMetric<const Name extends string = string>(\n metric: EvalMetric<Input, Output, boolean, Expected, Name> & { dataType: \"BOOLEAN\" },\n ): EvalMetric<Input, Output, boolean, Expected, Name>;\n defineMetric<const Name extends string = string>(\n metric: EvalMetric<Input, Output, number, Expected, Name> & { dataType: \"NUMERIC\" },\n ): EvalMetric<Input, Output, number, Expected, Name>;\n defineMetric<const Name extends string = string>(\n metric: EvalMetric<Input, Output, string, Expected, Name> & { dataType: \"CATEGORICAL\" },\n ): EvalMetric<Input, Output, string, Expected, Name>;\n defineMetric<Score, const Name extends string = string>(\n metric: EvalMetric<Input, Output, Score, Expected, Name> & {\n dataType: \"BOOLEAN\";\n projectScore(score: Score): boolean;\n },\n ): EvalMetric<Input, Output, Score, Expected, Name>;\n defineMetric<Score, const Name extends string = string>(\n metric: EvalMetric<Input, Output, Score, Expected, Name> & {\n dataType: \"NUMERIC\";\n projectScore(score: Score): number;\n },\n ): EvalMetric<Input, Output, Score, Expected, Name>;\n defineMetric<Score, const Name extends string = string>(\n metric: EvalMetric<Input, Output, Score, Expected, Name> & {\n dataType: \"CATEGORICAL\";\n projectScore(score: Score): string;\n },\n ): EvalMetric<Input, Output, Score, Expected, Name>;\n defineMetric<Score, const Name extends string = string>(\n metric: EvalMetric<Input, Output, Score, Expected, Name> & { dataType?: undefined },\n ): EvalMetric<Input, Output, Score, Expected, Name>;\n};\n\nexport function defineEvalCases<const Cases extends readonly EvalCaseLike[]>(cases: Cases): Cases {\n return cases;\n}\n\nexport function defineEvalSuite<Input, Output, Expected = unknown>(): EvalMetricFactory<\n Input,\n Output,\n Expected\n>;\nexport function defineEvalSuite<\n const Cases extends readonly EvalCaseLike[],\n const Target extends (\n input: EvalCasesInput<Cases>,\n testCase: EvalCase<EvalCasesInput<Cases>, EvalCasesExpected<Cases>>,\n ) => unknown,\n const Metrics extends readonly EvalMetric<\n EvalCasesInput<Cases>,\n Awaited<ReturnType<Target>>,\n unknown,\n EvalCasesExpected<Cases>,\n string\n >[],\n>(\n options: DefinedEvalSuite<Cases, Awaited<ReturnType<Target>>, Metrics> & { target: Target },\n): DefinedEvalSuite<Cases, Awaited<ReturnType<Target>>, Metrics> & { target: Target };\nexport function defineEvalSuite(\n options?: DefinedEvalSuite<\n readonly EvalCaseLike[],\n unknown,\n readonly EvalMetric<unknown, unknown>[]\n >,\n):\n | DefinedEvalSuite<readonly EvalCaseLike[], unknown, readonly EvalMetric<unknown, unknown>[]>\n | EvalMetricFactory<unknown, unknown, unknown> {\n if (options !== undefined) return options;\n return {\n defineMetric(metric: EvalMetric<unknown, unknown>) {\n return metric;\n },\n } as EvalMetricFactory<unknown, unknown, unknown>;\n}\n"],"mappings":"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","names":["usage","z","matches","z"]}
|