diff --git a/packages/opencode/src/plugin/codex.ts b/packages/opencode/src/plugin/codex.ts index 77c00eb4f0..bdeef9823f 100644 --- a/packages/opencode/src/plugin/codex.ts +++ b/packages/opencode/src/plugin/codex.ts @@ -599,5 +599,10 @@ export async function CodexAuthPlugin(input: PluginInput): Promise { output.headers["User-Agent"] = `opencode/${Installation.VERSION} (${os.platform()} ${os.release()}; ${os.arch()})` output.headers.session_id = input.sessionID }, + "chat.params": async (input, output) => { + if (input.model.providerID !== "openai") return + // Match codex cli + output.maxOutputTokens = undefined + }, } } diff --git a/packages/opencode/src/plugin/github-copilot/copilot.ts b/packages/opencode/src/plugin/github-copilot/copilot.ts index ea759b508b..c0425b7efe 100644 --- a/packages/opencode/src/plugin/github-copilot/copilot.ts +++ b/packages/opencode/src/plugin/github-copilot/copilot.ts @@ -309,6 +309,14 @@ export async function CopilotAuthPlugin(input: PluginInput): Promise { }, ], }, + "chat.params": async (incoming, output) => { + if (!incoming.model.providerID.includes("github-copilot")) return + + // Match github copilot cli, omit maxOutputTokens for gpt models + if (incoming.model.api.id.includes("gpt")) { + output.maxOutputTokens = undefined + } + }, "chat.headers": async (incoming, output) => { if (!incoming.model.providerID.includes("github-copilot")) return diff --git a/packages/opencode/src/session/llm.ts b/packages/opencode/src/session/llm.ts index 7ef6269b58..7f60c02b1d 100644 --- a/packages/opencode/src/session/llm.ts +++ b/packages/opencode/src/session/llm.ts @@ -160,11 +160,6 @@ export namespace LLM { ...input.messages, ] - const maxOutputTokens = - isOpenaiOauth || provider.id.includes("github-copilot") - ? undefined - : ProviderTransform.maxOutputTokens(input.model) - const params = await Plugin.trigger( "chat.params", { @@ -180,7 +175,7 @@ export namespace LLM { : undefined, topP: input.agent.topP ?? ProviderTransform.topP(input.model), topK: ProviderTransform.topK(input.model), - maxOutputTokens, + maxOutputTokens: ProviderTransform.maxOutputTokens(input.model), options, }, ) diff --git a/packages/opencode/test/session/llm.test.ts b/packages/opencode/test/session/llm.test.ts index 18b704f4d3..82ee8c0810 100644 --- a/packages/opencode/test/session/llm.test.ts +++ b/packages/opencode/test/session/llm.test.ts @@ -743,8 +743,7 @@ describe("session.llm.stream", () => { expect((body.reasoning as { effort?: string } | undefined)?.effort).toBe("high") const maxTokens = body.max_output_tokens as number | undefined - const expectedMaxTokens = ProviderTransform.maxOutputTokens(resolved) - expect(maxTokens).toBe(expectedMaxTokens) + expect(maxTokens).toBe(undefined) // match codex cli behavior }, }) })