2025-11-10 08:03:27 +00:00
|
|
|
import type VaultkeeperAIPlugin from "main";
|
2025-11-03 17:14:32 +00:00
|
|
|
import { Resolve } from "./DependencyService";
|
|
|
|
|
import { Services } from "./Services";
|
2026-04-20 19:20:22 +00:00
|
|
|
import { AIProvider, AIProviderModel, DEFAULT_MODEL_BY_PROVIDER, DEFAULT_PLANNING_MODEL_BY_PROVIDER, fromModel, isvalidProvider, isValidProviderModel, modelMatchesProvider } from "Enums/ApiProvider";
|
2025-11-03 17:14:32 +00:00
|
|
|
|
2025-11-10 08:03:27 +00:00
|
|
|
const DEFAULT_SETTINGS: IVaultkeeperAISettings = {
|
2025-11-03 17:14:32 +00:00
|
|
|
firstTimeStart: true,
|
2025-11-03 20:46:23 +00:00
|
|
|
userInstruction: "",
|
2025-11-03 17:14:32 +00:00
|
|
|
|
2026-04-20 19:20:22 +00:00
|
|
|
provider: AIProvider.Claude,
|
2026-01-05 21:49:51 +00:00
|
|
|
model: AIProviderModel.ClaudeHaiku_4_5,
|
2026-02-20 00:56:18 +00:00
|
|
|
planningModel: AIProviderModel.ClaudeSonnet_4_6,
|
2026-04-20 19:20:22 +00:00
|
|
|
quickActionModel: AIProviderModel.ClaudeHaiku_4_5,
|
|
|
|
|
|
2025-11-03 17:14:32 +00:00
|
|
|
apiKeys: {
|
|
|
|
|
claude: "",
|
|
|
|
|
openai: "",
|
2026-02-28 14:12:30 +00:00
|
|
|
gemini: "",
|
|
|
|
|
mistral: ""
|
2025-11-03 17:14:32 +00:00
|
|
|
},
|
|
|
|
|
exclusions: [],
|
|
|
|
|
|
2026-04-04 19:04:41 +00:00
|
|
|
searchResultsLimit: 30,
|
|
|
|
|
snippetSizeLimit: 100,
|
|
|
|
|
|
|
|
|
|
enableMemories: false,
|
2026-04-10 09:47:23 +00:00
|
|
|
allowUpdatingMemories: true,
|
|
|
|
|
|
2026-04-10 21:19:34 +00:00
|
|
|
enableWebSearch: true,
|
|
|
|
|
enableWebViewer: false
|
2025-11-03 17:14:32 +00:00
|
|
|
}
|
|
|
|
|
|
2025-11-10 08:03:27 +00:00
|
|
|
export interface IVaultkeeperAISettings {
|
2025-11-03 17:14:32 +00:00
|
|
|
firstTimeStart: boolean;
|
2025-11-03 20:46:23 +00:00
|
|
|
userInstruction: string;
|
2025-11-03 17:14:32 +00:00
|
|
|
|
2026-04-20 19:20:22 +00:00
|
|
|
provider: AIProvider;
|
|
|
|
|
model: AIProviderModel;
|
|
|
|
|
planningModel: AIProviderModel;
|
|
|
|
|
quickActionModel: AIProviderModel;
|
|
|
|
|
|
2025-11-03 17:14:32 +00:00
|
|
|
apiKeys: {
|
|
|
|
|
claude: string;
|
|
|
|
|
openai: string;
|
|
|
|
|
gemini: string;
|
2026-02-28 14:12:30 +00:00
|
|
|
mistral: string;
|
2025-11-03 17:14:32 +00:00
|
|
|
};
|
|
|
|
|
exclusions: string[];
|
|
|
|
|
|
2025-11-03 20:46:23 +00:00
|
|
|
searchResultsLimit: number;
|
|
|
|
|
snippetSizeLimit: number;
|
2026-04-04 19:04:41 +00:00
|
|
|
|
|
|
|
|
enableMemories: boolean;
|
|
|
|
|
allowUpdatingMemories: boolean;
|
2026-04-10 09:47:23 +00:00
|
|
|
|
|
|
|
|
enableWebSearch: boolean;
|
2026-04-10 21:19:34 +00:00
|
|
|
enableWebViewer: boolean;
|
2025-11-03 17:14:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export class SettingsService {
|
|
|
|
|
|
2025-11-10 08:03:27 +00:00
|
|
|
private readonly plugin: VaultkeeperAIPlugin;
|
2025-11-03 17:14:32 +00:00
|
|
|
|
2025-11-10 08:03:27 +00:00
|
|
|
public readonly settings: IVaultkeeperAISettings;
|
2025-11-03 17:14:32 +00:00
|
|
|
|
2025-11-10 08:03:27 +00:00
|
|
|
public constructor(loadedSettings: Partial<IVaultkeeperAISettings>) {
|
|
|
|
|
this.plugin = Resolve<VaultkeeperAIPlugin>(Services.VaultkeeperAIPlugin);
|
2025-11-03 17:14:32 +00:00
|
|
|
this.settings = Object.assign({}, DEFAULT_SETTINGS, loadedSettings);
|
2026-02-20 01:27:16 +00:00
|
|
|
this.ensureValidModels();
|
2025-11-03 17:14:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async saveSettings(onSave?: () => void) {
|
|
|
|
|
await this.plugin.saveData(this.settings);
|
|
|
|
|
if (onSave) {
|
|
|
|
|
onSave();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public getApiKeyForCurrentModel(): string {
|
2025-11-10 12:59:48 +00:00
|
|
|
const provider = fromModel(this.settings.model);
|
2025-11-03 17:14:32 +00:00
|
|
|
return this.getApiKeyForProvider(provider);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public getApiKeyForProvider(provider: AIProvider): string {
|
|
|
|
|
switch (provider) {
|
|
|
|
|
case AIProvider.Claude:
|
|
|
|
|
return this.settings.apiKeys.claude;
|
|
|
|
|
case AIProvider.OpenAI:
|
|
|
|
|
return this.settings.apiKeys.openai;
|
|
|
|
|
case AIProvider.Gemini:
|
|
|
|
|
return this.settings.apiKeys.gemini;
|
2026-02-28 14:12:30 +00:00
|
|
|
case AIProvider.Mistral:
|
|
|
|
|
return this.settings.apiKeys.mistral;
|
2025-11-03 17:14:32 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-11-17 19:02:15 +00:00
|
|
|
public setApiKeyForProvider(provider: AIProvider, key: string) {
|
2025-11-03 17:14:32 +00:00
|
|
|
switch (provider) {
|
|
|
|
|
case AIProvider.Claude:
|
|
|
|
|
this.settings.apiKeys.claude = key;
|
|
|
|
|
break;
|
|
|
|
|
case AIProvider.OpenAI:
|
|
|
|
|
this.settings.apiKeys.openai = key;
|
|
|
|
|
break;
|
|
|
|
|
case AIProvider.Gemini:
|
|
|
|
|
this.settings.apiKeys.gemini = key;
|
|
|
|
|
break;
|
2026-02-28 14:12:30 +00:00
|
|
|
case AIProvider.Mistral:
|
|
|
|
|
this.settings.apiKeys.mistral = key;
|
|
|
|
|
break;
|
2025-11-03 17:14:32 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-20 01:27:16 +00:00
|
|
|
private ensureValidModels(): void {
|
2026-04-20 19:20:22 +00:00
|
|
|
let changed = false;
|
|
|
|
|
|
|
|
|
|
let provider = this.settings.provider;
|
|
|
|
|
|
|
|
|
|
if (!isvalidProvider(provider)) {
|
|
|
|
|
provider = DEFAULT_SETTINGS.provider;
|
|
|
|
|
changed = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!isValidProviderModel(this.settings.model) || !modelMatchesProvider(this.settings.model, provider)) {
|
|
|
|
|
this.settings.model = DEFAULT_MODEL_BY_PROVIDER[provider];
|
|
|
|
|
changed = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!isValidProviderModel(this.settings.planningModel) || !modelMatchesProvider(this.settings.planningModel, provider)) {
|
|
|
|
|
this.settings.planningModel = DEFAULT_PLANNING_MODEL_BY_PROVIDER[provider];
|
|
|
|
|
changed = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!isValidProviderModel(this.settings.quickActionModel) || !modelMatchesProvider(this.settings.quickActionModel, provider)) {
|
|
|
|
|
this.settings.quickActionModel = DEFAULT_MODEL_BY_PROVIDER[provider];
|
|
|
|
|
changed = true;
|
|
|
|
|
}
|
2026-02-20 01:27:16 +00:00
|
|
|
|
2026-04-20 19:20:22 +00:00
|
|
|
if (changed) {
|
2026-02-28 14:33:37 +00:00
|
|
|
void this.saveSettings();
|
2026-02-20 01:27:16 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-11-03 17:14:32 +00:00
|
|
|
}
|