mirror of
https://github.com/Nezumi-2711/9router.git
synced 2026-09-22 13:38:31 +00:00
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 <cursoragent@cursor.com>
This commit is contained in:
@@ -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
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -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 }
|
||||||
|
};
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user