Skip to content
Open
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
7 changes: 1 addition & 6 deletions apps/web/src/lib/ai-gateway/is-free-model.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
import { KILO_AUTO_FREE_MODEL } from '@/lib/ai-gateway/auto-model';
import {
isKiloExclusiveFreeModel,
isOpenRouterStealthModel,
kiloExclusiveModels,
} from '@/lib/ai-gateway/models';
import { isKiloExclusiveFreeModel, kiloExclusiveModels } from '@/lib/ai-gateway/models';
import { isPublicIdExperimented } from '@/lib/ai-gateway/experiments/membership';

/**
Expand All @@ -22,7 +18,6 @@ export async function isFreeModel(model: string): Promise<boolean> {
model === KILO_AUTO_FREE_MODEL.id ||
(model ?? '').endsWith(':free') ||
model === 'openrouter/free' ||
isOpenRouterStealthModel(model ?? '') ||
(await isPublicIdExperimented(model ?? ''))
);
}
Expand Down
16 changes: 6 additions & 10 deletions apps/web/src/lib/ai-gateway/models.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,6 @@ describe('isFreeModel', () => {
expect(await isFreeModel('openrouter/free')).toBe(true);
});

test('should return true for OpenRouter stealth models (alpha/beta)', async () => {
expect(await isFreeModel('openrouter/model-alpha')).toBe(true);
expect(await isFreeModel('openrouter/model-beta')).toBe(true);
expect(await isFreeModel('openrouter/sonoma-dusk-alpha')).toBe(true);
expect(await isFreeModel('openrouter/sonoma-sky-beta')).toBe(true);
});

test('should return true for enabled Kilo exclusive models with no pricing', async () => {
// Test with known Kilo exclusive models that are enabled and have no pricing (free)
const enabledFreeModels = kiloExclusiveModels.filter(
Expand Down Expand Up @@ -158,10 +151,15 @@ describe('isFreeModel', () => {
expect(await isFreeModel('freemium')).toBe(false);
});

test('should return false for OpenRouter models that do not end with -alpha or -beta', async () => {
test('should return false for OpenRouter models including alpha/beta', async () => {
expect(await isFreeModel('openrouter/model')).toBe(false);
expect(await isFreeModel('openrouter/model-gamma')).toBe(false);
expect(await isFreeModel('openrouter/model-stable')).toBe(false);
expect(await isFreeModel('openrouter/model-alpha')).toBe(false);
expect(await isFreeModel('openrouter/model-beta')).toBe(false);
expect(await isFreeModel('openrouter/sonoma-dusk-alpha')).toBe(false);
expect(await isFreeModel('openrouter/sonoma-sky-beta')).toBe(false);
expect(await isFreeModel('openrouter/auto-beta')).toBe(false);
});

test('should return false for non-OpenRouter models ending with -alpha or -beta', async () => {
Expand All @@ -185,15 +183,13 @@ describe('isFreeModel', () => {
expect(await isFreeModel('model:FREE')).toBe(false);
expect(await isFreeModel('model:Free')).toBe(false);
expect(await isFreeModel('OPENROUTER/FREE')).toBe(false);
expect(await isFreeModel('openrouter/model-ALPHA')).toBe(false);
});

test('should handle whitespace correctly', async () => {
expect(await isFreeModel('model:free ')).toBe(false);
expect(await isFreeModel(' model:free')).toBe(true);
expect(await isFreeModel(' openrouter/free')).toBe(false);
expect(await isFreeModel('openrouter/free ')).toBe(false);
expect(await isFreeModel('openrouter/model-alpha ')).toBe(false);
});
});
});
Expand Down
4 changes: 0 additions & 4 deletions apps/web/src/lib/ai-gateway/models.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,10 +116,6 @@ export function shouldRedactModelNameInResponse(provider: ProviderId, model: str
);
}

export function isOpenRouterStealthModel(model: string): boolean {
return model.startsWith('openrouter/') && (model.endsWith('-alpha') || model.endsWith('-beta'));
}

export function isDeadFreeModel(model: string): boolean {
return !!kiloExclusiveModels.find(
m => m.public_id === model && m.status === 'disabled' && !m.pricing
Expand Down