""" MCP Tool: get_model_list Query the list of available image generation models, with optional filtering by model architecture. """ from .common import _load_yaml, _MODEL_LIST_PATH, _MODEL_DEFAULTS_PATH, _MODEL_ARCHITECTURES_PATH from .error_schema import make_not_found_error def handle_get_model_list(model_architecture: str = None) -> list | dict: """Dynamically load the list of available image generation models from model_list.yaml.""" model_list = _load_yaml(_MODEL_LIST_PATH) model_defaults = _load_yaml(_MODEL_DEFAULTS_PATH) arch_config = _load_yaml(_MODEL_ARCHITECTURES_PATH) valid_architectures = set(arch_config.get("architectures", {}).keys()) if model_architecture and model_architecture not in valid_architectures: return make_not_found_error("architecture", model_architecture) result = [] checkpoints = model_list.get("Checkpoint", {}) for arch_name, arch_data in checkpoints.items(): if model_architecture and arch_name != model_architecture: continue if not isinstance(arch_data, dict): continue models = arch_data.get("models", []) if not isinstance(models, list): continue arch_defaults = model_defaults.get(arch_name, {}) arch_level_defaults = arch_defaults.get("_defaults", {}) for model in models: display_name = model.get("display_name", "") category = model.get("category", None) model_specific_defaults = arch_defaults.get(display_name, {}) default_pos = model_specific_defaults.get( "positive_prompt", arch_level_defaults.get("positive_prompt", ""), ) default_neg = model_specific_defaults.get( "negative_prompt", arch_level_defaults.get("negative_prompt", ""), ) entry = { "name": display_name, "model_architecture": arch_name, } if category: entry["category"] = category if default_pos: entry["default_positive_prompt"] = default_pos if default_neg: entry["default_negative_prompt"] = default_neg result.append(entry) return result