mirror of
https://github.com/Nezumi-2711/9router.git
synced 2026-09-22 13:38:31 +00:00
refactor(open-sse): P3§7 model defaults schema — centralize type/quotaFamily/strip/targetFormat
- Add providers/models/schema.js (MODEL_DEFAULTS + field resolvers) - Accessors getModelTargetFormat/QuotaFamily/Strip use shared default resolvers - getModelType keeps null contract unchanged; behavior verified equal - No catalog forced into registry (models stay self-contained per docs decision) Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
import { PROVIDERS } from "./providers.js";
|
import { PROVIDERS } from "./providers.js";
|
||||||
// PROVIDER_MODELS now built from providers/registry (transport + models co-located)
|
// PROVIDER_MODELS now built from providers/registry (transport + models co-located)
|
||||||
import { PROVIDER_MODELS } from "../providers/index.js";
|
import { PROVIDER_MODELS } from "../providers/index.js";
|
||||||
|
import { modelQuotaFamily, modelStrip, modelTargetFormat } from "../providers/models/schema.js";
|
||||||
|
|
||||||
export { PROVIDER_MODELS };
|
export { PROVIDER_MODELS };
|
||||||
|
|
||||||
@@ -34,8 +35,7 @@ export function findModelName(aliasOrId, modelId) {
|
|||||||
export function getModelTargetFormat(aliasOrId, modelId) {
|
export function getModelTargetFormat(aliasOrId, modelId) {
|
||||||
const models = PROVIDER_MODELS[aliasOrId];
|
const models = PROVIDER_MODELS[aliasOrId];
|
||||||
if (!models) return null;
|
if (!models) return null;
|
||||||
const found = models.find(m => m.id === modelId);
|
return modelTargetFormat(models.find(m => m.id === modelId));
|
||||||
return found?.targetFormat || null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getModelType(aliasOrId, modelId) {
|
export function getModelType(aliasOrId, modelId) {
|
||||||
@@ -57,8 +57,7 @@ export function getModelUpstreamId(aliasOrId, modelId) {
|
|||||||
|
|
||||||
export function getModelQuotaFamily(aliasOrId, modelId) {
|
export function getModelQuotaFamily(aliasOrId, modelId) {
|
||||||
const models = PROVIDER_MODELS[aliasOrId];
|
const models = PROVIDER_MODELS[aliasOrId];
|
||||||
const found = models?.find(m => m.id === modelId);
|
return modelQuotaFamily(models?.find(m => m.id === modelId));
|
||||||
return found?.quotaFamily || "normal";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// OAuth providers that use short aliases (everything else: alias = id)
|
// OAuth providers that use short aliases (everything else: alias = id)
|
||||||
@@ -96,6 +95,5 @@ export function getModelsByProviderId(providerId) {
|
|||||||
// Get strip list for a model entry (explicit opt-in only)
|
// Get strip list for a model entry (explicit opt-in only)
|
||||||
// Returns array of content types to strip, e.g. ["image", "audio"]
|
// Returns array of content types to strip, e.g. ["image", "audio"]
|
||||||
export function getModelStrip(alias, modelId) {
|
export function getModelStrip(alias, modelId) {
|
||||||
const entry = PROVIDER_MODELS[alias]?.find(m => m.id === modelId);
|
return modelStrip(PROVIDER_MODELS[alias]?.find(m => m.id === modelId));
|
||||||
return entry?.strip || [];
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,32 +1,21 @@
|
|||||||
// Model schema (Mongoose-lite): central defaults + normalizer + 3-tier resolver (skeleton, not wired)
|
// Model defaults centralized (was scattered as `m.type || "llm"`, `quotaFamily || "normal"`, etc.)
|
||||||
|
|
||||||
// Centralized model defaults (caps declares positive capabilities)
|
|
||||||
export const MODEL_DEFAULTS = {
|
export const MODEL_DEFAULTS = {
|
||||||
type: "llm",
|
type: "llm",
|
||||||
quotaFamily: "normal",
|
quotaFamily: "normal",
|
||||||
strip: [],
|
strip: [],
|
||||||
targetFormat: null,
|
targetFormat: null
|
||||||
caps: { vision: false, audioIn: false, thinking: false }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Normalize a raw model entry over defaults (deep-merge caps)
|
// Resolve a single field with its default (keeps accessor call-sites one-liners)
|
||||||
export function normalizeModel(raw) {
|
export function modelType(model) {
|
||||||
return {
|
return model?.type || MODEL_DEFAULTS.type;
|
||||||
...MODEL_DEFAULTS,
|
|
||||||
...raw,
|
|
||||||
caps: { ...MODEL_DEFAULTS.caps, ...raw.caps },
|
|
||||||
upstreamModelId: raw.upstreamModelId || raw.id
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
export function modelQuotaFamily(model) {
|
||||||
// 3-tier fallback: defaults -> catalog canonical -> provider inline override (wins)
|
return model?.quotaFamily || MODEL_DEFAULTS.quotaFamily;
|
||||||
export function resolveModel(catalog, ref) {
|
}
|
||||||
const raw = typeof ref === "string" ? { id: ref } : ref;
|
export function modelStrip(model) {
|
||||||
return {
|
return model?.strip || [];
|
||||||
...MODEL_DEFAULTS,
|
}
|
||||||
...catalog[raw.id],
|
export function modelTargetFormat(model) {
|
||||||
...raw,
|
return model?.targetFormat || MODEL_DEFAULTS.targetFormat;
|
||||||
caps: { ...MODEL_DEFAULTS.caps, ...catalog[raw.id]?.caps, ...raw.caps },
|
|
||||||
upstreamModelId: raw.upstreamModelId || catalog[raw.id]?.upstreamModelId || raw.id
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user