Files
ST-Amily2-Chat-Optimisation/core/utils/embedding-api-adapter.js

53 lines
1.7 KiB
JavaScript

function getSanitizedBaseUrl(rawApiUrl) {
let baseUrl = rawApiUrl.trim();
if (baseUrl.endsWith('/')) {
baseUrl = baseUrl.slice(0, -1);
}
if (baseUrl.endsWith('/v1')) {
baseUrl = baseUrl.slice(0, -3);
}
return baseUrl;
}
export async function fetchEmbeddingModels(rawApiUrl, apiKey) {
if (!rawApiUrl || !apiKey) {
throw new Error("API URL or Key is not provided.");
}
const baseUrl = getSanitizedBaseUrl(rawApiUrl);
const modelsUrl = `${baseUrl}/v1/models`;
console.log(`[Embedding Adapter] Fetching models from: ${modelsUrl}`);
const response = await fetch(modelsUrl, {
method: 'GET',
headers: {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
});
if (!response.ok) {
const errorBody = await response.text();
throw new Error(`Failed to fetch models (${response.status}): ${errorBody}`);
}
const data = await response.json();
if (!data.data || !Array.isArray(data.data)) {
throw new Error("Invalid response format from models API: 'data' array not found.");
}
// Return all models, sorted alphabetically. The user can choose.
return data.data.sort((a, b) => a.id.localeCompare(b.id));
}
export async function testEmbeddingConnection(rawApiUrl, apiKey) {
try {
await fetchEmbeddingModels(rawApiUrl, apiKey);
return { success: true, message: "Connection successful! API endpoint is valid." };
} catch (error) {
console.error('[Embedding Adapter] Connection test failed:', error);
return { success: false, message: `Connection failed: ${error.message}` };
}
}