socraticode
Version:
SocratiCode — MCP server for local codebase indexing, semantic search, and code dependency graphs. All private, all local via Docker.
74 lines • 3.27 kB
JavaScript
// SPDX-License-Identifier: AGPL-3.0-only
// Copyright (C) 2026 Giancarlo Erra - Altaire Limited
/**
* Embedding provider factory.
*
* All embedding providers implement the EmbeddingProvider interface (defined
* in embedding-types.ts), allowing the rest of the codebase to be agnostic
* about which backend generates the vectors.
*
* Providers:
* - ollama (default) — local Ollama (Docker or external)
* - openai — OpenAI Embeddings API (text-embedding-3-small, etc.)
* - google — Google Generative AI Embedding API (gemini-embedding-001, etc.)
* - lmstudio — local LM Studio server via OpenAI-compatible API
* - litellm — LiteLLM proxy (OpenAI-compatible gateway in front of 100+ providers)
*/
import { getEmbeddingConfig } from "./embedding-config.js";
import { logger } from "./logger.js";
// ── Factory ──────────────────────────────────────────────────────────────
let _provider = null;
let _providerName = null;
/**
* Get (or create) the active embedding provider singleton.
* Provider is selected based on EMBEDDING_PROVIDER env var.
* @param onProgress Optional callback for reporting infrastructure setup progress
*/
export async function getEmbeddingProvider(onProgress) {
const config = getEmbeddingConfig();
// Recreate if provider changed (e.g. after config reset in tests)
if (_provider && _providerName === config.embeddingProvider) {
return _provider;
}
const name = config.embeddingProvider;
logger.info("Initializing embedding provider", { provider: name });
switch (name) {
case "ollama": {
// Dynamic imports avoid loading all provider SDKs at startup.
const { OllamaEmbeddingProvider } = await import("./provider-ollama.js");
_provider = new OllamaEmbeddingProvider(onProgress);
break;
}
case "openai": {
const { OpenAIEmbeddingProvider } = await import("./provider-openai.js");
_provider = new OpenAIEmbeddingProvider();
break;
}
case "google": {
const { GoogleEmbeddingProvider } = await import("./provider-google.js");
_provider = new GoogleEmbeddingProvider();
break;
}
case "lmstudio": {
const { LMStudioEmbeddingProvider } = await import("./provider-lmstudio.js");
_provider = new LMStudioEmbeddingProvider();
break;
}
case "litellm": {
const { LiteLLMEmbeddingProvider } = await import("./provider-litellm.js");
_provider = new LiteLLMEmbeddingProvider();
break;
}
default:
throw new Error(`Unknown embedding provider: "${name}". Must be "ollama", "openai", "google", "lmstudio", or "litellm".`);
}
_providerName = name;
// biome-ignore lint/style/noNonNullAssertion: _provider is guaranteed set by the switch above
return _provider;
}
/** Reset the provider singleton (for testing). */
export function resetEmbeddingProvider() {
_provider = null;
_providerName = null;
}
//# sourceMappingURL=embedding-provider.js.map