From 14b77d6ad3719f1adc50eb5c79f8c3499d138819 Mon Sep 17 00:00:00 2001 From: Christiaan Arnoldus Date: Tue, 18 Aug 2026 16:40:48 +0200 Subject: [PATCH 1/2] fix(ai-gateway): report exclusive provider data collection --- .../providers/kilo-exclusive-model.test.ts | 33 +++++++++++++++++++ .../providers/kilo-exclusive-model.ts | 15 ++++++--- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/apps/web/src/lib/ai-gateway/providers/kilo-exclusive-model.test.ts b/apps/web/src/lib/ai-gateway/providers/kilo-exclusive-model.test.ts index acffdf51ac..d7906d7d2b 100644 --- a/apps/web/src/lib/ai-gateway/providers/kilo-exclusive-model.test.ts +++ b/apps/web/src/lib/ai-gateway/providers/kilo-exclusive-model.test.ts @@ -3,6 +3,7 @@ import { applyKiloExclusiveModelSettings, calculateCost_mUsd, convertFromKiloExclusiveModel, + getInferenceProvider, type KiloExclusiveModel, type PricingTiers, } from '@/lib/ai-gateway/providers/kilo-exclusive-model'; @@ -117,6 +118,38 @@ describe('convertFromKiloExclusiveModel', () => { }); }); +describe('getInferenceProvider', () => { + it('uses a single inference provider restriction before the gateway', () => { + const model = makeModel({ + internal_id: 'vendor/x', + gateway: 'vercel', + inference_provider_restriction: ['openai'], + }); + + expect(getInferenceProvider(model)).toEqual({ + slug: 'openai', + name: 'OPENAI', + training: false, + retainsPrompts: true, + }); + }); + + it('reports data collection for a concrete gateway provider', () => { + const model = makeModel({ + internal_id: 'vendor/x', + gateway: 'alibaba', + flags: ['requires-data-collection'], + }); + + expect(getInferenceProvider(model)).toEqual({ + slug: 'alibaba', + name: 'ALIBABA', + training: true, + retainsPrompts: true, + }); + }); +}); + describe('applyKiloExclusiveModelSettings', () => { it('rewrites the public model id to the internal id', () => { const req = makeRequest(undefined, 'kilo/test-model'); diff --git a/apps/web/src/lib/ai-gateway/providers/kilo-exclusive-model.ts b/apps/web/src/lib/ai-gateway/providers/kilo-exclusive-model.ts index ed498298f1..965cf14226 100644 --- a/apps/web/src/lib/ai-gateway/providers/kilo-exclusive-model.ts +++ b/apps/web/src/lib/ai-gateway/providers/kilo-exclusive-model.ts @@ -194,14 +194,21 @@ export function getInferenceProvider(model: KiloExclusiveModel): InferenceProvid if (model.flags.includes('stealth')) { return { slug: 'stealth', name: 'Stealth', training: true, retainsPrompts: true }; } - if (model.gateway === 'openrouter' || model.gateway === 'vercel') { - return null; + + let slug: OpenRouterInferenceProviderId; + if (model.inference_provider_restriction.length === 1) { + slug = model.inference_provider_restriction[0]; + } else { + if (model.gateway === 'openrouter' || model.gateway === 'vercel') { + return null; + } + slug = OpenRouterInferenceProviderIdSchema.parse(model.gateway); } - const slug = OpenRouterInferenceProviderIdSchema.parse(model.gateway); + return { slug, name: slug.toUpperCase(), - training: false, + training: model.flags.includes('requires-data-collection'), retainsPrompts: true, }; } From 87a1f3fae3b0963eb53c6f4634b0a703d367c5f4 Mon Sep 17 00:00:00 2001 From: Christiaan Arnoldus Date: Tue, 18 Aug 2026 16:45:13 +0200 Subject: [PATCH 2/2] refactor(ai-gateway): derive inference provider immutably --- .../ai-gateway/providers/kilo-exclusive-model.ts | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/apps/web/src/lib/ai-gateway/providers/kilo-exclusive-model.ts b/apps/web/src/lib/ai-gateway/providers/kilo-exclusive-model.ts index 965cf14226..0b51d5b0d9 100644 --- a/apps/web/src/lib/ai-gateway/providers/kilo-exclusive-model.ts +++ b/apps/web/src/lib/ai-gateway/providers/kilo-exclusive-model.ts @@ -195,15 +195,13 @@ export function getInferenceProvider(model: KiloExclusiveModel): InferenceProvid return { slug: 'stealth', name: 'Stealth', training: true, retainsPrompts: true }; } - let slug: OpenRouterInferenceProviderId; - if (model.inference_provider_restriction.length === 1) { - slug = model.inference_provider_restriction[0]; - } else { - if (model.gateway === 'openrouter' || model.gateway === 'vercel') { - return null; - } - slug = OpenRouterInferenceProviderIdSchema.parse(model.gateway); - } + const slug: OpenRouterInferenceProviderId | null = + model.inference_provider_restriction.length === 1 + ? model.inference_provider_restriction[0] + : model.gateway === 'openrouter' || model.gateway === 'vercel' + ? null + : OpenRouterInferenceProviderIdSchema.parse(model.gateway); + if (!slug) return null; return { slug,