From 96b7d14e7bb0fbc050a69773df1a3cf3d4e9c064 Mon Sep 17 00:00:00 2001 From: chrarnoldus <12196001+chrarnoldus@users.noreply.github.com> Date: Sat, 18 Jul 2026 20:20:31 +0000 Subject: [PATCH] fix(ai-gateway): stop treating OpenRouter alpha/beta as free OpenRouter models ending in -alpha or -beta (e.g. openrouter/auto-beta) are no longer considered free. Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com> --- apps/web/src/lib/ai-gateway/is-free-model.ts | 7 +------ apps/web/src/lib/ai-gateway/models.test.ts | 16 ++++++---------- apps/web/src/lib/ai-gateway/models.ts | 4 ---- 3 files changed, 7 insertions(+), 20 deletions(-) diff --git a/apps/web/src/lib/ai-gateway/is-free-model.ts b/apps/web/src/lib/ai-gateway/is-free-model.ts index 9592637d2c..66f16ba78f 100644 --- a/apps/web/src/lib/ai-gateway/is-free-model.ts +++ b/apps/web/src/lib/ai-gateway/is-free-model.ts @@ -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'; /** @@ -22,7 +18,6 @@ export async function isFreeModel(model: string): Promise { model === KILO_AUTO_FREE_MODEL.id || (model ?? '').endsWith(':free') || model === 'openrouter/free' || - isOpenRouterStealthModel(model ?? '') || (await isPublicIdExperimented(model ?? '')) ); } diff --git a/apps/web/src/lib/ai-gateway/models.test.ts b/apps/web/src/lib/ai-gateway/models.test.ts index c53f7fd329..6475a9718a 100644 --- a/apps/web/src/lib/ai-gateway/models.test.ts +++ b/apps/web/src/lib/ai-gateway/models.test.ts @@ -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( @@ -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 () => { @@ -185,7 +183,6 @@ 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 () => { @@ -193,7 +190,6 @@ describe('isFreeModel', () => { 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); }); }); }); diff --git a/apps/web/src/lib/ai-gateway/models.ts b/apps/web/src/lib/ai-gateway/models.ts index f8cb4a018e..abbf874536 100644 --- a/apps/web/src/lib/ai-gateway/models.ts +++ b/apps/web/src/lib/ai-gateway/models.ts @@ -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