/** * Voyage AI API Client * Generated by vai v{{vaiVersion}} on {{generatedAt}} * * Model: {{model}} * Dimensions: {{dimensions}} */ const VOYAGE_API_URL = process.env.VOYAGE_API_URL || 'https://api.voyageai.com/v1'; const VOYAGE_API_KEY = process.env.VOYAGE_API_KEY; if (!VOYAGE_API_KEY) { throw new Error('VOYAGE_API_KEY environment variable is required'); } /** * Generate embeddings for text(s) using Voyage AI. * @param {string|string[]} input - Text or array of texts to embed * @param {object} options - Optional parameters * @param {string} options.model - Embedding model (default: {{model}}) * @param {string} options.inputType - 'document' or 'query' (default: {{inputType}}) * @param {number} options.outputDimension - Output dimensions (default: {{dimensions}}) * @returns {Promise<{embeddings: number[][], usage: {total_tokens: number}}>} */ async function embed(input, options = {}) { const texts = Array.isArray(input) ? input : [input]; const response = await fetch(`${VOYAGE_API_URL}/embeddings`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${VOYAGE_API_KEY}`, }, body: JSON.stringify({ model: options.model || '{{model}}', input: texts, input_type: options.inputType || '{{inputType}}', output_dimension: options.outputDimension || {{dimensions}}, }), }); if (!response.ok) { const error = await response.text(); throw new Error(`Voyage AI API error: ${response.status} ${error}`); } const data = await response.json(); return { embeddings: data.data.map(d => d.embedding), usage: data.usage, }; } {{#if rerank}} /** * Rerank documents by relevance to a query. * @param {string} query - The query to rank against * @param {string[]} documents - Documents to rerank * @param {object} options - Optional parameters * @param {string} options.model - Rerank model (default: {{rerankModel}}) * @param {number} options.topK - Number of results to return * @returns {Promise<{results: Array<{index: number, relevanceScore: number, document: string}>}>} */ async function rerank(query, documents, options = {}) { const response = await fetch(`${VOYAGE_API_URL}/rerank`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${VOYAGE_API_KEY}`, }, body: JSON.stringify({ model: options.model || '{{rerankModel}}', query, documents, top_k: options.topK, return_documents: true, }), }); if (!response.ok) { const error = await response.text(); throw new Error(`Voyage AI rerank error: ${response.status} ${error}`); } const data = await response.json(); return { results: data.data.map(d => ({ index: d.index, relevanceScore: d.relevance_score, document: d.document, })), usage: data.usage, }; } {{/if}} module.exports = { embed, {{#if rerank}} rerank, {{/if}} VOYAGE_API_URL, };