diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index 1574c644d322..6cb47eec6181 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -831,6 +831,10 @@ export namespace Config { }), ) .optional(), + requestOptions: z + .record(z.string(), z.any()) + .optional() + .describe("Default per-request model options applied to all models for this provider"), options: z .object({ apiKey: z.string().optional(), @@ -857,6 +861,26 @@ export namespace Config { .optional(), }) .strict() + .transform((provider) => { + const store = provider.options?.store + const requestOptions = { + ...(provider.requestOptions ?? {}), + ...(typeof store === "boolean" && provider.requestOptions?.store === undefined ? { store } : {}), + } + + const options = + provider.options == null + ? undefined + : Object.fromEntries(Object.entries(provider.options).filter(([key]) => key !== "store")) + + const hasRequestOptions = Object.keys(requestOptions).length > 0 + + return { + ...provider, + options, + requestOptions: hasRequestOptions ? requestOptions : undefined, + } + }) .meta({ ref: "ProviderConfig", }) diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index bcb115edf419..3e7a27fcf3f0 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -579,6 +579,7 @@ export namespace Provider { env: z.string().array(), key: z.string().optional(), options: z.record(z.string(), z.any()), + requestOptions: z.record(z.string(), z.any()).optional(), models: z.record(z.string(), Model), }) .meta({ @@ -725,6 +726,7 @@ export namespace Provider { name: provider.name ?? existing?.name ?? providerID, env: provider.env ?? existing?.env ?? [], options: mergeDeep(existing?.options ?? {}, provider.options ?? {}), + requestOptions: mergeDeep(existing?.requestOptions ?? {}, provider.requestOptions ?? {}), source: "config", models: existing?.models ?? {}, } diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts index 71295ba2b67b..a5ecce82f456 100644 --- a/packages/opencode/src/provider/transform.ts +++ b/packages/opencode/src/provider/transform.ts @@ -505,14 +505,20 @@ export namespace ProviderTransform { model: Provider.Model sessionID: string providerOptions?: Record + requestOptions?: Record }): Record { const result: Record = {} // openai and providers using openai package should set store to false by default. - if (input.model.providerID === "openai" || input.model.api.npm === "@ai-sdk/openai") { + const openai = input.model.providerID === "openai" || input.model.api.npm === "@ai-sdk/openai" + if (openai) { result["store"] = false } + if (openai && typeof input.requestOptions?.store === "boolean") { + result["store"] = input.requestOptions.store + } + if (input.model.api.npm === "@openrouter/ai-sdk-provider") { result["usage"] = { include: true, diff --git a/packages/opencode/src/session/llm.ts b/packages/opencode/src/session/llm.ts index 1029b45ea0db..a852e8e33b02 100644 --- a/packages/opencode/src/session/llm.ts +++ b/packages/opencode/src/session/llm.ts @@ -101,6 +101,7 @@ export namespace LLM { model: input.model, sessionID: input.sessionID, providerOptions: provider.options, + requestOptions: provider.requestOptions, }) const options: Record = pipe( base,