diff --git a/.changeset/gentle-laws-allow.md b/.changeset/gentle-laws-allow.md new file mode 100644 index 0000000000..738edce791 --- /dev/null +++ b/.changeset/gentle-laws-allow.md @@ -0,0 +1,5 @@ +--- +"kilo-code": patch +--- + +feat: support preserving reasoning content in OpenAI format conversion diff --git a/src/api/transform/openai-format.ts b/src/api/transform/openai-format.ts index 5d96a3de36..eccf4a7ce4 100644 --- a/src/api/transform/openai-format.ts +++ b/src/api/transform/openai-format.ts @@ -273,6 +273,22 @@ export interface ConvertToOpenAiMessagesOptions { mergeToolResultText?: boolean } +// kilocode_change start +type ReasoningBlockParam = { + /** + * Non-Anthropic block type used by some providers. We preserve it so we can + * round-trip it through OpenAI-format messages. + */ + type: "reasoning" + text?: string + thinking?: string +} +// kilocode_change end + +function isReasoningBlockParam(part: unknown): part is ReasoningBlockParam { + return typeof part === "object" && part !== null && (part as { type?: unknown }).type === "reasoning" +} + export function convertToOpenAiMessages( anthropicMessages: Anthropic.Messages.MessageParam[], options?: ConvertToOpenAiMessagesOptions, @@ -442,7 +458,14 @@ export function convertToOpenAiMessages( } } else if (anthropicMessage.role === "assistant") { const { nonToolMessages, toolMessages } = anthropicMessage.content.reduce<{ - nonToolMessages: (Anthropic.TextBlockParam | Anthropic.ImageBlockParam)[] + // kilocode_change start + nonToolMessages: ( + | Anthropic.TextBlockParam + | Anthropic.ImageBlockParam + | Anthropic.ThinkingBlockParam + | ReasoningBlockParam + )[] + // kilocode_change end toolMessages: Anthropic.ToolUseBlockParam[] }>( (acc, part) => { @@ -450,7 +473,11 @@ export function convertToOpenAiMessages( acc.toolMessages.push(part) } else if (part.type === "text" || part.type === "image") { acc.nonToolMessages.push(part) + // kilocode_change start + } else if (part.type === "thinking" || isReasoningBlockParam(part)) { + acc.nonToolMessages.push(part) } // assistant cannot send tool_result messages + // kilocode_change end return acc }, { nonToolMessages: [], toolMessages: [] }, @@ -463,6 +490,11 @@ export function convertToOpenAiMessages( .map((part) => { if (part.type === "image") { return "" // impossible as the assistant cannot send images + } else if (part.type === "thinking") { + return "" + part.thinking + "" + } else if (part.type === "reasoning") { + // kilocode_change - support custom "reasoning" type used by some providers + return "" + (part.text || part.thinking || "") + "" } return part.text })