Files
oh-my-opencode/src/hooks/think-mode/index.ts
T
YeonGyu-Kim 0ac4d223f9 feat(think-mode): inject thinking config with maxTokens for extended thinking
- Actually inject THINKING_CONFIGS into message (was defined but unused)
- Add maxTokens: 128000 for Anthropic (required for extended thinking)
- Add maxTokens: 64000 for Amazon Bedrock
- Track thinkingConfigInjected state

🤖 GENERATED WITH ASSISTANCE OF [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)
2025-12-13 14:05:02 +09:00

90 lines
2.5 KiB
TypeScript

import { detectThinkKeyword, extractPromptText } from "./detector"
import { getHighVariant, isAlreadyHighVariant, getThinkingConfig } from "./switcher"
import type { ThinkModeState, ThinkModeInput } from "./types"
import { log } from "../../shared"
export * from "./detector"
export * from "./switcher"
export * from "./types"
const thinkModeState = new Map<string, ThinkModeState>()
export function clearThinkModeState(sessionID: string): void {
thinkModeState.delete(sessionID)
}
export function createThinkModeHook() {
return {
"chat.params": async (
output: ThinkModeInput,
sessionID: string
): Promise<void> => {
const promptText = extractPromptText(output.parts)
const state: ThinkModeState = {
requested: false,
modelSwitched: false,
thinkingConfigInjected: false,
}
if (!detectThinkKeyword(promptText)) {
thinkModeState.set(sessionID, state)
return
}
state.requested = true
const currentModel = output.message.model
if (!currentModel) {
thinkModeState.set(sessionID, state)
return
}
state.providerID = currentModel.providerID
state.modelID = currentModel.modelID
if (isAlreadyHighVariant(currentModel.modelID)) {
thinkModeState.set(sessionID, state)
return
}
const highVariant = getHighVariant(currentModel.modelID)
const thinkingConfig = getThinkingConfig(currentModel.providerID, currentModel.modelID)
if (highVariant) {
output.message.model = {
providerID: currentModel.providerID,
modelID: highVariant,
}
state.modelSwitched = true
log("Think mode: model switched to high variant", {
sessionID,
from: currentModel.modelID,
to: highVariant,
})
}
if (thinkingConfig) {
Object.assign(output.message, thinkingConfig)
state.thinkingConfigInjected = true
log("Think mode: thinking config injected", {
sessionID,
provider: currentModel.providerID,
config: thinkingConfig,
})
}
thinkModeState.set(sessionID, state)
},
event: async ({ event }: { event: { type: string; properties?: unknown } }) => {
if (event.type === "session.deleted") {
const props = event.properties as { info?: { id?: string } } | undefined
if (props?.info?.id) {
thinkModeState.delete(props.info.id)
}
}
},
}
}