From fda66bfd40709aa4eda4809d75dcd1ae7115389b Mon Sep 17 00:00:00 2001 From: Dustin Deus Date: Mon, 13 Jul 2026 10:12:06 +0000 Subject: [PATCH] fix(core): request default OpenAI reasoning summaries --- packages/core/src/session/runner/model.ts | 11 +++++------ packages/core/test/session-runner-model.test.ts | 14 ++++++++++++++ packages/llm/src/providers/openai.ts | 1 + 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/packages/core/src/session/runner/model.ts b/packages/core/src/session/runner/model.ts index defd95f9c117..f102fd501a2a 100644 --- a/packages/core/src/session/runner/model.ts +++ b/packages/core/src/session/runner/model.ts @@ -2,6 +2,7 @@ export * as SessionRunnerModel from "./model" import { makeLocationNode } from "../../effect/app-node" import { Model } from "@opencode-ai/llm" +import { OpenAI } from "@opencode-ai/llm/providers" // ast-grep-ignore: no-star-import import * as AnthropicMessages from "@opencode-ai/llm/protocols/anthropic-messages" // ast-grep-ignore: no-star-import @@ -191,20 +192,18 @@ export const fromCatalogModel = ( const packageName = ProviderV2.packageName(resolved.package) const key = apiKey(resolved, credential) - if ( - OpenAICodex.isChatGPT(credential) && - !ProviderV2.isAISDK(resolved.package) && - isNativeOpenAI(resolved.package) - ) { + if (OpenAICodex.isChatGPT(credential) && !ProviderV2.isAISDK(resolved.package) && isNativeOpenAI(resolved.package)) { return Effect.succeed(codexModel(resolved, credential, key)) } if (ProviderV2.isAISDK(resolved.package) && packageName === "@ai-sdk/openai") { if (OpenAICodex.isChatGPT(credential)) return Effect.succeed(codexModel(resolved, credential, key)) + const id = resolved.modelID ?? resolved.id return Effect.succeed( withDefaults(resolved, OpenAIResponses.route) + .with(OpenAI.OpenAIProviderOptions.withOpenAIOptions(id, {})) .with({ auth: key === undefined ? Auth.none : Auth.bearer(key) }) - .model({ id: resolved.modelID ?? resolved.id }), + .model({ id }), ) } if (ProviderV2.isAISDK(resolved.package) && packageName === "@ai-sdk/anthropic") { diff --git a/packages/core/test/session-runner-model.test.ts b/packages/core/test/session-runner-model.test.ts index f3c666b4a97d..38a68fc388ad 100644 --- a/packages/core/test/session-runner-model.test.ts +++ b/packages/core/test/session-runner-model.test.ts @@ -64,6 +64,20 @@ describe("SessionRunnerModel", () => { }), ) + it.effect("requests OpenAI reasoning summaries for default reasoning models", () => + Effect.gen(function* () { + const resolved = yield* SessionRunnerModel.fromCatalogModel( + model(ProviderV2.aisdk("@ai-sdk/openai"), { + modelID: "gpt-5.2", + settings: { baseURL: "https://openai.example/v1" }, + }), + ) + const prepared = yield* LLMClient.prepare(LLM.request({ model: resolved, prompt: "Hello" })) + + expect(prepared.body).toMatchObject({ reasoning: { summary: "auto" } }) + }), + ) + it.effect("keeps catalog apiKey credentials out of provider JSON", () => Effect.gen(function* () { const resolved = yield* SessionRunnerModel.fromCatalogModel( diff --git a/packages/llm/src/providers/openai.ts b/packages/llm/src/providers/openai.ts index 73819eaf471c..fa7cf4f28ec8 100644 --- a/packages/llm/src/providers/openai.ts +++ b/packages/llm/src/providers/openai.ts @@ -7,6 +7,7 @@ import * as OpenAIResponses from "../protocols/openai-responses" import { withOpenAIOptions, type OpenAIProviderOptionsInput } from "./openai-options" export type { OpenAIOptionsInput, OpenAIResponseIncludable } from "./openai-options" +export * as OpenAIProviderOptions from "./openai-options" export const id = ProviderID.make("openai")