Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit f90b1b2

Browse files
authored
Merge pull request #597 from codestoryai/features/add-gemini-pro-support
[ide] add gemini pro support
2 parents af8167f + 007ce0a commit f90b1b2

File tree

8 files changed

+91
-16
lines changed

8 files changed

+91
-16
lines changed

extensions/codestory/src/completions/providers/editorSessionProvider.ts

+1
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,7 @@ export class CSInteractiveEditorSessionProvider implements vscode.InteractiveEdi
368368
variables: [],
369369
file_content_map: [],
370370
terminal_selection: undefined,
371+
folder_paths: [],
371372
}
372373
};
373374
const messages = await this.sidecarClient.getInLineEditorResponse(context);

extensions/codestory/src/sidecar/client.ts

+2
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,8 @@ export class SideCarClient {
229229
const activeWindowData = getCurrentActiveWindow();
230230
const folders = folderFromQuery(query);
231231
const sideCarModelConfiguration = await getSideCarModelConfiguration(await vscode.modelSelection.getConfiguration());
232+
console.log(sideCarModelConfiguration);
233+
console.log(JSON.stringify(sideCarModelConfiguration));
232234
const agentSystemInstruction = readCustomSystemInstruction();
233235
const body = {
234236
repo_ref: repoRef.getRepresentation(),

extensions/codestory/src/sidecar/types.ts

+12-1
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ export interface InEditorRequest {
234234
snippetInformation: SnippetInformation;
235235
textDocumentWeb: TextDocument;
236236
diagnosticsInformation: DiagnosticInformationFromEditor | null;
237-
userContext: { variables: SidecarVariableTypes[]; file_content_map: { file_path: string; file_content: string; language: string }[]; terminal_selection: string | undefined };
237+
userContext: { variables: SidecarVariableTypes[]; file_content_map: { file_path: string; file_content: string; language: string }[]; terminal_selection: string | undefined; folder_paths: string[] };
238238
}
239239

240240
export interface DiagnosticInformationFromEditor {
@@ -604,6 +604,14 @@ function getProviderConfiguration(type: string, value: ModelProviderConfiguratio
604604
}
605605
};
606606
}
607+
if (type === 'geminipro') {
608+
return {
609+
'GeminiPro': {
610+
'api_key': value.apiKey,
611+
'api_base': value.apiBase,
612+
}
613+
};
614+
}
607615
return null;
608616
}
609617

@@ -640,5 +648,8 @@ function getModelProviderConfiguration(providerConfiguration: ProviderSpecificCo
640648
if (providerConfiguration.type === 'fireworkai') {
641649
return 'FireworksAI';
642650
}
651+
if (providerConfiguration.type === 'geminipro') {
652+
return 'GeminiPro';
653+
}
643654
return null;
644655
}

src/vs/platform/aiModel/common/aiModels.ts

+30-9
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ export const humanReadableProviderConfigKey: Record<string, string> = {
1717
'apiBase': 'Base URL'
1818
};
1919

20-
export type ProviderType = 'codestory' | 'openai-default' | 'azure-openai' | 'togetherai' | 'ollama' | 'openai-compatible' | 'anthropic' | 'fireworkai';
21-
export const providerTypeValues: ProviderType[] = ['codestory', 'openai-default', 'azure-openai', 'togetherai', 'ollama', 'openai-compatible', 'anthropic', 'fireworkai'];
20+
export type ProviderType = 'codestory' | 'openai-default' | 'azure-openai' | 'togetherai' | 'ollama' | 'openai-compatible' | 'anthropic' | 'fireworkai' | 'geminipro';
21+
export const providerTypeValues: ProviderType[] = ['codestory', 'openai-default', 'azure-openai', 'togetherai', 'ollama', 'openai-compatible', 'anthropic', 'fireworkai', 'geminipro'];
2222

