/// import { describe, expect, test } from 'bun:test'; import { pickBestCodingChutesModel, pickSupportChutesModel, } from './chutes-selection'; import type { OpenCodeFreeModel } from './types'; function model(input: Partial): OpenCodeFreeModel { return { providerID: 'chutes', model: input.model ?? 'chutes/unknown', name: input.name ?? input.model ?? 'unknown', status: input.status ?? 'active', contextLimit: input.contextLimit ?? 128000, outputLimit: input.outputLimit ?? 16000, reasoning: input.reasoning ?? false, toolcall: input.toolcall ?? false, attachment: input.attachment ?? false, dailyRequestLimit: input.dailyRequestLimit, }; } describe('chutes-selection', () => { test('prefers reasoning model for primary role', () => { const models = [ model({ model: 'chutes/minimax-m2.1', reasoning: true, toolcall: true, contextLimit: 512000, outputLimit: 64000, dailyRequestLimit: 300, }), model({ model: 'chutes/gpt-oss-20b-mini', reasoning: false, toolcall: true, dailyRequestLimit: 5000, }), ]; expect(pickBestCodingChutesModel(models)?.model).toBe( 'chutes/minimax-m2.1', ); }); test('prefers high-cap fast model for support role', () => { const models = [ model({ model: 'chutes/kimi-k2.5', reasoning: true, toolcall: true, dailyRequestLimit: 300, }), model({ model: 'chutes/qwen3-coder-30b-mini', reasoning: true, toolcall: true, dailyRequestLimit: 5000, }), ]; expect(pickSupportChutesModel(models, 'chutes/kimi-k2.5')?.model).toBe( 'chutes/qwen3-coder-30b-mini', ); }); });