From db0cbea3f2cbecb5502c5344912d022e0cc0210a Mon Sep 17 00:00:00 2001 From: Michael Ludlow Date: Sun, 28 Dec 2025 06:47:13 -0500 Subject: [PATCH] fix: Memory Status card respects configured embedding provider (#336) (#373) The Graph Memory Status card now correctly validates the configured embedding provider (GRAPHITI_EMBEDDER_PROVIDER) instead of always requiring OPENAI_API_KEY. Supported providers: - openai (default, requires OPENAI_API_KEY) - ollama (local, no API key needed) - google (requires GOOGLE_API_KEY) - voyage (requires VOYAGE_API_KEY) - azure_openai (requires AZURE_OPENAI_API_KEY) Changes: - Add validateEmbeddingConfiguration() in utils.ts - Update memory-status-handlers.ts to use new validation - Display provider-specific error messages when keys are missing Fixes #336 Signed-off-by: Black Circle Sentinel Co-authored-by: Alex <63423455+AlexMadera@users.noreply.github.com> --- .../context/memory-status-handlers.ts | 8 +- .../src/main/ipc-handlers/context/utils.ts | 85 +++++++++++++++++++ 2 files changed, 89 insertions(+), 4 deletions(-) diff --git a/apps/frontend/src/main/ipc-handlers/context/memory-status-handlers.ts b/apps/frontend/src/main/ipc-handlers/context/memory-status-handlers.ts index 7dbd73b0..36f78265 100644 --- a/apps/frontend/src/main/ipc-handlers/context/memory-status-handlers.ts +++ b/apps/frontend/src/main/ipc-handlers/context/memory-status-handlers.ts @@ -9,7 +9,7 @@ import { loadProjectEnvVars, loadGlobalSettings, isGraphitiEnabled, - hasOpenAIKey, + validateEmbeddingConfiguration, getGraphitiDatabaseDetails } from './utils'; @@ -76,7 +76,7 @@ export function buildMemoryStatus( // Check environment configuration const graphitiEnabled = isGraphitiEnabled(projectEnvVars); - const hasOpenAI = hasOpenAIKey(projectEnvVars, globalSettings); + const embeddingValidation = validateEmbeddingConfiguration(projectEnvVars, globalSettings); if (!graphitiEnabled) { return { @@ -86,11 +86,11 @@ export function buildMemoryStatus( }; } - if (!hasOpenAI) { + if (!embeddingValidation.valid) { return { enabled: true, available: false, - reason: 'OPENAI_API_KEY not set (required for Graphiti embeddings)' + reason: embeddingValidation.reason }; } diff --git a/apps/frontend/src/main/ipc-handlers/context/utils.ts b/apps/frontend/src/main/ipc-handlers/context/utils.ts index 2bf502ef..c8157517 100644 --- a/apps/frontend/src/main/ipc-handlers/context/utils.ts +++ b/apps/frontend/src/main/ipc-handlers/context/utils.ts @@ -119,6 +119,91 @@ export function hasOpenAIKey(projectEnvVars: EnvironmentVars, globalSettings: Gl ); } +/** + * Embedding configuration validation result + */ +export interface EmbeddingValidationResult { + valid: boolean; + provider: string; + reason?: string; +} + +/** + * Validate embedding configuration based on the configured provider + * Supports: openai, ollama, google, voyage, azure_openai + * + * @returns validation result with provider info and reason if invalid + */ +export function validateEmbeddingConfiguration( + projectEnvVars: EnvironmentVars, + globalSettings: GlobalSettings +): EmbeddingValidationResult { + // Get the configured embedding provider (default to openai for backwards compatibility) + const provider = ( + projectEnvVars['GRAPHITI_EMBEDDER_PROVIDER'] || + process.env.GRAPHITI_EMBEDDER_PROVIDER || + 'openai' + ).toLowerCase(); + + switch (provider) { + case 'openai': { + if (hasOpenAIKey(projectEnvVars, globalSettings)) { + return { valid: true, provider: 'openai' }; + } + return { + valid: false, + provider: 'openai', + reason: 'OPENAI_API_KEY not set (required for OpenAI embeddings)' + }; + } + + case 'ollama': { + // Ollama is local, no API key needed - works with default localhost + return { valid: true, provider: 'ollama' }; + } + + case 'google': { + const googleKey = projectEnvVars['GOOGLE_API_KEY'] || process.env.GOOGLE_API_KEY; + if (googleKey) { + return { valid: true, provider: 'google' }; + } + return { + valid: false, + provider: 'google', + reason: 'GOOGLE_API_KEY not set (required for Google AI embeddings)' + }; + } + + case 'voyage': { + const voyageKey = projectEnvVars['VOYAGE_API_KEY'] || process.env.VOYAGE_API_KEY; + if (voyageKey) { + return { valid: true, provider: 'voyage' }; + } + return { + valid: false, + provider: 'voyage', + reason: 'VOYAGE_API_KEY not set (required for Voyage AI embeddings)' + }; + } + + case 'azure_openai': { + const azureKey = projectEnvVars['AZURE_OPENAI_API_KEY'] || process.env.AZURE_OPENAI_API_KEY; + if (azureKey) { + return { valid: true, provider: 'azure_openai' }; + } + return { + valid: false, + provider: 'azure_openai', + reason: 'AZURE_OPENAI_API_KEY not set (required for Azure OpenAI embeddings)' + }; + } + + default: + // Unknown provider - assume it might work + return { valid: true, provider }; + } +} + /** * Get Graphiti database details (LadybugDB - embedded database) */