Forked from will-lms/openai-compat-endpoint
src / api.ts
// src/api.ts
// Модуль для загрузки списка моделей с OpenRouter API
export interface ModelData {
id: string;
name?: string;
description?: string;
context_length?: number;
pricing?: any;
}
export interface ModelsResponse {
data: ModelData[];
}
/**
* Загружает список моделей с OpenRouter API
* @param baseUrl - базовый URL API (например, https://openrouter.ai/api/v1)
* @param apiKey - опциональный API ключ для авторизации
* @returns массив идентификаторов моделей
*/
export async function fetchModels(
baseUrl: string,
apiKey?: string
): Promise<string[]> {
try {
const modelsUrl = `${baseUrl}/models`;
if (typeof fetch === 'undefined') {
throw new Error('fetch is not available in this environment');
}
const headers: Record<string, string> = {};
if (apiKey && apiKey.trim()) {
headers["Authorization"] = `Bearer ${apiKey}`;
}
const response = await fetch(modelsUrl, {
method: 'GET',
headers
});
if (!response.ok) {
const errorText = await response.text();
throw new Error(`HTTP ${response.status}: ${errorText}`);
}
const data = await response.json() as ModelsResponse;
if (!data.data || !Array.isArray(data.data)) {
console.warn("[API] Invalid response format from models endpoint");
return [];
}
const allModels = data.data.map((m: ModelData) => m.id).filter(Boolean);
return allModels;
} catch (error) {
console.error("[API] Failed to fetch models:", error);
return [];
}
}
/**
* Фильтрует список моделей, оставляя только бесплатные (с суффиксом :free)
* @param models - полный список моделей
* @returns отфильтрованный список бесплатных моделей
*/
export function filterFreeModels(models: string[]): string[] {
return models.filter((id: string) => id.includes(":free"));
}