Skip to main content
Glama

generate_from_template

Create ComfyUI workflows by substituting custom parameters into predefined templates, optionally saving the generated DSL content for workflow automation.

Instructions

Generate a workflow from a template with custom parameters.

Creates a complete DSL workflow by substituting parameters into the template. Optionally saves to file.

Args: template_name: Name of the template to use parameters: Dictionary of parameter values to substitute save_path: Optional path to save the generated workflow

Returns: Generated DSL content and validation results

Examples: generate_from_template("text2img_basic", {"prompt": "sunset"}) generate_from_template("img2img", {"image_path": "input.png"}, "workflows/my_img2img.dsl")

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
template_nameYes
parametersNo
save_pathNo

Implementation Reference

  • MCP tool handler for 'generate_from_template'. Orchestrates template retrieval, parameter validation, DSL generation via TemplateManager, optional file saving, and result formatting.
    @mcp.tool
    def generate_from_template(
        template_name: str,
        parameters: dict = None,
        save_path: str = None
    ) -> dict:
        """Generate a workflow from a template with custom parameters.
        
        Creates a complete DSL workflow by substituting parameters into
        the template. Optionally saves to file.
        
        Args:
            template_name: Name of the template to use
            parameters: Dictionary of parameter values to substitute
            save_path: Optional path to save the generated workflow
        
        Returns:
            Generated DSL content and validation results
        
        Examples:
            generate_from_template("text2img_basic", {"prompt": "sunset"})
            generate_from_template("img2img", {"image_path": "input.png"}, "workflows/my_img2img.dsl")
        """
        try:
            # Validate template exists
            template = template_manager.get_template(template_name)
            if template is None:
                raise ToolError(f"Template '{template_name}' not found")
            
            # Validate parameters if provided
            if parameters:
                validation = template_manager.validate_parameters(template_name, parameters)
                if not validation["valid"]:
                    return {
                        "status": "error",
                        "errors": validation["errors"],
                        "warnings": validation.get("warnings", [])
                    }
            
            # Generate the workflow
            dsl_content = template_manager.generate_workflow(template_name, parameters)
            
            if dsl_content is None:
                raise ToolError(f"Failed to generate workflow from template '{template_name}'")
            
            result = {
                "status": "success",
                "template_name": template_name,
                "dsl_content": dsl_content,
                "parameters_used": parameters or {},
                "warnings": []
            }
            
            # Add warnings if any
            if parameters:
                validation = template_manager.validate_parameters(template_name, parameters)
                result["warnings"] = validation.get("warnings", [])
            
            # Save to file if requested
            if save_path:
                try:
                    path = validate_path(save_path)
                    path.write_text(dsl_content)
                    result["saved_to"] = str(path)
                    result["file_size"] = path.stat().st_size
                except Exception as e:
                    result["warnings"].append(f"Failed to save to {save_path}: {e}")
            
            return result
            
        except Exception as e:
            raise ToolError(f"Error generating from template: {e}")
  • Core helper function in TemplateManager that implements the workflow generation logic by loading template DSL (custom or official), substituting parameters via string replacement, and returning the final DSL content.
    def generate_workflow(
        self, 
        template_name: str, 
        parameters: Optional[Dict[str, str]] = None,
        source: str = "auto"
    ) -> Optional[str]:
        """Generate a workflow DSL from template with parameter substitution."""
        # Try custom templates first, then official
        template = None
        dsl_content = None
        
        if source in ["auto", "custom"]:
            template = self.custom_templates.get(template_name)
            if template:
                dsl_content = template.dsl_content
        
        if not template and source in ["auto", "official"]:
            official_template = official_manager.get_template(template_name)
            if official_template and official_template.dsl_content:
                dsl_content = official_template.dsl_content
                # Create a minimal template-like object for parameter handling
                template = type('Template', (), {
                    'parameters': {},  # Official templates don't have default parameters
                    'dsl_content': dsl_content
                })()
        
        if not template or not dsl_content:
            return None
        
        # Start with template's default parameters
        final_params = template.parameters.copy() if hasattr(template, 'parameters') and template.parameters else {}
        
        # Override with provided parameters
        if parameters:
            final_params.update(parameters)
        
        # Substitute parameters in DSL content if any
        if final_params:
            for param_name, param_value in final_params.items():
                # Replace {param_name} with actual value
                placeholder = f"{{{param_name}}}"
                dsl_content = dsl_content.replace(placeholder, str(param_value))
        
        return dsl_content
  • Helper function for parameter validation, extracts placeholders from DSL, checks required/missing/extra params, and performs type/constraint validation used by the tool handler.
    def validate_parameters(
        self, 
        template_name: str, 
        parameters: Dict[str, str],
        source: str = "auto"
    ) -> Dict[str, List[str]]:
        """Validate parameters for a template."""
        # Try to find template in custom or official
        template = None
        if source in ["auto", "custom"]:
            template = self.custom_templates.get(template_name)
        
        if not template and source in ["auto", "official"]:
            official_template = official_manager.get_template(template_name)
            if official_template and official_template.dsl_content:
                # Create minimal template object for validation
                template = type('Template', (), {
                    'parameters': {},
                    'dsl_content': official_template.dsl_content
                })()
        if not template:
            return {
                "valid": False,
                "errors": [f"Template '{template_name}' not found"],
                "warnings": []
            }
        
        errors = []
        warnings = []
        
        # Check for required parameters (those in template but not provided)
        template_params = template.parameters or {}
        required_params = set(self._extract_parameters_from_dsl(template.dsl_content))
        provided_params = set(parameters.keys())
        
        missing_params = required_params - provided_params
        if missing_params:
            errors.append(f"Missing required parameters: {', '.join(missing_params)}")
        
        # Check for extra parameters
        extra_params = provided_params - required_params
        if extra_params:
            warnings.append(f"Extra parameters will be ignored: {', '.join(extra_params)}")
        
        # Validate specific parameter types/constraints
        for param_name, param_value in parameters.items():
            if param_name in template_params:
                validation_errors = self._validate_parameter_value(
                    param_name, param_value, template_name
                )
                errors.extend(validation_errors)
        
        return {
            "valid": len(errors) == 0,
            "errors": errors,
            "warnings": warnings
        }
  • Import and global initialization of TemplateManager instance used by all template tools including generate_from_template.
    from ..templates import TemplateManager
    
    # Create MCP server
    mcp = FastMCP("ComfyUI Workflow Manager 🎨")
    
    # Security: Define allowed base directory for file operations
    WORKFLOWS_BASE = Path.cwd() / "workflows"
    WORKFLOWS_BASE.mkdir(exist_ok=True)
    
    # Initialize template manager
    template_manager = TemplateManager()

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/christian-byrne/comfy-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server