From d2b0960bf7f51cb4a1a34d84767701447e73896b Mon Sep 17 00:00:00 2001 From: decolua Date: Sat, 13 Jun 2026 21:13:37 +0700 Subject: [PATCH] =?UTF-8?q?refactor(open-sse):=20P3=C2=A77=20model=20defau?= =?UTF-8?q?lts=20schema=20=E2=80=94=20centralize=20type/quotaFamily/strip/?= =?UTF-8?q?targetFormat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- open-sse/config/providerModels.js | 10 ++++---- open-sse/providers/models/schema.js | 37 ++++++++++------------------- 2 files changed, 17 insertions(+), 30 deletions(-) diff --git a/open-sse/config/providerModels.js b/open-sse/config/providerModels.js index e0bb6599..01bb5dfd 100644 --- a/open-sse/config/providerModels.js +++ b/open-sse/config/providerModels.js @@ -1,6 +1,7 @@ import { PROVIDERS } from "./providers.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"; export { PROVIDER_MODELS }; @@ -34,8 +35,7 @@ export function findModelName(aliasOrId, modelId) { export function getModelTargetFormat(aliasOrId, modelId) { const models = PROVIDER_MODELS[aliasOrId]; if (!models) return null; - const found = models.find(m => m.id === modelId); - return found?.targetFormat || null; + return modelTargetFormat(models.find(m => m.id === modelId)); } export function getModelType(aliasOrId, modelId) { @@ -57,8 +57,7 @@ export function getModelUpstreamId(aliasOrId, modelId) { export function getModelQuotaFamily(aliasOrId, modelId) { const models = PROVIDER_MODELS[aliasOrId]; - const found = models?.find(m => m.id === modelId); - return found?.quotaFamily || "normal"; + return modelQuotaFamily(models?.find(m => m.id === modelId)); } // 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) // Returns array of content types to strip, e.g. ["image", "audio"] export function getModelStrip(alias, modelId) { - const entry = PROVIDER_MODELS[alias]?.find(m => m.id === modelId); - return entry?.strip || []; + return modelStrip(PROVIDER_MODELS[alias]?.find(m => m.id === modelId)); } diff --git a/open-sse/providers/models/schema.js b/open-sse/providers/models/schema.js index 742433fe..fef8ba52 100644 --- a/open-sse/providers/models/schema.js +++ b/open-sse/providers/models/schema.js @@ -1,32 +1,21 @@ -// Model schema (Mongoose-lite): central defaults + normalizer + 3-tier resolver (skeleton, not wired) - -// Centralized model defaults (caps declares positive capabilities) +// Model defaults centralized (was scattered as `m.type || "llm"`, `quotaFamily || "normal"`, etc.) export const MODEL_DEFAULTS = { type: "llm", quotaFamily: "normal", strip: [], - targetFormat: null, - caps: { vision: false, audioIn: false, thinking: false } + targetFormat: null }; -// Normalize a raw model entry over defaults (deep-merge caps) -export function normalizeModel(raw) { - return { - ...MODEL_DEFAULTS, - ...raw, - caps: { ...MODEL_DEFAULTS.caps, ...raw.caps }, - upstreamModelId: raw.upstreamModelId || raw.id - }; +// Resolve a single field with its default (keeps accessor call-sites one-liners) +export function modelType(model) { + return model?.type || MODEL_DEFAULTS.type; } - -// 3-tier fallback: defaults -> catalog canonical -> provider inline override (wins) -export function resolveModel(catalog, ref) { - const raw = typeof ref === "string" ? { id: ref } : ref; - return { - ...MODEL_DEFAULTS, - ...catalog[raw.id], - ...raw, - caps: { ...MODEL_DEFAULTS.caps, ...catalog[raw.id]?.caps, ...raw.caps }, - upstreamModelId: raw.upstreamModelId || catalog[raw.id]?.upstreamModelId || raw.id - }; +export function modelQuotaFamily(model) { + return model?.quotaFamily || MODEL_DEFAULTS.quotaFamily; +} +export function modelStrip(model) { + return model?.strip || []; +} +export function modelTargetFormat(model) { + return model?.targetFormat || MODEL_DEFAULTS.targetFormat; }