|
|
|
@@ -110,7 +110,7 @@ export namespace Provider {
|
|
|
|
|
"@ai-sdk/github-copilot": createGitHubCopilotOpenAICompatible,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type CustomModelLoader = (sdk: any, modelID: string, options?: Record<string, any>) => Promise<any>
|
|
|
|
|
type CustomModelLoader = (sdk: any, model: Model, options?: Record<string, any>) => Promise<any>
|
|
|
|
|
type CustomLoader = (provider: Info) => Promise<{
|
|
|
|
|
autoload: boolean
|
|
|
|
|
getModel?: CustomModelLoader
|
|
|
|
@@ -154,8 +154,8 @@ export namespace Provider {
|
|
|
|
|
openai: async () => {
|
|
|
|
|
return {
|
|
|
|
|
autoload: false,
|
|
|
|
|
async getModel(sdk: any, modelID: string, _options?: Record<string, any>) {
|
|
|
|
|
return sdk.responses(modelID)
|
|
|
|
|
async getModel(sdk: any, model: Model, _options?: Record<string, any>) {
|
|
|
|
|
return sdk.responses(model.api.id)
|
|
|
|
|
},
|
|
|
|
|
options: {},
|
|
|
|
|
}
|
|
|
|
@@ -163,9 +163,8 @@ export namespace Provider {
|
|
|
|
|
"github-copilot": async () => {
|
|
|
|
|
return {
|
|
|
|
|
autoload: false,
|
|
|
|
|
async getModel(sdk: any, modelID: string, _options?: Record<string, any>) {
|
|
|
|
|
if (sdk.responses === undefined && sdk.chat === undefined) return sdk.languageModel(modelID)
|
|
|
|
|
return shouldUseCopilotResponsesApi(modelID) ? sdk.responses(modelID) : sdk.chat(modelID)
|
|
|
|
|
async getModel(sdk: any, model: Model, _options?: Record<string, any>) {
|
|
|
|
|
return shouldUseCopilotResponsesApi(model.api.id) ? sdk.responses(model.api.id) : sdk.chat(model.api.id)
|
|
|
|
|
},
|
|
|
|
|
options: {},
|
|
|
|
|
}
|
|
|
|
@@ -173,9 +172,8 @@ export namespace Provider {
|
|
|
|
|
"github-copilot-enterprise": async () => {
|
|
|
|
|
return {
|
|
|
|
|
autoload: false,
|
|
|
|
|
async getModel(sdk: any, modelID: string, _options?: Record<string, any>) {
|
|
|
|
|
if (sdk.responses === undefined && sdk.chat === undefined) return sdk.languageModel(modelID)
|
|
|
|
|
return shouldUseCopilotResponsesApi(modelID) ? sdk.responses(modelID) : sdk.chat(modelID)
|
|
|
|
|
async getModel(sdk: any, model: Model, _options?: Record<string, any>) {
|
|
|
|
|
return shouldUseCopilotResponsesApi(model.api.id) ? sdk.responses(model.api.id) : sdk.chat(model.api.id)
|
|
|
|
|
},
|
|
|
|
|
options: {},
|
|
|
|
|
}
|
|
|
|
@@ -183,12 +181,9 @@ export namespace Provider {
|
|
|
|
|
azure: async () => {
|
|
|
|
|
return {
|
|
|
|
|
autoload: false,
|
|
|
|
|
async getModel(sdk: any, modelID: string, options?: Record<string, any>) {
|
|
|
|
|
if (options?.["useCompletionUrls"]) {
|
|
|
|
|
return sdk.chat(modelID)
|
|
|
|
|
} else {
|
|
|
|
|
return sdk.responses(modelID)
|
|
|
|
|
}
|
|
|
|
|
async getModel(sdk: any, model: Model, options?: Record<string, any>) {
|
|
|
|
|
if (options?.["useCompletionUrls"]) return sdk.chat(model.api.id)
|
|
|
|
|
return sdk.responses(model.api.id)
|
|
|
|
|
},
|
|
|
|
|
options: {},
|
|
|
|
|
}
|
|
|
|
@@ -197,12 +192,9 @@ export namespace Provider {
|
|
|
|
|
const resourceName = Env.get("AZURE_COGNITIVE_SERVICES_RESOURCE_NAME")
|
|
|
|
|
return {
|
|
|
|
|
autoload: false,
|
|
|
|
|
async getModel(sdk: any, modelID: string, options?: Record<string, any>) {
|
|
|
|
|
if (options?.["useCompletionUrls"]) {
|
|
|
|
|
return sdk.chat(modelID)
|
|
|
|
|
} else {
|
|
|
|
|
return sdk.responses(modelID)
|
|
|
|
|
}
|
|
|
|
|
async getModel(sdk: any, model: Model, options?: Record<string, any>) {
|
|
|
|
|
if (options?.["useCompletionUrls"]) return sdk.chat(model.api.id)
|
|
|
|
|
return sdk.responses(model.api.id)
|
|
|
|
|
},
|
|
|
|
|
options: {
|
|
|
|
|
baseURL: resourceName ? `https://${resourceName}.cognitiveservices.azure.com/openai` : undefined,
|
|
|
|
@@ -270,7 +262,8 @@ export namespace Provider {
|
|
|
|
|
return {
|
|
|
|
|
autoload: true,
|
|
|
|
|
options: providerOptions,
|
|
|
|
|
async getModel(sdk: any, modelID: string, options?: Record<string, any>) {
|
|
|
|
|
async getModel(sdk: any, model: Model, options?: Record<string, any>) {
|
|
|
|
|
let modelID = model.api.id
|
|
|
|
|
// Skip region prefixing if model already has a cross-region inference profile prefix
|
|
|
|
|
// Models from models.dev may already include prefixes like us., eu., global., etc.
|
|
|
|
|
const crossRegionPrefixes = ["global.", "us.", "eu.", "jp.", "apac.", "au."]
|
|
|
|
@@ -407,8 +400,8 @@ export namespace Provider {
|
|
|
|
|
return fetch(input, { ...init, headers })
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
async getModel(sdk: any, modelID: string) {
|
|
|
|
|
const id = String(modelID).trim()
|
|
|
|
|
async getModel(sdk: any, model: Model) {
|
|
|
|
|
const id = String(model.api.id).trim()
|
|
|
|
|
return sdk.languageModel(id)
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
@@ -424,8 +417,8 @@ export namespace Provider {
|
|
|
|
|
project,
|
|
|
|
|
location,
|
|
|
|
|
},
|
|
|
|
|
async getModel(sdk: any, modelID) {
|
|
|
|
|
const id = String(modelID).trim()
|
|
|
|
|
async getModel(sdk: any, model: Model) {
|
|
|
|
|
const id = String(model.api.id).trim()
|
|
|
|
|
return sdk.languageModel(id)
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
@@ -449,8 +442,8 @@ export namespace Provider {
|
|
|
|
|
return {
|
|
|
|
|
autoload: !!envServiceKey,
|
|
|
|
|
options: envServiceKey ? { deploymentId, resourceGroup } : {},
|
|
|
|
|
async getModel(sdk: any, modelID: string) {
|
|
|
|
|
return sdk(modelID)
|
|
|
|
|
async getModel(sdk: any, model: Model) {
|
|
|
|
|
return sdk(model.api.id)
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
@@ -496,8 +489,8 @@ export namespace Provider {
|
|
|
|
|
...(providerConfig?.options?.featureFlags || {}),
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
async getModel(sdk: ReturnType<typeof createGitLab>, modelID: string) {
|
|
|
|
|
return sdk.agenticChat(modelID, {
|
|
|
|
|
async getModel(sdk: ReturnType<typeof createGitLab>, model: Model) {
|
|
|
|
|
return sdk.agenticChat(model.api.id, {
|
|
|
|
|
aiGatewayHeaders,
|
|
|
|
|
featureFlags: {
|
|
|
|
|
duo_agent_platform_agentic_chat: true,
|
|
|
|
@@ -526,8 +519,8 @@ export namespace Provider {
|
|
|
|
|
apiKey,
|
|
|
|
|
baseURL: `https://api.cloudflare.com/client/v4/accounts/${accountId}/ai/v1`,
|
|
|
|
|
},
|
|
|
|
|
async getModel(sdk: any, modelID: string) {
|
|
|
|
|
return sdk.languageModel(modelID)
|
|
|
|
|
async getModel(sdk: any, model: Model) {
|
|
|
|
|
return sdk.languageModel(model.api.id)
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
@@ -583,9 +576,9 @@ export namespace Provider {
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
autoload: true,
|
|
|
|
|
async getModel(_sdk: any, modelID: string, _options?: Record<string, any>) {
|
|
|
|
|
async getModel(_sdk: any, model: Model, _options?: Record<string, any>) {
|
|
|
|
|
// Model IDs use Unified API format: provider/model (e.g., "anthropic/claude-sonnet-4-5")
|
|
|
|
|
return aigateway(unified(modelID))
|
|
|
|
|
return aigateway(unified(model.api.id))
|
|
|
|
|
},
|
|
|
|
|
options: {},
|
|
|
|
|
}
|
|
|
|
@@ -621,6 +614,7 @@ export namespace Provider {
|
|
|
|
|
id: z.string(),
|
|
|
|
|
url: z.string(),
|
|
|
|
|
npm: z.string(),
|
|
|
|
|
shape: z.string().optional(),
|
|
|
|
|
}),
|
|
|
|
|
name: z.string(),
|
|
|
|
|
family: z.string().optional(),
|
|
|
|
@@ -709,6 +703,7 @@ export namespace Provider {
|
|
|
|
|
id: model.id,
|
|
|
|
|
url: model.provider?.api ?? provider.api!,
|
|
|
|
|
npm: model.provider?.npm ?? provider.npm ?? "@ai-sdk/openai-compatible",
|
|
|
|
|
shape: model.provider?.shape,
|
|
|
|
|
},
|
|
|
|
|
status: model.status ?? "active",
|
|
|
|
|
headers: model.headers ?? {},
|
|
|
|
@@ -859,6 +854,7 @@ export namespace Provider {
|
|
|
|
|
existingModel?.api.npm ??
|
|
|
|
|
modelsDev[providerID]?.npm ??
|
|
|
|
|
"@ai-sdk/openai-compatible",
|
|
|
|
|
shape: model.provider?.shape ?? existingModel?.api.shape,
|
|
|
|
|
url: model.provider?.api ?? provider?.api ?? existingModel?.api.url ?? modelsDev[providerID]?.api,
|
|
|
|
|
},
|
|
|
|
|
status: model.status ?? existingModel?.status ?? "active",
|
|
|
|
@@ -1199,9 +1195,20 @@ export namespace Provider {
|
|
|
|
|
const sdk = await getSDK(model)
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
const language = s.modelLoaders[model.providerID]
|
|
|
|
|
? await s.modelLoaders[model.providerID](sdk, model.api.id, provider.options)
|
|
|
|
|
: sdk.languageModel(model.api.id)
|
|
|
|
|
const language = await iife(async () => {
|
|
|
|
|
// SDK the type doesn't have .responses or .chat on it, but it CAN when using certain npm packages
|
|
|
|
|
const looselyTyped = sdk as any
|
|
|
|
|
if (looselyTyped.responses !== undefined || looselyTyped.chat !== undefined) {
|
|
|
|
|
if (model.api.shape === "responses") return looselyTyped.responses(model.api.id)
|
|
|
|
|
if (model.api.shape === "completions") return looselyTyped.chat(model.api.id)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const ml = s.modelLoaders[model.providerID]
|
|
|
|
|
if (ml) {
|
|
|
|
|
return await ml(sdk, model, provider.options)
|
|
|
|
|
}
|
|
|
|
|
return sdk.languageModel(model.api.id)
|
|
|
|
|
})
|
|
|
|
|
s.models.set(key, language)
|
|
|
|
|
return language
|
|
|
|
|
} catch (e) {
|
|
|
|
|