Dax Raad 8 месяцев назад
Родитель
Сommit
4e7f6c47fd
1 измененных файлов с 31 добавлено и 13 удалено
  1. 31 13
      packages/opencode/src/provider/provider.ts

+ 31 - 13
packages/opencode/src/provider/provider.ts

@@ -28,20 +28,21 @@ import { TaskTool } from "../tool/task"
 export namespace Provider {
   const log = Log.create({ service: "provider" })
 
-  type CustomLoader = (provider: ModelsDev.Provider) => Promise<
-    | {
-        getModel?: (sdk: any, modelID: string) => Promise<any>
-        options: Record<string, any>
-      }
-    | false
-  >
+  type CustomLoader = (
+    provider: ModelsDev.Provider,
+    api?: string,
+  ) => Promise<{
+    autoload: boolean
+    getModel?: (sdk: any, modelID: string) => Promise<any>
+    options?: Record<string, any>
+  }>
 
   type Source = "env" | "config" | "custom" | "api"
 
   const CUSTOM_LOADERS: Record<string, CustomLoader> = {
     async anthropic(provider) {
       const access = await AuthAnthropic.access()
-      if (!access) return false
+      if (!access) return { autoload: false }
       for (const model of Object.values(provider.models)) {
         model.cost = {
           input: 0,
@@ -49,6 +50,7 @@ export namespace Provider {
         }
       }
       return {
+        autoload: true,
         options: {
           apiKey: "",
           async fetch(input: any, init: any) {
@@ -69,9 +71,9 @@ export namespace Provider {
     },
     "github-copilot": async (provider) => {
       const copilot = await AuthCopilot()
-      if (!copilot) return false
+      if (!copilot) return { autoload: false }
       let info = await Auth.get("github-copilot")
-      if (!info || info.type !== "oauth") return false
+      if (!info || info.type !== "oauth") return { autoload: false }
 
       if (provider && provider.models) {
         for (const model of Object.values(provider.models)) {
@@ -83,6 +85,7 @@ export namespace Provider {
       }
 
       return {
+        autoload: true,
         options: {
           apiKey: "",
           async fetch(input: any, init: any) {
@@ -113,9 +116,18 @@ export namespace Provider {
         },
       }
     },
+    openai: async () => {
+      return {
+        autoload: false,
+        async getModel(sdk: any, modelID: string) {
+          return sdk.responses(modelID)
+        },
+        options: {},
+      }
+    },
     "amazon-bedrock": async () => {
       if (!process.env["AWS_PROFILE"] && !process.env["AWS_ACCESS_KEY_ID"])
-        return false
+        return { autoload: false }
 
       const region = process.env["AWS_REGION"] ?? "us-east-1"
 
@@ -123,6 +135,7 @@ export namespace Provider {
         await BunProc.install("@aws-sdk/credential-providers")
       )
       return {
+        autoload: true,
         options: {
           region,
           credentialProvider: fromNodeProviderChain(),
@@ -248,8 +261,13 @@ export namespace Provider {
     for (const [providerID, fn] of Object.entries(CUSTOM_LOADERS)) {
       if (disabled.has(providerID)) continue
       const result = await fn(database[providerID])
-      if (result) {
-        mergeProvider(providerID, result.options, "custom", result.getModel)
+      if (result && (result.autoload || providers[providerID])) {
+        mergeProvider(
+          providerID,
+          result.options ?? {},
+          "custom",
+          result.getModel,
+        )
       }
     }