/// import { describe, expect, test } from 'bun:test'; import { buildDynamicModelPlan, rankModelsV1WithBreakdown, } from './dynamic-model-selection'; import type { DiscoveredModel, InstallConfig } from './types'; function m( input: Partial & { model: string }, ): DiscoveredModel { const [providerID] = input.model.split('/'); return { providerID: providerID ?? 'openai', model: input.model, name: input.name ?? input.model, status: input.status ?? 'active', contextLimit: input.contextLimit ?? 200000, outputLimit: input.outputLimit ?? 32000, reasoning: input.reasoning ?? true, toolcall: input.toolcall ?? true, attachment: input.attachment ?? false, dailyRequestLimit: input.dailyRequestLimit, costInput: input.costInput, costOutput: input.costOutput, }; } function baseInstallConfig(): InstallConfig { return { hasKimi: false, hasOpenAI: true, hasAnthropic: false, hasCopilot: true, hasZaiPlan: true, hasAntigravity: false, hasChutes: true, hasOpencodeZen: true, useOpenCodeFreeModels: true, selectedOpenCodePrimaryModel: 'opencode/glm-4.7-free', selectedOpenCodeSecondaryModel: 'opencode/gpt-5-nano', selectedChutesPrimaryModel: 'chutes/kimi-k2.5', selectedChutesSecondaryModel: 'chutes/minimax-m2.1', hasTmux: false, installSkills: false, installCustomSkills: false, setupMode: 'quick', }; } describe('dynamic-model-selection', () => { test('builds assignments and chains for all six agents', () => { const plan = buildDynamicModelPlan( [ m({ model: 'openai/gpt-5.3-codex', reasoning: true, toolcall: true }), m({ model: 'openai/gpt-5.1-codex-mini', reasoning: true, toolcall: true, }), m({ model: 'github-copilot/grok-code-fast-1', reasoning: true, toolcall: true, }), m({ model: 'zai-coding-plan/glm-4.7', reasoning: true, toolcall: true, }), m({ model: 'chutes/kimi-k2.5', reasoning: true, toolcall: true }), m({ model: 'chutes/minimax-m2.1', reasoning: true, toolcall: true }), ], baseInstallConfig(), ); expect(plan).not.toBeNull(); const agents = plan?.agents ?? {}; const chains = plan?.chains ?? {}; expect(Object.keys(agents).sort()).toEqual([ 'designer', 'explorer', 'fixer', 'librarian', 'oracle', 'orchestrator', ]); expect(agents.oracle?.model.startsWith('opencode/')).toBe(false); expect(agents.orchestrator?.model.startsWith('opencode/')).toBe(false); expect(chains.oracle.some((m: string) => m.startsWith('openai/'))).toBe( true, ); expect(chains.orchestrator).toContain('chutes/kimi-k2.5'); expect(chains.explorer).toContain('opencode/gpt-5-nano'); expect(chains.fixer[chains.fixer.length - 1]).toBe('opencode/gpt-5-nano'); expect(plan?.provenance?.oracle?.winnerLayer).toBe( 'dynamic-recommendation', ); expect(plan?.scoring?.engineVersionApplied).toBe('v1'); }); test('supports v2-shadow mode without changing applied engine', () => { const plan = buildDynamicModelPlan( [ m({ model: 'openai/gpt-5.3-codex', reasoning: true, toolcall: true }), m({ model: 'chutes/kimi-k2.5', reasoning: true, toolcall: true }), m({ model: 'opencode/gpt-5-nano', reasoning: true, toolcall: true }), ], baseInstallConfig(), undefined, { scoringEngineVersion: 'v2-shadow' }, ); expect(plan).not.toBeNull(); expect(plan?.scoring?.engineVersionApplied).toBe('v1'); expect(plan?.scoring?.shadowCompared).toBe(true); expect(plan?.scoring?.diffs?.oracle).toBeDefined(); }); test('balances provider usage when subscription mode is enabled', () => { const plan = buildDynamicModelPlan( [ m({ model: 'openai/gpt-5.3-codex', reasoning: true, toolcall: true }), m({ model: 'openai/gpt-5.1-codex-mini', reasoning: true, toolcall: true, }), m({ model: 'zai-coding-plan/glm-4.7', reasoning: true, toolcall: true, }), m({ model: 'zai-coding-plan/glm-4.7-flash', reasoning: true, toolcall: true, }), m({ model: 'chutes/moonshotai/Kimi-K2.5-TEE', reasoning: true, toolcall: true, }), m({ model: 'chutes/Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8-TEE', reasoning: true, toolcall: true, }), ], { ...baseInstallConfig(), hasCopilot: false, balanceProviderUsage: true, }, undefined, { scoringEngineVersion: 'v2' }, ); expect(plan).not.toBeNull(); const usage = Object.values(plan?.agents ?? {}).reduce( (acc, assignment) => { const provider = assignment.model.split('/')[0] ?? 'unknown'; acc[provider] = (acc[provider] ?? 0) + 1; return acc; }, {} as Record, ); expect(usage.openai).toBe(2); expect(usage['zai-coding-plan']).toBe(2); expect(usage.chutes).toBe(2); }); test('matches external signals for multi-segment chutes ids in v1', () => { const ranked = rankModelsV1WithBreakdown( [m({ model: 'chutes/Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8-TEE' })], 'fixer', { 'qwen/qwen3-coder-480b-a35b-instruct': { source: 'artificial-analysis', qualityScore: 95, codingScore: 92, }, }, ); expect(ranked[0]?.externalSignalBoost).toBeGreaterThan(0); }); test('prefers chutes kimi/minimax over qwen3 in v1 role scoring', () => { const catalog = [ m({ model: 'chutes/Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8-TEE', reasoning: true, toolcall: true, }), m({ model: 'chutes/moonshotai/Kimi-K2.5-TEE', reasoning: true, toolcall: true, }), m({ model: 'chutes/minimax-m2.1', reasoning: true, toolcall: true, }), ]; const fixer = rankModelsV1WithBreakdown(catalog, 'fixer'); const explorer = rankModelsV1WithBreakdown(catalog, 'explorer'); expect(fixer[0]?.model).not.toContain('Qwen3-Coder-480B'); expect(explorer[0]?.model).toContain('minimax-m2.1'); }); test('does not apply a positive Gemini bonus in v1 scoring', () => { const catalog = [ m({ model: 'google/antigravity-gemini-3-pro', reasoning: true, toolcall: true, }), m({ model: 'openai/gpt-5.3-codex', reasoning: true, toolcall: true }), ]; const oracle = rankModelsV1WithBreakdown(catalog, 'oracle'); const orchestrator = rankModelsV1WithBreakdown(catalog, 'orchestrator'); const designer = rankModelsV1WithBreakdown(catalog, 'designer'); const librarian = rankModelsV1WithBreakdown(catalog, 'librarian'); expect(oracle[0]?.model).toBe('openai/gpt-5.3-codex'); expect(orchestrator[0]?.model).toBe('openai/gpt-5.3-codex'); expect(designer[0]?.model).toBe('openai/gpt-5.3-codex'); expect(librarian[0]?.model).toBe('openai/gpt-5.3-codex'); }); });