From f4684fddd2bbe16623d22419823bc78270a86607 Mon Sep 17 00:00:00 2001 From: chrarnoldus <12196001+chrarnoldus@users.noreply.github.com> Date: Fri, 21 Aug 2026 12:55:38 +0000 Subject: [PATCH 1/4] Replace Laguna with LongCat in Auto Free Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com> --- apps/web/src/lib/ai-gateway/models.test.ts | 12 +++++------- apps/web/src/lib/ai-gateway/models.ts | 15 +++++++++------ 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/apps/web/src/lib/ai-gateway/models.test.ts b/apps/web/src/lib/ai-gateway/models.test.ts index 2c5db6f3b5..2f7c96802d 100644 --- a/apps/web/src/lib/ai-gateway/models.test.ts +++ b/apps/web/src/lib/ai-gateway/models.test.ts @@ -87,7 +87,7 @@ describe('isFreeModel', () => { expect(autoFreeModels.map(({ model }) => model)).toContain(tencent_hy3_free_model.public_id); }); - test('registers LongCat 2.0 as a free preferred model', async () => { + test('registers LongCat 2.0 as an Auto Free model', async () => { expect(kiloExclusiveModels).toContain(longcat_2_free_model); expect(findKiloExclusiveModel(longcat_2_free_model.public_id)).toBe(longcat_2_free_model); expect(await isFreeModel(longcat_2_free_model.public_id)).toBe(true); @@ -98,9 +98,7 @@ describe('isFreeModel', () => { max_completion_tokens: 131_072, status: 'public', }); - expect(autoFreeModels.map(({ model }) => model)).not.toContain( - longcat_2_free_model.public_id - ); + expect(autoFreeModels.map(({ model }) => model)).toContain(longcat_2_free_model.public_id); expect(preferredModels).toContain(longcat_2_free_model.public_id); expect(getAiSdkProvider(longcat_2_free_model.public_id, null)).toBeUndefined(); }); @@ -195,17 +193,17 @@ describe('isFreeModel', () => { ).toEqual({ 'stepfun/step-3.7-flash:free': { enabled: true, effort: 'high' }, 'tencent/hy3:free': { enabled: true, effort: 'high' }, - 'poolside/laguna-s-2.1:free': { enabled: true, effort: 'high' }, + 'meituan/longcat-2.0-free': { enabled: true, effort: 'high' }, }); }); - test('weights Auto Free models at 80% StepFun, 10% Hy3, and 10% Laguna', () => { + test('weights Auto Free models at 80% StepFun, 10% Hy3, and 10% LongCat', () => { expect( Object.fromEntries(autoFreeModels.map(({ model, weight }) => [model, weight])) ).toEqual({ 'stepfun/step-3.7-flash:free': 8, 'tencent/hy3:free': 1, - 'poolside/laguna-s-2.1:free': 1, + 'meituan/longcat-2.0-free': 1, }); }); diff --git a/apps/web/src/lib/ai-gateway/models.ts b/apps/web/src/lib/ai-gateway/models.ts index bf0812c188..833e5c0000 100644 --- a/apps/web/src/lib/ai-gateway/models.ts +++ b/apps/web/src/lib/ai-gateway/models.ts @@ -61,11 +61,15 @@ export const autoFreeModels: ReadonlyArray = [ } satisfies AutoFreeModel, ] : []), - { - model: 'poolside/laguna-s-2.1:free', - weight: 1, - reasoning: { enabled: true, effort: 'high' }, - } satisfies AutoFreeModel, + ...(longcat_2_free_model.status === 'public' + ? [ + { + model: longcat_2_free_model.public_id, + weight: 1, + reasoning: { enabled: true, effort: 'high' }, + } satisfies AutoFreeModel, + ] + : []), ]; export function selectAutoFreeCandidate( @@ -91,7 +95,6 @@ export const preferredModels = [ KILO_AUTO_FREE_MODEL.id, ...autoFreeModels.map(({ model }) => model), - ...(longcat_2_free_model.status === 'public' ? [longcat_2_free_model.public_id] : []), CLAUDE_SONNET_CURRENT_MODEL_ID, CLAUDE_OPUS_CURRENT_MODEL_ID, From c2b61a140e96df44bb340dbb9da20480347f3327 Mon Sep 17 00:00:00 2001 From: chrarnoldus <12196001+chrarnoldus@users.noreply.github.com> Date: Fri, 21 Aug 2026 13:06:01 +0000 Subject: [PATCH 2/4] Update Auto Free quarantine expectation Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com> --- apps/web/src/app/api/openrouter/[...path]/route.test.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/apps/web/src/app/api/openrouter/[...path]/route.test.ts b/apps/web/src/app/api/openrouter/[...path]/route.test.ts index 0e453a418a..4b99aa4904 100644 --- a/apps/web/src/app/api/openrouter/[...path]/route.test.ts +++ b/apps/web/src/app/api/openrouter/[...path]/route.test.ts @@ -27,6 +27,7 @@ import { logFreeModelRequest, } from '@/lib/free-model-rate-limiter'; import { gemma_4_26b_a4b_it_free_model } from '@/lib/ai-gateway/providers/google'; +import { longcat_2_free_model } from '@/lib/ai-gateway/providers/longcat'; import { tencent_hy3_free_model } from '@/lib/ai-gateway/providers/tencent'; import { getEffectiveModelDecision } from '@/lib/organizations/effective-model-access.server'; import { getPercentageRoutedPartnerProvider } from '@/lib/ai-gateway/providers/partner/routing'; @@ -526,8 +527,12 @@ describe('POST /api/openrouter/v1/chat/completions rules-engine actions', () => expect(response.status).toBe(200); expect(mockedGetProvider).toHaveBeenCalledTimes(2); - expect(mockedGetProvider.mock.calls[1]?.[0].requestedModel).toBe('stepfun/step-3.7-flash:free'); - expect(mockedUpstreamRequest.mock.calls[0]?.[0].body.model).toBe('stepfun/step-3.7-flash'); + expect(mockedGetProvider.mock.calls[1]?.[0].requestedModel).toBe( + longcat_2_free_model.public_id + ); + expect(mockedUpstreamRequest.mock.calls[0]?.[0].body.model).toBe( + longcat_2_free_model.internal_id + ); expect(mockedAccountForMicrodollarUsage.mock.calls[0]?.[1]).toMatchObject({ abuse_delay: 6000, abuse_downgraded_from: 'openai/gpt-4o', From 7d5fceea73cec27084c3146ad7133f17e6a10919 Mon Sep 17 00:00:00 2001 From: chrarnoldus <12196001+chrarnoldus@users.noreply.github.com> Date: Fri, 21 Aug 2026 14:18:05 +0000 Subject: [PATCH 3/4] Keep Laguna in Auto Free rotation --- apps/web/src/app/api/openrouter/[...path]/route.test.ts | 9 ++------- apps/web/src/lib/ai-gateway/models.test.ts | 6 ++++-- apps/web/src/lib/ai-gateway/models.ts | 7 ++++++- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/apps/web/src/app/api/openrouter/[...path]/route.test.ts b/apps/web/src/app/api/openrouter/[...path]/route.test.ts index 4b99aa4904..0e453a418a 100644 --- a/apps/web/src/app/api/openrouter/[...path]/route.test.ts +++ b/apps/web/src/app/api/openrouter/[...path]/route.test.ts @@ -27,7 +27,6 @@ import { logFreeModelRequest, } from '@/lib/free-model-rate-limiter'; import { gemma_4_26b_a4b_it_free_model } from '@/lib/ai-gateway/providers/google'; -import { longcat_2_free_model } from '@/lib/ai-gateway/providers/longcat'; import { tencent_hy3_free_model } from '@/lib/ai-gateway/providers/tencent'; import { getEffectiveModelDecision } from '@/lib/organizations/effective-model-access.server'; import { getPercentageRoutedPartnerProvider } from '@/lib/ai-gateway/providers/partner/routing'; @@ -527,12 +526,8 @@ describe('POST /api/openrouter/v1/chat/completions rules-engine actions', () => expect(response.status).toBe(200); expect(mockedGetProvider).toHaveBeenCalledTimes(2); - expect(mockedGetProvider.mock.calls[1]?.[0].requestedModel).toBe( - longcat_2_free_model.public_id - ); - expect(mockedUpstreamRequest.mock.calls[0]?.[0].body.model).toBe( - longcat_2_free_model.internal_id - ); + expect(mockedGetProvider.mock.calls[1]?.[0].requestedModel).toBe('stepfun/step-3.7-flash:free'); + expect(mockedUpstreamRequest.mock.calls[0]?.[0].body.model).toBe('stepfun/step-3.7-flash'); expect(mockedAccountForMicrodollarUsage.mock.calls[0]?.[1]).toMatchObject({ abuse_delay: 6000, abuse_downgraded_from: 'openai/gpt-4o', diff --git a/apps/web/src/lib/ai-gateway/models.test.ts b/apps/web/src/lib/ai-gateway/models.test.ts index 2f7c96802d..0f2e420388 100644 --- a/apps/web/src/lib/ai-gateway/models.test.ts +++ b/apps/web/src/lib/ai-gateway/models.test.ts @@ -193,16 +193,18 @@ describe('isFreeModel', () => { ).toEqual({ 'stepfun/step-3.7-flash:free': { enabled: true, effort: 'high' }, 'tencent/hy3:free': { enabled: true, effort: 'high' }, + 'poolside/laguna-s-2.1:free': { enabled: true, effort: 'high' }, 'meituan/longcat-2.0-free': { enabled: true, effort: 'high' }, }); }); - test('weights Auto Free models at 80% StepFun, 10% Hy3, and 10% LongCat', () => { + test('weights Auto Free models at 70% StepFun and 10% each for Hy3, Laguna, and LongCat', () => { expect( Object.fromEntries(autoFreeModels.map(({ model, weight }) => [model, weight])) ).toEqual({ - 'stepfun/step-3.7-flash:free': 8, + 'stepfun/step-3.7-flash:free': 7, 'tencent/hy3:free': 1, + 'poolside/laguna-s-2.1:free': 1, 'meituan/longcat-2.0-free': 1, }); }); diff --git a/apps/web/src/lib/ai-gateway/models.ts b/apps/web/src/lib/ai-gateway/models.ts index 833e5c0000..8b03427419 100644 --- a/apps/web/src/lib/ai-gateway/models.ts +++ b/apps/web/src/lib/ai-gateway/models.ts @@ -47,7 +47,7 @@ export const autoFreeModels: ReadonlyArray = [ ? [ { model: stepfun_37_flash_free_model.public_id, - weight: 8, + weight: 7, reasoning: { enabled: true, effort: 'high' }, } satisfies AutoFreeModel, ] @@ -61,6 +61,11 @@ export const autoFreeModels: ReadonlyArray = [ } satisfies AutoFreeModel, ] : []), + { + model: 'poolside/laguna-s-2.1:free', + weight: 1, + reasoning: { enabled: true, effort: 'high' }, + } satisfies AutoFreeModel, ...(longcat_2_free_model.status === 'public' ? [ { From 35264c50496f162f6bd5962e712b545fa2138b61 Mon Sep 17 00:00:00 2001 From: chrarnoldus <12196001+chrarnoldus@users.noreply.github.com> Date: Fri, 21 Aug 2026 14:28:56 +0000 Subject: [PATCH 4/4] Update Auto Free quarantine target --- apps/web/src/app/api/openrouter/[...path]/route.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/web/src/app/api/openrouter/[...path]/route.test.ts b/apps/web/src/app/api/openrouter/[...path]/route.test.ts index 0e453a418a..47f0985cdd 100644 --- a/apps/web/src/app/api/openrouter/[...path]/route.test.ts +++ b/apps/web/src/app/api/openrouter/[...path]/route.test.ts @@ -526,8 +526,8 @@ describe('POST /api/openrouter/v1/chat/completions rules-engine actions', () => expect(response.status).toBe(200); expect(mockedGetProvider).toHaveBeenCalledTimes(2); - expect(mockedGetProvider.mock.calls[1]?.[0].requestedModel).toBe('stepfun/step-3.7-flash:free'); - expect(mockedUpstreamRequest.mock.calls[0]?.[0].body.model).toBe('stepfun/step-3.7-flash'); + expect(mockedGetProvider.mock.calls[1]?.[0].requestedModel).toBe('meituan/longcat-2.0-free'); + expect(mockedUpstreamRequest.mock.calls[0]?.[0].body.model).toBe('LongCat-2.0'); expect(mockedAccountForMicrodollarUsage.mock.calls[0]?.[1]).toMatchObject({ abuse_delay: 6000, abuse_downgraded_from: 'openai/gpt-4o',