Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions apps/cli/src/commands/eval/artifact-writer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ import {
writePerTestArtifacts as writeCorePerTestArtifacts,
writeInitialRunSummaryArtifact,
} from '@agentv/core';
import type { TargetDefinition } from '@agentv/core';
import type { ProviderDefinition } from '@agentv/core';

import {
type MaterializedTaskBundlePaths,
Expand Down Expand Up @@ -206,7 +206,7 @@ function createTaskBundleArtifactsWriter(options?: {
const taskBundle = await materializeTaskBundle({
test: sourceTest,
targetName: targetSelection.targetName,
targetDefinitions: targetSelection.definitions as readonly TargetDefinition[],
targetDefinitions: targetSelection.definitions as readonly ProviderDefinition[],
outputDir: testDir,
cwd: options?.cwd,
repoRoot: options?.repoRoot,
Expand Down
24 changes: 12 additions & 12 deletions apps/cli/src/commands/eval/commands/bundle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ import path from 'node:path';
import {
type EvalTargetRef,
type EvalTargetSpec,
type TargetDefinition,
type ProviderDefinition,
loadTestSuite,
readTargetDefinitions,
readProviderDefinitions,
} from '@agentv/core';
import { array, command, multioption, option, optional, positional, string } from 'cmd-ts';

Expand All @@ -28,7 +28,7 @@ function unique(values: readonly string[]): readonly string[] {
return result;
}

function targetReferenceNames(target: TargetDefinition): readonly string[] {
function targetReferenceNames(target: ProviderDefinition): readonly string[] {
const references: string[] = [];
for (const key of ['use_target', 'grader_target'] as const) {
const value = target[key];
Expand All @@ -51,7 +51,7 @@ function targetReferenceNames(target: TargetDefinition): readonly string[] {

function ensureTargetGraph(
targetName: string,
definitions: readonly TargetDefinition[],
definitions: readonly ProviderDefinition[],
targetsFilePath: string,
): void {
const byName = new Map(definitions.map((definition) => [definition.name, definition]));
Expand Down Expand Up @@ -82,9 +82,9 @@ function ensureTargetGraph(
}

function definitionsWithEvalTargetRefs(
definitions: readonly TargetDefinition[],
definitions: readonly ProviderDefinition[],
targetRefs: readonly EvalTargetRef[] | undefined,
): readonly TargetDefinition[] {
): readonly ProviderDefinition[] {
if (!targetRefs) {
return definitions;
}
Expand All @@ -94,16 +94,16 @@ function definitionsWithEvalTargetRefs(
if (ref.definition && !result.some((definition) => definition.name === ref.name)) {
result.push(ref.definition);
} else if (ref.use_target && !result.some((definition) => definition.name === ref.name)) {
result.push({ name: ref.name, use_target: ref.use_target } as TargetDefinition);
result.push({ name: ref.name, use_target: ref.use_target } as ProviderDefinition);
}
}
return result;
}

function definitionsWithEvalTargetSpec(
definitions: readonly TargetDefinition[],
definitions: readonly ProviderDefinition[],
targetSpec: EvalTargetSpec | undefined,
): readonly TargetDefinition[] {
): readonly ProviderDefinition[] {
if (!targetSpec?.definition) {
return definitions;
}
Expand All @@ -124,7 +124,7 @@ function definitionsWithEvalTargetSpec(
...base,
...targetSpec.definition,
name: targetSpec.name,
} as TargetDefinition;
} as ProviderDefinition;
return [effective, ...definitions.filter((definition) => definition.name !== targetSpec.name)];
}

Expand Down Expand Up @@ -210,7 +210,7 @@ export const evalBundleCommand = command({
);
}

let definitions: readonly TargetDefinition[];
let definitions: readonly ProviderDefinition[];
let targetNames: readonly string[];
if (suite.inlineTarget) {
definitions = [suite.inlineTarget];
Expand All @@ -224,7 +224,7 @@ export const evalBundleCommand = command({
});
definitions = definitionsWithEvalTargetSpec(
definitionsWithEvalTargetRefs(
await readTargetDefinitions(targetsFilePath),
await readProviderDefinitions(targetsFilePath),
suite.targetRefs,
),
suite.targetSpec,
Expand Down
6 changes: 3 additions & 3 deletions apps/cli/src/commands/eval/interactive.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { existsSync } from 'node:fs';
import path from 'node:path';
import { listTargetNames, readTargetDefinitions } from '@agentv/core';
import { listProviderLabels, readProviderDefinitions } from '@agentv/core';
import { checkbox, confirm, number, search, select } from '@inquirer/prompts';

import { PROVIDER_FILE_CANDIDATES, fileExists } from '../../utils/targets.js';
Expand Down Expand Up @@ -209,8 +209,8 @@ async function promptTargetSelection(cwd: string, firstEvalPath: string): Promis
return 'default';
}

const definitions = await readTargetDefinitions(targetsPath);
const targetNames = listTargetNames(definitions);
const definitions = await readProviderDefinitions(targetsPath);
const targetNames = listProviderLabels(definitions);

if (targetNames.length === 0) {
return 'default';
Expand Down
24 changes: 12 additions & 12 deletions apps/cli/src/commands/eval/run-eval.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@ import {
type ExperimentArtifactMetadata,
type ExperimentConfig,
type FailOnError,
type ResolvedTarget,
type ProviderDefinition,
type ResolvedProviderBackend,
ResponseCache,
RunBudgetTracker,
type RunRuntimeSourceMetadata,
type TargetDefinition,
type TrialsConfig,
buildExperimentArtifactMetadata,
buildTraceFromMessages,
Expand All @@ -31,7 +31,7 @@ import {
loadTestSuite,
loadTestSuiteFromYamlObject,
loadTsConfig,
resolveTargetDefinition,
resolveProviderDefinition,
shouldEnableCache,
shouldSkipCacheForTemperature,
subscribeToCodexLogEntries,
Expand Down Expand Up @@ -1205,7 +1205,7 @@ function createDisplayIdTracker(): { getOrAssign(testCaseKey: string): number }
* Azure uses `deploymentName`; most other providers use `model`.
* CLI and mock providers have no model field.
*/
function extractModelName(target: ResolvedTarget): string | undefined {
function extractModelName(target: ResolvedProviderBackend): string | undefined {
if (target.kind === 'azure') {
return target.config.deploymentName;
}
Expand All @@ -1218,7 +1218,7 @@ function extractModelName(target: ResolvedTarget): string | undefined {
/**
* Build the inline label suffix (e.g. `[provider=azure, model=gpt-4]`).
*/
function buildTargetLabelSuffix(providerLabel: string, target: ResolvedTarget): string {
function buildTargetLabelSuffix(providerLabel: string, target: ResolvedProviderBackend): string {
const parts = [`provider=${providerLabel}`];
const model = extractModelName(target);
if (model) parts.push(`model=${model}`);
Expand Down Expand Up @@ -1345,7 +1345,7 @@ async function prepareFileMetadata(params: {
readonly cwd: string;
readonly options: NormalizedOptions;
readonly providerCatalogPath?: string;
readonly providerDefinitions?: readonly TargetDefinition[];
readonly providerDefinitions?: readonly ProviderDefinition[];
readonly providerDefinitionsSource?: string;
readonly suiteFilter?: string | readonly string[];
}): Promise<{
Expand All @@ -1362,7 +1362,7 @@ async function prepareFileMetadata(params: {
readonly threshold?: number;
readonly tags?: readonly string[];
readonly providerFactory?: (
target: import('@agentv/core').ResolvedTarget,
target: import('@agentv/core').ResolvedProviderBackend,
) => import('@agentv/core').Provider;
}> {
const {
Expand Down Expand Up @@ -1454,7 +1454,7 @@ async function prepareFileMetadata(params: {
];
} else if (suite.inlineTarget && effectiveOptions.cliTargets.length === 0) {
const targetDefinition = suite.inlineTarget;
const resolvedTarget = resolveTargetDefinition(targetDefinition, process.env, testFilePath, {
const resolvedTarget = resolveProviderDefinition(targetDefinition, process.env, testFilePath, {
emitDeprecationWarnings: false,
});
selections = [
Expand All @@ -1470,7 +1470,7 @@ async function prepareFileMetadata(params: {
},
];
} else if (suite.providerFactory && effectiveOptions.cliTargets.length === 0) {
const taskTarget: ResolvedTarget = {
const taskTarget: ResolvedProviderBackend = {
kind: 'mock',
name: 'custom-task',
graderTarget: undefined,
Expand Down Expand Up @@ -1647,7 +1647,7 @@ async function runSingleEvalFile(params: {
readonly failOnError?: FailOnError;
readonly threshold?: number;
readonly providerFactory?: (
target: import('@agentv/core').ResolvedTarget,
target: import('@agentv/core').ResolvedProviderBackend,
) => import('@agentv/core').Provider;
}): Promise<{ results: EvaluationResult[] }> {
const {
Expand Down Expand Up @@ -2156,7 +2156,7 @@ export async function runEvalCommand(
readonly threshold?: number;
readonly tags?: readonly string[];
readonly providerFactory?: (
target: import('@agentv/core').ResolvedTarget,
target: import('@agentv/core').ResolvedProviderBackend,
) => import('@agentv/core').Provider;
}
>();
Expand Down Expand Up @@ -2359,7 +2359,7 @@ export async function runEvalCommand(

// --transcript: create a shared TranscriptProvider and validate entry count
let transcriptProviderFactory:
| ((target: import('@agentv/core').ResolvedTarget) => import('@agentv/core').Provider)
| ((target: import('@agentv/core').ResolvedProviderBackend) => import('@agentv/core').Provider)
| undefined;
if (options.transcript) {
const { TranscriptProvider } = await import('@agentv/core');
Expand Down
56 changes: 29 additions & 27 deletions apps/cli/src/commands/eval/targets.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import {
type EvalTargetSpec,
type ResolvedTarget,
type TargetDefinition,
listTargetNames,
readTargetDefinitions,
type ProviderDefinition,
type ResolvedProviderBackend,
listProviderLabels,
readProviderDefinitions,
readTestSuiteMetadata,
resolveTargetDefinition,
resolveProviderDefinition,
} from '@agentv/core';
import { validateTargetsFile } from '@agentv/core/evaluation/validation';
import { discoverTargetsFile } from '../../utils/targets.js';
Expand All @@ -32,14 +32,14 @@ function isTTY(): boolean {
*/
function resolveUseTarget(
name: string,
definitions: readonly TargetDefinition[],
definitions: readonly ProviderDefinition[],
env: NodeJS.ProcessEnv,
targetsFilePath: string,
): TargetDefinition {
): ProviderDefinition {
const maxDepth = 5;
let current: TargetDefinition | undefined = definitions.find((d) => d.name === name);
let current: ProviderDefinition | undefined = definitions.find((d) => d.name === name);
if (!current) {
const available = listTargetNames(definitions).join(', ');
const available = listProviderLabels(definitions).join(', ');
throw new Error(
`Provider '${name}' not found in ${targetsFilePath}. Available providers: ${available}`,
);
Expand All @@ -56,9 +56,11 @@ function resolveUseTarget(
const resolved: string = envMatch ? (env[envMatch[1]] ?? '') : raw;
if (resolved.trim().length === 0) break;

const next: TargetDefinition | undefined = definitions.find((d) => d.name === resolved.trim());
const next: ProviderDefinition | undefined = definitions.find(
(d) => d.name === resolved.trim(),
);
if (!next) {
const available = listTargetNames(definitions).join(', ');
const available = listProviderLabels(definitions).join(', ');
throw new Error(
`Provider '${name}' use_target '${resolved.trim()}' not found in ${targetsFilePath}. Available providers: ${available}`,
);
Expand All @@ -82,8 +84,8 @@ export async function readTestSuiteTargets(
}

export interface TargetSelection {
readonly definitions: readonly TargetDefinition[];
readonly resolvedTarget: ResolvedTarget;
readonly definitions: readonly ProviderDefinition[];
readonly resolvedTarget: ResolvedProviderBackend;
readonly targetName: string;
readonly targetLabel?: string;
readonly targetSource: 'cli' | 'test-file' | 'default';
Expand All @@ -97,7 +99,7 @@ export interface TargetSelectionOptions {
readonly repoRoot: string;
readonly cwd: string;
readonly explicitTargetsPath?: string;
readonly providerDefinitions?: readonly TargetDefinition[];
readonly providerDefinitions?: readonly ProviderDefinition[];
readonly providerDefinitionsSource?: string;
readonly requireExplicitProviderCatalog?: boolean;
readonly allowLegacyTargetFiles?: boolean;
Expand All @@ -111,14 +113,14 @@ export interface TargetSelectionOptions {

async function readProviderCatalog(options: {
readonly explicitTargetsPath?: string;
readonly providerDefinitions?: readonly TargetDefinition[];
readonly providerDefinitions?: readonly ProviderDefinition[];
readonly providerDefinitionsSource?: string;
readonly requireExplicitProviderCatalog?: boolean;
readonly testFilePath: string;
readonly repoRoot: string;
readonly cwd: string;
readonly allowLegacyTargetFiles?: boolean;
}): Promise<{ readonly definitions: readonly TargetDefinition[]; readonly sourcePath: string }> {
}): Promise<{ readonly definitions: readonly ProviderDefinition[]; readonly sourcePath: string }> {
if (!options.explicitTargetsPath && options.providerDefinitions) {
return {
definitions: options.providerDefinitions,
Expand All @@ -139,7 +141,7 @@ async function readProviderCatalog(options: {
});
await validateProviderCatalogFile(targetsFilePath);
return {
definitions: await readTargetDefinitions(targetsFilePath),
definitions: await readProviderDefinitions(targetsFilePath),
sourcePath: targetsFilePath,
};
}
Expand Down Expand Up @@ -191,19 +193,19 @@ function pickTargetName(options: {
}

function withModelOverride(
target: TargetDefinition,
target: ProviderDefinition,
modelOverride: string | undefined,
): TargetDefinition {
): ProviderDefinition {
const model = modelOverride?.trim();
return model && model.length > 0 ? { ...target, model } : target;
}

function overlayTargetDefinition(params: {
readonly spec: EvalTargetSpec | undefined;
readonly definitions: readonly TargetDefinition[];
readonly definitions: readonly ProviderDefinition[];
readonly env: NodeJS.ProcessEnv;
readonly targetsFilePath: string;
}): TargetDefinition | undefined {
}): ProviderDefinition | undefined {
const { spec, definitions, env, targetsFilePath } = params;
if (!spec?.definition) {
return undefined;
Expand All @@ -220,9 +222,9 @@ function overlayTargetDefinition(params: {
}

function definitionsWithEffectiveTarget(
definitions: readonly TargetDefinition[],
effective: TargetDefinition,
): readonly TargetDefinition[] {
definitions: readonly ProviderDefinition[],
effective: ProviderDefinition,
): readonly ProviderDefinition[] {
return [effective, ...definitions.filter((definition) => definition.name !== effective.name)];
}

Expand Down Expand Up @@ -272,7 +274,7 @@ export async function selectTarget(options: TargetSelectionOptions): Promise<Tar
: definitions;

try {
const resolvedTarget = resolveTargetDefinition(targetDefinition, env, testFilePath, {
const resolvedTarget = resolveProviderDefinition(targetDefinition, env, testFilePath, {
emitDeprecationWarnings: false,
});
return {
Expand Down Expand Up @@ -351,7 +353,7 @@ export async function selectMultipleTargets(
if (ref.definition && !fileDefinitions.some((d) => d.name === ref.name)) {
definitions.push(ref.definition);
} else if (ref.use_target && !fileDefinitions.some((d) => d.name === ref.name)) {
definitions.push({ name: ref.name, use_target: ref.use_target } as TargetDefinition);
definitions.push({ name: ref.name, use_target: ref.use_target } as ProviderDefinition);
}
}
}
Expand All @@ -367,7 +369,7 @@ export async function selectMultipleTargets(
const targetLabel = labelsMap.get(name);

try {
const resolvedTarget = resolveTargetDefinition(targetDefinition, env, testFilePath, {
const resolvedTarget = resolveProviderDefinition(targetDefinition, env, testFilePath, {
emitDeprecationWarnings: false,
});
results.push({
Expand Down
Loading
Loading