andy-stack_vaultkeeper-ai/Enums/ApiProvider.ts
Andrew Beal 28c8ccb44b feat: add quick actions system with provider-aware model settings
Introduce QuickActionsService and QuickAgent for lightweight, single-shot AI
operations. Add a dedicated quickActionModel setting alongside a new top-level
provider setting, with validation ensuring all models match the selected provider
and provider-specific defaults. Refactor FileSystemService to offer both TFile
and path-based overloads (readFile/readFilePath, writeToFile/writeToFilePath,
patchFile/patchFileAtPath). Replace window/document globals with activeWindow/
activeDocument throughout InputService and VaultkeeperAISettingTab for Obsidian
mobile compatibility.
Update linting packages to latest.
2026-04-20 20:20:22 +01:00

133 lines
No EOL
4.4 KiB
TypeScript

import { Exception } from "Helpers/Exception";
export function fromModel(model: string): AIProvider {
if (!isValidProviderModel(model)) {
Exception.throw(`Invalid model: ${model}`);
}
if (isClaudeModel(model)) {
return AIProvider.Claude;
} else if (isGeminiModel(model)) {
return AIProvider.Gemini;
} else if (isOpenAIModel(model)) {
return AIProvider.OpenAI;
} else if (isMistralModel(model)) {
return AIProvider.Mistral;
} else {
Exception.throw("Invalid model selection");
}
}
export function isvalidProvider(value: string): value is AIProvider {
return Object.values(AIProvider).includes(value as AIProvider);
}
export function isValidProviderModel(model: string): model is AIProviderModel {
return Object.values(AIProviderModel).includes(model as AIProviderModel);
}
function isClaudeModel(model: string): boolean {
return isValidProviderModel(model) && model.startsWith("claude-");
}
function isGeminiModel(model: string): boolean {
return isValidProviderModel(model) && model.startsWith("gemini-");
}
function isOpenAIModel(model: string): boolean {
return isValidProviderModel(model) && model.startsWith("gpt-");
}
function isMistralModel(model: string): boolean {
return isValidProviderModel(model) && model.startsWith("mistral-");
}
export function modelMatchesProvider(model: AIProviderModel, provider: AIProvider): boolean {
switch (provider) {
case AIProvider.Claude:
return isClaudeModel(model);
case AIProvider.Gemini:
return isGeminiModel(model);
case AIProvider.OpenAI:
return isOpenAIModel(model);
case AIProvider.Mistral:
return isMistralModel(model);
}
}
export enum AIProvider {
Claude = "Claude",
Gemini = "Gemini",
OpenAI = "OpenAI",
Mistral = "Mistral"
}
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",
ClaudeOpus_4_6 = "claude-opus-4-6",
ClaudeOpus_4_5 = "claude-opus-4-5-20251101",
ClaudeOpus_4_1 = "claude-opus-4-1-20250805",
ClaudeOpus_4 = "claude-opus-4-20250514",
ClaudeHaiku_4_5 = "claude-haiku-4-5-20251001",
// Gemini models
GeminiFlash_2_5_Lite = "gemini-2.5-flash-lite",
GeminiFlash_2_5 = "gemini-2.5-flash",
GeminiPro_2_5 = "gemini-2.5-pro",
GeminiFlash_3_Preview = "gemini-3-flash-preview",
GeminiFlash_3_1_Preview_Lite = "gemini-3.1-flash-lite-preview",
GeminiPro_3_1_Preview = "gemini-3.1-pro-preview",
// OpenAI models
GPT_5_4 = "gpt-5.4",
GPT_5_4_Pro = "gpt-5.4-pro",
GPT_5_4_Mini = "gpt-5.4-mini",
GPT_5_4_Nano = "gpt-5.4-nano",
// Mistral models
MistralLarge = "mistral-large-latest",
MistralMedium = "mistral-medium-latest",
MistralSmall = "mistral-small-latest",
// Conversation naming models (aliases to existing models)
ClaudeNamer = ClaudeHaiku_4_5,
GeminiNamer = GeminiFlash_2_5_Lite,
OpenAINamer = GPT_5_4_Nano,
MistralNamer = MistralSmall,
}
export enum AIProviderURL {
Claude = "https://api.anthropic.com/v1/messages",
Gemini = "https://generativelanguage.googleapis.com/v1beta/models",
OpenAI = "https://api.openai.com/v1/responses",
Mistral = "https://api.mistral.ai/v1/chat/completions"
}
export enum AIFileServiceURL {
Claude = "https://api.anthropic.com/v1/files",
Gemini = "https://generativelanguage.googleapis.com/v1beta",
GeminiUpload = "https://generativelanguage.googleapis.com/upload/v1beta",
OpenAI = "https://api.openai.com/v1/files",
Mistral = "https://api.mistral.ai/v1/files",
}
export enum MistralAgentEndpoint {
Url = "https://api.mistral.ai/v1/agents",
ConversationsUrl = "https://api.mistral.ai/v1/conversations"
}
export const DEFAULT_MODEL_BY_PROVIDER: Record<AIProvider, AIProviderModel> = {
[AIProvider.Claude]: AIProviderModel.ClaudeHaiku_4_5,
[AIProvider.Gemini]: AIProviderModel.GeminiFlash_2_5_Lite,
[AIProvider.OpenAI]: AIProviderModel.GPT_5_4_Nano,
[AIProvider.Mistral]: AIProviderModel.MistralSmall,
};
export const DEFAULT_PLANNING_MODEL_BY_PROVIDER: Record<AIProvider, AIProviderModel> = {
[AIProvider.Claude]: AIProviderModel.ClaudeSonnet_4_6,
[AIProvider.Gemini]: AIProviderModel.GeminiPro_2_5,
[AIProvider.OpenAI]: AIProviderModel.GPT_5_4_Pro,
[AIProvider.Mistral]: AIProviderModel.MistralLarge,
};