Skip to content

Commit e4e4c2b

Browse files
fix(kimi-coding): disable reasoning for Roo Code-based clients (#2839)
* fix(kimi-coding): disable reasoning for Roo Code-based clients Kimi Code's `thinking` parameter was enabled by default for all BYOK requests, which fails for older Roo Code-based clients that don't expect reasoning output. Detect those clients via the incoming user-agent and force `thinking.type = 'disabled'` for them. Threads fraudHeaders through the transformRequest context so providers can inspect the originating client. * refactor: rename fraudHeaders context field to originalHeaders --------- Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com>
1 parent ff14e72 commit e4e4c2b

4 files changed

Lines changed: 13 additions & 3 deletions

File tree

apps/web/src/app/api/openrouter/[...path]/route.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,8 @@ export async function POST(request: NextRequest): Promise<NextResponseType<unkno
530530
originalModelIdLowerCased,
531531
requestBodyParsed,
532532
extraHeaders,
533-
userByok
533+
userByok,
534+
fraudHeaders
534535
);
535536

536537
const response = await openRouterRequest({

apps/web/src/lib/ai-gateway/providers/direct-byok/kimi-coding.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,19 @@ import {
44
} from '@/lib/ai-gateway/providers/direct-byok/types';
55
import { REASONING_VARIANTS_MINIMAL_LOW_MEDIUM_HIGH } from '@/lib/ai-gateway/providers/model-settings';
66
import { isReasoningExplicitlyDisabled } from '@/lib/ai-gateway/providers/openrouter/request-helpers';
7+
import { isRooCodeBasedClient } from '@/lib/utils';
78

89
export default {
910
id: 'kimi-coding',
1011
name: 'Kimi Code',
1112
base_url: 'https://api.kimi.com/coding/v1',
1213
ai_sdk_provider: 'openai-compatible',
1314
transformRequest(context) {
15+
const reasoningDisabled =
16+
isRooCodeBasedClient(context.originalHeaders) ||
17+
isReasoningExplicitlyDisabled(context.request);
1418
context.request.body.thinking = {
15-
type: isReasoningExplicitlyDisabled(context.request) ? 'disabled' : 'enabled',
19+
type: reasoningDisabled ? 'disabled' : 'enabled',
1620
};
1721
context.extraHeaders['user-agent'] = COMPATIBLE_USER_AGENT;
1822
},

apps/web/src/lib/ai-gateway/providers/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ import {
4747
injectReasoningIntoContent,
4848
} from '@/lib/ai-gateway/providers/openrouter/request-helpers';
4949
import { isStepFunModel } from '@/lib/ai-gateway/providers/stepfun';
50+
import type { FraudDetectionHeaders } from '@/lib/utils';
5051

5152
function inferSupportedChatApis(
5253
aiSdkProvider: CustomLlmProvider | undefined,
@@ -291,7 +292,8 @@ export function applyProviderSpecificLogic(
291292
requestedModel: string,
292293
requestToMutate: GatewayRequest,
293294
extraHeaders: Record<string, string>,
294-
userByok: BYOKResult[] | null
295+
userByok: BYOKResult[] | null,
296+
originalHeaders: FraudDetectionHeaders
295297
) {
296298
const kiloExclusiveModel = kiloExclusiveModels.find(m => m.public_id === requestedModel);
297299
if (kiloExclusiveModel) {
@@ -334,6 +336,7 @@ export function applyProviderSpecificLogic(
334336
provider.transformRequest({
335337
model: requestedModel,
336338
request: requestToMutate,
339+
originalHeaders,
337340
extraHeaders,
338341
userByok,
339342
});

apps/web/src/lib/ai-gateway/providers/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type { UserByokProviderId } from '@/lib/ai-gateway/providers/openrouter/inference-provider-id';
22
import type { GatewayRequest } from '@/lib/ai-gateway/providers/openrouter/types';
3+
import type { FraudDetectionHeaders } from '@/lib/utils';
34

45
export type ProviderId =
56
| 'openrouter'
@@ -22,6 +23,7 @@ export type BYOKResult = {
2223
export type TransformRequestContext = {
2324
model: string;
2425
request: GatewayRequest;
26+
originalHeaders: FraudDetectionHeaders;
2527
extraHeaders: Record<string, string>;
2628
userByok: BYOKResult[] | null;
2729
};

0 commit comments

Comments
 (0)