-
Notifications
You must be signed in to change notification settings - Fork 9.9k
Description
Description
In v1.1.45, opencode supported parsing <think> tags in model responses and displaying them as special reasoning blocks in the UI. This was useful for adding thinking capability to models that don't have native extended thinking support (e.g., via system prompts or custom providers).
However, since v1.1.46, this functionality no longer works. Both <think> and <thinking> tags are now rendered as plain text mixed into the response content.
Root Cause
PR #11270 removed the extractReasoningMiddleware from packages/opencode/src/session/llm.ts:
// packages/opencode/src/session/llm.ts
- extractReasoningMiddleware({ tagName: "think", startWithReasoning: false }),Use Case
Many users add thinking capability to models via proxy services or custom providers. Typical implementation flow:
Model emits reasoning event
↓
Detect thinking content, mark isThinking=true
↓
Output in different formats based on config:
- reasoning_content field (DeepSeek native)
- <think>...</think> tag (OpenAI style)
- <thinking>...</thinking> tag (Claude style)
↓
Client parses and displays as reasoning block
Core logic:
// 1. Detect thinking content
if (reasoning.text) {
onChunk(reasoning.text, undefined, true) // isThinking=true
}
// 2. Output based on format config
if (isThinking) {
if (format === 'think') {
send({ content: `<think>${text}</think>` })
} else if (format === 'thinking') {
send({ content: `<thinking>${text}</thinking>` })
} else {
send({ reasoning_content: text }) // DeepSeek format
}
}In v1.1.45, extractReasoningMiddleware correctly parsed <think> tags. After removal, these tags can only be displayed as plain text.
Suggested Solution
Add a configuration option to re-enable tag-based reasoning extraction:
extractReasoningFromTags: {
enabled: true,
tagNames: ["think", "thinking"]
}Plugins
omo
OpenCode version
- Broken in: v1.1.46+
- Working in: v1.1.45
Operating System
Windows 11
Terminal
Windows Terminal