diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts index d86fe9022..4089dde53 100644 --- a/packages/opencode/src/provider/transform.ts +++ b/packages/opencode/src/provider/transform.ts @@ -3,6 +3,7 @@ import { unique } from "remeda" import type { JSONSchema } from "zod/v4/core" import type { Provider } from "./provider" import type { ModelsDev } from "./models" +import type { MessageV2 } from "@/session/message-v2" type Modality = NonNullable["input"][number] @@ -241,6 +242,38 @@ export namespace ProviderTransform { return undefined } + export function thinking(model: Provider.Model, thinking: MessageV2.Thinking) { + if (!model.capabilities.reasoning) return undefined + + switch (model.api.npm) { + case "@openrouter/ai-sdk-provider": + return { + reasoning: { effort: thinking.effort }, + } + case "@ai-sdk/openai-compatible": + const result: Record = { + reasoningEffort: thinking.effort, + } + + if (model.providerID === "baseten") { + result["chat_template_args"] = { enable_thinking: true } + } + + return result + + case "@ai-sdk/openai": + return { + reasoningEffort: thinking.effort, + reasoningSummary: "auto", + include: ["reasoning.encrypted_content"], + } + + case "@ai-sdk/anthropic": + // TODO: map to thinking budgets + return {} + } + } + export function options( model: Provider.Model, sessionID: string, diff --git a/packages/opencode/src/session/message-v2.ts b/packages/opencode/src/session/message-v2.ts index 14542669e..77858fa03 100644 --- a/packages/opencode/src/session/message-v2.ts +++ b/packages/opencode/src/session/message-v2.ts @@ -287,6 +287,9 @@ export namespace MessageV2 { sessionID: z.string(), }) + export const Thinking = z.object({ effort: z.enum(["low", "medium", "high"]) }) + export type Thinking = z.infer + export const User = Base.extend({ role: z.literal("user"), time: z.object({ @@ -306,6 +309,7 @@ export namespace MessageV2 { }), system: z.string().optional(), tools: z.record(z.string(), z.boolean()).optional(), + thinking: Thinking.optional(), }).meta({ ref: "UserMessage", }) diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts index 1372765e3..899dd7c22 100644 --- a/packages/sdk/js/src/v2/gen/types.gen.ts +++ b/packages/sdk/js/src/v2/gen/types.gen.ts @@ -90,6 +90,9 @@ export type UserMessage = { tools?: { [key: string]: boolean } + thinking?: { + effort: "low" | "medium" | "high" + } } export type ProviderAuthError = { diff --git a/packages/sdk/openapi.json b/packages/sdk/openapi.json index 588b130b9..999a89ecb 100644 --- a/packages/sdk/openapi.json +++ b/packages/sdk/openapi.json @@ -5228,6 +5228,16 @@ "additionalProperties": { "type": "boolean" } + }, + "thinking": { + "type": "object", + "properties": { + "effort": { + "type": "string", + "enum": ["low", "medium", "high"] + } + }, + "required": ["effort"] } }, "required": ["id", "sessionID", "role", "time", "agent", "model"]