2323
export interface AzureOpenAIModelProviderConfig {
2424
readonly type: 'azure-openai';
@@ -93,7 +93,13 @@ export interface FireworkAIProviderConfig {
9393
readonly apiKey: string;
9494
}
9595

96-
export type ProviderConfig = CodeStoryProviderConfig | OpenAIProviderConfig | AzureOpenAIProviderConfig | TogetherAIProviderConfig | OpenAICompatibleProviderConfig | OllamaProviderConfig | AnthropicProviderConfig | FireworkAIProviderConfig;
96+
export interface GeminiProProviderConfig {
97+
readonly name: 'GeminiPro';
98+
readonly apiKey: string;
99+
readonly apiBase: string;
100+
}
101+
102+
export type ProviderConfig = CodeStoryProviderConfig | OpenAIProviderConfig | AzureOpenAIProviderConfig | TogetherAIProviderConfig | OpenAICompatibleProviderConfig | OllamaProviderConfig | AnthropicProviderConfig | FireworkAIProviderConfig | GeminiProProviderConfig;
97103
export type ProviderConfigsWithAPIKey = Exclude<ProviderConfig, CodeStoryProviderConfig | OllamaProviderConfig>;
98104

99105
export type IModelProviders =
@@ -104,7 +110,8 @@ export type IModelProviders =
104110
| { 'openai-compatible': OpenAICompatibleProviderConfig }
105111
| { 'ollama': OllamaProviderConfig }
106112
| { 'anthropic': AnthropicProviderConfig }
107-
| { 'fireworkai': FireworkAIProviderConfig };
113+
| { 'fireworkai': FireworkAIProviderConfig }
114+
| { 'geminipro': GeminiProProviderConfig };
108115

109116
export function isModelProviderItem(obj: any): obj is IModelProviders {
110117
return obj && typeof obj === 'object'
@@ -262,7 +269,15 @@ export const defaultModelSelectionSettings: IModelSelectionSettings = {
262269
provider: {
263270
type: 'codestory'
264271
}
265-
}
272+
},
273+
'GeminiPro1.5': {
274+
name: 'Gemini Pro 1.5',
275+
contextLength: 1000000,
276+
temperature: 0.2,
277+
provider: {
278+
type: 'geminipro',
279+
}
280+
},
266281
},
267282
providers: {
268283
'codestory': {
@@ -297,6 +312,11 @@ export const defaultModelSelectionSettings: IModelSelectionSettings = {
297312
name: 'Firework AI',
298313
apiKey: '',
299314
},
315+
'geminipro': {
316+
name: 'GeminiPro',
317+
apiBase: '',
318+
apiKey: '',
319+
}
300320
}
301321
};
302322

@@ -309,6 +329,7 @@ export const supportedModels: Record<ProviderType, string[]> = {
309329
'ollama': ['Mixtral', 'MistralInstruct', 'CodeLlama13BInstruct', 'DeepSeekCoder1.3BInstruct', 'DeepSeekCoder6BInstruct', 'DeepSeekCoder33BInstruct'],
310330
'anthropic': ['ClaudeOpus', 'ClaudeSonnet', 'ClaudeHaiku'],
311331
'fireworkai': ['CodeLlama13BInstruct'],
332+
'geminipro': ['GeminiPro1.5'],
312333
};
313334

