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
54 changes: 27 additions & 27 deletions .agentv/targets.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,36 +11,36 @@ targets:
# redirects to a named target, controlled via AGENT_TARGET env var.
# One env var switches the entire provider config (auth, model, etc.).
# Example: AGENT_TARGET=copilot-cli or AGENT_TARGET=claude
- label: default
- id: default
use_target: ${{ AGENT_TARGET }}

- label: agent
- id: agent
use_target: ${{ AGENT_TARGET }}

# ── LLM target (text generation, no agent binary needed) ────────────
# Delegates to LLM_TARGET — same provider used for grading and LLM evals.
- label: llm
- id: llm
use_target: ${{ LLM_TARGET }}

# ── Grader (LLM-as-judge) ──────────────────────────────────────────
# Used by agent targets via grader_target. Switch provider via GRADER_TARGET.
- label: grader
- id: grader
use_target: ${{ GRADER_TARGET }}

# ── Named agent targets ───────────────────────────────────────────
- label: copilot
- id: copilot
provider: copilot-cli
model: ${{ COPILOT_MODEL }}
grader_target: grader
stream_log: raw

- label: copilot-sdk
- id: copilot-sdk
provider: copilot-sdk
model: ${{ COPILOT_MODEL }}
grader_target: grader
stream_log: raw

- label: copilot-sdk-azure
- id: copilot-sdk-azure
provider: copilot-sdk
model: ${{ AZURE_DEPLOYMENT_NAME }}
subprovider: azure
Expand All @@ -49,22 +49,22 @@ targets:
grader_target: grader
stream_log: raw

- label: claude
- id: claude
provider: claude-cli
grader_target: grader

- label: claude-sdk
- id: claude-sdk
provider: claude-sdk
grader_target: grader

- label: pi
- id: pi
provider: pi-cli
subprovider: openrouter
model: ${{ OPENROUTER_MODEL }}
api_key: ${{ OPENROUTER_API_KEY }}
grader_target: grader

- label: pi-sdk
- id: pi-sdk
provider: pi-coding-agent
subprovider: openai
base_url: ${{ OPENAI_ENDPOINT }}
Expand All @@ -75,15 +75,15 @@ targets:
stream_log: raw


- label: pi-azure
- id: pi-azure
provider: pi-cli
subprovider: azure
base_url: ${{ AZURE_OPENAI_ENDPOINT }}
model: ${{ AZURE_DEPLOYMENT_NAME }}
api_key: ${{ AZURE_OPENAI_API_KEY }}
grader_target: grader

- label: pi-sdk-azure
- id: pi-sdk-azure
provider: pi-coding-agent
subprovider: azure
base_url: ${{ AZURE_OPENAI_ENDPOINT }}
Expand All @@ -93,7 +93,7 @@ targets:
thinking: low
stream_log: raw

- label: codex
- id: codex
provider: codex
executable: ${{ CODEX_EXECUTABLE }}
model: ${{ CODEX_MODEL }}
Expand All @@ -104,7 +104,7 @@ targets:
stream_log: raw

# ── LLM targets (direct model access) ─────────────────────────────
- label: gh-models
- id: gh-models
provider: openai
base_url: https://models.github.ai/inference
api_key: ${{ GH_MODELS_TOKEN }}
Expand All @@ -115,40 +115,40 @@ targets:
# overridden via AZURE_OPENAI_API_VERSION. Chat-completions-only Azure
# deployments must use `provider: openai` with a deployment-scoped
# `base_url` instead.
- label: azure
- id: azure
provider: azure
endpoint: ${{ AZURE_OPENAI_ENDPOINT }}
api_key: ${{ AZURE_OPENAI_API_KEY }}
model: ${{ AZURE_DEPLOYMENT_NAME }}
version: ${{ AZURE_OPENAI_API_VERSION }}

- label: gemini
- id: gemini
provider: gemini
api_key: ${{ GOOGLE_GENERATIVE_AI_API_KEY }}
model: ${{ GEMINI_MODEL_NAME }}

- label: openai
- id: openai
provider: openai
endpoint: ${{ OPENAI_ENDPOINT }}
api_key: ${{ OPENAI_API_KEY }}
model: ${{ OPENAI_MODEL }}

# Local OpenAI-compatible endpoint. Useful for dogfood against a local proxy
# without changing provider-specific target labels.
- label: local-openai
- id: local-openai
provider: openai
base_url: ${{ LOCAL_OPENAI_PROXY_BASE_URL }}
api_key: ${{ LOCAL_OPENAI_PROXY_API_KEY }}
model: ${{ LOCAL_OPENAI_PROXY_MODEL }}
grader_target: local-openai-grader

