mirror of
https://github.com/Nezumi-2711/9router.git
synced 2026-09-22 20:00:47 +00:00
- Backup DB only on real SCHEMA_VERSION change, not every app version bump - Kill idle MCP stdio bridge children to prevent orphan process leaks - Add getDistinctProviders to avoid loading every row JSON blob (OOM fix) - Update codex model list (gpt-5.6 sol/terra/luna, drop 5.3 codex variants) - Reorder Claude default models (fable first) Co-authored-by: Cursor <cursoragent@cursor.com>
42 lines
1.3 KiB
JavaScript
42 lines
1.3 KiB
JavaScript
import { NextResponse } from "next/server";
|
|
import { getDistinctProviders } from "@/lib/requestDetailsDb";
|
|
import { getProviderNodes } from "@/lib/localDb";
|
|
import { AI_PROVIDERS, getProviderByAlias } from "@/shared/constants/providers";
|
|
|
|
/**
|
|
* GET /api/usage/providers
|
|
* Returns list of unique providers from request details
|
|
*/
|
|
export async function GET() {
|
|
try {
|
|
// Query DISTINCT provider column directly — avoids parsing every row's
|
|
// full JSON blob (can be hundreds of MB), which previously caused OOM.
|
|
const providerIds = await getDistinctProviders();
|
|
|
|
const providerNodes = await getProviderNodes();
|
|
const nodeMap = {};
|
|
for (const node of providerNodes) {
|
|
nodeMap[node.id] = node.name;
|
|
}
|
|
|
|
const providers = providerIds.map(providerId => {
|
|
let name = providerId;
|
|
if (nodeMap[providerId]) {
|
|
name = nodeMap[providerId];
|
|
} else {
|
|
const providerConfig = getProviderByAlias(providerId) || AI_PROVIDERS[providerId];
|
|
if (providerConfig?.name) name = providerConfig.name;
|
|
}
|
|
return { id: providerId, name };
|
|
});
|
|
|
|
return NextResponse.json({ providers });
|
|
} catch (error) {
|
|
console.error("[API] Failed to get providers:", error);
|
|
return NextResponse.json(
|
|
{ error: "Failed to fetch providers" },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|