mongodb-memory-bank-mcp-v2
Version:
MongoDB-powered Memory Bank MCP server with hybrid search capabilities for AI assistants
87 lines • 3.23 kB
JavaScript
import { logger } from '../utils/logger.js';
const VOYAGE_API_URL = 'https://api.voyageai.com/v1/embeddings';
const EMBEDDING_MODEL = 'voyage-3';
const EMBEDDING_DIMENSIONS = 1024;
export async function generateEmbedding(text) {
const apiKey = process.env.VOYAGE_API_KEY;
if (!apiKey) {
throw new Error('VOYAGE_API_KEY environment variable is not set');
}
try {
const response = await fetch(VOYAGE_API_URL, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${apiKey}`,
},
body: JSON.stringify({
input: text,
model: EMBEDDING_MODEL,
}),
});
if (!response.ok) {
const error = await response.text();
throw new Error(`Voyage AI API error: ${response.status} - ${error}`);
}
const data = await response.json();
if (!data.data || data.data.length === 0) {
throw new Error('No embedding returned from Voyage AI');
}
const firstData = data.data[0];
if (!firstData) {
throw new Error('No embedding data returned from Voyage AI');
}
const embedding = firstData.embedding;
if (embedding.length !== EMBEDDING_DIMENSIONS) {
throw new Error(`Unexpected embedding dimensions: ${embedding.length} (expected ${EMBEDDING_DIMENSIONS})`);
}
logger.debug(`Generated embedding for text (${text.length} chars), tokens used: ${data.usage.total_tokens}`);
return embedding;
}
catch (error) {
logger.error('Error generating embedding:', error);
throw error;
}
}
export async function generateEmbeddings(texts) {
const apiKey = process.env.VOYAGE_API_KEY;
if (!apiKey) {
throw new Error('VOYAGE_API_KEY environment variable is not set');
}
if (texts.length === 0) {
return [];
}
try {
const response = await fetch(VOYAGE_API_URL, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${apiKey}`,
},
body: JSON.stringify({
input: texts,
model: EMBEDDING_MODEL,
}),
});
if (!response.ok) {
const error = await response.text();
throw new Error(`Voyage AI API error: ${response.status} - ${error}`);
}
const data = await response.json();
if (!data.data || data.data.length !== texts.length) {
throw new Error('Unexpected number of embeddings returned from Voyage AI');
}
// Sort by index to ensure correct order
const sortedEmbeddings = data.data
.sort((a, b) => a.index - b.index)
.map(item => item.embedding);
logger.debug(`Generated ${texts.length} embeddings, tokens used: ${data.usage.total_tokens}`);
return sortedEmbeddings;
}
catch (error) {
logger.error('Error generating embeddings:', error);
throw error;
}
}
export { EMBEDDING_DIMENSIONS };
//# sourceMappingURL=voyage.js.map