@@ -5,6 +5,7 @@ import type {
55import type { ModelDefinitionConfig } from "openclaw/plugin-sdk/provider-model-shared" ;
66import { normalizeModelCompat } from "openclaw/plugin-sdk/provider-model-shared" ;
77import { normalizeOptionalLowercaseString } from "openclaw/plugin-sdk/text-runtime" ;
8+ import { resolveCopilotTransportApi , resolveStaticCopilotModelOverride } from "./model-metadata.js" ;
89
910export const PROVIDER_ID = "github-copilot" ;
1011const CODEX_FORWARD_COMPAT_TARGET_IDS = new Set ( [ "gpt-5.4" , "gpt-5.3-codex" ] ) ;
@@ -19,14 +20,6 @@ function isCopilotCodexModelId(modelId: string): boolean {
1920 return / (?: ^ | [ - _ . ] ) c o d e x (?: $ | [ - _ . ] ) / . test ( modelId ) ;
2021}
2122
22- export function resolveCopilotTransportApi (
23- modelId : string ,
24- ) : "anthropic-messages" | "openai-responses" {
25- return ( normalizeOptionalLowercaseString ( modelId ) ?? "" ) . includes ( "claude" )
26- ? "anthropic-messages"
27- : "openai-responses" ;
28- }
29-
3023export function resolveCopilotForwardCompatModel (
3124 ctx : ProviderResolveDynamicModelContext ,
3225) : ProviderRuntimeModel | undefined {
@@ -62,6 +55,22 @@ export function resolveCopilotForwardCompatModel(
6255 // Template not found — fall through to synthetic catch-all below.
6356 }
6457
58+ const staticOverride = resolveStaticCopilotModelOverride ( lowerModelId ) ;
59+ if ( staticOverride ) {
60+ return normalizeModelCompat ( {
61+ id : trimmedModelId ,
62+ name : staticOverride . name ?? trimmedModelId ,
63+ provider : PROVIDER_ID ,
64+ api : staticOverride . api ?? resolveCopilotTransportApi ( trimmedModelId ) ,
65+ reasoning : staticOverride . reasoning ?? false ,
66+ input : staticOverride . input ?? [ "text" , "image" ] ,
67+ cost : staticOverride . cost ?? { input : 0 , output : 0 , cacheRead : 0 , cacheWrite : 0 } ,
68+ contextWindow : staticOverride . contextWindow ?? DEFAULT_CONTEXT_WINDOW ,
69+ maxTokens : staticOverride . maxTokens ?? DEFAULT_MAX_TOKENS ,
70+ ...( staticOverride . compat ? { compat : staticOverride . compat } : { } ) ,
71+ } as ProviderRuntimeModel ) ;
72+ }
73+
6574 // Catch-all: create a synthetic model definition for any unknown model ID.
6675 // The Copilot API is OpenAI-compatible and will return its own error if the
6776 // model isn't available on the user's plan. This lets new models be used
0 commit comments