codevault
Version:
AI-powered semantic code search via Model Context Protocol
50 lines • 1.74 kB
JavaScript
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