Add a new AI provider integration to GitLens
Add a new AI provider to GitLens with all required boilerplate.
/add-ai-provider [provider-name]
myProvider), becomes part of AIProviders union typesrc/constants.ai.tsAdd to AIProviders union type:
export type AIProviders = 'anthropic' | 'openai' | ... | '{providerId}';
Add descriptor to the descriptors object:
export const aiProviderDescriptors = {
// ... existing providers
{providerId}: {
id: '{providerId}',
name: '{Display Name}',
primary: false,
requiresAccount: false,
requiresUserKey: true,
} satisfies AIProviderDescriptor<'{providerId}'>,
} as const;
src/plus/ai/{providerId}Provider.tsFor OpenAI-compatible providers (most common):
import type { AIProviderDescriptor } from '../../constants.ai.js';
import { aiProviderDescriptors } from '../../constants.ai.js';
import type { AIActionType, AIModel } from './models/model.js';
import { OpenAICompatibleProviderBase } from './openAICompatibleProviderBase.js';
export class {ProviderName}Provider extends OpenAICompatibleProviderBase<'{providerId}'> {
override get id(): '{providerId}' {
return '{providerId}';
}
override get name(): string {
return '{Display Name}';
}
override get descriptor(): AIProviderDescriptor<'{providerId}'> {
return aiProviderDescriptors.{providerId};
}
override get config() {
return {
keyUrl: 'https://provider.com/api-keys',
keyValidator: /^[a-z]{2}-[A-Za-z0-9-]+$/,
keyDescription: '{Provider} API Key',
};
}
override getModels(type: AIActionType): AIModel<'{providerId}'>[] {
return [
{ id: 'model-name', name: 'Model Name', maxTokens: { input: 128000, output: 4096 } },
];
}
protected override getUrl(_model: AIModel<'{providerId}'>): string {
return 'https://api.provider.com/v1/chat/completions';
}
}
For non-OpenAI-compatible providers, implement AIProvider<T> interface directly.
See src/plus/ai/models/provider.ts for the interface definition.
src/plus/ai/aiProviderService.tsAdd to the supportedAIProviders Map (in alphabetical order):
[
'{providerId}',
{
provider: async () =>
new (
await import(/* webpackChunkName: "ai" */ './{providerId}Provider.js')
).{ProviderName}Provider(this.container),
},
],
package.jsonAdd settings for the provider's API key and default model:
"gitlens.ai.{providerId}.key": {
"type": "string",
"description": "API key for {Display Name}"
},
"gitlens.ai.{providerId}.model": {
"type": "string",
"description": "Default model for {Display Name}"
}
src/plus/ai/anthropicProvider.ts — Clean example of an OpenAI-compatible provider.
AIProvider<T> — src/plus/ai/models/provider.ts — Core provider interfaceAIModel<Provider, Model> — src/plus/ai/models/model.ts — Model definitionAIProviderDescriptor<T> — src/constants.ai.ts — Provider metadataOpenAICompatibleProviderBase<T> — src/plus/ai/openAICompatibleProviderBase.ts — Base class for OpenAI-compatible APIspnpm run build:extension # Build to verify compilation