314335
export const providersSupportingModel = (model: string): ProviderType[] => {
@@ -332,23 +353,23 @@ export const isDefaultProviderConfig = (key: ProviderType, config: ProviderConfi
332353
const defaultConfig = defaultModelSelectionSettings.providers[key as keyof IModelProviders] as ProviderConfig;
333354
return defaultConfig
334355
&& defaultConfig.name === config.name
335-
&& (defaultConfig.name === 'OpenAI' || defaultConfig.name === 'Together AI' || defaultConfig.name === 'Azure OpenAI' || defaultConfig.name === 'OpenAI Compatible' || defaultConfig.name === 'Anthropic' || defaultConfig.name === 'Firework AI'
356+
&& (defaultConfig.name === 'OpenAI' || defaultConfig.name === 'Together AI' || defaultConfig.name === 'Azure OpenAI' || defaultConfig.name === 'OpenAI Compatible' || defaultConfig.name === 'Anthropic' || defaultConfig.name === 'Firework AI' || defaultConfig.name === 'GeminiPro'
336357
? (defaultConfig).apiKey === (config as ProviderConfigsWithAPIKey).apiKey
337358
: true
338359
)
339-
&& (defaultConfig.name === 'Azure OpenAI' || defaultConfig.name === 'OpenAI Compatible'
360+
&& (defaultConfig.name === 'Azure OpenAI' || defaultConfig.name === 'OpenAI Compatible' || defaultConfig.name === 'GeminiPro'
340361
? defaultConfig.apiBase === (config as BaseOpenAICompatibleProviderConfig).apiBase
341362
: true
342363
);
343364
};
344365

345366
export const areProviderConfigsEqual = (a: ProviderConfig, b: ProviderConfig) => {
346367
return a.name === b.name
347-
&& (a.name === 'OpenAI' || a.name === 'Together AI' || a.name === 'Azure OpenAI' || a.name === 'OpenAI Compatible' || a.name === 'Anthropic' || a.name === 'Firework AI'
368+
&& (a.name === 'OpenAI' || a.name === 'Together AI' || a.name === 'Azure OpenAI' || a.name === 'OpenAI Compatible' || a.name === 'Anthropic' || a.name === 'Firework AI' || a.name === 'GeminiPro'
348369
? (a as ProviderConfigsWithAPIKey).apiKey === (b as ProviderConfigsWithAPIKey).apiKey
349370
: true
350371
)
351-
&& (a.name === 'Azure OpenAI' || a.name === 'OpenAI Compatible'
372+
&& (a.name === 'Azure OpenAI' || a.name === 'OpenAI Compatible' || a.name === 'GeminiPro'
352373
? (a as BaseOpenAICompatibleProviderConfig).apiBase === (b as BaseOpenAICompatibleProviderConfig).apiBase
353374
: true
354375
);

src/vs/workbench/contrib/preferences/browser/media/modelSelectionEditor.css

+11
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,17 @@
279279
background-color: currentColor;
280280
}
281281

282+
.model-selection-editor > .model-selection-body > .table-container .monaco-table-td .provider-logo.geminipro {
283+
mask-image: url('logos/fireworks.svg');
284+
-webkit-mask-image: url('logos/fireworks.svg');
285+
mask-size: contain;
286+
-webkit-mask-size: contain;
287+
mask-repeat: no-repeat;
288+
-webkit-mask-repeat: no-repeat;
289+
mask-position: center;
290+
-webkit-mask-position: center;
291+
background-color: currentColor;
292+
}
282293

283294
.model-selection-editor > .model-selection-body > .table-container .monaco-table-td .provider-logo {
284295
display: block;

src/vs/workbench/contrib/preferences/browser/modelSelectionEditor.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -822,7 +822,7 @@ class ProviderConfigColumnRenderer implements ITableRenderer<IProviderItemEntry,
822822
disposeTemplate(templateData: IProviderConfigColumnTemplateData): void { }
823823

824824
private getEmptyConfigurationMessage(providerType: ProviderType): { message: string; complete: boolean } {
825-
if (providerType === 'azure-openai' || providerType === 'openai-default' || providerType === 'togetherai' || providerType === 'openai-compatible' || providerType === 'anthropic' || providerType === 'fireworkai') {
825+
if (providerType === 'azure-openai' || providerType === 'openai-default' || providerType === 'togetherai' || providerType === 'openai-compatible' || providerType === 'anthropic' || providerType === 'fireworkai' || providerType === 'geminipro') {
826826
return { message: 'Configuration incomplete', complete: false };
827827
} else if (providerType === 'codestory' || providerType === 'ollama') {
828828
return { message: 'No configuration required', complete: true };

src/vs/workbench/services/aiModel/browser/aiModelService.ts

+29-4
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ export class AIModelsService extends Disposable implements IAIModelSelectionServ
6969
const key = untypedKey as ProviderType;
7070
const acc = untypedAcc as { [key: string]: ProviderConfig };
7171
const provider = modelSelection.providers[key as keyof typeof modelSelection.providers] as ProviderConfig;
72-
if ((provider.name === 'Azure OpenAI' || provider.name === 'OpenAI Compatible') && (provider.apiBase.length > 0 && provider.apiKey.length > 0)) {
72+
if ((provider.name === 'Azure OpenAI' || provider.name === 'OpenAI Compatible' || provider.name === 'GeminiPro') && (provider.apiBase.length > 0 && provider.apiKey.length > 0)) {
7373
acc[key] = provider;
7474
} else if ((provider.name === 'OpenAI' || provider.name === 'Together AI' || provider.name === 'OpenAI Compatible' || provider.name === 'Anthropic' || provider.name === 'Firework AI') && (provider.apiKey?.length ?? 0) > 0) {
7575
acc[key] = provider;
@@ -95,7 +95,8 @@ export class AIModelsService extends Disposable implements IAIModelSelectionServ
9595
|| model.provider.type === 'openai-compatible'
9696
|| model.provider.type === 'ollama'
9797
|| model.provider.type === 'anthropic'
98-
|| model.provider.type === 'fireworkai') {
98+
|| model.provider.type === 'fireworkai'
99+
|| model.provider.type === 'geminipro') {
99100
acc[key] = model;
100101
}
101102
}
@@ -381,7 +382,7 @@ class ModelSelectionJsonSchema {
381382
'fireworksaiProvider': {
382383
'type': 'object',
383384
'properties': {
384-
'anthropic': {
385+
'fireworksai': {
385386
'type': 'object',
386387
'properties': {
387388
'name': {
@@ -397,6 +398,29 @@ class ModelSelectionJsonSchema {
397398
}
398399
}
399400
},
401+
'geminiProProvider': {
402+
'type': 'object',
403+
'properties': {
404+
'geminipro': {
405+
'type': 'object',
406+
'properties': {
407+
'name': {
408+
'enum': ['Gemini Pro 1.5'],
409+
'description': nls.localize('modelSelection.json.geminiProProvider.name', 'Name of the provider')
410+
},
411+
'apiKey': {
412+
'type': 'string',
413+
'description': nls.localize('modelSelection.json.geminiProProvider.apiKey', 'API key for the provider')
414+
},
415+
'apiBase': {
416+
'type': 'string',
417+
'description': nls.localize('modelSelection.json.geminiProProvider.apiBase', 'Base URL of the provider\'s API')
418+
}
419+
},
420+
'required': ['name', 'apiKey']
421+
}
422+
}
423+
},
400424
'providers': {
401425
'oneOf': [
402426
{ '$ref': '#/definitions/codestoryProvider' },
@@ -407,6 +431,7 @@ class ModelSelectionJsonSchema {
407431
{ '$ref': '#/definitions/ollamaProvider' },
408432
{ '$ref': '#/definitions/anthropicProvider' },
409433
{ '$ref': '#/definitions/fireworksaiProvider' },
434+
{ '$ref': '#/definitions/geminiProProvider' },
410435
]
411436
},
412437
'azureOpenAIModelProviderConfig': {
@@ -427,7 +452,7 @@ class ModelSelectionJsonSchema {
427452
'type': 'object',
428453
'properties': {
429454
'type': {
430-
'enum': ['codestory', 'openai-default', 'togetherai', 'openai-compatible', 'ollama', 'anthropic', 'fireworkai'],
455+
'enum': ['codestory', 'openai-default', 'togetherai', 'openai-compatible', 'ollama', 'anthropic', 'fireworkai', 'geminipro'],
431456
'description': nls.localize('modelSelection.json.genericModelProviderConfig.type', 'Type of the provider')
432457
}
433458
},

src/vs/workbench/services/preferences/common/preferences.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { URI } from 'vs/base/common/uri';
1212
import { IRange } from 'vs/editor/common/core/range';
1313
import { IEditorContribution } from 'vs/editor/common/editorCommon';
1414
import { ITextModel } from 'vs/editor/common/model';
15-
import { ModelProviderConfig, ProviderType, ProviderConfig, AzureOpenAIProviderConfig, OpenAIProviderConfig, OpenAICompatibleProviderConfig, AnthropicProviderConfig, FireworkAIProviderConfig } from 'vs/platform/aiModel/common/aiModels';
15+
import { ModelProviderConfig, ProviderType, ProviderConfig, AzureOpenAIProviderConfig, OpenAIProviderConfig, OpenAICompatibleProviderConfig, AnthropicProviderConfig, FireworkAIProviderConfig, GeminiProProviderConfig } from 'vs/platform/aiModel/common/aiModels';
1616
import { ConfigurationTarget } from 'vs/platform/configuration/common/configuration';
1717
import { ConfigurationScope, EditPresentationTypes, IExtensionInfo } from 'vs/platform/configuration/common/configurationRegistry';
1818
import { IEditorOptions } from 'vs/platform/editor/common/editor';
@@ -394,5 +394,9 @@ export const isProviderItemConfigComplete = (providerItem: IProviderItem): boole
394394
const { name, apiKey } = providerItem as FireworkAIProviderConfig;
395395
return !!name && !!apiKey;
396396
}
397+
case 'geminipro': {
398+
const { name, apiKey, apiBase } = providerItem as GeminiProProviderConfig;
399+
return !!name && !!apiKey && !!apiBase;
400+
}
397401
}
398402
};

0 commit comments

Comments
 (0)