diff --git a/packages/tfcode/src/provider/sdk/copilot/chat/openai-compatible-chat-language-model.ts b/packages/tfcode/src/provider/sdk/copilot/chat/openai-compatible-chat-language-model.ts index c85d3f3d1..07e744695 100644 --- a/packages/tfcode/src/provider/sdk/copilot/chat/openai-compatible-chat-language-model.ts +++ b/packages/tfcode/src/provider/sdk/copilot/chat/openai-compatible-chat-language-model.ts @@ -228,8 +228,8 @@ export class OpenAICompatibleChatLanguageModel implements LanguageModelV2 { }) } - // reasoning content (Copilot uses reasoning_text): - const reasoning = choice.message.reasoning_text + // reasoning content (Copilot uses reasoning_text, ToothFairyAI/DeepSeek use reasoning_content): + const reasoning = choice.message.reasoning_text || choice.message.reasoning_content if (reasoning != null && reasoning.length > 0) { content.push({ type: "reasoning", @@ -456,8 +456,8 @@ export class OpenAICompatibleChatLanguageModel implements LanguageModelV2 { reasoningOpaque = delta.reasoning_opaque } - // enqueue reasoning before text deltas (Copilot uses reasoning_text): - const reasoningContent = delta.reasoning_text + // enqueue reasoning before text deltas (Copilot uses reasoning_text, ToothFairyAI/DeepSeek use reasoning_content): + const reasoningContent = delta.reasoning_text || delta.reasoning_content if (reasoningContent) { if (!isActiveReasoning) { controller.enqueue({ @@ -719,6 +719,8 @@ const OpenAICompatibleChatResponseSchema = z.object({ message: z.object({ role: z.literal("assistant").nullish(), content: z.string().nullish(), + // OpenAI-style reasoning content (ToothFairyAI, DeepSeek, etc.) + reasoning_content: z.string().nullish(), // Copilot-specific reasoning fields reasoning_text: z.string().nullish(), reasoning_opaque: z.string().nullish(), @@ -754,6 +756,8 @@ const createOpenAICompatibleChatChunkSchema = [effort, { reasoningEffort: effort }])) case "@ai-sdk/azure":