diff --git a/src/renderer/src/providers/OpenAIProvider.ts b/src/renderer/src/providers/OpenAIProvider.ts index b16215d5ef..03d878fd16 100644 --- a/src/renderer/src/providers/OpenAIProvider.ts +++ b/src/renderer/src/providers/OpenAIProvider.ts @@ -129,6 +129,18 @@ export default class OpenAIProvider extends BaseProvider { return assistant?.settings?.temperature } + private getProviderSpecificParameters(model: Model) { + if (this.provider.id === 'openrouter') { + if (model.id.includes('deepseek-r1')) { + return { + include_reasoning: true + } + } + } + + return {} + } + async completions({ messages, assistant, onChunk, onFilterMessages }: CompletionsParams): Promise { const defaultModel = getDefaultModel() const model = assistant.model || defaultModel @@ -175,6 +187,7 @@ export default class OpenAIProvider extends BaseProvider { keep_alive: this.keepAliveTime, stream: isSupportStreamOutput(), ...(assistant.enableWebSearch ? getOpenAIWebSearchParams(model) : {}), + ...this.getProviderSpecificParameters(model), ...this.getCustomParameters(assistant) }) @@ -207,10 +220,12 @@ export default class OpenAIProvider extends BaseProvider { const time_completion_millsec = new Date().getTime() - start_time_millsec const time_thinking_millsec = time_first_content_millsec ? time_first_content_millsec - start_time_millsec : 0 + const delta = chunk.choices[0]?.delta + onChunk({ - text: chunk.choices[0]?.delta?.content || '', + text: delta?.content || '', // @ts-ignore key is not typed - reasoning_content: chunk.choices[0]?.delta?.reasoning_content || '', + reasoning_content: delta?.reasoning_content || delta.reasoning || '', usage: chunk.usage, metrics: { completion_tokens: chunk.usage?.completion_tokens,