From c0e8903a58b1065d9f6a8f9fb3d248501fad90ce Mon Sep 17 00:00:00 2001 From: Ramin Tadayon Date: Thu, 1 May 2025 10:06:03 -0700 Subject: [PATCH 1/5] Splits out Azure provider from OpenAI Compatible providers --- docs/telemetry-events.md | 14 +- package.json | 21 +- src/config.ts | 3 + src/constants.ai.ts | 10 +- src/plus/ai/aiProviderService.ts | 8 + src/plus/ai/azureProvider.ts | 384 ++++++++++++++++++++++++ src/plus/ai/openAICompatibleProvider.ts | 27 +- src/plus/ai/openaiProvider.ts | 3 +- src/plus/ai/utils/-webview/ai.utils.ts | 4 + 9 files changed, 442 insertions(+), 32 deletions(-) create mode 100644 src/plus/ai/azureProvider.ts diff --git a/docs/telemetry-events.md b/docs/telemetry-events.md index 62faa6def5e7f..f48346b737d4f 100644 --- a/docs/telemetry-events.md +++ b/docs/telemetry-events.md @@ -124,7 +124,7 @@ 'failed.reason': 'user-declined' | 'user-cancelled' | 'error', 'input.length': number, 'model.id': string, - 'model.provider.id': 'anthropic' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'ollama' | 'openai' | 'openaicompatible' | 'openrouter' | 'vscode' | 'xai', + 'model.provider.id': 'anthropic' | 'azure' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'ollama' | 'openai' | 'openaicompatible' | 'openrouter' | 'vscode' | 'xai', 'model.provider.name': string, 'output.length': number, 'retry.count': number, @@ -155,7 +155,7 @@ 'failed.reason': 'user-declined' | 'user-cancelled' | 'error', 'input.length': number, 'model.id': string, - 'model.provider.id': 'anthropic' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'ollama' | 'openai' | 'openaicompatible' | 'openrouter' | 'vscode' | 'xai', + 'model.provider.id': 'anthropic' | 'azure' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'ollama' | 'openai' | 'openaicompatible' | 'openrouter' | 'vscode' | 'xai', 'model.provider.name': string, 'output.length': number, 'retry.count': number, @@ -185,7 +185,7 @@ or 'failed.reason': 'user-declined' | 'user-cancelled' | 'error', 'input.length': number, 'model.id': string, - 'model.provider.id': 'anthropic' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'ollama' | 'openai' | 'openaicompatible' | 'openrouter' | 'vscode' | 'xai', + 'model.provider.id': 'anthropic' | 'azure' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'ollama' | 'openai' | 'openaicompatible' | 'openrouter' | 'vscode' | 'xai', 'model.provider.name': string, 'output.length': number, 'retry.count': number, @@ -214,7 +214,7 @@ or 'failed.reason': 'user-declined' | 'user-cancelled' | 'error', 'input.length': number, 'model.id': string, - 'model.provider.id': 'anthropic' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'ollama' | 'openai' | 'openaicompatible' | 'openrouter' | 'vscode' | 'xai', + 'model.provider.id': 'anthropic' | 'azure' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'ollama' | 'openai' | 'openaicompatible' | 'openrouter' | 'vscode' | 'xai', 'model.provider.name': string, 'output.length': number, 'retry.count': number, @@ -243,7 +243,7 @@ or 'failed.reason': 'user-declined' | 'user-cancelled' | 'error', 'input.length': number, 'model.id': string, - 'model.provider.id': 'anthropic' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'ollama' | 'openai' | 'openaicompatible' | 'openrouter' | 'vscode' | 'xai', + 'model.provider.id': 'anthropic' | 'azure' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'ollama' | 'openai' | 'openaicompatible' | 'openrouter' | 'vscode' | 'xai', 'model.provider.name': string, 'output.length': number, 'retry.count': number, @@ -272,7 +272,7 @@ or 'failed.reason': 'user-declined' | 'user-cancelled' | 'error', 'input.length': number, 'model.id': string, - 'model.provider.id': 'anthropic' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'ollama' | 'openai' | 'openaicompatible' | 'openrouter' | 'vscode' | 'xai', + 'model.provider.id': 'anthropic' | 'azure' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'ollama' | 'openai' | 'openaicompatible' | 'openrouter' | 'vscode' | 'xai', 'model.provider.name': string, 'output.length': number, 'retry.count': number, @@ -295,7 +295,7 @@ or ```typescript { 'model.id': string, - 'model.provider.id': 'anthropic' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'ollama' | 'openai' | 'openaicompatible' | 'openrouter' | 'vscode' | 'xai', + 'model.provider.id': 'anthropic' | 'azure' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'ollama' | 'openai' | 'openaicompatible' | 'openrouter' | 'vscode' | 'xai', 'model.provider.name': string } ``` diff --git a/package.json b/package.json index e91da908ca905..360bc20d2477f 100644 --- a/package.json +++ b/package.json @@ -4047,7 +4047,7 @@ "null" ], "default": null, - "pattern": "^((anthropic|deepseek|gemini|github|huggingface|ollama|openai|openaicompatible|openrouter|xai):([\\w.-:]+)|gitkraken|vscode)$", + "pattern": "^((anthropic|azure|deepseek|gemini|github|huggingface|ollama|openai|openaicompatible|openrouter|xai):([\\w.-:]+)|gitkraken|vscode)$", "markdownDescription": "Specifies the AI provider and model to use for GitLens' AI features. Should be formatted as `provider:model` (e.g. `openai:gpt-4o` or `anthropic:claude-3-5-sonnet-latest`), `gitkraken` for GitKraken AI provided models, or `vscode` for models provided by the VS Code extension API (e.g. Copilot)", "scope": "window", "order": 10, @@ -4102,22 +4102,35 @@ "null" ], "default": null, - "markdownDescription": "Specifies a custom URL to use for access to an OpenAI model via Azure. Azure URLs should be in the following format: https://{your-resource-name}.openai.azure.com/openai/deployments/{deployment-id}/chat/completions?api-version={api-version}", + "markdownDescription": "Specifies a custom URL to use for access to an OpenAI model.", "scope": "window", "order": 31, "tags": [ "preview" ] }, + "gitlens.ai.azure.url": { + "type": [ + "string", + "null" + ], + "default": null, + "markdownDescription": "Specifies a custom URL to use for access to an Azure OpenAI model. Azure URLs should be in the following format: https://{your-resource-name}.openai.azure.com/openai/deployments/{deployment-id}/chat/completions?api-version={api-version}", + "scope": "window", + "order": 32, + "tags": [ + "preview" + ] + }, "gitlens.ai.openaicompatible.url": { "type": [ "string", "null" ], "default": null, - "markdownDescription": "Specifies a custom URL to use for access to an OpenAI-compatible model. Azure URLs should be in the following format: https://{your-resource-name}.openai.azure.com/openai/deployments/{deployment-id}/chat/completions?api-version={api-version}", + "markdownDescription": "Specifies a custom URL to use for access to an OpenAI-compatible model.", "scope": "window", - "order": 31, + "order": 33, "tags": [ "preview" ] diff --git a/src/config.ts b/src/config.ts index 30046291ccb80..04aa6e39d6900 100644 --- a/src/config.ts +++ b/src/config.ts @@ -210,6 +210,9 @@ export interface AdvancedConfig { } interface AIConfig { + readonly azure: { + readonly url: string | null; + }; readonly explainChanges: { readonly customInstructions: string; }; diff --git a/src/constants.ai.ts b/src/constants.ai.ts index d2067f5f9d671..346ebbd78d44f 100644 --- a/src/constants.ai.ts +++ b/src/constants.ai.ts @@ -2,6 +2,7 @@ import type { AIProviderDescriptor } from './plus/ai/models/model'; export type AIProviders = | 'anthropic' + | 'azure' | 'deepseek' | 'gemini' | 'github' @@ -39,9 +40,16 @@ export const openAIProviderDescriptor: AIProviderDescriptor<'openai'> = { requiresAccount: true, requiresUserKey: true, } as const; +export const azureProviderDescriptor: AIProviderDescriptor<'azure'> = { + id: 'azure', + name: 'Azure', + primary: false, + requiresAccount: true, + requiresUserKey: true, +} as const; export const openAICompatibleProviderDescriptor: AIProviderDescriptor<'openaicompatible'> = { id: 'openaicompatible', - name: 'OpenAI-Compatible Provider (Azure, etc.)', + name: 'OpenAI-Compatible Provider', primary: false, requiresAccount: true, requiresUserKey: true, diff --git a/src/plus/ai/aiProviderService.ts b/src/plus/ai/aiProviderService.ts index c105267997443..af636a411c898 100644 --- a/src/plus/ai/aiProviderService.ts +++ b/src/plus/ai/aiProviderService.ts @@ -3,6 +3,7 @@ import { CancellationTokenSource, env, EventEmitter, window } from 'vscode'; import type { AIPrimaryProviders, AIProviderAndModel, AIProviders, SupportedAIModels } from '../../constants.ai'; import { anthropicProviderDescriptor, + azureProviderDescriptor, deepSeekProviderDescriptor, geminiProviderDescriptor, githubProviderDescriptor, @@ -151,6 +152,13 @@ const supportedAIProviders = new Map( type: lazy(async () => (await import(/* webpackChunkName: "ai" */ './openaiProvider')).OpenAIProvider), }, ], + [ + 'azure', + { + ...azureProviderDescriptor, + type: lazy(async () => (await import(/* webpackChunkName: "ai" */ './azureProvider')).AzureProvider), + }, + ], [ 'openaicompatible', { diff --git a/src/plus/ai/azureProvider.ts b/src/plus/ai/azureProvider.ts new file mode 100644 index 0000000000000..d50fd86eb61fd --- /dev/null +++ b/src/plus/ai/azureProvider.ts @@ -0,0 +1,384 @@ +import type { Disposable } from 'vscode'; +import { window } from 'vscode'; +import { openAICompatibleProviderDescriptor as provider } from '../../constants.ai'; +import { configuration } from '../../system/-webview/configuration'; +import type { AIActionType, AIModel } from './models/model'; +import { OpenAICompatibleProviderBase } from './openAICompatibleProviderBase'; +import { isAzureUrl } from './utils/-webview/ai.utils'; + +type AzureModel = AIModel; +const models: AzureModel[] = [ + { + id: 'gpt-4.1', + name: 'GPT-4.1', + maxTokens: { input: 1047576, output: 32768 }, + provider: provider, + }, + { + id: 'gpt-4.1-2025-04-14', + name: 'GPT-4.1 (2025-04-14)', + maxTokens: { input: 1047576, output: 32768 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-4.1-mini', + name: 'GPT-4.1 mini', + maxTokens: { input: 1047576, output: 32768 }, + provider: provider, + }, + { + id: 'gpt-4.1-mini-2025-04-14', + name: 'GPT-4.1 mini (2025-04-14)', + maxTokens: { input: 1047576, output: 32768 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-4.1-nano', + name: 'GPT-4.1 nano', + maxTokens: { input: 1047576, output: 32768 }, + provider: provider, + }, + { + id: 'gpt-4.1-nano-2025-04-14', + name: 'GPT-4.1 nano (2025-04-14)', + maxTokens: { input: 1047576, output: 32768 }, + provider: provider, + hidden: true, + }, + { + id: 'o4-mini', + name: 'o4 mini', + maxTokens: { input: 200000, output: 100000 }, + provider: provider, + temperature: null, + }, + { + id: 'o4-mini-2025-04-16', + name: 'o4 mini (2025-04-16)', + maxTokens: { input: 200000, output: 100000 }, + provider: provider, + temperature: null, + hidden: true, + }, + { + id: 'o3', + name: 'o3', + maxTokens: { input: 200000, output: 100000 }, + provider: provider, + temperature: null, + }, + { + id: 'o3-2025-04-16', + name: 'o3 (2025-04-16)', + maxTokens: { input: 200000, output: 100000 }, + provider: provider, + temperature: null, + hidden: true, + }, + { + id: 'o3-mini', + name: 'o3 mini', + maxTokens: { input: 200000, output: 100000 }, + provider: provider, + temperature: null, + }, + { + id: 'o3-mini-2025-01-31', + name: 'o3 mini', + maxTokens: { input: 200000, output: 100000 }, + provider: provider, + temperature: null, + hidden: true, + }, + { + id: 'o1', + name: 'o1', + maxTokens: { input: 200000, output: 100000 }, + provider: provider, + temperature: null, + }, + { + id: 'o1-2024-12-17', + name: 'o1', + maxTokens: { input: 200000, output: 100000 }, + provider: provider, + temperature: null, + hidden: true, + }, + { + id: 'o1-preview', + name: 'o1 preview', + maxTokens: { input: 128000, output: 32768 }, + provider: provider, + temperature: null, + hidden: true, + }, + { + id: 'o1-preview-2024-09-12', + name: 'o1 preview', + maxTokens: { input: 128000, output: 32768 }, + provider: provider, + temperature: null, + hidden: true, + }, + { + id: 'o1-mini', + name: 'o1 mini', + maxTokens: { input: 128000, output: 65536 }, + provider: provider, + temperature: null, + }, + { + id: 'o1-mini-2024-09-12', + name: 'o1 mini', + maxTokens: { input: 128000, output: 65536 }, + provider: provider, + temperature: null, + hidden: true, + }, + { + id: 'gpt-4o', + name: 'GPT-4o', + maxTokens: { input: 128000, output: 16384 }, + provider: provider, + default: true, + }, + { + id: 'gpt-4o-2024-11-20', + name: 'GPT-4o', + maxTokens: { input: 128000, output: 16384 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-4o-2024-08-06', + name: 'GPT-4o', + maxTokens: { input: 128000, output: 16384 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-4o-2024-05-13', + name: 'GPT-4o', + maxTokens: { input: 128000, output: 4096 }, + provider: provider, + hidden: true, + }, + { + id: 'chatgpt-4o-latest', + name: 'GPT-4o', + maxTokens: { input: 128000, output: 16384 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-4o-mini', + name: 'GPT-4o mini', + maxTokens: { input: 128000, output: 16384 }, + provider: provider, + }, + { + id: 'gpt-4o-mini-2024-07-18', + name: 'GPT-4o mini', + maxTokens: { input: 128000, output: 16384 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-4-turbo', + name: 'GPT-4 Turbo', + maxTokens: { input: 128000, output: 4096 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-4-turbo-2024-04-09', + name: 'GPT-4 Turbo preview (2024-04-09)', + maxTokens: { input: 128000, output: 4096 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-4-turbo-preview', + name: 'GPT-4 Turbo preview', + maxTokens: { input: 128000, output: 4096 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-4-0125-preview', + name: 'GPT-4 0125 preview', + maxTokens: { input: 128000, output: 4096 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-4-1106-preview', + name: 'GPT-4 1106 preview', + maxTokens: { input: 128000, output: 4096 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-4', + name: 'GPT-4', + maxTokens: { input: 8192, output: 4096 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-4-0613', + name: 'GPT-4 0613', + maxTokens: { input: 8192, output: 4096 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-4-32k', + name: 'GPT-4 32k', + maxTokens: { input: 32768, output: 4096 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-4-32k-0613', + name: 'GPT-4 32k 0613', + maxTokens: { input: 32768, output: 4096 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-3.5-turbo', + name: 'GPT-3.5 Turbo', + maxTokens: { input: 16385, output: 4096 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-3.5-turbo-0125', + name: 'GPT-3.5 Turbo 0125', + maxTokens: { input: 16385, output: 4096 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-3.5-turbo-1106', + name: 'GPT-3.5 Turbo 1106', + maxTokens: { input: 16385, output: 4096 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-3.5-turbo-16k', + name: 'GPT-3.5 Turbo 16k', + maxTokens: { input: 16385, output: 4096 }, + provider: provider, + hidden: true, + }, +]; + +export class AzureProvider extends OpenAICompatibleProviderBase { + readonly id = provider.id; + readonly name = provider.name; + protected readonly descriptor = provider; + protected readonly config = { + keyUrl: undefined, + keyValidator: /(?:sk-)?[a-zA-Z0-9]{32,}/, + }; + + getModels(): Promise[]> { + return Promise.resolve(models); + } + + protected getUrl(_model?: AIModel): string | undefined { + return configuration.get('ai.azure.url') ?? undefined; + } + + private async getOrPromptBaseUrl(silent: boolean): Promise { + let url: string | undefined = this.getUrl(); + + if (silent || url != null) return url; + + const input = window.createInputBox(); + input.ignoreFocusOut = true; + + const disposables: Disposable[] = []; + + try { + url = await new Promise(resolve => { + disposables.push( + input.onDidHide(() => resolve(undefined)), + input.onDidChangeValue(value => { + if (value) { + try { + new URL(value); + } catch { + input.validationMessage = `Please enter a valid URL`; + return; + } + } + input.validationMessage = undefined; + }), + input.onDidAccept(() => { + const value = input.value.trim(); + if (!value) { + input.validationMessage = `Please enter a valid URL`; + return; + } + + try { + new URL(value); + } catch { + input.validationMessage = `Please enter a valid URL`; + return; + } + + if (!isAzureUrl(value)) { + input.validationMessage = `Please enter a valid Azure OpenAI URL`; + return; + } + + resolve(value); + }), + ); + + input.title = `Connect to Azure OpenAI Provider`; + input.placeholder = `Please enter your provider's URL to use this feature`; + input.prompt = `Enter your Azure OpenAI Provider URL`; + + input.show(); + }); + } finally { + input.dispose(); + disposables.forEach(d => void d.dispose()); + } + + if (url) { + void configuration.updateEffective('ai.azure.url', url); + } + + return url; + } + + override async configured(silent: boolean): Promise { + const url = await this.getOrPromptBaseUrl(silent); + if (url == null) return false; + + return super.configured(silent); + } + + protected override getHeaders( + _action: TAction, + apiKey: string, + _model: AIModel, + _url: string, + ): Record | Promise> { + return { + Accept: 'application/json', + 'Content-Type': 'application/json', + 'api-key': apiKey, + }; + } +} diff --git a/src/plus/ai/openAICompatibleProvider.ts b/src/plus/ai/openAICompatibleProvider.ts index 6e6fc08e50f17..6f6d69cbd4363 100644 --- a/src/plus/ai/openAICompatibleProvider.ts +++ b/src/plus/ai/openAICompatibleProvider.ts @@ -2,8 +2,9 @@ import type { Disposable } from 'vscode'; import { window } from 'vscode'; import { openAICompatibleProviderDescriptor as provider } from '../../constants.ai'; import { configuration } from '../../system/-webview/configuration'; -import type { AIActionType, AIModel } from './models/model'; +import type { AIModel } from './models/model'; import { OpenAICompatibleProviderBase } from './openAICompatibleProviderBase'; +import { isAzureUrl } from './utils/-webview/ai.utils'; type OpenAICompatibleModel = AIModel; const models: OpenAICompatibleModel[] = [ @@ -334,6 +335,11 @@ export class OpenAICompatibleProvider extends OpenAICompatibleProviderBase { const url = await this.getOrPromptBaseUrl(silent); - if (url == null) return false; + if (url == null || isAzureUrl(url)) return false; return super.configured(silent); } - - protected override getHeaders( - action: TAction, - apiKey: string, - model: AIModel, - url: string, - ): Record | Promise> { - if (url.includes('.azure.com')) { - return { - Accept: 'application/json', - 'Content-Type': 'application/json', - 'api-key': apiKey, - }; - } - - return super.getHeaders(action, apiKey, model, url); - } } diff --git a/src/plus/ai/openaiProvider.ts b/src/plus/ai/openaiProvider.ts index 5aa03bafec7d1..0d256b0408e38 100644 --- a/src/plus/ai/openaiProvider.ts +++ b/src/plus/ai/openaiProvider.ts @@ -2,6 +2,7 @@ import { openAIProviderDescriptor as provider } from '../../constants.ai'; import { configuration } from '../../system/-webview/configuration'; import type { AIActionType, AIModel } from './models/model'; import { OpenAICompatibleProviderBase } from './openAICompatibleProviderBase'; +import { isAzureUrl } from './utils/-webview/ai.utils'; type OpenAIModel = AIModel; const models: OpenAIModel[] = [ @@ -299,7 +300,7 @@ export class OpenAIProvider extends OpenAICompatibleProviderBase, url: string, ): Record | Promise> { - if (url.includes('.azure.com')) { + if (isAzureUrl(url)) { return { Accept: 'application/json', 'Content-Type': 'application/json', diff --git a/src/plus/ai/utils/-webview/ai.utils.ts b/src/plus/ai/utils/-webview/ai.utils.ts index bb0265c2c0cf9..cf01035c655a3 100644 --- a/src/plus/ai/utils/-webview/ai.utils.ts +++ b/src/plus/ai/utils/-webview/ai.utils.ts @@ -162,3 +162,7 @@ export function showPromptTruncationWarning(model: AIModel): void { `The prompt was truncated to fit within the ${getPossessiveForm(model.provider.name)} limits.`, ); } + +export function isAzureUrl(url: string): boolean { + return url.includes('.azure.com'); +} From 823474659356b0891486ddf47cfee87c05945ab0 Mon Sep 17 00:00:00 2001 From: Ramin Tadayon Date: Fri, 2 May 2025 08:39:35 -0700 Subject: [PATCH 2/5] Consolidates models --- src/constants.ai.ts | 1 + src/plus/ai/azureProvider.ts | 273 +---------------------- src/plus/ai/models/model.ts | 274 +++++++++++++++++++++++- src/plus/ai/openAICompatibleProvider.ts | 273 +---------------------- src/plus/ai/openaiProvider.ts | 273 +---------------------- 5 files changed, 280 insertions(+), 814 deletions(-) diff --git a/src/constants.ai.ts b/src/constants.ai.ts index 346ebbd78d44f..4f2eda792961e 100644 --- a/src/constants.ai.ts +++ b/src/constants.ai.ts @@ -15,6 +15,7 @@ export type AIProviders = | 'vscode' | 'xai'; export type AIPrimaryProviders = Extract; +export type OpenAIProviders = 'azure' | 'openai' | 'openaicompatible'; export type AIProviderAndModel = `${string}:${string}`; export type SupportedAIModels = `${Exclude}:${string}` | AIPrimaryProviders; diff --git a/src/plus/ai/azureProvider.ts b/src/plus/ai/azureProvider.ts index d50fd86eb61fd..a13af9c0a6f71 100644 --- a/src/plus/ai/azureProvider.ts +++ b/src/plus/ai/azureProvider.ts @@ -3,281 +3,12 @@ import { window } from 'vscode'; import { openAICompatibleProviderDescriptor as provider } from '../../constants.ai'; import { configuration } from '../../system/-webview/configuration'; import type { AIActionType, AIModel } from './models/model'; +import { openAIModels } from './models/model'; import { OpenAICompatibleProviderBase } from './openAICompatibleProviderBase'; import { isAzureUrl } from './utils/-webview/ai.utils'; type AzureModel = AIModel; -const models: AzureModel[] = [ - { - id: 'gpt-4.1', - name: 'GPT-4.1', - maxTokens: { input: 1047576, output: 32768 }, - provider: provider, - }, - { - id: 'gpt-4.1-2025-04-14', - name: 'GPT-4.1 (2025-04-14)', - maxTokens: { input: 1047576, output: 32768 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4.1-mini', - name: 'GPT-4.1 mini', - maxTokens: { input: 1047576, output: 32768 }, - provider: provider, - }, - { - id: 'gpt-4.1-mini-2025-04-14', - name: 'GPT-4.1 mini (2025-04-14)', - maxTokens: { input: 1047576, output: 32768 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4.1-nano', - name: 'GPT-4.1 nano', - maxTokens: { input: 1047576, output: 32768 }, - provider: provider, - }, - { - id: 'gpt-4.1-nano-2025-04-14', - name: 'GPT-4.1 nano (2025-04-14)', - maxTokens: { input: 1047576, output: 32768 }, - provider: provider, - hidden: true, - }, - { - id: 'o4-mini', - name: 'o4 mini', - maxTokens: { input: 200000, output: 100000 }, - provider: provider, - temperature: null, - }, - { - id: 'o4-mini-2025-04-16', - name: 'o4 mini (2025-04-16)', - maxTokens: { input: 200000, output: 100000 }, - provider: provider, - temperature: null, - hidden: true, - }, - { - id: 'o3', - name: 'o3', - maxTokens: { input: 200000, output: 100000 }, - provider: provider, - temperature: null, - }, - { - id: 'o3-2025-04-16', - name: 'o3 (2025-04-16)', - maxTokens: { input: 200000, output: 100000 }, - provider: provider, - temperature: null, - hidden: true, - }, - { - id: 'o3-mini', - name: 'o3 mini', - maxTokens: { input: 200000, output: 100000 }, - provider: provider, - temperature: null, - }, - { - id: 'o3-mini-2025-01-31', - name: 'o3 mini', - maxTokens: { input: 200000, output: 100000 }, - provider: provider, - temperature: null, - hidden: true, - }, - { - id: 'o1', - name: 'o1', - maxTokens: { input: 200000, output: 100000 }, - provider: provider, - temperature: null, - }, - { - id: 'o1-2024-12-17', - name: 'o1', - maxTokens: { input: 200000, output: 100000 }, - provider: provider, - temperature: null, - hidden: true, - }, - { - id: 'o1-preview', - name: 'o1 preview', - maxTokens: { input: 128000, output: 32768 }, - provider: provider, - temperature: null, - hidden: true, - }, - { - id: 'o1-preview-2024-09-12', - name: 'o1 preview', - maxTokens: { input: 128000, output: 32768 }, - provider: provider, - temperature: null, - hidden: true, - }, - { - id: 'o1-mini', - name: 'o1 mini', - maxTokens: { input: 128000, output: 65536 }, - provider: provider, - temperature: null, - }, - { - id: 'o1-mini-2024-09-12', - name: 'o1 mini', - maxTokens: { input: 128000, output: 65536 }, - provider: provider, - temperature: null, - hidden: true, - }, - { - id: 'gpt-4o', - name: 'GPT-4o', - maxTokens: { input: 128000, output: 16384 }, - provider: provider, - default: true, - }, - { - id: 'gpt-4o-2024-11-20', - name: 'GPT-4o', - maxTokens: { input: 128000, output: 16384 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4o-2024-08-06', - name: 'GPT-4o', - maxTokens: { input: 128000, output: 16384 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4o-2024-05-13', - name: 'GPT-4o', - maxTokens: { input: 128000, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'chatgpt-4o-latest', - name: 'GPT-4o', - maxTokens: { input: 128000, output: 16384 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4o-mini', - name: 'GPT-4o mini', - maxTokens: { input: 128000, output: 16384 }, - provider: provider, - }, - { - id: 'gpt-4o-mini-2024-07-18', - name: 'GPT-4o mini', - maxTokens: { input: 128000, output: 16384 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4-turbo', - name: 'GPT-4 Turbo', - maxTokens: { input: 128000, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4-turbo-2024-04-09', - name: 'GPT-4 Turbo preview (2024-04-09)', - maxTokens: { input: 128000, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4-turbo-preview', - name: 'GPT-4 Turbo preview', - maxTokens: { input: 128000, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4-0125-preview', - name: 'GPT-4 0125 preview', - maxTokens: { input: 128000, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4-1106-preview', - name: 'GPT-4 1106 preview', - maxTokens: { input: 128000, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4', - name: 'GPT-4', - maxTokens: { input: 8192, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4-0613', - name: 'GPT-4 0613', - maxTokens: { input: 8192, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4-32k', - name: 'GPT-4 32k', - maxTokens: { input: 32768, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4-32k-0613', - name: 'GPT-4 32k 0613', - maxTokens: { input: 32768, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-3.5-turbo', - name: 'GPT-3.5 Turbo', - maxTokens: { input: 16385, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-3.5-turbo-0125', - name: 'GPT-3.5 Turbo 0125', - maxTokens: { input: 16385, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-3.5-turbo-1106', - name: 'GPT-3.5 Turbo 1106', - maxTokens: { input: 16385, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-3.5-turbo-16k', - name: 'GPT-3.5 Turbo 16k', - maxTokens: { input: 16385, output: 4096 }, - provider: provider, - hidden: true, - }, -]; +const models: AzureModel[] = openAIModels(provider); export class AzureProvider extends OpenAICompatibleProviderBase { readonly id = provider.id; diff --git a/src/plus/ai/models/model.ts b/src/plus/ai/models/model.ts index c3569c995eb09..656bc43e5188b 100644 --- a/src/plus/ai/models/model.ts +++ b/src/plus/ai/models/model.ts @@ -1,4 +1,4 @@ -import type { AIPrimaryProviders, AIProviders } from '../../../constants.ai'; +import type { AIPrimaryProviders, AIProviders, OpenAIProviders } from '../../../constants.ai'; import type { Container } from '../../../container'; import type { Lazy } from '../../../system/lazy'; import type { ServerConnection } from '../../gk/serverConnection'; @@ -54,3 +54,275 @@ export interface AIProviderDescriptorWithType, 'type'> { readonly type: Lazy>>; } + +export const openAIModels = (provider: AIProviderDescriptor): AIModel[] => [ + { + id: 'gpt-4.1', + name: 'GPT-4.1', + maxTokens: { input: 1047576, output: 32768 }, + provider: provider, + }, + { + id: 'gpt-4.1-2025-04-14', + name: 'GPT-4.1 (2025-04-14)', + maxTokens: { input: 1047576, output: 32768 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-4.1-mini', + name: 'GPT-4.1 mini', + maxTokens: { input: 1047576, output: 32768 }, + provider: provider, + }, + { + id: 'gpt-4.1-mini-2025-04-14', + name: 'GPT-4.1 mini (2025-04-14)', + maxTokens: { input: 1047576, output: 32768 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-4.1-nano', + name: 'GPT-4.1 nano', + maxTokens: { input: 1047576, output: 32768 }, + provider: provider, + }, + { + id: 'gpt-4.1-nano-2025-04-14', + name: 'GPT-4.1 nano (2025-04-14)', + maxTokens: { input: 1047576, output: 32768 }, + provider: provider, + hidden: true, + }, + { + id: 'o4-mini', + name: 'o4 mini', + maxTokens: { input: 200000, output: 100000 }, + provider: provider, + temperature: null, + }, + { + id: 'o4-mini-2025-04-16', + name: 'o4 mini (2025-04-16)', + maxTokens: { input: 200000, output: 100000 }, + provider: provider, + temperature: null, + hidden: true, + }, + { + id: 'o3', + name: 'o3', + maxTokens: { input: 200000, output: 100000 }, + provider: provider, + temperature: null, + }, + { + id: 'o3-2025-04-16', + name: 'o3 (2025-04-16)', + maxTokens: { input: 200000, output: 100000 }, + provider: provider, + temperature: null, + hidden: true, + }, + { + id: 'o3-mini', + name: 'o3 mini', + maxTokens: { input: 200000, output: 100000 }, + provider: provider, + temperature: null, + }, + { + id: 'o3-mini-2025-01-31', + name: 'o3 mini', + maxTokens: { input: 200000, output: 100000 }, + provider: provider, + temperature: null, + hidden: true, + }, + { + id: 'o1', + name: 'o1', + maxTokens: { input: 200000, output: 100000 }, + provider: provider, + temperature: null, + }, + { + id: 'o1-2024-12-17', + name: 'o1', + maxTokens: { input: 200000, output: 100000 }, + provider: provider, + temperature: null, + hidden: true, + }, + { + id: 'o1-preview', + name: 'o1 preview', + maxTokens: { input: 128000, output: 32768 }, + provider: provider, + temperature: null, + hidden: true, + }, + { + id: 'o1-preview-2024-09-12', + name: 'o1 preview', + maxTokens: { input: 128000, output: 32768 }, + provider: provider, + temperature: null, + hidden: true, + }, + { + id: 'o1-mini', + name: 'o1 mini', + maxTokens: { input: 128000, output: 65536 }, + provider: provider, + temperature: null, + }, + { + id: 'o1-mini-2024-09-12', + name: 'o1 mini', + maxTokens: { input: 128000, output: 65536 }, + provider: provider, + temperature: null, + hidden: true, + }, + { + id: 'gpt-4o', + name: 'GPT-4o', + maxTokens: { input: 128000, output: 16384 }, + provider: provider, + default: true, + }, + { + id: 'gpt-4o-2024-11-20', + name: 'GPT-4o', + maxTokens: { input: 128000, output: 16384 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-4o-2024-08-06', + name: 'GPT-4o', + maxTokens: { input: 128000, output: 16384 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-4o-2024-05-13', + name: 'GPT-4o', + maxTokens: { input: 128000, output: 4096 }, + provider: provider, + hidden: true, + }, + { + id: 'chatgpt-4o-latest', + name: 'GPT-4o', + maxTokens: { input: 128000, output: 16384 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-4o-mini', + name: 'GPT-4o mini', + maxTokens: { input: 128000, output: 16384 }, + provider: provider, + }, + { + id: 'gpt-4o-mini-2024-07-18', + name: 'GPT-4o mini', + maxTokens: { input: 128000, output: 16384 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-4-turbo', + name: 'GPT-4 Turbo', + maxTokens: { input: 128000, output: 4096 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-4-turbo-2024-04-09', + name: 'GPT-4 Turbo preview (2024-04-09)', + maxTokens: { input: 128000, output: 4096 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-4-turbo-preview', + name: 'GPT-4 Turbo preview', + maxTokens: { input: 128000, output: 4096 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-4-0125-preview', + name: 'GPT-4 0125 preview', + maxTokens: { input: 128000, output: 4096 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-4-1106-preview', + name: 'GPT-4 1106 preview', + maxTokens: { input: 128000, output: 4096 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-4', + name: 'GPT-4', + maxTokens: { input: 8192, output: 4096 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-4-0613', + name: 'GPT-4 0613', + maxTokens: { input: 8192, output: 4096 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-4-32k', + name: 'GPT-4 32k', + maxTokens: { input: 32768, output: 4096 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-4-32k-0613', + name: 'GPT-4 32k 0613', + maxTokens: { input: 32768, output: 4096 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-3.5-turbo', + name: 'GPT-3.5 Turbo', + maxTokens: { input: 16385, output: 4096 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-3.5-turbo-0125', + name: 'GPT-3.5 Turbo 0125', + maxTokens: { input: 16385, output: 4096 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-3.5-turbo-1106', + name: 'GPT-3.5 Turbo 1106', + maxTokens: { input: 16385, output: 4096 }, + provider: provider, + hidden: true, + }, + { + id: 'gpt-3.5-turbo-16k', + name: 'GPT-3.5 Turbo 16k', + maxTokens: { input: 16385, output: 4096 }, + provider: provider, + hidden: true, + }, +]; diff --git a/src/plus/ai/openAICompatibleProvider.ts b/src/plus/ai/openAICompatibleProvider.ts index 6f6d69cbd4363..8bd62be5b3081 100644 --- a/src/plus/ai/openAICompatibleProvider.ts +++ b/src/plus/ai/openAICompatibleProvider.ts @@ -3,281 +3,12 @@ import { window } from 'vscode'; import { openAICompatibleProviderDescriptor as provider } from '../../constants.ai'; import { configuration } from '../../system/-webview/configuration'; import type { AIModel } from './models/model'; +import { openAIModels } from './models/model'; import { OpenAICompatibleProviderBase } from './openAICompatibleProviderBase'; import { isAzureUrl } from './utils/-webview/ai.utils'; type OpenAICompatibleModel = AIModel; -const models: OpenAICompatibleModel[] = [ - { - id: 'gpt-4.1', - name: 'GPT-4.1', - maxTokens: { input: 1047576, output: 32768 }, - provider: provider, - }, - { - id: 'gpt-4.1-2025-04-14', - name: 'GPT-4.1 (2025-04-14)', - maxTokens: { input: 1047576, output: 32768 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4.1-mini', - name: 'GPT-4.1 mini', - maxTokens: { input: 1047576, output: 32768 }, - provider: provider, - }, - { - id: 'gpt-4.1-mini-2025-04-14', - name: 'GPT-4.1 mini (2025-04-14)', - maxTokens: { input: 1047576, output: 32768 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4.1-nano', - name: 'GPT-4.1 nano', - maxTokens: { input: 1047576, output: 32768 }, - provider: provider, - }, - { - id: 'gpt-4.1-nano-2025-04-14', - name: 'GPT-4.1 nano (2025-04-14)', - maxTokens: { input: 1047576, output: 32768 }, - provider: provider, - hidden: true, - }, - { - id: 'o4-mini', - name: 'o4 mini', - maxTokens: { input: 200000, output: 100000 }, - provider: provider, - temperature: null, - }, - { - id: 'o4-mini-2025-04-16', - name: 'o4 mini (2025-04-16)', - maxTokens: { input: 200000, output: 100000 }, - provider: provider, - temperature: null, - hidden: true, - }, - { - id: 'o3', - name: 'o3', - maxTokens: { input: 200000, output: 100000 }, - provider: provider, - temperature: null, - }, - { - id: 'o3-2025-04-16', - name: 'o3 (2025-04-16)', - maxTokens: { input: 200000, output: 100000 }, - provider: provider, - temperature: null, - hidden: true, - }, - { - id: 'o3-mini', - name: 'o3 mini', - maxTokens: { input: 200000, output: 100000 }, - provider: provider, - temperature: null, - }, - { - id: 'o3-mini-2025-01-31', - name: 'o3 mini', - maxTokens: { input: 200000, output: 100000 }, - provider: provider, - temperature: null, - hidden: true, - }, - { - id: 'o1', - name: 'o1', - maxTokens: { input: 200000, output: 100000 }, - provider: provider, - temperature: null, - }, - { - id: 'o1-2024-12-17', - name: 'o1', - maxTokens: { input: 200000, output: 100000 }, - provider: provider, - temperature: null, - hidden: true, - }, - { - id: 'o1-preview', - name: 'o1 preview', - maxTokens: { input: 128000, output: 32768 }, - provider: provider, - temperature: null, - hidden: true, - }, - { - id: 'o1-preview-2024-09-12', - name: 'o1 preview', - maxTokens: { input: 128000, output: 32768 }, - provider: provider, - temperature: null, - hidden: true, - }, - { - id: 'o1-mini', - name: 'o1 mini', - maxTokens: { input: 128000, output: 65536 }, - provider: provider, - temperature: null, - }, - { - id: 'o1-mini-2024-09-12', - name: 'o1 mini', - maxTokens: { input: 128000, output: 65536 }, - provider: provider, - temperature: null, - hidden: true, - }, - { - id: 'gpt-4o', - name: 'GPT-4o', - maxTokens: { input: 128000, output: 16384 }, - provider: provider, - default: true, - }, - { - id: 'gpt-4o-2024-11-20', - name: 'GPT-4o', - maxTokens: { input: 128000, output: 16384 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4o-2024-08-06', - name: 'GPT-4o', - maxTokens: { input: 128000, output: 16384 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4o-2024-05-13', - name: 'GPT-4o', - maxTokens: { input: 128000, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'chatgpt-4o-latest', - name: 'GPT-4o', - maxTokens: { input: 128000, output: 16384 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4o-mini', - name: 'GPT-4o mini', - maxTokens: { input: 128000, output: 16384 }, - provider: provider, - }, - { - id: 'gpt-4o-mini-2024-07-18', - name: 'GPT-4o mini', - maxTokens: { input: 128000, output: 16384 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4-turbo', - name: 'GPT-4 Turbo', - maxTokens: { input: 128000, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4-turbo-2024-04-09', - name: 'GPT-4 Turbo preview (2024-04-09)', - maxTokens: { input: 128000, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4-turbo-preview', - name: 'GPT-4 Turbo preview', - maxTokens: { input: 128000, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4-0125-preview', - name: 'GPT-4 0125 preview', - maxTokens: { input: 128000, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4-1106-preview', - name: 'GPT-4 1106 preview', - maxTokens: { input: 128000, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4', - name: 'GPT-4', - maxTokens: { input: 8192, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4-0613', - name: 'GPT-4 0613', - maxTokens: { input: 8192, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4-32k', - name: 'GPT-4 32k', - maxTokens: { input: 32768, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4-32k-0613', - name: 'GPT-4 32k 0613', - maxTokens: { input: 32768, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-3.5-turbo', - name: 'GPT-3.5 Turbo', - maxTokens: { input: 16385, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-3.5-turbo-0125', - name: 'GPT-3.5 Turbo 0125', - maxTokens: { input: 16385, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-3.5-turbo-1106', - name: 'GPT-3.5 Turbo 1106', - maxTokens: { input: 16385, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-3.5-turbo-16k', - name: 'GPT-3.5 Turbo 16k', - maxTokens: { input: 16385, output: 4096 }, - provider: provider, - hidden: true, - }, -]; +const models: OpenAICompatibleModel[] = openAIModels(provider); export class OpenAICompatibleProvider extends OpenAICompatibleProviderBase { readonly id = provider.id; diff --git a/src/plus/ai/openaiProvider.ts b/src/plus/ai/openaiProvider.ts index 0d256b0408e38..cc55d810b450f 100644 --- a/src/plus/ai/openaiProvider.ts +++ b/src/plus/ai/openaiProvider.ts @@ -1,281 +1,12 @@ import { openAIProviderDescriptor as provider } from '../../constants.ai'; import { configuration } from '../../system/-webview/configuration'; import type { AIActionType, AIModel } from './models/model'; +import { openAIModels } from './models/model'; import { OpenAICompatibleProviderBase } from './openAICompatibleProviderBase'; import { isAzureUrl } from './utils/-webview/ai.utils'; type OpenAIModel = AIModel; -const models: OpenAIModel[] = [ - { - id: 'gpt-4.1', - name: 'GPT-4.1', - maxTokens: { input: 1047576, output: 32768 }, - provider: provider, - }, - { - id: 'gpt-4.1-2025-04-14', - name: 'GPT-4.1 (2025-04-14)', - maxTokens: { input: 1047576, output: 32768 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4.1-mini', - name: 'GPT-4.1 mini', - maxTokens: { input: 1047576, output: 32768 }, - provider: provider, - }, - { - id: 'gpt-4.1-mini-2025-04-14', - name: 'GPT-4.1 mini (2025-04-14)', - maxTokens: { input: 1047576, output: 32768 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4.1-nano', - name: 'GPT-4.1 nano', - maxTokens: { input: 1047576, output: 32768 }, - provider: provider, - }, - { - id: 'gpt-4.1-nano-2025-04-14', - name: 'GPT-4.1 nano (2025-04-14)', - maxTokens: { input: 1047576, output: 32768 }, - provider: provider, - hidden: true, - }, - { - id: 'o4-mini', - name: 'o4 mini', - maxTokens: { input: 200000, output: 100000 }, - provider: provider, - temperature: null, - }, - { - id: 'o4-mini-2025-04-16', - name: 'o4 mini (2025-04-16)', - maxTokens: { input: 200000, output: 100000 }, - provider: provider, - temperature: null, - hidden: true, - }, - { - id: 'o3', - name: 'o3', - maxTokens: { input: 200000, output: 100000 }, - provider: provider, - temperature: null, - }, - { - id: 'o3-2025-04-16', - name: 'o3 (2025-04-16)', - maxTokens: { input: 200000, output: 100000 }, - provider: provider, - temperature: null, - hidden: true, - }, - { - id: 'o3-mini', - name: 'o3 mini', - maxTokens: { input: 200000, output: 100000 }, - provider: provider, - temperature: null, - }, - { - id: 'o3-mini-2025-01-31', - name: 'o3 mini', - maxTokens: { input: 200000, output: 100000 }, - provider: provider, - temperature: null, - hidden: true, - }, - { - id: 'o1', - name: 'o1', - maxTokens: { input: 200000, output: 100000 }, - provider: provider, - temperature: null, - }, - { - id: 'o1-2024-12-17', - name: 'o1', - maxTokens: { input: 200000, output: 100000 }, - provider: provider, - temperature: null, - hidden: true, - }, - { - id: 'o1-preview', - name: 'o1 preview', - maxTokens: { input: 128000, output: 32768 }, - provider: provider, - temperature: null, - hidden: true, - }, - { - id: 'o1-preview-2024-09-12', - name: 'o1 preview', - maxTokens: { input: 128000, output: 32768 }, - provider: provider, - temperature: null, - hidden: true, - }, - { - id: 'o1-mini', - name: 'o1 mini', - maxTokens: { input: 128000, output: 65536 }, - provider: provider, - temperature: null, - }, - { - id: 'o1-mini-2024-09-12', - name: 'o1 mini', - maxTokens: { input: 128000, output: 65536 }, - provider: provider, - temperature: null, - hidden: true, - }, - { - id: 'gpt-4o', - name: 'GPT-4o', - maxTokens: { input: 128000, output: 16384 }, - provider: provider, - default: true, - }, - { - id: 'gpt-4o-2024-11-20', - name: 'GPT-4o', - maxTokens: { input: 128000, output: 16384 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4o-2024-08-06', - name: 'GPT-4o', - maxTokens: { input: 128000, output: 16384 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4o-2024-05-13', - name: 'GPT-4o', - maxTokens: { input: 128000, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'chatgpt-4o-latest', - name: 'GPT-4o', - maxTokens: { input: 128000, output: 16384 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4o-mini', - name: 'GPT-4o mini', - maxTokens: { input: 128000, output: 16384 }, - provider: provider, - }, - { - id: 'gpt-4o-mini-2024-07-18', - name: 'GPT-4o mini', - maxTokens: { input: 128000, output: 16384 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4-turbo', - name: 'GPT-4 Turbo', - maxTokens: { input: 128000, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4-turbo-2024-04-09', - name: 'GPT-4 Turbo preview (2024-04-09)', - maxTokens: { input: 128000, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4-turbo-preview', - name: 'GPT-4 Turbo preview', - maxTokens: { input: 128000, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4-0125-preview', - name: 'GPT-4 0125 preview', - maxTokens: { input: 128000, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4-1106-preview', - name: 'GPT-4 1106 preview', - maxTokens: { input: 128000, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4', - name: 'GPT-4', - maxTokens: { input: 8192, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4-0613', - name: 'GPT-4 0613', - maxTokens: { input: 8192, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4-32k', - name: 'GPT-4 32k', - maxTokens: { input: 32768, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-4-32k-0613', - name: 'GPT-4 32k 0613', - maxTokens: { input: 32768, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-3.5-turbo', - name: 'GPT-3.5 Turbo', - maxTokens: { input: 16385, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-3.5-turbo-0125', - name: 'GPT-3.5 Turbo 0125', - maxTokens: { input: 16385, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-3.5-turbo-1106', - name: 'GPT-3.5 Turbo 1106', - maxTokens: { input: 16385, output: 4096 }, - provider: provider, - hidden: true, - }, - { - id: 'gpt-3.5-turbo-16k', - name: 'GPT-3.5 Turbo 16k', - maxTokens: { input: 16385, output: 4096 }, - provider: provider, - hidden: true, - }, -]; +const models: OpenAIModel[] = openAIModels(provider); export class OpenAIProvider extends OpenAICompatibleProviderBase { readonly id = provider.id; From 6b57c512676ff75b69c85cf08852c515ae3804a9 Mon Sep 17 00:00:00 2001 From: Ramin Tadayon Date: Fri, 2 May 2025 08:39:48 -0700 Subject: [PATCH 3/5] Updates provider label --- src/constants.ai.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/constants.ai.ts b/src/constants.ai.ts index 4f2eda792961e..4686579a2fe7f 100644 --- a/src/constants.ai.ts +++ b/src/constants.ai.ts @@ -43,7 +43,7 @@ export const openAIProviderDescriptor: AIProviderDescriptor<'openai'> = { } as const; export const azureProviderDescriptor: AIProviderDescriptor<'azure'> = { id: 'azure', - name: 'Azure', + name: 'Azure (Preview)', primary: false, requiresAccount: true, requiresUserKey: true, From de6c441dbe3c4cbb5113c9ae7f6c6e72f665b326 Mon Sep 17 00:00:00 2001 From: Ramin Tadayon Date: Fri, 2 May 2025 08:40:02 -0700 Subject: [PATCH 4/5] Uses correct provider descriptor --- src/plus/ai/azureProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plus/ai/azureProvider.ts b/src/plus/ai/azureProvider.ts index a13af9c0a6f71..19380ec37ba28 100644 --- a/src/plus/ai/azureProvider.ts +++ b/src/plus/ai/azureProvider.ts @@ -1,6 +1,6 @@ import type { Disposable } from 'vscode'; import { window } from 'vscode'; -import { openAICompatibleProviderDescriptor as provider } from '../../constants.ai'; +import { azureProviderDescriptor as provider } from '../../constants.ai'; import { configuration } from '../../system/-webview/configuration'; import type { AIActionType, AIModel } from './models/model'; import { openAIModels } from './models/model'; From 7e40e346f6564648faf167cb103b12bc5092485c Mon Sep 17 00:00:00 2001 From: Ramin Tadayon Date: Fri, 2 May 2025 08:40:10 -0700 Subject: [PATCH 5/5] Fixes setting regex --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 360bc20d2477f..d0f5438d63678 100644 --- a/package.json +++ b/package.json @@ -4047,7 +4047,7 @@ "null" ], "default": null, - "pattern": "^((anthropic|azure|deepseek|gemini|github|huggingface|ollama|openai|openaicompatible|openrouter|xai):([\\w.-:]+)|gitkraken|vscode)$", + "pattern": "^((anthropic|azure|deepseek|gemini|github|huggingface|ollama|openai|openaicompatible|openrouter|xai):([\\w.\\-:]+)|gitkraken|vscode)$", "markdownDescription": "Specifies the AI provider and model to use for GitLens' AI features. Should be formatted as `provider:model` (e.g. `openai:gpt-4o` or `anthropic:claude-3-5-sonnet-latest`), `gitkraken` for GitKraken AI provided models, or `vscode` for models provided by the VS Code extension API (e.g. Copilot)", "scope": "window", "order": 10,