diff --git a/src/model-catalog/refs.ts b/src/model-catalog/refs.ts new file mode 100644 index 00000000000..1bdeba3c9c8 --- /dev/null +++ b/src/model-catalog/refs.ts @@ -0,0 +1,13 @@ +import { normalizeLowercaseStringOrEmpty } from "../shared/string-coerce.js"; + +export function normalizeModelCatalogProviderId(provider: string): string { + return normalizeLowercaseStringOrEmpty(provider); +} + +export function buildModelCatalogRef(provider: string, modelId: string): string { + return `${normalizeModelCatalogProviderId(provider)}/${modelId}`; +} + +export function buildModelCatalogMergeKey(provider: string, modelId: string): string { + return `${normalizeModelCatalogProviderId(provider)}::${normalizeLowercaseStringOrEmpty(modelId)}`; +} diff --git a/src/model-catalog/types.ts b/src/model-catalog/types.ts new file mode 100644 index 00000000000..e3a832c06fc --- /dev/null +++ b/src/model-catalog/types.ts @@ -0,0 +1,97 @@ +import type { ModelApi, ModelCompatConfig } from "../config/types.models.js"; + +export type ModelCatalogInput = "text" | "image" | "document"; +export type ModelCatalogDiscovery = "static" | "refreshable" | "runtime"; +export type ModelCatalogStatus = "available" | "preview" | "deprecated" | "disabled"; +export type ModelCatalogSource = + | "manifest" + | "provider-index" + | "cache" + | "config" + | "runtime-refresh"; + +export type ModelCatalogTieredCost = { + input: number; + output: number; + cacheRead: number; + cacheWrite: number; + range: [number, number] | [number]; +}; + +export type ModelCatalogCost = { + input?: number; + output?: number; + cacheRead?: number; + cacheWrite?: number; + tieredPricing?: ModelCatalogTieredCost[]; +}; + +export type ModelCatalogModel = { + id: string; + name?: string; + api?: ModelApi; + baseUrl?: string; + headers?: Record; + input?: ModelCatalogInput[]; + reasoning?: boolean; + contextWindow?: number; + contextTokens?: number; + maxTokens?: number; + cost?: ModelCatalogCost; + compat?: ModelCompatConfig; + status?: ModelCatalogStatus; + statusReason?: string; + replaces?: string[]; + replacedBy?: string; + tags?: string[]; +}; + +export type ModelCatalogProvider = { + baseUrl?: string; + api?: ModelApi; + headers?: Record; + models: ModelCatalogModel[]; +}; + +export type ModelCatalogAlias = { + provider: string; + api?: ModelApi; + baseUrl?: string; +}; + +export type ModelCatalogSuppression = { + provider: string; + model: string; + reason?: string; +}; + +export type ModelCatalog = { + providers?: Record; + aliases?: Record; + suppressions?: ModelCatalogSuppression[]; + discovery?: Record; +}; + +export type NormalizedModelCatalogRow = { + provider: string; + id: string; + ref: string; + mergeKey: string; + name: string; + source: ModelCatalogSource; + input: ModelCatalogInput[]; + reasoning: boolean; + status: ModelCatalogStatus; + api?: ModelApi; + baseUrl?: string; + headers?: Record; + contextWindow?: number; + contextTokens?: number; + maxTokens?: number; + cost?: ModelCatalogCost; + compat?: ModelCompatConfig; + statusReason?: string; + replaces?: string[]; + replacedBy?: string; + tags?: string[]; +};