UNPKG

@lobehub/chat

Version:

Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.

139 lines (117 loc) 4.15 kB
/** * Model Name Resolver Utilities * * Helper functions for resolving model names to configurations * Contains all model lookup and query functions */ import debug from 'debug'; import { MODEL_ID_VARIANT_MAP, MODEL_REGISTRY, type ModelConfig, } from '@/server/services/comfyui/config/modelRegistry'; const log = debug('lobe-image:comfyui:static-model-lookup'); /** * Resolve a model name to its configuration * This is a helper function for static model config lookup */ // =================================================================== // Model Query Functions // =================================================================== /** * Get models by variant, sorted by priority */ export function getModelsByVariant(variant: ModelConfig['variant']): string[] { const matchingModels: Array<{ fileName: string; priority: number }> = []; for (const [fileName, config] of Object.entries(MODEL_REGISTRY)) { if (config.variant === variant) { matchingModels.push({ fileName, priority: config.priority }); } } // Sort by priority (lower number = higher priority) return matchingModels.sort((a, b) => a.priority - b.priority).map((item) => item.fileName); } /** * Get single model config */ export function getModelConfig( modelName: string, options?: { caseInsensitive?: boolean; modelFamily?: ModelConfig['modelFamily']; priority?: number; recommendedDtype?: ModelConfig['recommendedDtype']; variant?: ModelConfig['variant']; }, ): ModelConfig | undefined { // Direct lookup - KISS principle let config = MODEL_REGISTRY[modelName]; // If not found and case-insensitive search requested, try case-insensitive lookup if (!config && options?.caseInsensitive) { const lowerModelName = modelName.toLowerCase(); for (const [registryName, registryConfig] of Object.entries(MODEL_REGISTRY)) { if (registryName.toLowerCase() === lowerModelName) { config = registryConfig; break; } } } if (!config) return undefined; // No filters - return the config if (!options) return config; // Check filters (excluding caseInsensitive which is not a model property filter) const matches = (!options.variant || config.variant === options.variant) && (!options.priority || config.priority === options.priority) && (!options.modelFamily || config.modelFamily === options.modelFamily) && (!options.recommendedDtype || config.recommendedDtype === options.recommendedDtype); return matches ? config : undefined; } /** * Get all model names from the registry * @returns Array of all model filenames */ export function getAllModelNames(): string[] { return Object.keys(MODEL_REGISTRY); } // =================================================================== // Resolver Function // =================================================================== export function resolveModel(modelName: string): ModelConfig | null { log('Resolving static model config for:', modelName); // Clean the model name const cleanName = modelName.replace(/^comfyui\//, ''); // First try exact match with filename let config = getModelConfig(cleanName); if (config) { return config; } // Try case-insensitive match config = getModelConfig(cleanName, { caseInsensitive: true }); if (config) { return config; } // Try to resolve using model ID mapping const mappedVariant = MODEL_ID_VARIANT_MAP[cleanName]; if (mappedVariant) { // Find first model with this variant for (const [, modelConfig] of Object.entries(MODEL_REGISTRY)) { if (modelConfig.variant === mappedVariant) { return modelConfig; } } } // Fallback: Try to match by variant name (legacy logic) for (const [, modelConfig] of Object.entries(MODEL_REGISTRY)) { // Check if clean name matches variant exactly or ends with variant if ( cleanName === modelConfig.variant || cleanName.endsWith(`-${modelConfig.variant}`) || cleanName.endsWith(modelConfig.variant) ) { return modelConfig; } } log('No static config found for:', modelName); return null; }