Skip to content

Commit 4d52732

Browse files
committed
Adds DeepSeek model support (#3943)
Adds gemini flash thinking model
1 parent ecaa83a commit 4d52732

File tree

7 files changed

+83
-21
lines changed

7 files changed

+83
-21
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,14 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
66

77
## [Unreleased]
88

9+
### Added
10+
11+
- Adds and expands AI model support for GitLens' AI features
12+
- Adds DeepSeek V3 and R1 models
13+
- Adds the latest experimental Gemini 2.0 Flash Thinking model
14+
- Adds a `gitlens.ai.modelOptions.temperature` setting to specify the temperature (randomness) for AI models
15+
- Adds a _Switch Model_ button to the AI confirmation prompts
16+
917
### Fixed
1018

1119
- Fixes [#3938](https://github.com/gitkraken/vscode-gitlens/issues/3938) - GitLens automatically initiating an external sign-in after install on vscode.dev

docs/telemetry-events.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,8 @@
114114
'failed.error': string,
115115
'failed.reason': 'user-declined' | 'user-cancelled' | 'error',
116116
'input.length': number,
117-
'model.id': 'claude-3-5-sonnet-latest' | 'claude-3-5-sonnet-20241022' | 'claude-3-5-sonnet-20240620' | 'claude-3-5-haiku-20241022' | 'claude-3-5-haiku-latest' | 'claude-3-opus-latest' | 'claude-3-opus-20240229' | 'claude-3-sonnet-20240229' | 'claude-3-haiku-20240307' | 'claude-2.1' | 'gemini-2.0-flash-exp' | 'gemini-exp-1206' | 'gemini-exp-1121' | 'gemini-1.5-pro-latest' | 'gemini-1.5-flash-latest' | 'gemini-1.5-flash-8b' | 'gemini-1.0-pro' | 'gpt-4o' | 'gpt-4o-mini' | 'o1-preview' | 'o1-mini' | 'Phi-3.5-MoE-instruct' | 'Phi-3.5-mini-instruct' | 'AI21-Jamba-1.5-Large' | 'AI21-Jamba-1.5-Mini' | 'meta-llama/Llama-3.2-11B-Vision-Instruct' | 'Qwen/Qwen2.5-72B-Instruct' | 'NousResearch/Hermes-3-Llama-3.1-8B' | 'mistralai/Mistral-Nemo-Instruct-2407' | 'microsoft/Phi-3.5-mini-instruct' | 'o1-preview-2024-09-12' | 'o1-mini-2024-09-12' | 'gpt-4o-2024-08-06' | 'gpt-4o-2024-05-13' | 'chatgpt-4o-latest' | 'gpt-4o-mini-2024-07-18' | 'gpt-4-turbo' | 'gpt-4-turbo-2024-04-09' | 'gpt-4-turbo-preview' | 'gpt-4-0125-preview' | 'gpt-4-1106-preview' | 'gpt-4' | 'gpt-4-0613' | 'gpt-4-32k' | 'gpt-4-32k-0613' | 'gpt-3.5-turbo' | 'gpt-3.5-turbo-0125' | 'gpt-3.5-turbo-1106' | 'gpt-3.5-turbo-16k' | `${string}:${string}` | 'grok-beta',
118-
'model.provider.id': 'anthropic' | 'gemini' | 'github' | 'huggingface' | 'openai' | 'vscode' | 'xai',
117+
'model.id': 'claude-3-5-sonnet-latest' | 'claude-3-5-sonnet-20241022' | 'claude-3-5-sonnet-20240620' | 'claude-3-5-haiku-20241022' | 'claude-3-5-haiku-latest' | 'claude-3-opus-latest' | 'claude-3-opus-20240229' | 'claude-3-sonnet-20240229' | 'claude-3-haiku-20240307' | 'claude-2.1' | 'deepseek-chat' | 'deepseek-reasoner' | 'gemini-2.0-flash-exp' | 'gemini-2.0-flash-thinking-exp-01-21' | 'gemini-exp-1206' | 'gemini-exp-1121' | 'gemini-1.5-pro-latest' | 'gemini-1.5-flash-latest' | 'gemini-1.5-flash-8b' | 'gemini-1.0-pro' | 'gpt-4o' | 'gpt-4o-mini' | 'o1-preview' | 'o1-mini' | 'Phi-3.5-MoE-instruct' | 'Phi-3.5-mini-instruct' | 'AI21-Jamba-1.5-Large' | 'AI21-Jamba-1.5-Mini' | 'meta-llama/Llama-3.2-11B-Vision-Instruct' | 'Qwen/Qwen2.5-72B-Instruct' | 'NousResearch/Hermes-3-Llama-3.1-8B' | 'mistralai/Mistral-Nemo-Instruct-2407' | 'microsoft/Phi-3.5-mini-instruct' | 'o1-preview-2024-09-12' | 'o1-mini-2024-09-12' | 'gpt-4o-2024-08-06' | 'gpt-4o-2024-05-13' | 'chatgpt-4o-latest' | 'gpt-4o-mini-2024-07-18' | 'gpt-4-turbo' | 'gpt-4-turbo-2024-04-09' | 'gpt-4-turbo-preview' | 'gpt-4-0125-preview' | 'gpt-4-1106-preview' | 'gpt-4' | 'gpt-4-0613' | 'gpt-4-32k' | 'gpt-4-32k-0613' | 'gpt-3.5-turbo' | 'gpt-3.5-turbo-0125' | 'gpt-3.5-turbo-1106' | 'gpt-3.5-turbo-16k' | `${string}:${string}` | 'grok-beta',
118+
'model.provider.id': 'anthropic' | 'deepseek' | 'gemini' | 'github' | 'huggingface' | 'openai' | 'vscode' | 'xai',
119119
'model.provider.name': string,
120120
'output.length': number,
121121
'retry.count': number,
@@ -133,8 +133,8 @@
133133
'failed.error': string,
134134
'failed.reason': 'user-declined' | 'user-cancelled' | 'error',
135135
'input.length': number,
136-
'model.id': 'claude-3-5-sonnet-latest' | 'claude-3-5-sonnet-20241022' | 'claude-3-5-sonnet-20240620' | 'claude-3-5-haiku-20241022' | 'claude-3-5-haiku-latest' | 'claude-3-opus-latest' | 'claude-3-opus-20240229' | 'claude-3-sonnet-20240229' | 'claude-3-haiku-20240307' | 'claude-2.1' | 'gemini-2.0-flash-exp' | 'gemini-exp-1206' | 'gemini-exp-1121' | 'gemini-1.5-pro-latest' | 'gemini-1.5-flash-latest' | 'gemini-1.5-flash-8b' | 'gemini-1.0-pro' | 'gpt-4o' | 'gpt-4o-mini' | 'o1-preview' | 'o1-mini' | 'Phi-3.5-MoE-instruct' | 'Phi-3.5-mini-instruct' | 'AI21-Jamba-1.5-Large' | 'AI21-Jamba-1.5-Mini' | 'meta-llama/Llama-3.2-11B-Vision-Instruct' | 'Qwen/Qwen2.5-72B-Instruct' | 'NousResearch/Hermes-3-Llama-3.1-8B' | 'mistralai/Mistral-Nemo-Instruct-2407' | 'microsoft/Phi-3.5-mini-instruct' | 'o1-preview-2024-09-12' | 'o1-mini-2024-09-12' | 'gpt-4o-2024-08-06' | 'gpt-4o-2024-05-13' | 'chatgpt-4o-latest' | 'gpt-4o-mini-2024-07-18' | 'gpt-4-turbo' | 'gpt-4-turbo-2024-04-09' | 'gpt-4-turbo-preview' | 'gpt-4-0125-preview' | 'gpt-4-1106-preview' | 'gpt-4' | 'gpt-4-0613' | 'gpt-4-32k' | 'gpt-4-32k-0613' | 'gpt-3.5-turbo' | 'gpt-3.5-turbo-0125' | 'gpt-3.5-turbo-1106' | 'gpt-3.5-turbo-16k' | `${string}:${string}` | 'grok-beta',
137-
'model.provider.id': 'anthropic' | 'gemini' | 'github' | 'huggingface' | 'openai' | 'vscode' | 'xai',
136+
'model.id': 'claude-3-5-sonnet-latest' | 'claude-3-5-sonnet-20241022' | 'claude-3-5-sonnet-20240620' | 'claude-3-5-haiku-20241022' | 'claude-3-5-haiku-latest' | 'claude-3-opus-latest' | 'claude-3-opus-20240229' | 'claude-3-sonnet-20240229' | 'claude-3-haiku-20240307' | 'claude-2.1' | 'deepseek-chat' | 'deepseek-reasoner' | 'gemini-2.0-flash-exp' | 'gemini-2.0-flash-thinking-exp-01-21' | 'gemini-exp-1206' | 'gemini-exp-1121' | 'gemini-1.5-pro-latest' | 'gemini-1.5-flash-latest' | 'gemini-1.5-flash-8b' | 'gemini-1.0-pro' | 'gpt-4o' | 'gpt-4o-mini' | 'o1-preview' | 'o1-mini' | 'Phi-3.5-MoE-instruct' | 'Phi-3.5-mini-instruct' | 'AI21-Jamba-1.5-Large' | 'AI21-Jamba-1.5-Mini' | 'meta-llama/Llama-3.2-11B-Vision-Instruct' | 'Qwen/Qwen2.5-72B-Instruct' | 'NousResearch/Hermes-3-Llama-3.1-8B' | 'mistralai/Mistral-Nemo-Instruct-2407' | 'microsoft/Phi-3.5-mini-instruct' | 'o1-preview-2024-09-12' | 'o1-mini-2024-09-12' | 'gpt-4o-2024-08-06' | 'gpt-4o-2024-05-13' | 'chatgpt-4o-latest' | 'gpt-4o-mini-2024-07-18' | 'gpt-4-turbo' | 'gpt-4-turbo-2024-04-09' | 'gpt-4-turbo-preview' | 'gpt-4-0125-preview' | 'gpt-4-1106-preview' | 'gpt-4' | 'gpt-4-0613' | 'gpt-4-32k' | 'gpt-4-32k-0613' | 'gpt-3.5-turbo' | 'gpt-3.5-turbo-0125' | 'gpt-3.5-turbo-1106' | 'gpt-3.5-turbo-16k' | `${string}:${string}` | 'grok-beta',
137+
'model.provider.id': 'anthropic' | 'deepseek' | 'gemini' | 'github' | 'huggingface' | 'openai' | 'vscode' | 'xai',
138138
'model.provider.name': string,
139139
'output.length': number,
140140
'retry.count': number,
@@ -151,8 +151,8 @@ or
151151
'failed.error': string,
152152
'failed.reason': 'user-declined' | 'user-cancelled' | 'error',
153153
'input.length': number,
154-
'model.id': 'claude-3-5-sonnet-latest' | 'claude-3-5-sonnet-20241022' | 'claude-3-5-sonnet-20240620' | 'claude-3-5-haiku-20241022' | 'claude-3-5-haiku-latest' | 'claude-3-opus-latest' | 'claude-3-opus-20240229' | 'claude-3-sonnet-20240229' | 'claude-3-haiku-20240307' | 'claude-2.1' | 'gemini-2.0-flash-exp' | 'gemini-exp-1206' | 'gemini-exp-1121' | 'gemini-1.5-pro-latest' | 'gemini-1.5-flash-latest' | 'gemini-1.5-flash-8b' | 'gemini-1.0-pro' | 'gpt-4o' | 'gpt-4o-mini' | 'o1-preview' | 'o1-mini' | 'Phi-3.5-MoE-instruct' | 'Phi-3.5-mini-instruct' | 'AI21-Jamba-1.5-Large' | 'AI21-Jamba-1.5-Mini' | 'meta-llama/Llama-3.2-11B-Vision-Instruct' | 'Qwen/Qwen2.5-72B-Instruct' | 'NousResearch/Hermes-3-Llama-3.1-8B' | 'mistralai/Mistral-Nemo-Instruct-2407' | 'microsoft/Phi-3.5-mini-instruct' | 'o1-preview-2024-09-12' | 'o1-mini-2024-09-12' | 'gpt-4o-2024-08-06' | 'gpt-4o-2024-05-13' | 'chatgpt-4o-latest' | 'gpt-4o-mini-2024-07-18' | 'gpt-4-turbo' | 'gpt-4-turbo-2024-04-09' | 'gpt-4-turbo-preview' | 'gpt-4-0125-preview' | 'gpt-4-1106-preview' | 'gpt-4' | 'gpt-4-0613' | 'gpt-4-32k' | 'gpt-4-32k-0613' | 'gpt-3.5-turbo' | 'gpt-3.5-turbo-0125' | 'gpt-3.5-turbo-1106' | 'gpt-3.5-turbo-16k' | `${string}:${string}` | 'grok-beta',
155-
'model.provider.id': 'anthropic' | 'gemini' | 'github' | 'huggingface' | 'openai' | 'vscode' | 'xai',
154+
'model.id': 'claude-3-5-sonnet-latest' | 'claude-3-5-sonnet-20241022' | 'claude-3-5-sonnet-20240620' | 'claude-3-5-haiku-20241022' | 'claude-3-5-haiku-latest' | 'claude-3-opus-latest' | 'claude-3-opus-20240229' | 'claude-3-sonnet-20240229' | 'claude-3-haiku-20240307' | 'claude-2.1' | 'deepseek-chat' | 'deepseek-reasoner' | 'gemini-2.0-flash-exp' | 'gemini-2.0-flash-thinking-exp-01-21' | 'gemini-exp-1206' | 'gemini-exp-1121' | 'gemini-1.5-pro-latest' | 'gemini-1.5-flash-latest' | 'gemini-1.5-flash-8b' | 'gemini-1.0-pro' | 'gpt-4o' | 'gpt-4o-mini' | 'o1-preview' | 'o1-mini' | 'Phi-3.5-MoE-instruct' | 'Phi-3.5-mini-instruct' | 'AI21-Jamba-1.5-Large' | 'AI21-Jamba-1.5-Mini' | 'meta-llama/Llama-3.2-11B-Vision-Instruct' | 'Qwen/Qwen2.5-72B-Instruct' | 'NousResearch/Hermes-3-Llama-3.1-8B' | 'mistralai/Mistral-Nemo-Instruct-2407' | 'microsoft/Phi-3.5-mini-instruct' | 'o1-preview-2024-09-12' | 'o1-mini-2024-09-12' | 'gpt-4o-2024-08-06' | 'gpt-4o-2024-05-13' | 'chatgpt-4o-latest' | 'gpt-4o-mini-2024-07-18' | 'gpt-4-turbo' | 'gpt-4-turbo-2024-04-09' | 'gpt-4-turbo-preview' | 'gpt-4-0125-preview' | 'gpt-4-1106-preview' | 'gpt-4' | 'gpt-4-0613' | 'gpt-4-32k' | 'gpt-4-32k-0613' | 'gpt-3.5-turbo' | 'gpt-3.5-turbo-0125' | 'gpt-3.5-turbo-1106' | 'gpt-3.5-turbo-16k' | `${string}:${string}` | 'grok-beta',
155+
'model.provider.id': 'anthropic' | 'deepseek' | 'gemini' | 'github' | 'huggingface' | 'openai' | 'vscode' | 'xai',
156156
'model.provider.name': string,
157157
'output.length': number,
158158
'retry.count': number,

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3862,7 +3862,7 @@
38623862
"null"
38633863
],
38643864
"default": null,
3865-
"pattern": "^((anthropic|github|google|huggingface|openai|xai):([\\w.-]+)|vscode)$",
3865+
"pattern": "^((anthropic|deepseek|github|google|huggingface|openai|xai):([\\w.-]+)|vscode)$",
38663866
"markdownDescription": "Specifies the AI 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`), or `vscode` for models provided by the VS Code extension API (e.g. Copilot)",
38673867
"scope": "window",
38683868
"order": 10,

src/ai/aiProviderService.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { getSettledValue } from '../system/promise';
1919
import { getPossessiveForm } from '../system/string';
2020
import type { TelemetryService } from '../telemetry/telemetry';
2121
import { AnthropicProvider } from './anthropicProvider';
22+
import { DeepSeekProvider } from './deepSeekProvider';
2223
import { GeminiProvider } from './geminiProvider';
2324
import { GitHubModelsProvider } from './githubModelsProvider';
2425
import { HuggingFaceProvider } from './huggingFaceProvider';
@@ -57,6 +58,7 @@ const _supportedProviderTypes = new Map<AIProviders, AIProviderConstructor>([
5758
...(supportedInVSCodeVersion('language-models') ? [['vscode', VSCodeAIProvider]] : ([] as any)),
5859
['openai', OpenAIProvider],
5960
['anthropic', AnthropicProvider],
61+
['deepseek', DeepSeekProvider],
6062
['gemini', GeminiProvider],
6163
['github', GitHubModelsProvider],
6264
['huggingface', HuggingFaceProvider],

src/ai/deepSeekProvider.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import type { AIModel } from './aiProviderService';
2+
import { OpenAICompatibleProvider } from './openAICompatibleProvider';
3+
4+
const provider = { id: 'deepseek', name: 'DeepSeek' } as const;
5+
6+
type DeepSeekModel = AIModel<typeof provider.id>;
7+
const models: DeepSeekModel[] = [
8+
{
9+
id: 'deepseek-chat',
10+
name: 'DeepSeek-V3',
11+
maxTokens: { input: 65536, output: 8192 },
12+
provider: provider,
13+
default: true,
14+
temperature: 0.0, // Recommended for Coding/Math
15+
},
16+
{
17+
id: 'deepseek-reasoner',
18+
name: 'DeepSeek-R1',
19+
maxTokens: { input: 65536, output: 8192 },
20+
provider: provider,
21+
temperature: 0.0, // Recommended for Coding/Math
22+
},
23+
];
24+
25+
export class DeepSeekProvider extends OpenAICompatibleProvider<typeof provider.id> {
26+
readonly id = provider.id;
27+
readonly name = provider.name;
28+
protected readonly config = {
29+
keyUrl: 'https://platform.deepseek.com/api_keys',
30+
keyValidator: /(?:sk-)?[a-zA-Z0-9]{32,}/,
31+
};
32+
33+
getModels(): Promise<readonly AIModel<typeof provider.id>[]> {
34+
return Promise.resolve(models);
35+
}
36+
37+
protected getUrl(_model: AIModel<typeof provider.id>): string {
38+
return 'https://api.deepseek.com/v1/chat/completions';
39+
}
40+
}

src/ai/geminiProvider.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ const models: GeminiModel[] = [
1212
maxTokens: { input: 1048576, output: 8192 },
1313
provider: provider,
1414
},
15+
{
16+
id: 'gemini-2.0-flash-thinking-exp-01-21',
17+
name: 'Gemini 2.0 Flash Thinking (Experimental)',
18+
maxTokens: { input: 1048576, output: 8192 },
19+
provider: provider,
20+
},
1521
{
1622
id: 'gemini-exp-1206',
1723
name: 'Gemini Experimental 1206',

src/constants.ai.ts

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,11 @@ export type AnthropicModels =
1010
| 'claude-3-haiku-20240307'
1111
| 'claude-2.1';
1212

13+
export type DeepSeekModels = 'deepseek-chat' | 'deepseek-reasoner';
14+
1315
export type GeminiModels =
1416
| 'gemini-2.0-flash-exp'
17+
| 'gemini-2.0-flash-thinking-exp-01-21'
1518
| 'gemini-exp-1206'
1619
| 'gemini-exp-1121'
1720
| 'gemini-1.5-pro-latest'
@@ -65,25 +68,28 @@ export type VSCodeAIModels = `${string}:${string}`;
6568

6669
export type xAIModels = 'grok-beta';
6770

68-
export type AIProviders = 'anthropic' | 'gemini' | 'github' | 'huggingface' | 'openai' | 'vscode' | 'xai';
71+
export type AIProviders = 'anthropic' | 'deepseek' | 'gemini' | 'github' | 'huggingface' | 'openai' | 'vscode' | 'xai';
6972
export type AIModels<Provider extends AIProviders = AIProviders> = Provider extends 'anthropic'
7073
? AnthropicModels
71-
: Provider extends 'gemini'
72-
? GeminiModels
73-
: Provider extends 'github'
74-
? GitHubModels
75-
: Provider extends 'huggingface'
76-
? HuggingFaceModels
77-
: Provider extends 'openai'
78-
? OpenAIModels
79-
: Provider extends 'vscode'
80-
? VSCodeAIModels
81-
: Provider extends 'xai'
82-
? xAIModels
83-
: AnthropicModels | GeminiModels | OpenAIModels | xAIModels;
74+
: Provider extends 'deepseek'
75+
? DeepSeekModels
76+
: Provider extends 'gemini'
77+
? GeminiModels
78+
: Provider extends 'github'
79+
? GitHubModels
80+
: Provider extends 'huggingface'
81+
? HuggingFaceModels
82+
: Provider extends 'openai'
83+
? OpenAIModels
84+
: Provider extends 'vscode'
85+
? VSCodeAIModels
86+
: Provider extends 'xai'
87+
? xAIModels
88+
: AnthropicModels | GeminiModels | OpenAIModels | xAIModels;
8489

8590
export type SupportedAIModels =
8691
| `anthropic:${AIModels<'anthropic'>}`
92+
| `deepseek:${AIModels<'deepseek'>}`
8793
| `github:${AIModels<'github'>}`
8894
| `google:${AIModels<'gemini'>}`
8995
| `huggingface:${AIModels<'huggingface'>}`

0 commit comments

Comments
 (0)