diff --git a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx index 9494b81cb1..0709fb253e 100644 --- a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx @@ -21,6 +21,7 @@ import { Editor } from "@tui/util/editor" import { useExit } from "../../context/exit" import { Clipboard } from "../../util/clipboard" import type { FilePart } from "@opencode-ai/sdk/v2" +import type { MessageV2 } from "@/session/message-v2" import { TuiEvent } from "../../event" import { iife } from "@/util/iife" import { Locale } from "@/util/locale" @@ -171,6 +172,7 @@ export function Prompt(props: PromptProps) { extmarkToPartIndex: Map interrupt: number placeholder: number + effort: MessageV2.Thinking["effort"] }>({ placeholder: Math.floor(Math.random() * PLACEHOLDERS.length), prompt: { @@ -180,6 +182,7 @@ export function Prompt(props: PromptProps) { mode: "normal", extmarkToPartIndex: new Map(), interrupt: 0, + effort: "default", }) command.register(() => { @@ -510,6 +513,7 @@ export function Prompt(props: PromptProps) { parts: [], }) setStore("extmarkToPartIndex", new Map()) + setStore("effort", "default") }, submit() { submit() @@ -841,6 +845,14 @@ export function Prompt(props: PromptProps) { return } } + if (keybind.match("effort_cycle", e)) { + e.preventDefault() + const levels: MessageV2.Thinking["effort"][] = ["default", "medium", "high"] + const currentIndex = levels.indexOf(store.effort) + const nextIndex = (currentIndex + 1) % levels.length + setStore("effort", levels[nextIndex]) + return + } if (store.mode === "normal") autocomplete.onKeyDown(e) if (!autocomplete.visible) { if ( @@ -956,6 +968,12 @@ export function Prompt(props: PromptProps) { {local.model.parsed().model} {local.model.parsed().provider} + + ยท + + {store.effort} + + diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index 802c5db929..ff8a0cf4d4 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -478,6 +478,7 @@ export namespace Config { agent_list: z.string().optional().default("a").describe("List agents"), agent_cycle: z.string().optional().default("tab").describe("Next agent"), agent_cycle_reverse: z.string().optional().default("shift+tab").describe("Previous agent"), + effort_cycle: z.string().optional().default("ctrl+t").describe("Cycle thinking effort level"), input_clear: z.string().optional().default("ctrl+c").describe("Clear input field"), input_paste: z.string().optional().default("ctrl+v").describe("Paste from clipboard"), input_submit: z.string().optional().default("return").describe("Submit input"), diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts index 7b1e2909ea..edfdf2bd6c 100644 --- a/packages/opencode/src/provider/transform.ts +++ b/packages/opencode/src/provider/transform.ts @@ -245,7 +245,7 @@ export namespace ProviderTransform { } export function thinking(model: Provider.Model, thinking: MessageV2.Thinking) { - if (!model.capabilities.reasoning) return undefined + if (!model.capabilities.reasoning || thinking.effort === "default") return undefined switch (model.api.npm) { case "@openrouter/ai-sdk-provider": diff --git a/packages/opencode/src/session/message-v2.ts b/packages/opencode/src/session/message-v2.ts index 11812d19a1..4349e75044 100644 --- a/packages/opencode/src/session/message-v2.ts +++ b/packages/opencode/src/session/message-v2.ts @@ -289,7 +289,7 @@ export namespace MessageV2 { sessionID: z.string(), }) - export const Thinking = z.object({ effort: z.enum(["low", "medium", "high"]) }) + export const Thinking = z.object({ effort: z.enum(["default", "medium", "high"]) }) export type Thinking = z.infer export const User = Base.extend({ diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts index 0e374c952d..c8016012f5 100644 --- a/packages/sdk/js/src/v2/gen/types.gen.ts +++ b/packages/sdk/js/src/v2/gen/types.gen.ts @@ -91,7 +91,7 @@ export type UserMessage = { [key: string]: boolean } thinking?: { - effort: "low" | "medium" | "high" + effort: "default" | "medium" | "high" } } @@ -972,6 +972,10 @@ export type KeybindsConfig = { * Previous agent */ agent_cycle_reverse?: string + /** + * Cycle thinking effort level + */ + effort_cycle?: string /** * Clear input field */