From 26fa08820854bd0f1c216a25c363a1b46fea8590 Mon Sep 17 00:00:00 2001 From: "kiloconnect[bot]" <240665456+kiloconnect[bot]@users.noreply.github.com> Date: Wed, 1 Apr 2026 06:57:43 +0000 Subject: [PATCH 1/3] fix(openrouter): guide Roo clients to upgrade Kilo --- src/app/api/openrouter/[...path]/route.ts | 6 +++++- src/lib/llm-proxy-helpers.test.ts | 26 +++++++++++++++++++++++ src/lib/llm-proxy-helpers.ts | 7 ++++-- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/app/api/openrouter/[...path]/route.ts b/src/app/api/openrouter/[...path]/route.ts index 6b3497bac0..75d693b1d9 100644 --- a/src/app/api/openrouter/[...path]/route.ts +++ b/src/app/api/openrouter/[...path]/route.ts @@ -346,7 +346,11 @@ export async function POST(request: NextRequest): Promise { describe('enterprise plan - model deny list restrictions', () => { @@ -271,6 +273,30 @@ describe('extractEmbeddingPromptInfo', () => { }); }); +describe('apiKindNotSupportedResponse', () => { + it('tells Roo Code based clients to upgrade Kilo', async () => { + const response = apiKindNotSupportedResponse( + 'responses', + ['chat_completions'], + getFraudDetectionHeaders(new Headers({ 'user-agent': 'Kilo-Code/4.65.3' })) + ); + + await expect(response.json()).resolves.toEqual({ + error: 'This Kilo version is too old for this model. Please upgrade Kilo and try again.', + message: 'This Kilo version is too old for this model. Please upgrade Kilo and try again.', + }); + }); + + it('keeps the generic unsupported API message for other clients', async () => { + const response = apiKindNotSupportedResponse('responses', ['chat_completions'], EmptyFraudDetectionHeaders); + + await expect(response.json()).resolves.toEqual({ + error: 'This model does not support the responses API, please use any of: chat_completions', + message: 'This model does not support the responses API, please use any of: chat_completions', + }); + }); +}); + describe('parseEmbeddingUsageFromResponse', () => { function makeResponse(overrides: Record = {}) { return JSON.stringify({ diff --git a/src/lib/llm-proxy-helpers.ts b/src/lib/llm-proxy-helpers.ts index ea01bc8d01..50b9bd893d 100644 --- a/src/lib/llm-proxy-helpers.ts +++ b/src/lib/llm-proxy-helpers.ts @@ -120,9 +120,12 @@ export function dataCollectionRequiredResponse() { export function apiKindNotSupportedResponse( apiKind: GatewayChatApiKind, - supportedApiKinds: ReadonlyArray + supportedApiKinds: ReadonlyArray, + fraudHeaders?: FraudDetectionHeaders ) { - const error = `This model does not support the ${apiKind} API, please use any of: ${supportedApiKinds.join()}`; + const error = isRooCodeBasedClient(fraudHeaders ?? getFraudDetectionHeaders(new Headers())) + ? 'This Kilo version is too old for this model. Please upgrade Kilo and try again.' + : `This model does not support the ${apiKind} API, please use any of: ${supportedApiKinds.join()}`; return NextResponse.json({ error, message: error }, { status: 400 }); } From 74ab21abaf661ca0bee951ee12fe781dc89d6835 Mon Sep 17 00:00:00 2001 From: "kiloconnect[bot]" <240665456+kiloconnect[bot]@users.noreply.github.com> Date: Wed, 1 Apr 2026 07:01:19 +0000 Subject: [PATCH 2/3] fix(openrouter): require Kilo v7 for Roo clients --- src/lib/llm-proxy-helpers.test.ts | 26 -------------------------- src/lib/llm-proxy-helpers.ts | 7 +++---- 2 files changed, 3 insertions(+), 30 deletions(-) diff --git a/src/lib/llm-proxy-helpers.test.ts b/src/lib/llm-proxy-helpers.test.ts index 06a1ecef37..952a3789cb 100644 --- a/src/lib/llm-proxy-helpers.test.ts +++ b/src/lib/llm-proxy-helpers.test.ts @@ -1,11 +1,9 @@ import { describe, it, expect } from '@jest/globals'; import { - apiKindNotSupportedResponse, checkOrganizationModelRestrictions, extractEmbeddingPromptInfo, parseEmbeddingUsageFromResponse, } from './llm-proxy-helpers'; -import { EmptyFraudDetectionHeaders, getFraudDetectionHeaders } from './utils'; describe('checkOrganizationModelRestrictions', () => { describe('enterprise plan - model deny list restrictions', () => { @@ -273,30 +271,6 @@ describe('extractEmbeddingPromptInfo', () => { }); }); -describe('apiKindNotSupportedResponse', () => { - it('tells Roo Code based clients to upgrade Kilo', async () => { - const response = apiKindNotSupportedResponse( - 'responses', - ['chat_completions'], - getFraudDetectionHeaders(new Headers({ 'user-agent': 'Kilo-Code/4.65.3' })) - ); - - await expect(response.json()).resolves.toEqual({ - error: 'This Kilo version is too old for this model. Please upgrade Kilo and try again.', - message: 'This Kilo version is too old for this model. Please upgrade Kilo and try again.', - }); - }); - - it('keeps the generic unsupported API message for other clients', async () => { - const response = apiKindNotSupportedResponse('responses', ['chat_completions'], EmptyFraudDetectionHeaders); - - await expect(response.json()).resolves.toEqual({ - error: 'This model does not support the responses API, please use any of: chat_completions', - message: 'This model does not support the responses API, please use any of: chat_completions', - }); - }); -}); - describe('parseEmbeddingUsageFromResponse', () => { function makeResponse(overrides: Record = {}) { return JSON.stringify({ diff --git a/src/lib/llm-proxy-helpers.ts b/src/lib/llm-proxy-helpers.ts index 50b9bd893d..e1c7fb039a 100644 --- a/src/lib/llm-proxy-helpers.ts +++ b/src/lib/llm-proxy-helpers.ts @@ -20,7 +20,6 @@ import type { } from '@/lib/providers/openrouter/types'; import { type FraudDetectionHeaders, - getFraudDetectionHeaders, isRooCodeBasedClient, toMicrodollars, } from '@/lib/utils'; @@ -121,10 +120,10 @@ export function dataCollectionRequiredResponse() { export function apiKindNotSupportedResponse( apiKind: GatewayChatApiKind, supportedApiKinds: ReadonlyArray, - fraudHeaders?: FraudDetectionHeaders + fraudHeaders: FraudDetectionHeaders ) { - const error = isRooCodeBasedClient(fraudHeaders ?? getFraudDetectionHeaders(new Headers())) - ? 'This Kilo version is too old for this model. Please upgrade Kilo and try again.' + const error = isRooCodeBasedClient(fraudHeaders) + ? 'This model requires Kilo v7 or newer. Please upgrade Kilo and try again.' : `This model does not support the ${apiKind} API, please use any of: ${supportedApiKinds.join()}`; return NextResponse.json({ error, message: error }, { status: 400 }); } From 73c0758fcda395432414df88db76e5dd193a30c1 Mon Sep 17 00:00:00 2001 From: Christiaan Arnoldus Date: Wed, 1 Apr 2026 09:55:26 +0200 Subject: [PATCH 3/3] Fix --- src/lib/llm-proxy-helpers.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/llm-proxy-helpers.ts b/src/lib/llm-proxy-helpers.ts index e1c7fb039a..743158afac 100644 --- a/src/lib/llm-proxy-helpers.ts +++ b/src/lib/llm-proxy-helpers.ts @@ -20,6 +20,7 @@ import type { } from '@/lib/providers/openrouter/types'; import { type FraudDetectionHeaders, + getFraudDetectionHeaders, isRooCodeBasedClient, toMicrodollars, } from '@/lib/utils';