diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts index 04d14248b1..4eee1cf321 100644 --- a/packages/opencode/src/provider/transform.ts +++ b/packages/opencode/src/provider/transform.ts @@ -590,6 +590,10 @@ function openAIReasoningEffortVariants() { ) } +function openAICompatibleReasoningEffortVariants() { + return Object.fromEntries(OPENAI_EFFORTS.map((effort) => [effort, { reasoningEffort: effort }])) +} + type ReasoningOption = NonNullable[number] type ReasoningEffortOption = Extract type ReasoningBudgetOption = Extract @@ -828,6 +832,7 @@ export function variants(model: Provider.Model): Record [effort, { reasoning: { effort } }])) case "ai-gateway-provider": + if (idIncludes(model, "openai")) return openAICompatibleReasoningEffortVariants() return Object.fromEntries(WIDELY_SUPPORTED_EFFORTS.map((effort) => [effort, { reasoningEffort: effort }])) case "@ai-sdk/gateway": diff --git a/packages/opencode/test/provider/transform.test.ts b/packages/opencode/test/provider/transform.test.ts index d1230dd6e7..c0146051a0 100644 --- a/packages/opencode/test/provider/transform.test.ts +++ b/packages/opencode/test/provider/transform.test.ts @@ -3881,12 +3881,15 @@ describe("ProviderTransform.variants", () => { release_date: releaseDate, }) - test("falls back to widely-supported OAI efforts", () => { + test("OpenAI upstreams fall back to broad OAI efforts", () => { const result = ProviderTransform.variants(cfModel("openai/gpt-future", "2026-03-05")) expect(result).toEqual({ + none: { reasoningEffort: "none" }, + minimal: { reasoningEffort: "minimal" }, low: { reasoningEffort: "low" }, medium: { reasoningEffort: "medium" }, high: { reasoningEffort: "high" }, + xhigh: { reasoningEffort: "xhigh" }, }) }) diff --git a/packages/opencode/test/tool/read.test.ts b/packages/opencode/test/tool/read.test.ts index c1ef61b227..c0414f6c6a 100644 --- a/packages/opencode/test/tool/read.test.ts +++ b/packages/opencode/test/tool/read.test.ts @@ -316,9 +316,7 @@ describe("tool.read truncation", () => { it.instance("truncates large file by bytes and sets truncated metadata", () => Effect.gen(function* () { const test = yield* TestInstance - const base = yield* load(path.join(FIXTURES_DIR, "models-api.json")) - const target = 60 * 1024 - const content = base.length >= target ? base : base.repeat(Math.ceil(target / base.length)) + const content = `${"x".repeat(80)}\n`.repeat(1_000) yield* put(path.join(test.directory, "large.json"), content) const result = yield* run({ filePath: path.join(test.directory, "large.json") }) diff --git a/packages/opencode/test/tool/truncation.test.ts b/packages/opencode/test/tool/truncation.test.ts index d575a58ffa..e6ef0693ea 100644 --- a/packages/opencode/test/tool/truncation.test.ts +++ b/packages/opencode/test/tool/truncation.test.ts @@ -163,8 +163,7 @@ describe("Truncate", () => { it.live("large single-line file truncates with byte message", () => Effect.gen(function* () { const svc = yield* Truncate.Service - const fsys = yield* FSUtil.Service - const content = yield* fsys.readFileString(path.join(FIXTURES_DIR, "models-api.json")) + const content = "a".repeat(Truncate.MAX_BYTES + 1) const result = yield* svc.output(content) expect(result.truncated).toBe(true)