diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index 2041ac35..804a0274 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -392,6 +392,21 @@ export namespace Config { .object({ apiKey: z.string().optional(), baseURL: z.string().optional(), + timeout: z + .union([ + z + .number() + .int() + .positive() + .describe( + "Timeout in milliseconds for requests to this provider. Default is 300000 (5 minutes). Set to false to disable timeout.", + ), + z.literal(false).describe("Disable timeout for this provider entirely."), + ]) + .optional() + .describe( + "Timeout in milliseconds for requests to this provider. Default is 300000 (5 minutes). Set to false to disable timeout.", + ), }) .catchall(z.any()) .optional(), diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index e37f11f0..c60bbf79 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -320,9 +320,16 @@ export namespace Provider { const pkg = provider.npm ?? provider.id const mod = await import(await BunProc.install(pkg, "latest")) const fn = mod[Object.keys(mod).find((key) => key.startsWith("create"))!] + let options = { ...s.providers[provider.id]?.options } + if (options["timeout"] !== undefined) { + // Only override fetch if user explicitly sets timeout + options["fetch"] = async (input: any, init?: any) => { + return await fetch(input, { ...init, timeout: options["timeout"] }) + } + } const loaded = fn({ name: provider.id, - ...s.providers[provider.id]?.options, + ...options, }) s.sdk.set(provider.id, loaded) return loaded as SDK