Browse Source

fix(github-copilot): auto-route GPT-5+ models to Responses API (#5877)

Co-authored-by: Claude <[email protected]>
Christopher Tso 1 month ago
parent
commit
fc6c9cbbd2

+ 14 - 8
packages/opencode/src/provider/provider.ts

@@ -41,6 +41,18 @@ import { ProviderTransform } from "./transform"
 export namespace Provider {
 export namespace Provider {
   const log = Log.create({ service: "provider" })
   const log = Log.create({ service: "provider" })
 
 
+  function isGpt5OrLater(modelID: string): boolean {
+    const match = /^gpt-(\d+)/.exec(modelID)
+    if (!match) {
+      return false
+    }
+    return Number(match[1]) >= 5
+  }
+
+  function shouldUseCopilotResponsesApi(modelID: string): boolean {
+    return isGpt5OrLater(modelID) && !modelID.startsWith("gpt-5-mini")
+  }
+
   const BUNDLED_PROVIDERS: Record<string, (options: any) => SDK> = {
   const BUNDLED_PROVIDERS: Record<string, (options: any) => SDK> = {
     "@ai-sdk/amazon-bedrock": createAmazonBedrock,
     "@ai-sdk/amazon-bedrock": createAmazonBedrock,
     "@ai-sdk/anthropic": createAnthropic,
     "@ai-sdk/anthropic": createAnthropic,
@@ -120,10 +132,7 @@ export namespace Provider {
       return {
       return {
         autoload: false,
         autoload: false,
         async getModel(sdk: any, modelID: string, _options?: Record<string, any>) {
         async getModel(sdk: any, modelID: string, _options?: Record<string, any>) {
-          if (modelID.includes("codex")) {
-            return sdk.responses(modelID)
-          }
-          return sdk.chat(modelID)
+          return shouldUseCopilotResponsesApi(modelID) ? sdk.responses(modelID) : sdk.chat(modelID)
         },
         },
         options: {},
         options: {},
       }
       }
@@ -132,10 +141,7 @@ export namespace Provider {
       return {
       return {
         autoload: false,
         autoload: false,
         async getModel(sdk: any, modelID: string, _options?: Record<string, any>) {
         async getModel(sdk: any, modelID: string, _options?: Record<string, any>) {
-          if (modelID.includes("codex")) {
-            return sdk.responses(modelID)
-          }
-          return sdk.chat(modelID)
+          return shouldUseCopilotResponsesApi(modelID) ? sdk.responses(modelID) : sdk.chat(modelID)
         },
         },
         options: {},
         options: {},
       }
       }

+ 5 - 1
packages/opencode/src/provider/transform.ts

@@ -524,7 +524,11 @@ export namespace ProviderTransform {
     const result: Record<string, any> = {}
     const result: Record<string, any> = {}
 
 
     // openai and providers using openai package should set store to false by default.
     // 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") {
+    if (
+      input.model.providerID === "openai" ||
+      input.model.api.npm === "@ai-sdk/openai" ||
+      input.model.api.npm === "@ai-sdk/github-copilot"
+    ) {
       result["store"] = false
       result["store"] = false
     }
     }