From ac04f9706715533ec98d09e5b2700931d31fab8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=27=C3=A9lectron=20rare?= <108685187+electron-rare@users.noreply.github.com> Date: Sun, 22 Mar 2026 13:24:21 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20add=20Mascarade=20as=20LLM=20provider?= =?UTF-8?q?=20=E2=80=94=20multi-agent=20orchestration=20engine?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add 'mascarade' to SupportedProvider enum (types.ts) - Add Mascarade case in createProviderInstance using OpenAI-compatible SDK (factory.ts) - Add 'mascarade' to BuiltinProvider type (provider-account.ts) - Add mascarade- prefix to MODEL_PROVIDER_MAP (config/types.ts) - Add 5 mascarade models: router, writer, coder, analyst, planner (models.ts) - Add mascarade provider presets for all agent profiles (models.ts) - Add mascarade to PROVIDER_INFOS with UI metadata (providers.ts) Mascarade is a self-hosted LLM orchestration engine (50K LOC Python) that routes requests across Claude, OpenAI, Mistral, Google and Ollama with intelligent routing strategies (best/cheapest/fastest/domain). Default endpoint: http://localhost:8100/v1 (OpenAI-compatible) Co-Authored-By: Claude Opus 4.6 (1M context) --- apps/desktop/src/main/ai/config/types.ts | 1 + apps/desktop/src/main/ai/providers/factory.ts | 18 ++++++++++++++++++ apps/desktop/src/main/ai/providers/types.ts | 1 + apps/desktop/src/shared/constants/models.ts | 12 ++++++++++++ apps/desktop/src/shared/constants/providers.ts | 7 +++++++ .../src/shared/types/provider-account.ts | 2 +- 6 files changed, 40 insertions(+), 1 deletion(-) diff --git a/apps/desktop/src/main/ai/config/types.ts b/apps/desktop/src/main/ai/config/types.ts index b32fce7c..8ddffc5f 100644 --- a/apps/desktop/src/main/ai/config/types.ts +++ b/apps/desktop/src/main/ai/config/types.ts @@ -147,6 +147,7 @@ export const MODEL_PROVIDER_MAP: Record = { 'llama-': 'groq', 'grok-': 'xai', 'glm-': 'zai', + 'mascarade-': 'mascarade', } as const; // ============================================ diff --git a/apps/desktop/src/main/ai/providers/factory.ts b/apps/desktop/src/main/ai/providers/factory.ts index f4fc6e9e..2935170f 100644 --- a/apps/desktop/src/main/ai/providers/factory.ts +++ b/apps/desktop/src/main/ai/providers/factory.ts @@ -156,6 +156,24 @@ function createProviderInstance(config: ProviderConfig) { }); } + case SupportedProvider.Mascarade: { + // Mascarade LLM orchestration engine — OpenAI-compatible API + // Default: http://localhost:8100/v1 (Tower) or configurable + let mascaradeBaseURL = baseURL ?? 'http://localhost:8100/v1'; + if (!mascaradeBaseURL.endsWith('/v1')) { + mascaradeBaseURL = mascaradeBaseURL.replace(/\/+$/, '') + '/v1'; + } + return createOpenAICompatible({ + name: 'mascarade', + apiKey: apiKey ?? 'mascarade-local', + baseURL: mascaradeBaseURL, + headers: { + ...headers, + 'Authorization': `Bearer ${apiKey ?? 'mascarade-local'}`, + }, + }); + } + default: { const _exhaustive: never = provider; throw new Error(`Unsupported provider: ${_exhaustive}`); diff --git a/apps/desktop/src/main/ai/providers/types.ts b/apps/desktop/src/main/ai/providers/types.ts index d8021c78..a60a605b 100644 --- a/apps/desktop/src/main/ai/providers/types.ts +++ b/apps/desktop/src/main/ai/providers/types.ts @@ -21,6 +21,7 @@ export const SupportedProvider = { OpenRouter: 'openrouter', ZAI: 'zai', Ollama: 'ollama', + Mascarade: 'mascarade', } as const; export type SupportedProvider = (typeof SupportedProvider)[keyof typeof SupportedProvider]; diff --git a/apps/desktop/src/shared/constants/models.ts b/apps/desktop/src/shared/constants/models.ts index 1e939928..b818f31a 100644 --- a/apps/desktop/src/shared/constants/models.ts +++ b/apps/desktop/src/shared/constants/models.ts @@ -71,6 +71,12 @@ export const ALL_AVAILABLE_MODELS: ModelOption[] = [ { value: 'glm-4.7', label: 'GLM-4.7', provider: 'zai', description: 'Previous flagship', capabilities: { thinking: false, tools: true, vision: false, contextWindow: 128000 } }, { value: 'glm-4.6v', label: 'GLM-4.6V', provider: 'zai', description: 'Multimodal', capabilities: { thinking: false, tools: true, vision: true, contextWindow: 128000 } }, { value: 'glm-4.5-flash', label: 'GLM-4.5 Flash', provider: 'zai', description: 'Fast', capabilities: { thinking: false, tools: true, vision: false, contextWindow: 128000 } }, + // Mascarade (LLM Orchestration Engine) + { value: 'mascarade-router', label: 'Mascarade Router', provider: 'mascarade', description: 'Multi-LLM routing (best/cheapest/fastest)', capabilities: { thinking: false, tools: true, vision: false, contextWindow: 128000 } }, + { value: 'mascarade-writer', label: 'Mascarade Writer', provider: 'mascarade', description: 'Content generation agent', capabilities: { thinking: false, tools: true, vision: false, contextWindow: 128000 } }, + { value: 'mascarade-coder', label: 'Mascarade Coder', provider: 'mascarade', description: 'Code review & generation', capabilities: { thinking: false, tools: true, vision: false, contextWindow: 128000 } }, + { value: 'mascarade-analyst', label: 'Mascarade Analyst', provider: 'mascarade', description: 'Data analysis agent', capabilities: { thinking: false, tools: true, vision: false, contextWindow: 128000 } }, + { value: 'mascarade-planner', label: 'Mascarade Planner', provider: 'mascarade', description: 'Project decomposition', capabilities: { thinking: false, tools: true, vision: false, contextWindow: 128000 } }, ]; // Maps model shorthand to actual Claude model IDs @@ -322,6 +328,12 @@ export const PROVIDER_PRESET_DEFINITIONS: Partial