import type { Api, ClassifierApi, ClassifierModel, ImageApi, ImageModel, Model, ModelType, ProviderId, } from "./types.ts"; export type ModelGroups = Record>; type ModelKey = { [TApi in keyof TGroups]: keyof TGroups[TApi]; }[keyof TGroups] & string; type KeyForType = Extract< ModelKey, `${TType}:${string}` >; type ModelId = TKey extends `${ModelType}:${infer TModelId}` ? TModelId : never; type ApiForKey> = { [TApi in keyof TGroups]: TKey extends keyof TGroups[TApi] ? TApi : never; }[keyof TGroups]; export type ChatModelCatalog = { [TKey in KeyForType as ModelId]: Model & Api> & { id: ModelId; provider: TProvider; }; }; export type ImageModelCatalog = { [TKey in KeyForType as ModelId]: ImageModel & ImageApi> & { id: ModelId; provider: TProvider; }; }; export type ClassifierModelCatalog = { [TKey in KeyForType as ModelId]: ClassifierModel< ApiForKey & ClassifierApi > & { id: ModelId; provider: TProvider; }; }; function flattenModelCatalog(groups: ModelGroups, type: ModelType): Record { return Object.fromEntries( Object.values(groups) .flatMap((models) => Object.values(models)) .filter((model) => (model as { type?: unknown }).type === type) .map((model) => [(model as { id: string }).id, model]), ); } export function flattenChatModelCatalog( _provider: TProvider, groups: TGroups, ): ChatModelCatalog { return flattenModelCatalog(groups, "chat") as ChatModelCatalog; } export function flattenImageModelCatalog( _provider: TProvider, groups: TGroups, ): ImageModelCatalog { return flattenModelCatalog(groups, "image") as ImageModelCatalog; } export function flattenClassifierModelCatalog( _provider: TProvider, groups: TGroups, ): ClassifierModelCatalog { return flattenModelCatalog(groups, "classifier") as ClassifierModelCatalog; }