ai_api / src /app /api /models /catalog /route.ts
Yogesh
initial deploy
cd8bd0a
Raw
History Blame Contribute Delete
2.8 kB
import { AI_PROVIDERS } from "@/shared/constants/providers";
import { getUnifiedModelsResponse } from "@/app/api/v1/models/catalog";
import { INTERNAL_PROXY_ERROR, getCatalogDiagnosticsHeaders } from "@/lib/modelMetadataRegistry";
import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error";
/**
* GET /api/models/catalog
* Returns all models grouped by provider, with metadata (type, custom flag)
*/
export async function GET(request: Request) {
const diagnosticHeaders = getCatalogDiagnosticsHeaders({ request });
try {
const response = await getUnifiedModelsResponse(request, {});
const body = await response.json();
if (!response.ok) {
return Response.json(body, {
status: response.status,
headers: {
...diagnosticHeaders,
},
});
}
const catalog: Record<string, any> = {};
for (const model of body.data || []) {
const providerId =
typeof model.owned_by === "string" && model.owned_by.length > 0
? model.owned_by
: "unknown";
const bucket = catalog[providerId] || {
provider: AI_PROVIDERS[providerId]?.name || providerId,
active: providerId !== "unknown",
models: [],
};
bucket.models.push({
id: model.id,
name: model.name || model.root || model.id,
type: model.type || "chat",
custom: model.custom === true,
...(model.free === true ? { free: true } : {}),
...(model.capabilities ? { capabilities: model.capabilities } : {}),
...(typeof model.context_length === "number"
? { context_length: model.context_length }
: {}),
...(typeof model.max_output_tokens === "number"
? { max_output_tokens: model.max_output_tokens }
: {}),
...(Array.isArray(model.input_modalities)
? { input_modalities: model.input_modalities }
: {}),
...(Array.isArray(model.output_modalities)
? { output_modalities: model.output_modalities }
: {}),
...(Array.isArray(model.supported_endpoints)
? { supported_endpoints: model.supported_endpoints }
: {}),
});
catalog[providerId] = bucket;
}
return Response.json(
{ catalog, catalogVersion: response.headers.get("X-Model-Catalog-Version") },
{
headers: {
...diagnosticHeaders,
},
}
);
} catch (error) {
return Response.json(
{
error: {
message: sanitizeErrorMessage(error instanceof Error ? error.message : String(error)),
type: "server_error",
code: INTERNAL_PROXY_ERROR,
},
},
{
status: 500,
headers: {
...diagnosticHeaders,
},
}
);
}
}