armand0e's picture
Reimplement Openrouter filter
49687c1
import { NextResponse } from "next/server";
interface OpenRouterModel {
id: string;
name: string;
created_at?: string | number;
createdAt?: string | number;
created?: string | number;
released_at?: string | number;
releasedAt?: string | number;
release_date?: string | number;
pricing: {
prompt: string;
completion: string;
};
context_length: number;
}
function toTimestampMs(value: unknown): number {
if (typeof value === "number") {
// Heuristic: treat small values as seconds
return value > 1_000_000_000_000 ? value : value * 1000;
}
if (typeof value === "string") {
const parsed = Date.parse(value);
return Number.isFinite(parsed) ? parsed : 0;
}
return 0;
}
function getModelTimestampMs(model: OpenRouterModel): number {
return Math.max(
toTimestampMs(model.released_at),
toTimestampMs(model.releasedAt),
toTimestampMs(model.release_date),
toTimestampMs(model.created_at),
toTimestampMs(model.createdAt),
toTimestampMs(model.created)
);
}
let cachedModels: { id: string; name: string }[] | null = null;
let cacheTimestamp: number = 0;
const CACHE_DURATION = 1000 * 60 * 60; // 1 hour
export async function GET() {
try {
const now = Date.now();
if (cachedModels && now - cacheTimestamp < CACHE_DURATION) {
return NextResponse.json(cachedModels);
}
const response = await fetch("https://openrouter.ai/api/v1/models", {
headers: {
Accept: "application/json",
},
next: { revalidate: 3600 },
});
if (!response.ok) {
throw new Error(`OpenRouter API error: ${response.status}`);
}
const data = await response.json();
cachedModels = data.data
.slice()
.sort((a: OpenRouterModel, b: OpenRouterModel) => {
const bt = getModelTimestampMs(b);
const at = getModelTimestampMs(a);
if (bt !== at) return bt - at;
const an = (a.name || a.id).toLowerCase();
const bn = (b.name || b.id).toLowerCase();
return an.localeCompare(bn);
})
.map((model: OpenRouterModel) => ({
id: model.id,
name: model.name || model.id,
}));
cacheTimestamp = now;
return NextResponse.json(cachedModels);
} catch (error) {
console.error("Error fetching OpenRouter models:", error);
if (cachedModels) {
return NextResponse.json(cachedModels);
}
return NextResponse.json([], { status: 500 });
}
}