From 34ea763d806a1a284e93d3400be0626d30c78a2f Mon Sep 17 00:00:00 2001 From: decolua Date: Sat, 13 Jun 2026 17:05:42 +0700 Subject: [PATCH] refactor(open-sse): add provider/model schema skeleton (C-prep) New unwired modules providers/schema.js + models/schema.js with PROVIDER_DEFAULTS, ENDPOINT_DEFAULTS, resolveProvider, MODEL_DEFAULTS, resolveModel (3-tier merge). Foundation for upcoming registry tasks; no runtime wiring yet. Co-authored-by: Cursor --- open-sse/providers/models/schema.js | 32 +++++++++++++++++++++++++++++ open-sse/providers/schema.js | 31 ++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 open-sse/providers/models/schema.js create mode 100644 open-sse/providers/schema.js diff --git a/open-sse/providers/models/schema.js b/open-sse/providers/models/schema.js new file mode 100644 index 00000000..742433fe --- /dev/null +++ b/open-sse/providers/models/schema.js @@ -0,0 +1,32 @@ +// Model schema (Mongoose-lite): central defaults + normalizer + 3-tier resolver (skeleton, not wired) + +// Centralized model defaults (caps declares positive capabilities) +export const MODEL_DEFAULTS = { + type: "llm", + quotaFamily: "normal", + strip: [], + targetFormat: null, + caps: { vision: false, audioIn: false, thinking: false } +}; + +// 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 + }; +} + +// 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 + }; +} diff --git a/open-sse/providers/schema.js b/open-sse/providers/schema.js new file mode 100644 index 00000000..035490a9 --- /dev/null +++ b/open-sse/providers/schema.js @@ -0,0 +1,31 @@ +// Provider transport schema: shared defaults + endpoint defaults + resolver (skeleton, not wired) +import { DEFAULT_RETRY_CONFIG, FETCH_CONNECT_TIMEOUT_MS } from "../config/runtimeConfig.js"; + +// Shared defaults: provider only overrides fields that differ +export const PROVIDER_DEFAULTS = { + format: "openai", + headers: {}, + auth: { header: "Authorization", scheme: "bearer", source: ["accessToken", "apiKey"] }, + retry: DEFAULT_RETRY_CONFIG, + timeoutMs: FETCH_CONNECT_TIMEOUT_MS, + executor: "default" +}; + +// Default endpoints per format (provider only overrides what differs) +export const ENDPOINT_DEFAULTS = { + openai: { chat: "/chat/completions", test: "/models", models: "/models" }, + claude: { chat: "/messages", test: "/models", countTokens: "/messages/count_tokens" }, + gemini: { chat: "/{model}:streamGenerateContent", models: "/models", test: "/models" } +}; + +// Deep-merge a provider entry over PROVIDER_DEFAULTS (defensive for missing transport) +export function resolveProvider(entry) { + const transport = (entry && entry.transport) || {}; + return { + ...PROVIDER_DEFAULTS, + ...transport, + headers: { ...PROVIDER_DEFAULTS.headers, ...transport.headers }, + auth: { ...PROVIDER_DEFAULTS.auth, ...transport.auth }, + retry: { ...PROVIDER_DEFAULTS.retry, ...transport.retry } + }; +}