diff --git a/Enums/ApiProvider.ts b/Enums/ApiProvider.ts index 109ece7..4be41bc 100644 --- a/Enums/ApiProvider.ts +++ b/Enums/ApiProvider.ts @@ -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, diff --git a/Enums/Copy.ts b/Enums/Copy.ts index 0f84288..132c977 100644 --- a/Enums/Copy.ts +++ b/Enums/Copy.ts @@ -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", diff --git a/README.md b/README.md index 2f67c49..a63ffef 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/Services/SettingsService.ts b/Services/SettingsService.ts index be53abf..cffc495 100644 --- a/Services/SettingsService.ts +++ b/Services/SettingsService.ts @@ -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: "", diff --git a/Services/VaultService.ts b/Services/VaultService.ts index bc8d473..3588917 100644 --- a/Services/VaultService.ts +++ b/Services/VaultService.ts @@ -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}"`); } diff --git a/Views/VaultkeeperAISettingTab.ts b/Views/VaultkeeperAISettingTab.ts index b31af52..70ccd78 100644 --- a/Views/VaultkeeperAISettingTab.ts +++ b/Views/VaultkeeperAISettingTab.ts @@ -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 }); } } diff --git a/__tests__/Services/SettingsService.test.ts b/__tests__/Services/SettingsService.test.ts index 191286e..9b9d17d 100644 --- a/__tests__/Services/SettingsService.test.ts +++ b/__tests__/Services/SettingsService.test.ts @@ -65,7 +65,7 @@ describe('SettingsService', () => { it('should handle partially loaded settings and fill missing properties with defaults', () => { const loadedSettings: Partial = { - 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 ];