UNPKG

codevault

Version:

AI-powered semantic code search via Model Context Protocol

50 lines 1.74 kB
import { createRateLimiter } from '../utils/rate-limiter.js'; import { EmbeddingProvider, getModelProfile } from './base.js'; export class OllamaProvider extends EmbeddingProvider { ollama = null; model; rateLimiter; constructor(model = process.env.CODEVAULT_OLLAMA_EMBEDDING_MODEL || process.env.CODEVAULT_OLLAMA_MODEL || 'nomic-embed-text') { super(); this.model = model; this.rateLimiter = createRateLimiter('Ollama'); } async init() { if (!this.ollama) { try { const ollama = await import('ollama'); this.ollama = ollama.default; } catch (error) { throw new Error('Ollama is not installed. Run: npm install ollama'); } } } async generateEmbedding(text) { await this.init(); const profile = await getModelProfile('Ollama', this.model); const maxChars = profile.maxChunkChars || 8000; return await this.rateLimiter.execute(async () => { const response = await this.ollama.embeddings({ model: this.model, prompt: text.slice(0, maxChars) }); return response.embedding; }); } getDimensions() { if (process.env.CODEVAULT_EMBEDDING_DIMENSIONS || process.env.CODEVAULT_DIMENSIONS) { const dims = parseInt(process.env.CODEVAULT_EMBEDDING_DIMENSIONS || process.env.CODEVAULT_DIMENSIONS || '0', 10); if (!isNaN(dims) && dims > 0) return dims; } return 768; } getName() { return 'Ollama'; } getModelName() { return this.model; } } //# sourceMappingURL=ollama.js.map