mirror of
https://github.com/Nezumi-2711/9router.git
synced 2026-09-22 13:38:31 +00:00
- 71 registry files: flat `media.*Config.models` → `models[]` with `kind` field - `media` wrapper removed → serviceKinds, *Config fields promoted top-level - `type` field renamed to `kind` (llm/image/tts/stt/embedding/embedding/video/music) - providers/index.js: PROVIDER_MEDIA now built from flat top-level media fields - shared/constants/providers.js: buildProviderEntry reads flat top-level media fields - route /v1/models: modelKind() uses kind||type; removed subConfig merge block - models/info route: removed sub-config fallback lookup (all models in PROVIDER_MODELS) - ttsProviders/index.js: synthesizeViaConfig reads tts models from PROVIDER_MODELS - test-models route, helpers.js, validate route: kind||type compat - Baselines: PROVIDERS 62/62 ✅, Alias 90/90 ✅ Co-authored-by: Cursor <cursoragent@cursor.com>
84 lines
3.0 KiB
JavaScript
84 lines
3.0 KiB
JavaScript
import { PROVIDERS } from "./providers.js";
|
|
import REGISTRY from "../providers/registry/index.js";
|
|
// PROVIDER_MODELS now built from providers/registry (transport + models co-located)
|
|
import { PROVIDER_MODELS } from "../providers/index.js";
|
|
import { modelQuotaFamily, modelStrip, modelTargetFormat } from "../providers/models/schema.js";
|
|
import { CODEX_REVIEW_SUFFIX } from "../providers/models/helpers.js";
|
|
|
|
export { PROVIDER_MODELS };
|
|
|
|
|
|
// Helper functions
|
|
export function getProviderModels(aliasOrId) {
|
|
return PROVIDER_MODELS[aliasOrId] || [];
|
|
}
|
|
|
|
export function getDefaultModel(aliasOrId) {
|
|
const models = PROVIDER_MODELS[aliasOrId];
|
|
return models?.[0]?.id || null;
|
|
}
|
|
|
|
export function isValidModel(aliasOrId, modelId, passthroughProviders = new Set()) {
|
|
if (passthroughProviders.has(aliasOrId)) return true;
|
|
const models = PROVIDER_MODELS[aliasOrId];
|
|
if (!models) return false;
|
|
return models.some(m => m.id === modelId);
|
|
}
|
|
|
|
export function findModelName(aliasOrId, modelId) {
|
|
const models = PROVIDER_MODELS[aliasOrId];
|
|
if (!models) return modelId;
|
|
const found = models.find(m => m.id === modelId);
|
|
return found?.name || modelId;
|
|
}
|
|
|
|
export function getModelTargetFormat(aliasOrId, modelId) {
|
|
const models = PROVIDER_MODELS[aliasOrId];
|
|
if (!models) return null;
|
|
return modelTargetFormat(models.find(m => m.id === modelId));
|
|
}
|
|
|
|
export function getModelType(aliasOrId, modelId) {
|
|
const models = PROVIDER_MODELS[aliasOrId];
|
|
if (!models) return null;
|
|
const found = models.find(m => m.id === modelId);
|
|
return found?.kind || found?.type || null;
|
|
}
|
|
|
|
export function getModelUpstreamId(aliasOrId, modelId) {
|
|
const models = PROVIDER_MODELS[aliasOrId];
|
|
const found = models?.find(m => m.id === modelId);
|
|
if (found?.upstreamModelId) return found.upstreamModelId;
|
|
if (aliasOrId === "cx" && typeof modelId === "string" && modelId.endsWith(CODEX_REVIEW_SUFFIX)) {
|
|
return modelId.slice(0, -CODEX_REVIEW_SUFFIX.length);
|
|
}
|
|
return modelId;
|
|
}
|
|
|
|
export function getModelQuotaFamily(aliasOrId, modelId) {
|
|
const models = PROVIDER_MODELS[aliasOrId];
|
|
return modelQuotaFamily(models?.find(m => m.id === modelId));
|
|
}
|
|
|
|
// OAuth short aliases — derived from registry `alias` (single source). everything else: alias = id.
|
|
// vertex/vertex-partner keep alias=id (kept via the `|| id` fallback in consumers).
|
|
export const OAUTH_ALIASES = Object.fromEntries(
|
|
REGISTRY.filter(r => r.alias && r.alias !== r.id).map(r => [r.id, r.alias])
|
|
);
|
|
|
|
// Derived from PROVIDERS — no need to maintain manually
|
|
export const PROVIDER_ID_TO_ALIAS = Object.fromEntries(
|
|
Object.keys(PROVIDERS).map(id => [id, OAUTH_ALIASES[id] || id])
|
|
);
|
|
|
|
export function getModelsByProviderId(providerId) {
|
|
const alias = PROVIDER_ID_TO_ALIAS[providerId] || providerId;
|
|
return PROVIDER_MODELS[alias] || [];
|
|
}
|
|
|
|
// Get strip list for a model entry (explicit opt-in only)
|
|
// Returns array of content types to strip, e.g. ["image", "audio"]
|
|
export function getModelStrip(alias, modelId) {
|
|
return modelStrip(PROVIDER_MODELS[alias]?.find(m => m.id === modelId));
|
|
}
|