mirror of
https://github.com/andy-stack/vaultkeeper-ai.git
synced 2026-07-22 06:42:03 +00:00
Introduce separate planning model setting to allow using different models for planning vs execution. Add visual countdown display when rate limits are hit, with improved retry delay parsing across providers (Claude, OpenAI, Gemini). Refactor settings tab into Views directory and enhance mobile layout for input controls.
84 lines
No EOL
2.6 KiB
TypeScript
84 lines
No EOL
2.6 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 {
|
|
Exception.throw("Invalid model selection");
|
|
}
|
|
}
|
|
|
|
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 isValidProviderModel(model: string): model is AIProviderModel {
|
|
return Object.values(AIProviderModel).includes(model as AIProviderModel);
|
|
}
|
|
|
|
export enum AIProvider {
|
|
Claude = "Claude",
|
|
Gemini = "Gemini",
|
|
OpenAI = "OpenAI"
|
|
}
|
|
|
|
export enum AIProviderModel {
|
|
// Claude models
|
|
ClaudeSonnet_4_5 = "claude-sonnet-4-5-20250929",
|
|
ClaudeSonnet_4 = "claude-sonnet-4-20250514",
|
|
ClaudeSonnet_3_7 = "claude-3-7-sonnet-20250219",
|
|
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",
|
|
GeminiPro_3_Preview = "gemini-3-pro-preview",
|
|
|
|
// OpenAI models
|
|
GPT_5_1 = "gpt-5.1",
|
|
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,
|
|
GeminiNamer = GeminiFlash_2_5_Lite,
|
|
OpenAINamer = GPT_5_Nano,
|
|
}
|
|
|
|
export enum AIProviderURL {
|
|
Claude = "https://api.anthropic.com/v1/messages",
|
|
Gemini = "https://generativelanguage.googleapis.com/v1beta/models",
|
|
OpenAI = "https://api.openai.com/v1/responses"
|
|
}
|
|
|
|
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",
|
|
} |