From f37dd4d97f47fae335e514bb141bc1c06ac10901 Mon Sep 17 00:00:00 2001 From: Roo Code Date: Tue, 23 Sep 2025 02:19:32 +0000 Subject: [PATCH] fix: update DeepSeek, Doubao, and Moonshot handlers to extend OpenAIChatCompletionsHandler These handlers now properly extend from OpenAIChatCompletionsHandler instead of OpenAiHandler to maintain compatibility with the new architecture --- src/api/providers/deepseek.ts | 11 +++++++---- src/api/providers/doubao.ts | 11 +++++++---- src/api/providers/moonshot.ts | 13 ++++++++----- src/api/providers/openai.ts | 7 +++++++ 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/api/providers/deepseek.ts b/src/api/providers/deepseek.ts index de119de6db..e0852d404d 100644 --- a/src/api/providers/deepseek.ts +++ b/src/api/providers/deepseek.ts @@ -5,9 +5,11 @@ import type { ApiHandlerOptions } from "../../shared/api" import type { ApiStreamUsageChunk } from "../transform/stream" import { getModelParams } from "../transform/model-params" -import { OpenAiHandler } from "./openai" +import { OpenAIChatCompletionsHandler } from "./openai-chat-completions" + +export class DeepSeekHandler extends OpenAIChatCompletionsHandler { + private deepSeekOptions: ApiHandlerOptions -export class DeepSeekHandler extends OpenAiHandler { constructor(options: ApiHandlerOptions) { super({ ...options, @@ -17,12 +19,13 @@ export class DeepSeekHandler extends OpenAiHandler { openAiStreamingEnabled: true, includeMaxTokens: true, }) + this.deepSeekOptions = options } override getModel() { - const id = this.options.apiModelId ?? deepSeekDefaultModelId + const id = this.deepSeekOptions.apiModelId ?? deepSeekDefaultModelId const info = deepSeekModels[id as keyof typeof deepSeekModels] || deepSeekModels[deepSeekDefaultModelId] - const params = getModelParams({ format: "openai", modelId: id, model: info, settings: this.options }) + const params = getModelParams({ format: "openai", modelId: id, model: info, settings: this.deepSeekOptions }) return { id, info, ...params } } diff --git a/src/api/providers/doubao.ts b/src/api/providers/doubao.ts index a1337ed558..b6fc5bb58e 100644 --- a/src/api/providers/doubao.ts +++ b/src/api/providers/doubao.ts @@ -1,4 +1,4 @@ -import { OpenAiHandler } from "./openai" +import { OpenAIChatCompletionsHandler } from "./openai-chat-completions" import type { ApiHandlerOptions } from "../../shared/api" import { DOUBAO_API_BASE_URL, doubaoDefaultModelId, doubaoModels } from "@roo-code/types" import { getModelParams } from "../transform/model-params" @@ -49,7 +49,9 @@ interface ChatCompletionChunk { } } -export class DoubaoHandler extends OpenAiHandler { +export class DoubaoHandler extends OpenAIChatCompletionsHandler { + private doubaoOptions: ApiHandlerOptions + constructor(options: ApiHandlerOptions) { super({ ...options, @@ -59,12 +61,13 @@ export class DoubaoHandler extends OpenAiHandler { openAiStreamingEnabled: true, includeMaxTokens: true, }) + this.doubaoOptions = options } override getModel() { - const id = this.options.apiModelId ?? doubaoDefaultModelId + const id = this.doubaoOptions.apiModelId ?? doubaoDefaultModelId const info = doubaoModels[id as keyof typeof doubaoModels] || doubaoModels[doubaoDefaultModelId] - const params = getModelParams({ format: "openai", modelId: id, model: info, settings: this.options }) + const params = getModelParams({ format: "openai", modelId: id, model: info, settings: this.doubaoOptions }) return { id, info, ...params } } diff --git a/src/api/providers/moonshot.ts b/src/api/providers/moonshot.ts index d29a10a3b3..fe96b7620f 100644 --- a/src/api/providers/moonshot.ts +++ b/src/api/providers/moonshot.ts @@ -6,9 +6,11 @@ import type { ApiHandlerOptions } from "../../shared/api" import type { ApiStreamUsageChunk } from "../transform/stream" import { getModelParams } from "../transform/model-params" -import { OpenAiHandler } from "./openai" +import { OpenAIChatCompletionsHandler } from "./openai-chat-completions" + +export class MoonshotHandler extends OpenAIChatCompletionsHandler { + private moonshotOptions: ApiHandlerOptions -export class MoonshotHandler extends OpenAiHandler { constructor(options: ApiHandlerOptions) { super({ ...options, @@ -18,12 +20,13 @@ export class MoonshotHandler extends OpenAiHandler { openAiStreamingEnabled: true, includeMaxTokens: true, }) + this.moonshotOptions = options } override getModel() { - const id = this.options.apiModelId ?? moonshotDefaultModelId + const id = this.moonshotOptions.apiModelId ?? moonshotDefaultModelId const info = moonshotModels[id as keyof typeof moonshotModels] || moonshotModels[moonshotDefaultModelId] - const params = getModelParams({ format: "openai", modelId: id, model: info, settings: this.options }) + const params = getModelParams({ format: "openai", modelId: id, model: info, settings: this.moonshotOptions }) return { id, info, ...params } } @@ -46,6 +49,6 @@ export class MoonshotHandler extends OpenAiHandler { modelInfo: ModelInfo, ): void { // Moonshot uses max_tokens instead of max_completion_tokens - requestOptions.max_tokens = this.options.modelMaxTokens || modelInfo.maxTokens + requestOptions.max_tokens = this.moonshotOptions.modelMaxTokens || modelInfo.maxTokens } } diff --git a/src/api/providers/openai.ts b/src/api/providers/openai.ts index 5dc7412db1..09525e68b9 100644 --- a/src/api/providers/openai.ts +++ b/src/api/providers/openai.ts @@ -75,6 +75,13 @@ export class OpenAiHandler implements SingleCompletionHandler { return this.handler.completePrompt(prompt) } + /** + * Count tokens for the given content + */ + async countTokens(content: any[]): Promise { + return this.handler.countTokens(content) + } + /** * Get information about which API is being used */