From dcbfe004362b725e53e3b4895c11329802da12b8 Mon Sep 17 00:00:00 2001 From: wangxiaolong Date: Thu, 4 Sep 2025 23:13:00 +0800 Subject: [PATCH 1/4] feat: enhance MoonshotHandler to include max_tokens and update OpenAiHandler method visibility --- src/api/providers/moonshot.ts | 14 +++++++++++++- src/api/providers/openai.ts | 2 +- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/api/providers/moonshot.ts b/src/api/providers/moonshot.ts index f04b369d1c..72f670d043 100644 --- a/src/api/providers/moonshot.ts +++ b/src/api/providers/moonshot.ts @@ -1,4 +1,5 @@ -import { moonshotModels, moonshotDefaultModelId } from "@roo-code/types" +import OpenAI from "openai" +import { moonshotModels, moonshotDefaultModelId, type ModelInfo } from "@roo-code/types" import type { ApiHandlerOptions } from "../../shared/api" @@ -36,4 +37,15 @@ export class MoonshotHandler extends OpenAiHandler { cacheReadTokens: usage?.cached_tokens, } } + + // Override to always include max_completion_tokens for Moonshot + protected override addMaxTokensIfNeeded( + requestOptions: + | OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming + | OpenAI.Chat.Completions.ChatCompletionCreateParamsNonStreaming, + modelInfo: ModelInfo, + ): void { + // Moonshot use max_tokens instead of max_completion_tokens + requestOptions.max_tokens = this.options.modelMaxTokens || modelInfo.maxTokens + } } diff --git a/src/api/providers/openai.ts b/src/api/providers/openai.ts index 36158d770c..fd9a45f57f 100644 --- a/src/api/providers/openai.ts +++ b/src/api/providers/openai.ts @@ -408,7 +408,7 @@ export class OpenAiHandler extends BaseProvider implements SingleCompletionHandl * Note: max_tokens is deprecated in favor of max_completion_tokens as per OpenAI documentation * O3 family models handle max_tokens separately in handleO3FamilyMessage */ - private addMaxTokensIfNeeded( + protected addMaxTokensIfNeeded( requestOptions: | OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming | OpenAI.Chat.Completions.ChatCompletionCreateParamsNonStreaming, From 5d4ed0e7906ddeb066fbe46a8683cb653c1aee4f Mon Sep 17 00:00:00 2001 From: WangXiaolong Date: Thu, 4 Sep 2025 23:59:59 +0800 Subject: [PATCH 2/4] Update src/api/providers/moonshot.ts Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --- src/api/providers/moonshot.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/providers/moonshot.ts b/src/api/providers/moonshot.ts index 72f670d043..907a4fb7fc 100644 --- a/src/api/providers/moonshot.ts +++ b/src/api/providers/moonshot.ts @@ -38,7 +38,7 @@ export class MoonshotHandler extends OpenAiHandler { } } - // Override to always include max_completion_tokens for Moonshot + // Override to always include max_tokens for Moonshot (not max_completion_tokens) protected override addMaxTokensIfNeeded( requestOptions: | OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming From ad4943f0226db64e7a8adaadacbb03b06115a2ec Mon Sep 17 00:00:00 2001 From: WangXiaolong Date: Fri, 5 Sep 2025 00:06:14 +0800 Subject: [PATCH 3/4] Update src/api/providers/moonshot.ts Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> --- src/api/providers/moonshot.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/providers/moonshot.ts b/src/api/providers/moonshot.ts index 907a4fb7fc..d29a10a3b3 100644 --- a/src/api/providers/moonshot.ts +++ b/src/api/providers/moonshot.ts @@ -45,7 +45,7 @@ export class MoonshotHandler extends OpenAiHandler { | OpenAI.Chat.Completions.ChatCompletionCreateParamsNonStreaming, modelInfo: ModelInfo, ): void { - // Moonshot use max_tokens instead of max_completion_tokens + // Moonshot uses max_tokens instead of max_completion_tokens requestOptions.max_tokens = this.options.modelMaxTokens || modelInfo.maxTokens } } From bafc6c17b47663984817bd14881dd5eca46f2def Mon Sep 17 00:00:00 2001 From: wangxiaolong Date: Fri, 5 Sep 2025 00:10:32 +0800 Subject: [PATCH 4/4] feat: add tests for addMaxTokensIfNeeded method in MoonshotHandler --- src/api/providers/__tests__/moonshot.spec.ts | 62 ++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/src/api/providers/__tests__/moonshot.spec.ts b/src/api/providers/__tests__/moonshot.spec.ts index 586dd5598e..05bc8ee4b8 100644 --- a/src/api/providers/__tests__/moonshot.spec.ts +++ b/src/api/providers/__tests__/moonshot.spec.ts @@ -294,4 +294,66 @@ describe("MoonshotHandler", () => { expect(result.cacheReadTokens).toBeUndefined() }) }) + + describe("addMaxTokensIfNeeded", () => { + it("should always add max_tokens regardless of includeMaxTokens option", () => { + // Create a test subclass to access the protected method + class TestMoonshotHandler extends MoonshotHandler { + public testAddMaxTokensIfNeeded(requestOptions: any, modelInfo: any) { + this.addMaxTokensIfNeeded(requestOptions, modelInfo) + } + } + + const testHandler = new TestMoonshotHandler(mockOptions) + const requestOptions: any = {} + const modelInfo = { + maxTokens: 32_000, + } + + // Test with includeMaxTokens set to false - should still add max tokens + testHandler.testAddMaxTokensIfNeeded(requestOptions, modelInfo) + + expect(requestOptions.max_tokens).toBe(32_000) + }) + + it("should use modelMaxTokens when provided", () => { + class TestMoonshotHandler extends MoonshotHandler { + public testAddMaxTokensIfNeeded(requestOptions: any, modelInfo: any) { + this.addMaxTokensIfNeeded(requestOptions, modelInfo) + } + } + + const customMaxTokens = 5000 + const testHandler = new TestMoonshotHandler({ + ...mockOptions, + modelMaxTokens: customMaxTokens, + }) + const requestOptions: any = {} + const modelInfo = { + maxTokens: 32_000, + } + + testHandler.testAddMaxTokensIfNeeded(requestOptions, modelInfo) + + expect(requestOptions.max_tokens).toBe(customMaxTokens) + }) + + it("should fall back to modelInfo.maxTokens when modelMaxTokens is not provided", () => { + class TestMoonshotHandler extends MoonshotHandler { + public testAddMaxTokensIfNeeded(requestOptions: any, modelInfo: any) { + this.addMaxTokensIfNeeded(requestOptions, modelInfo) + } + } + + const testHandler = new TestMoonshotHandler(mockOptions) + const requestOptions: any = {} + const modelInfo = { + maxTokens: 16_000, + } + + testHandler.testAddMaxTokensIfNeeded(requestOptions, modelInfo) + + expect(requestOptions.max_tokens).toBe(16_000) + }) + }) })