Add new models for Gemini and Claude. Remove older models for OpenAI and Sonnet 3.7.

This commit is contained in:
Andrew Beal 2026-02-20 00:56:18 +00:00
parent 984ed9eb82
commit d3b461efc7
7 changed files with 20 additions and 31 deletions

View file

@ -39,9 +39,9 @@ export enum AIProvider {
export enum AIProviderModel {
// Claude models
ClaudeSonnet_4_6 = "claude-sonnet-4-6",
ClaudeSonnet_4_5 = "claude-sonnet-4-5-20250929",
ClaudeSonnet_4 = "claude-sonnet-4-20250514",
ClaudeSonnet_3_7 = "claude-3-7-sonnet-20250219",
ClaudeOpus_4_6 = "claude-opus-4-6",
ClaudeOpus_4_5 = "claude-opus-4-5-20251101",
ClaudeOpus_4_1 = "claude-opus-4-1-20250805",
@ -54,6 +54,7 @@ export enum AIProviderModel {
GeminiPro_2_5 = "gemini-2.5-pro",
GeminiFlash_3_Preview = "gemini-3-flash-preview",
GeminiPro_3_Preview = "gemini-3-pro-preview",
GeminiPro_3_1_Preview = "gemini-3.1-pro-preview",
// OpenAI models
GPT_5_2_Instant = "gpt-5.2-chat-latest",
@ -63,11 +64,6 @@ export enum AIProviderModel {
GPT_5 = "gpt-5",
GPT_5_Mini = "gpt-5-mini",
GPT_5_Nano = "gpt-5-nano",
GPT_5_Pro = "gpt-5-pro",
GPT_4o = "gpt-4o",
GPT_4o_Mini = "gpt-4o-mini",
GPT_4_1 = "gpt-4.1",
GPT_4_1_Mini = "gpt-4.1-mini",
// Conversation naming models (aliases to existing models)
ClaudeNamer = ClaudeHaiku_4_5,

View file

@ -8,9 +8,9 @@ export enum Copy {
NoUserInstruction = "No custom instructions",
// Model Display Names
ClaudeSonnet_4_6 = "Claude Sonnet 4.6",
ClaudeSonnet_4_5 = "Claude Sonnet 4.5",
ClaudeSonnet_4 = "Claude Sonnet 4",
ClaudeSonnet_3_7 = "Claude Sonnet 3.7",
ClaudeOpus_4_6 = "Claude Opus 4.6",
ClaudeOpus_4_5 = "Claude Opus 4.5",
ClaudeOpus_4_1 = "Claude Opus 4.1",
@ -22,6 +22,7 @@ export enum Copy {
GeminiPro_2_5 = "Gemini 2.5 Pro",
GeminiFlash_3_Preview = "Gemini 3 Flash Preview",
GeminiPro_3_Preview = "Gemini 3 Pro Preview",
GeminiPro_3_1_Preview = "Gemini 3.1 Pro Preview",
GPT_5_2_Instant = "GPT-5.2 Instant",
GPT_5_2_Thinking = "GPT-5.2 Thinking",
@ -30,11 +31,6 @@ export enum Copy {
GPT_5 = "GPT-5",
GPT_5_Mini = "GPT-5 Mini",
GPT_5_Nano = "GPT-5 Nano",
GPT_5_Pro = "GPT-5 Pro",
GPT_4o = "GPT-4o",
GPT_4o_Mini = "GPT-4o Mini",
GPT_4_1 = "GPT-4.1",
GPT_4_1_Mini = "GPT-4.1 Mini",
// AI Provider Groups
ProviderClaude = "Claude",

View file

@ -66,20 +66,21 @@ The plugin supports multiple AI models:
**Claude (Anthropic)**
- Claude Sonnet 4.5 ⚡ (Recommended)
- Claude Opus 4.5, 4.1, 4
- Claude Sonnet 4.6 ⚡ (Recommended)
- Claude Sonnet 4.5, 4
- Claude Opus 4.6, 4.5, 4.1, 4
- Claude Haiku 4.5
**Gemini (Google)**
- Gemini 3 Pro Preview
- Gemini 3.1 Pro Preview, 3 Pro Preview, 3 Flash Preview
- Gemini 2.5 Flash, Pro
- Gemini 2.5 Flash Lite
**OpenAI**
- GPT-5.1, GPT-5 (Pro, Mini, Nano)
- GPT-4o, GPT-4.1
- GPT-5.2 (Instant, Thinking, Pro)
- GPT-5.1, GPT-5 (Mini, Nano)
Switch models anytime in the settings without losing your conversation context.
@ -223,7 +224,7 @@ See `EXAMPLE_INSTRUCTIONS.md` in your vault for a template.
**Planning Model**
- Select a separate model for the planning agent (used in Planning Mode)
- Default: Claude Sonnet 4.5
- Default: Claude Sonnet 4.6
- Allows cost optimization by using a more capable model for planning and a faster/cheaper model for execution
- The planning model dropdown updates to match your selected provider

View file

@ -8,7 +8,7 @@ const DEFAULT_SETTINGS: IVaultkeeperAISettings = {
userInstruction: "",
model: AIProviderModel.ClaudeHaiku_4_5,
planningModel: AIProviderModel.ClaudeSonnet_4_5,
planningModel: AIProviderModel.ClaudeSonnet_4_6,
apiKeys: {
claude: "",
openai: "",

View file

@ -167,7 +167,7 @@ export class VaultService {
return currentContent;
}
for (let content of oldContent) {
for (const content of oldContent) {
if (!currentContent.includes(content) && !StringTools.toWhitespaceFlexibleRegex(content).test(currentContent)) {
return Exception.new(`Content to replace was not found in the file, the old content must match exactly. No changes have been made. Unmatched content: "${content}"`);
}

View file

@ -176,9 +176,9 @@ export class VaultkeeperAISettingTab extends PluginSettingTab {
// Claude models
if (!providerFilter || providerFilter === AIProvider.Claude) {
const claudeGroup = select.createEl("optgroup", { attr: { label: Copy.ProviderClaude } });
claudeGroup.createEl("option", { value: AIProviderModel.ClaudeSonnet_4_6, text: Copy.ClaudeSonnet_4_6 });
claudeGroup.createEl("option", { value: AIProviderModel.ClaudeSonnet_4_5, text: Copy.ClaudeSonnet_4_5 });
claudeGroup.createEl("option", { value: AIProviderModel.ClaudeSonnet_4, text: Copy.ClaudeSonnet_4 });
claudeGroup.createEl("option", { value: AIProviderModel.ClaudeSonnet_3_7, text: Copy.ClaudeSonnet_3_7 });
claudeGroup.createEl("option", { value: AIProviderModel.ClaudeOpus_4_6, text: Copy.ClaudeOpus_4_6 });
claudeGroup.createEl("option", { value: AIProviderModel.ClaudeOpus_4_5, text: Copy.ClaudeOpus_4_5 });
claudeGroup.createEl("option", { value: AIProviderModel.ClaudeOpus_4_1, text: Copy.ClaudeOpus_4_1 });
@ -196,11 +196,6 @@ export class VaultkeeperAISettingTab extends PluginSettingTab {
openaiGroup.createEl("option", { value: AIProviderModel.GPT_5, text: Copy.GPT_5 });
openaiGroup.createEl("option", { value: AIProviderModel.GPT_5_Mini, text: Copy.GPT_5_Mini });
openaiGroup.createEl("option", { value: AIProviderModel.GPT_5_Nano, text: Copy.GPT_5_Nano });
openaiGroup.createEl("option", { value: AIProviderModel.GPT_5_Pro, text: Copy.GPT_5_Pro });
openaiGroup.createEl("option", { value: AIProviderModel.GPT_4o, text: Copy.GPT_4o });
openaiGroup.createEl("option", { value: AIProviderModel.GPT_4o_Mini, text: Copy.GPT_4o_Mini });
openaiGroup.createEl("option", { value: AIProviderModel.GPT_4_1, text: Copy.GPT_4_1 });
openaiGroup.createEl("option", { value: AIProviderModel.GPT_4_1_Mini, text: Copy.GPT_4_1_Mini });
}
// Gemini models
@ -211,6 +206,7 @@ export class VaultkeeperAISettingTab extends PluginSettingTab {
geminiGroup.createEl("option", { value: AIProviderModel.GeminiPro_2_5, text: Copy.GeminiPro_2_5 });
geminiGroup.createEl("option", { value: AIProviderModel.GeminiFlash_3_Preview, text: Copy.GeminiFlash_3_Preview });
geminiGroup.createEl("option", { value: AIProviderModel.GeminiPro_3_Preview, text: Copy.GeminiPro_3_Preview });
geminiGroup.createEl("option", { value: AIProviderModel.GeminiPro_3_1_Preview, text: Copy.GeminiPro_3_1_Preview });
}
}

View file

@ -65,7 +65,7 @@ describe('SettingsService', () => {
it('should handle partially loaded settings and fill missing properties with defaults', () => {
const loadedSettings: Partial<IVaultkeeperAISettings> = {
model: AIProviderModel.GPT_4o,
model: AIProviderModel.GPT_5,
apiKeys: {
claude: '',
openai: 'partial-key',
@ -76,7 +76,7 @@ describe('SettingsService', () => {
settingsService = new SettingsService(loadedSettings as IVaultkeeperAISettings);
expect(settingsService.settings.firstTimeStart).toBe(true); // Default
expect(settingsService.settings.model).toBe(AIProviderModel.GPT_4o); // Loaded
expect(settingsService.settings.model).toBe(AIProviderModel.GPT_5); // Loaded
expect(settingsService.settings.apiKeys.openai).toBe('partial-key'); // Loaded
expect(settingsService.settings.exclusions).toEqual([]); // Default
expect(settingsService.settings.userInstruction).toBe(''); // Default
@ -151,7 +151,7 @@ describe('SettingsService', () => {
it('should return OpenAI key when current model is GPT', () => {
const loadedSettings: IVaultkeeperAISettings = {
firstTimeStart: false,
model: AIProviderModel.GPT_4o,
model: AIProviderModel.GPT_5_Mini,
planningModel: AIProviderModel.GPT_5,
apiKeys: {
claude: 'claude-key',
@ -356,8 +356,8 @@ describe('SettingsService', () => {
it('should correctly identify OpenAI models', () => {
const openaiModels = [
AIProviderModel.GPT_4o,
AIProviderModel.GPT_4o_Mini,
AIProviderModel.GPT_5_Nano,
AIProviderModel.GPT_5_Mini,
AIProviderModel.GPT_5,
AIProviderModel.GPT_5_Mini
];