From 0bcfb31e7f9e8b363b924ad331fe5efa392ae888 Mon Sep 17 00:00:00 2001 From: Shoubhit Dash Date: Mon, 28 Sep 2026 18:44:14 +0530 Subject: [PATCH] feat(schema): expose effort and thinking binding overrides --- .../client/src/promise/generated/types.ts | 2 ++ packages/core/test/model-resolver.test.ts | 31 +++++++++++++++++++ packages/schema/src/model.ts | 2 ++ 3 files changed, 35 insertions(+) diff --git a/packages/client/src/promise/generated/types.ts b/packages/client/src/promise/generated/types.ts index 4d51de939f7..def60b250da 100644 --- a/packages/client/src/promise/generated/types.ts +++ b/packages/client/src/promise/generated/types.ts @@ -1460,6 +1460,8 @@ export type ModelCompatibility = { requireFinishReason?: boolean requireAssistantAfterTool?: boolean supportsPromptCacheKey?: boolean + supportsEffortUpdates?: boolean + supportsThinkingBlockBinding?: boolean } export type ModelCost = { diff --git a/packages/core/test/model-resolver.test.ts b/packages/core/test/model-resolver.test.ts index 29ddfe746e3..85bcfe0d71c 100644 --- a/packages/core/test/model-resolver.test.ts +++ b/packages/core/test/model-resolver.test.ts @@ -449,6 +449,37 @@ describe("ModelResolver", () => { ), ) + it.effect("lets catalog compatibility disable default effort updates", () => + Effect.gen(function* () { + const request = (compatibility?: Compatibility) => + Effect.gen(function* () { + const resolved = yield* ModelResolver.fromCatalogModel( + model("@opencode/ai/providers/openai", { + modelID: "gpt-6-sol", + compatibility, + settings: { apiKey: "test" }, + }), + ) + const prepared = yield* compileRequest( + LLM.request({ + model: resolved, + messages: [ + Message.user("Before."), + Message.effort({ effort: "low", previous: "high" }), + Message.user("After."), + ], + providerOptions: { reasoningEffort: "low" }, + }), + ) + return prepared.body.input + }) + const update = { type: "configuration_update", reasoning: { effort: "low" } } + + expect(yield* request()).toContainEqual(update) + expect(yield* request({ supportsEffortUpdates: false })).not.toContainEqual(update) + }), + ) + it.effect("uses merged API settings for OpenAI-compatible auth and request defaults", () => Effect.gen(function* () { const resolved = yield* ModelResolver.fromCatalogModel( diff --git a/packages/schema/src/model.ts b/packages/schema/src/model.ts index b52018f9271..b43346ea714 100644 --- a/packages/schema/src/model.ts +++ b/packages/schema/src/model.ts @@ -80,6 +80,8 @@ export const Compatibility = Schema.Struct({ requireFinishReason: Schema.Boolean.pipe(optional), requireAssistantAfterTool: Schema.Boolean.pipe(optional), supportsPromptCacheKey: Schema.Boolean.pipe(optional), + supportsEffortUpdates: Schema.Boolean.pipe(optional), + supportsThinkingBlockBinding: Schema.Boolean.pipe(optional), }).annotate({ identifier: "Model.Compatibility" }) export interface Capabilities extends Schema.Schema.Type {}