import { deepSeekModels, deepSeekDefaultModelId } from "@roo-code/types" import type { ApiHandlerOptions } from "../../shared/api" import type { ApiStreamUsageChunk } from "../transform/stream" import { getModelParams } from "../transform/model-params" import { OpenAiHandler } from "./openai" export class DeepSeekHandler extends OpenAiHandler { constructor(options: ApiHandlerOptions) { super({ ...options, openAiApiKey: options.deepSeekApiKey ?? "not-provided", openAiModelId: options.apiModelId ?? deepSeekDefaultModelId, openAiBaseUrl: options.deepSeekBaseUrl ?? "https://api.deepseek.com", openAiStreamingEnabled: true, includeMaxTokens: true, }) } override getModel() { const id = this.options.apiModelId ?? deepSeekDefaultModelId const info = deepSeekModels[id as keyof typeof deepSeekModels] || deepSeekModels[deepSeekDefaultModelId] const params = getModelParams({ format: "openai", modelId: id, model: info, settings: this.options }) return { id, info, ...params } } // Override to handle DeepSeek's usage metrics, including caching. protected override processUsageMetrics(usage: any): ApiStreamUsageChunk { return { type: "usage", inputTokens: usage?.prompt_tokens || 0, outputTokens: usage?.completion_tokens || 0, cacheWriteTokens: usage?.prompt_tokens_details?.cache_miss_tokens, cacheReadTokens: usage?.prompt_tokens_details?.cached_tokens, } } }