From f15214f59a86b450e488f89d1cb8dd55a4dbe92b Mon Sep 17 00:00:00 2001 From: 01luyicheng Date: Sun, 1 Feb 2026 17:03:14 +0800 Subject: [PATCH 1/2] docs: improve zh-TW punctuation to match Taiwan usage (#11574) --- README.zht.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.zht.md b/README.zht.md index 298b5b35acf..f31bf8b834a 100644 --- a/README.zht.md +++ b/README.zht.md @@ -124,7 +124,7 @@ OpenCode 內建了兩種 Agent,您可以使用 `Tab` 鍵快速切換。 - 100% 開源。 - 不綁定特定的服務提供商。雖然我們推薦使用透過 [OpenCode Zen](https://opencode.ai/zen) 提供的模型,但 OpenCode 也可搭配 Claude, OpenAI, Google 甚至本地模型使用。隨著模型不斷演進,彼此間的差距會縮小且價格會下降,因此具備「不限廠商 (provider-agnostic)」的特性至關重要。 - 內建 LSP (語言伺服器協定) 支援。 -- 專注於終端機介面 (TUI)。OpenCode 由 Neovim 愛好者與 [terminal.shop](https://terminal.shop) 的創作者打造;我們將不斷挑戰終端機介面的極限。 +- 專注於終端機介面 (TUI)。OpenCode 由 Neovim 愛好者與 [terminal.shop](https://terminal.shop) 的創作者打造。我們將不斷挑戰終端機介面的極限。 - 客戶端/伺服器架構 (Client/Server Architecture)。這讓 OpenCode 能夠在您的電腦上運行的同時,由行動裝置進行遠端操控。這意味著 TUI 前端只是眾多可能的客戶端之一。 --- From cd2e0352e7c694ce5e786a9e564b91ea19244807 Mon Sep 17 00:00:00 2001 From: 01luyicheng Date: Sun, 1 Feb 2026 17:15:53 +0800 Subject: [PATCH 2/2] fix: strip reasoning parts from messages when switching to non-thinking models (#11571) When switching from a model with extended thinking (e.g., Claude Opus) to a model without thinking support (e.g., GPT 5.2, Claude Sonnet without thinking) mid-session, reasoning parts from previous messages were still being sent to the API, causing validation errors. This fix ensures that reasoning parts are only included in providerOptions when the target model supports interleaved reasoning (capabilities.interleaved is an object with a field). For models that don't support interleaved reasoning, the reasoning parts are filtered out from the content array but not added to providerOptions, preventing the API error. Changes: - Modified normalizeMessages() in transform.ts to check if model supports interleaved reasoning before including reasoning in providerOptions - Reasoning parts are now correctly filtered for both thinking and non-thinking models --- packages/opencode/src/provider/transform.ts | 53 ++++++++++----------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts index f5fe419db90..c038c13f156 100644 --- a/packages/opencode/src/provider/transform.ts +++ b/packages/opencode/src/provider/transform.ts @@ -129,40 +129,39 @@ export namespace ProviderTransform { return result } - if (typeof model.capabilities.interleaved === "object" && model.capabilities.interleaved.field) { - const field = model.capabilities.interleaved.field - return msgs.map((msg) => { - if (msg.role === "assistant" && Array.isArray(msg.content)) { - const reasoningParts = msg.content.filter((part: any) => part.type === "reasoning") - const reasoningText = reasoningParts.map((part: any) => part.text).join("") - - // Filter out reasoning parts from content - const filteredContent = msg.content.filter((part: any) => part.type !== "reasoning") - - // Include reasoning_content | reasoning_details directly on the message for all assistant messages - if (reasoningText) { - return { - ...msg, - content: filteredContent, - providerOptions: { - ...msg.providerOptions, - openaiCompatible: { - ...(msg.providerOptions as any)?.openaiCompatible, - [field]: reasoningText, - }, - }, - } - } + const supportsInterleaved = typeof model.capabilities.interleaved === "object" && model.capabilities.interleaved.field + const field = supportsInterleaved ? model.capabilities.interleaved.field : undefined + return msgs.map((msg) => { + if (msg.role === "assistant" && Array.isArray(msg.content)) { + const reasoningParts = msg.content.filter((part: any) => part.type === "reasoning") + const reasoningText = reasoningParts.map((part: any) => part.text).join("") + // Filter out reasoning parts from content + const filteredContent = msg.content.filter((part: any) => part.type !== "reasoning") + + // Include reasoning_content | reasoning_details directly on message for models that support interleaved reasoning + if (reasoningText && supportsInterleaved && field) { return { ...msg, content: filteredContent, + providerOptions: { + ...msg.providerOptions, + openaiCompatible: { + ...(msg.providerOptions as any)?.openaiCompatible, + [field]: reasoningText, + }, + }, } } - return msg - }) - } + return { + ...msg, + content: filteredContent, + } + } + + return msg + }) return msgs }