Skip to content

Commit 3782aad

Browse files
Adds Ollama support (#3311)
Co-authored-by: Ramin Tadayon <[email protected]>
1 parent 80c0ae1 commit 3782aad

File tree

8 files changed

+359
-27
lines changed

8 files changed

+359
-27
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
99
### Added
1010

1111
- Adds the ability to search for GitHub Enterprise and GitLab Self-Managed pull requests by URL in the main step of Launchpad
12-
- Adds OpenRouter support for GitLens' AI features ([#3906](https://github.com/gitkraken/vscode-gitlens/issues/3906))
12+
- Adds Ollama and OpenRouter support for GitLens' AI features ([#3311](https://github.com/gitkraken/vscode-gitlens/issues/3311), [#3906](https://github.com/gitkraken/vscode-gitlens/issues/3906))
1313
- Adds Google Gemini 2.5 Flash (Preview) model, and OpenAI GPT-4.1, GPT-4.1 mini, GPT-4.1 nano, o4 mini, and o3 models for GitLens' AI features ([#4235](https://github.com/gitkraken/vscode-gitlens/issues/4235))
1414
- Adds _Open File at Revision from Remote_ command to open the specific file revision from a remote file URL
1515

docs/telemetry-events.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@
124124
'failed.reason': 'user-declined' | 'user-cancelled' | 'error',
125125
'input.length': number,
126126
'model.id': string,
127-
'model.provider.id': 'anthropic' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'openai' | 'openrouter' | 'vscode' | 'xai',
127+
'model.provider.id': 'anthropic' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'ollama' | 'openai' | 'openrouter' | 'vscode' | 'xai',
128128
'model.provider.name': string,
129129
'output.length': number,
130130
'retry.count': number,
@@ -155,7 +155,7 @@
155155
'failed.reason': 'user-declined' | 'user-cancelled' | 'error',
156156
'input.length': number,
157157
'model.id': string,
158-
'model.provider.id': 'anthropic' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'openai' | 'openrouter' | 'vscode' | 'xai',
158+
'model.provider.id': 'anthropic' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'ollama' | 'openai' | 'openrouter' | 'vscode' | 'xai',
159159
'model.provider.name': string,
160160
'output.length': number,
161161
'retry.count': number,
@@ -185,7 +185,7 @@ or
185185
'failed.reason': 'user-declined' | 'user-cancelled' | 'error',
186186
'input.length': number,
187187
'model.id': string,
188-
'model.provider.id': 'anthropic' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'openai' | 'openrouter' | 'vscode' | 'xai',
188+
'model.provider.id': 'anthropic' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'ollama' | 'openai' | 'openrouter' | 'vscode' | 'xai',
189189
'model.provider.name': string,
190190
'output.length': number,
191191
'retry.count': number,
@@ -214,7 +214,7 @@ or
214214
'failed.reason': 'user-declined' | 'user-cancelled' | 'error',
215215
'input.length': number,
216216
'model.id': string,
217-
'model.provider.id': 'anthropic' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'openai' | 'openrouter' | 'vscode' | 'xai',
217+
'model.provider.id': 'anthropic' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'ollama' | 'openai' | 'openrouter' | 'vscode' | 'xai',
218218
'model.provider.name': string,
219219
'output.length': number,
220220
'retry.count': number,
@@ -243,7 +243,7 @@ or
243243
'failed.reason': 'user-declined' | 'user-cancelled' | 'error',
244244
'input.length': number,
245245
'model.id': string,
246-
'model.provider.id': 'anthropic' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'openai' | 'openrouter' | 'vscode' | 'xai',
246+
'model.provider.id': 'anthropic' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'ollama' | 'openai' | 'openrouter' | 'vscode' | 'xai',
247247
'model.provider.name': string,
248248
'output.length': number,
249249
'retry.count': number,
@@ -272,7 +272,7 @@ or
272272
'failed.reason': 'user-declined' | 'user-cancelled' | 'error',
273273
'input.length': number,
274274
'model.id': string,
275-
'model.provider.id': 'anthropic' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'openai' | 'openrouter' | 'vscode' | 'xai',
275+
'model.provider.id': 'anthropic' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'ollama' | 'openai' | 'openrouter' | 'vscode' | 'xai',
276276
'model.provider.name': string,
277277
'output.length': number,
278278
'retry.count': number,
@@ -295,7 +295,7 @@ or
295295
```typescript
296296
{
297297
'model.id': string,
298-
'model.provider.id': 'anthropic' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'openai' | 'openrouter' | 'vscode' | 'xai',
298+
'model.provider.id': 'anthropic' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'ollama' | 'openai' | 'openrouter' | 'vscode' | 'xai',
299299
'model.provider.name': string
300300
}
301301
```

package.json

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4047,7 +4047,7 @@
40474047
"null"
40484048
],
40494049
"default": null,
4050-
"pattern": "^((anthropic|deepseek|gemini|github|huggingface|openai|xai):([\\w.-]+)|gitkraken|vscode)$",
4050+
"pattern": "^((anthropic|deepseek|gemini|github|huggingface|ollama|openai|openrouter|xai):([\\w.-:]+)|gitkraken|vscode)$",
40514051
"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)",
40524052
"scope": "window",
40534053
"order": 10,
@@ -4083,6 +4083,19 @@
40834083
"preview"
40844084
]
40854085
},
4086+
"gitlens.ai.ollama.url": {
4087+
"type": [
4088+
"string",
4089+
"null"
4090+
],
4091+
"default": null,
4092+
"markdownDescription": "Specifies the Ollama URL to use for access",
4093+
"scope": "window",
4094+
"order": 30,
4095+
"tags": [
4096+
"preview"
4097+
]
4098+
},
40864099
"gitlens.ai.openai.url": {
40874100
"type": [
40884101
"string",
@@ -4091,7 +4104,7 @@
40914104
"default": null,
40924105
"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}",
40934106
"scope": "window",
4094-
"order": 30,
4107+
"order": 31,
40954108
"tags": [
40964109
"preview"
40974110
]

src/config.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,9 @@ interface AIConfig {
243243
readonly modelOptions: {
244244
readonly temperature: number;
245245
};
246+
readonly ollama: {
247+
readonly url: string | null;
248+
};
246249
readonly openai: {
247250
readonly url: string | null;
248251
};

src/constants.ai.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export type AIProviders =
77
| 'github'
88
| 'gitkraken'
99
| 'huggingface'
10+
| 'ollama'
1011
| 'openai'
1112
| 'openrouter'
1213
| 'vscode'
@@ -86,3 +87,10 @@ export const openRouterProviderDescriptor: AIProviderDescriptor<'openrouter'> =
8687
requiresAccount: true,
8788
requiresUserKey: true,
8889
} as const;
90+
export const ollamaProviderDescriptor: AIProviderDescriptor<'ollama'> = {
91+
id: 'ollama',
92+
name: 'Ollama',
93+
primary: false,
94+
requiresAccount: false,
95+
requiresUserKey: false,
96+
} as const;

src/plus/ai/aiProviderService.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
githubProviderDescriptor,
99
gitKrakenProviderDescriptor,
1010
huggingFaceProviderDescriptor,
11+
ollamaProviderDescriptor,
1112
openAIProviderDescriptor,
1213
openRouterProviderDescriptor,
1314
vscodeProviderDescriptor,
@@ -183,6 +184,13 @@ const supportedAIProviders = new Map<AIProviders, AIProviderDescriptorWithType>(
183184
),
184185
},
185186
],
187+
[
188+
'ollama',
189+
{
190+
...ollamaProviderDescriptor,
191+
type: lazy(async () => (await import(/* webpackChunkName: "ai" */ './ollamaProvider')).OllamaProvider),
192+
},
193+
],
186194
]);
187195

188196
export class AIProviderService implements Disposable {

0 commit comments

Comments
 (0)