- label: local-openai-grader
- id: local-openai-grader
provider: openai
base_url: ${{ LOCAL_OPENAI_PROXY_BASE_URL }}
api_key: ${{ LOCAL_OPENAI_PROXY_API_KEY }}
model: ${{ LOCAL_OPENAI_PROXY_MODEL }}

- label: pi-cli-openai
- id: pi-cli-openai
provider: pi-cli
subprovider: openai
base_url: ${{ LOCAL_OPENAI_PROXY_BASE_URL }}
Expand All @@ -158,7 +158,7 @@ targets:
thinking: low
stream_log: raw

- label: codex-sdk-openai
- id: codex-sdk-openai
provider: codex
base_url: ${{ LOCAL_OPENAI_PROXY_BASE_URL }}
api_key: ${{ LOCAL_OPENAI_PROXY_API_KEY }}
Expand All @@ -168,7 +168,7 @@ targets:
grader_target: local-openai-grader
stream_log: raw

- label: copilot-sdk-openai
- id: copilot-sdk-openai
provider: copilot-sdk
subprovider: openai
base_url: ${{ LOCAL_OPENAI_PROXY_BASE_URL }}
Expand All @@ -177,25 +177,25 @@ targets:
grader_target: local-openai-grader
stream_log: raw

- label: openrouter
- id: openrouter
provider: openrouter
api_key: ${{ OPENROUTER_API_KEY }}
model: ${{ OPENROUTER_MODEL }}

# ── MiMo (Xiaomi) via OpenRouter ───────────────────────────────────
- label: mimo
- id: mimo
provider: openrouter
api_key: ${{ OPENROUTER_API_KEY }}
model: xiaomi/mimo-v2.5-pro
grader_target: grader

- label: mimo-flash
- id: mimo-flash
provider: openrouter
api_key: ${{ OPENROUTER_API_KEY }}
model: xiaomi/mimo-v2-flash
grader_target: grader

- label: mimo-direct
- id: mimo-direct
provider: openai
base_url: https://token-plan-sgp.xiaomimimo.com/v1
api_key: ${{ XIAOMI_MIMO_API_KEY }}
Expand Down
10 changes: 8 additions & 2 deletions apps/cli/src/commands/eval/task-bundle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -625,14 +625,20 @@ function uniqueTargetDefinitions(
}

