From 0c4bbc3cd1128bbda8a0b493200c421b4ba0a862 Mon Sep 17 00:00:00 2001 From: Shoubhit Dash Date: Fri, 25 Sep 2026 22:15:23 +0530 Subject: [PATCH] feat(ai): keep prompt cache across effort switches on GPT-6 Sol and Luna (#51339) --- packages/ai/src/protocols/openai-responses.ts | 6 +++-- packages/ai/test/effort-updates.test.ts | 24 +++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/packages/ai/src/protocols/openai-responses.ts b/packages/ai/src/protocols/openai-responses.ts index 71140613213..e36496954b9 100644 --- a/packages/ai/src/protocols/openai-responses.ts +++ b/packages/ai/src/protocols/openai-responses.ts @@ -143,12 +143,14 @@ const adapter = { restoreHostedToolItem: (item: unknown) => (Schema.is(OpenAIResponsesHostedToolItem)(item) ? item : undefined), } satisfies OpenResponses.ProviderAdapter -// Only GPT-6 Astra accepts `configuration_update`, and never alongside automatic `context_management` compaction. +// GPT-6 Astra, Sol, and Luna accept `configuration_update` only in standard mode (not `reasoning.mode: "pro"` or +// `-pro` slugs), and never alongside automatic `context_management` compaction. const supportsEffortUpdates = (request: LLMRequest) => { if (request.providerOptions?.contextManagement !== undefined) return false + if (Schema.is(Schema.Struct({ mode: Schema.Literal("pro") }))(request.http?.body?.reasoning)) return false const override = request.model.compatibility?.supportsEffortUpdates if (override !== undefined) return override - return /(?:^|\/)gpt-6-astra$/i.test(request.model.id) + return /(?:^|\/)gpt-6-(?:astra|sol|luna)$/i.test(request.model.id) } const nativeImageToolInput = (tool: ToolDefinition) => { diff --git a/packages/ai/test/effort-updates.test.ts b/packages/ai/test/effort-updates.test.ts index 3ce1d13a9c8..0e30911f8ad 100644 --- a/packages/ai/test/effort-updates.test.ts +++ b/packages/ai/test/effort-updates.test.ts @@ -351,10 +351,34 @@ describe("OpenAI Responses effort updates", () => { }), ) + it.effect("strips markers when the body overlay selects pro reasoning mode", () => + Effect.gen(function* () { + const prepared = yield* compileRequest( + LLM.request({ + model: OpenAI.configure({ apiKey: "fixture", http: { body: { reasoning: { mode: "pro" } } } }).responses( + "gpt-6-sol", + ), + messages: conversation, + providerOptions: { reasoningEffort: "low" }, + }), + ) + + expect(updates(prepared.body)).toEqual([]) + expect(prepared.body.reasoning).toEqual({ effort: "low" }) + }), + ) + for (const [id, supported] of [ ["gpt-6-astra", true], ["openai/gpt-6-astra", true], + ["gpt-6-sol", true], + ["openai/gpt-6-sol", true], + ["gpt-6-luna", true], + ["openai/gpt-6-luna", true], ["gpt-6-astra-2026-09-01", false], + ["gpt-6-sol-pro", false], + ["gpt-6-luna-pro", false], + ["gpt-6-sol-fast", false], ["gpt-5.6-sol", false], ] as const) { it.effect(`${supported ? "lowers" : "strips"} markers for ${id}`, () =>