From bacf705ee5dc9826e0eff0451c8ea8607777ab66 Mon Sep 17 00:00:00 2001 From: Aiden Cline Date: Thu, 11 Dec 2025 17:07:22 -0600 Subject: [PATCH 1/2] wip --- packages/opencode/src/provider/transform.ts | 33 +++++++++++++++++++++ packages/opencode/src/session/message-v2.ts | 4 +++ 2 files changed, 37 insertions(+) diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts index c0ee45236..c2a92e888 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] @@ -210,6 +211,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 1f4fffaa6..c13f1203d 100644 --- a/packages/opencode/src/session/message-v2.ts +++ b/packages/opencode/src/session/message-v2.ts @@ -286,6 +286,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({ @@ -305,6 +308,7 @@ export namespace MessageV2 { }), system: z.string().optional(), tools: z.record(z.string(), z.boolean()).optional(), + thinking: Thinking.optional(), }).meta({ ref: "UserMessage", }) From 86f9c3acce9e685a1d0b51b9d926f237800f559f Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Thu, 11 Dec 2025 23:08:04 +0000 Subject: [PATCH 2/2] chore: format code --- packages/sdk/js/src/v2/gen/types.gen.ts | 3 +++ packages/sdk/openapi.json | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts index f8890d9fb..e99bac662 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 7c7c216f5..2c657ebc0 100644 --- a/packages/sdk/openapi.json +++ b/packages/sdk/openapi.json @@ -5023,6 +5023,16 @@ "additionalProperties": { "type": "boolean" } + }, + "thinking": { + "type": "object", + "properties": { + "effort": { + "type": "string", + "enum": ["low", "medium", "high"] + } + }, + "required": ["effort"] } }, "required": ["id", "sessionID", "role", "time", "agent", "model"]