mirror of
https://github.com/andy-stack/vaultkeeper-ai.git
synced 2026-07-22 06:42:03 +00:00
Add new models for Gemini and Claude. Remove older models for OpenAI and Sonnet 3.7.
This commit is contained in:
parent
984ed9eb82
commit
d3b461efc7
7 changed files with 20 additions and 31 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
13
README.md
13
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
|
||||
|
||||
|
|
|
|||
|
|
@ -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: "",
|
||||
|
|
|
|||
|
|
@ -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}"`);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 });
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
];
|
||||
|
|
|
|||
Loading…
Reference in a new issue