Files
oh-my-opencode/src/hooks/think-mode/detector.ts
T
YeonGyu-Kim 589cf60252 feat(hooks): add think-mode hook for automatic model switching
Detects thinking keywords (ultrathink, deepthink, etc.) and switches
to thinking-capable models automatically.

Supports model patterns:
- claude-sonnet-4-0 -> claude-sonnet-4-0-max-thinking
- claude-sonnet-4-20250514 -> claude-sonnet-4-20250514-max-thinking

🤖 GENERATED WITH ASSISTANCE OF [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)
2025-12-09 16:59:22 +09:00

58 lines
1.9 KiB
TypeScript

const ENGLISH_PATTERNS = [/\bultrathink\b/i, /\bthink\b/i]
const MULTILINGUAL_KEYWORDS = [
"생각", "고민", "검토", "제대로",
"思考", "考虑", "考慮",
"思考", "考え", "熟考",
"सोच", "विचार",
"تفكير", "تأمل",
"চিন্তা", "ভাবনা",
"думать", "думай", "размышлять", "размышляй",
"pensar", "pense", "refletir", "reflita",
"pensar", "piensa", "reflexionar", "reflexiona",
"penser", "pense", "réfléchir", "réfléchis",
"denken", "denk", "nachdenken",
"suy nghĩ", "cân nhắc",
"düşün", "düşünmek",
"pensare", "pensa", "riflettere", "rifletti",
"คิด", "พิจารณา",
"myśl", "myśleć", "zastanów",
"denken", "denk", "nadenken",
"berpikir", "pikir", "pertimbangkan",
"думати", "думай", "роздумувати",
"σκέψου", "σκέφτομαι",
"myslet", "mysli", "přemýšlet",
"gândește", "gândi", "reflectă",
"tänka", "tänk", "fundera",
"gondolkodj", "gondolkodni",
"ajattele", "ajatella", "pohdi",
"tænk", "tænke", "overvej",
"tenk", "tenke", "gruble",
"חשוב", "לחשוב", "להרהר",
"fikir", "berfikir",
]
const MULTILINGUAL_PATTERNS = MULTILINGUAL_KEYWORDS.map((kw) => new RegExp(kw, "i"))
const THINK_PATTERNS = [...ENGLISH_PATTERNS, ...MULTILINGUAL_PATTERNS]
const CODE_BLOCK_PATTERN = /```[\s\S]*?```/g
const INLINE_CODE_PATTERN = /`[^`]+`/g
function removeCodeBlocks(text: string): string {
return text.replace(CODE_BLOCK_PATTERN, "").replace(INLINE_CODE_PATTERN, "")
}
export function detectThinkKeyword(text: string): boolean {
const textWithoutCode = removeCodeBlocks(text)
return THINK_PATTERNS.some((pattern) => pattern.test(textWithoutCode))
}
export function extractPromptText(
parts: Array<{ type: string; text?: string }>
): string {
return parts
.filter((p) => p.type === "text")
.map((p) => p.text || "")
.join("")
}