Просмотр исходного кода

feat: Allow provider timeout override (#1982)

Beshoy Girgis 5 месяцев назад
Родитель
Сommit
e4cc05a975
2 измененных файлов с 23 добавлено и 1 удалено
  1. 15 0
      packages/opencode/src/config/config.ts
  2. 8 1
      packages/opencode/src/provider/provider.ts

+ 15 - 0
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(),

+ 8 - 1
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