function serializeTargetDefinition(definition: TargetDefinition): Record<string, unknown> {
const target: Record<string, unknown> = { label: definition.name };
const target: Record<string, unknown> = { id: definition.name };
if (definition.id !== undefined) {
target.id = definition.id;
}
const config: Record<string, unknown> = {};

for (const [key, value] of Object.entries(definition)) {
if (value === undefined || key === 'name' || key === 'id' || key === 'config') {
if (
value === undefined ||
key === 'name' ||
key === 'id' ||
key === 'label' ||
key === 'config'
) {
continue;
}
if (AUTHORING_TOP_LEVEL_TARGET_FIELDS.has(key)) {
Expand Down
3 changes: 3 additions & 0 deletions apps/cli/src/commands/runs/rerun.ts
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,9 @@ async function readTargetDefinitions(
}

function targetName(definition: Record<string, unknown>): string | undefined {
if (typeof definition.id === 'string' && definition.id.trim().length > 0) {
return definition.id.trim();
}
if (typeof definition.label === 'string' && definition.label.trim().length > 0) {
return definition.label.trim();
}
Expand Down
16 changes: 8 additions & 8 deletions apps/cli/src/templates/.agentv/targets.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@
# Agent and CLI targets use grader_target to reference an LLM target for scoring.

targets:
- label: default
- id: default
provider: azure
endpoint: ${{ AZURE_OPENAI_ENDPOINT }}
api_key: ${{ AZURE_OPENAI_API_KEY }}
model: ${{ AZURE_DEPLOYMENT_NAME }}
# version: ${{ AZURE_OPENAI_API_VERSION }} # Optional: uncomment to override default (v1)

- label: codex
- id: codex
provider: codex
grader_target: azure-llm
# Uses the Codex CLI (defaults to `codex` on PATH)
Expand All @@ -28,7 +28,7 @@ targets:
stream_log: raw # Optional: 'summary' for consolidated logs or 'raw' for per-event logs

# Claude - Anthropic's Claude Agent SDK
- label: claude
- id: claude
provider: claude
grader_target: azure-llm
# Uses the @anthropic-ai/claude-agent-sdk
Expand All @@ -40,19 +40,19 @@ targets:
stream_log: raw # Optional: 'summary' for consolidated logs or 'raw' for per-event logs
# system_prompt: optional override (default instructs agent to include code in response)

- label: azure-llm
- id: azure-llm
provider: azure
endpoint: ${{ AZURE_OPENAI_ENDPOINT }}
api_key: ${{ AZURE_OPENAI_API_KEY }}
model: ${{ AZURE_DEPLOYMENT_NAME }}
version: ${{ AZURE_OPENAI_API_VERSION }}

- label: gemini-llm
- id: gemini-llm
provider: gemini
api_key: ${{ GOOGLE_GENERATIVE_AI_API_KEY }}
model: ${{ GEMINI_MODEL_NAME }}

- label: local_cli
- id: local_cli
provider: cli
grader_target: azure-llm
# Passes the fully rendered prompt and any attached files to a local Python script
Expand All @@ -75,12 +75,12 @@ targets:
# mimo-v2.5 — 1M context, ~131K output, multimodal
# mimo-v2-flash — 262K context, 65K output, fast MoE (open-source)
# mimo-v2-omni — 262K context, 65K output, omni-modal
- label: mimo
- id: mimo
provider: openrouter
api_key: ${{ OPENROUTER_API_KEY }}
model: xiaomi/mimo-v2.5-pro

- label: mimo-flash
- id: mimo-flash
provider: openrouter
api_key: ${{ OPENROUTER_API_KEY }}
model: xiaomi/mimo-v2-flash
Expand Down
14 changes: 7 additions & 7 deletions apps/cli/test/commands/eval/bundle.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,11 @@ describe('agentv eval bundle', () => {
await writeFile(
path.join(sourceDir, '.agentv', 'targets.yaml'),
`targets:
- label: inherited
- id: inherited
provider: mock
response: '{"answer":"Mock provider response from inherited target"}'
fallback_targets: [backup]
- label: backup
- id: backup
provider: mock
response: '{"answer":"Backup mock response"}'
`,
Expand Down Expand Up @@ -153,8 +153,8 @@ tests: ../data/cases.yaml
expect(input[0]?.content[0]).toEqual({ type: 'file', value: 'files/data/input.txt' });

const bundledTargets = await readFile(path.join(bundleDir, 'targets.yaml'), 'utf8');
expect(bundledTargets).toContain('label: inherited');
expect(bundledTargets).toContain('label: backup');
expect(bundledTargets).toContain('id: inherited');
expect(bundledTargets).toContain('id: backup');

await rm(sourceDir, { recursive: true, force: true });
const run = await runCli(bundleDir, [
Expand All @@ -178,7 +178,7 @@ tests: ../data/cases.yaml
await writeFile(
path.join(sourceDir, 'evals', 'inline.eval.yaml'),
`targets:
- label: candidate
- id: candidate
provider: mock
response: '{"answer":"inline bundled response"}'
tests:
Expand All @@ -201,7 +201,7 @@ tests:

expect(bundle.exitCode).toBe(0);
const bundledTargets = await readFile(path.join(bundleDir, 'targets.yaml'), 'utf8');
expect(bundledTargets).toContain('label: candidate');
expect(bundledTargets).toContain('id: candidate');
expect(bundledTargets).toContain('provider: mock');
expect(bundledTargets).toContain('inline bundled response');
}, 30_000);
Expand All @@ -214,7 +214,7 @@ tests:
await writeFile(
path.join(sourceDir, '.agentv', 'targets.yaml'),
`targets:
- label: default
- id: default
provider: mock
`,
'utf8',
Expand Down
7 changes: 3 additions & 4 deletions apps/cli/test/commands/eval/targets.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@ describe('eval target selection', () => {
await rm(tempDir, { recursive: true, force: true });
});

it('resolves authored target ids through targets.yaml while keeping labels for display', async () => {
it('resolves authored target ids through targets.yaml', async () => {
const agentvDir = path.join(tempDir, '.agentv');
await mkdir(agentvDir, { recursive: true });
await writeFile(
path.join(agentvDir, 'targets.yaml'),
[
'$schema: agentv-targets-v2.2',
'targets:',
' - label: openai:gpt-5.4-mini',
' - id: openai:gpt-5.4-mini',
' provider: mock',
'',
].join('\n'),
Expand All @@ -38,7 +38,6 @@ describe('eval target selection', () => {
'name: target-label-suite',
'targets:',
' - id: openai:gpt-5.4-mini',
' label: mini',
'tests:',
' - id: target-case',
' input: hello',
Expand All @@ -60,7 +59,7 @@ describe('eval target selection', () => {

expect(selections).toHaveLength(1);
expect(selections[0]?.targetName).toBe('openai:gpt-5.4-mini');
expect(selections[0]?.targetLabel).toBe('mini');
expect(selections[0]?.targetLabel).toBeUndefined();
expect(selections[0]?.resolvedTarget.kind).toBe('mock');
});
});
2 changes: 1 addition & 1 deletion apps/cli/test/commands/grade/grade-prepared.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ console.log(JSON.stringify({
path.join(root, '.agentv', 'targets.yaml'),
`
targets:
- label: codex
- id: codex
provider: cli
command: bun ./scripts/target.ts
`,
Expand Down
Loading
Loading