ComfyUI Prompt Interview Conduct a guided conversation to draw out the user's complete creative vision, then synthesize a perfect, model-appropriate prompt with all recommended settings. When to Invoke This Skill - User describes an image or scene idea but hasn't given enough detail for a quality prompt - User says "help me think through what I want to create" - User has a vague concept that needs refinement - User wants a structured prompt but isn't sure what to specify The Interview Philosophy Ask, don't interrogate. This is a conversation, not a form. Ask one or two questions at a time. Li…

\\n'\n fi\n fi\n done \u003c \"$yaml_file\"\n\n if [[ -n \"$current_id\" ]]; then\n ids+=(\"$current_id\")\n printf '%s' \"$current_prompt\" > \"$RESULTS_DIR/prompts/${current_id}.txt\"\n fi\n\n echo \"${ids[@]}\"\n}\n\nCASE_IDS=($(extract_cases))\necho \"Found ${#CASE_IDS[@]} test cases: ${CASE_IDS[*]}\"\n\nif [[ -n \"$SINGLE_CASE\" ]]; then\n CASE_IDS=(\"$SINGLE_CASE\")\n echo \"Filtering to: $SINGLE_CASE\"\nfi\necho \"\"\n\n# ─── Run test cases ────────────────────────────────────────────────\n\nrun_case() {\n local case_id=\"$1\"\n local mode=\"$2\"\n local prompt_file=\"$RESULTS_DIR/prompts/${case_id}.txt\"\n local output_file=\"$RESULTS_DIR/$mode/${case_id}.md\"\n local prompt_text\n prompt_text=$(cat \"$prompt_file\")\n\n echo \" [$mode] Running $case_id...\"\n\n if [[ \"$mode\" == \"with-skill\" ]]; then\n local full_prompt=\"Use the $SKILL_NAME skill to answer this: $prompt_text\"\n claude -p \"$full_prompt\" \\\n --allowedTools \"Read,Glob,Grep\" \\\n --max-turns 3 \\\n --output-format text \\\n > \"$output_file\" 2>/dev/null || {\n echo \"EVAL_ERROR: claude command failed for $case_id ($mode)\" > \"$output_file\"\n }\n else\n claude -p \"$prompt_text\" \\\n --allowedTools \"Read,Glob,Grep\" \\\n --max-turns 3 \\\n --output-format text \\\n > \"$output_file\" 2>/dev/null || {\n echo \"EVAL_ERROR: claude command failed for $case_id ($mode)\" > \"$output_file\"\n }\n fi\n\n local wc_out\n wc_out=$(wc -w \u003c \"$output_file\" | tr -d ' ')\n echo \" [$mode] $case_id complete ($wc_out words)\"\n}\n\nif ! $SCORE_ONLY; then\n if $RUN_SKILL; then\n echo \"── With Skill ──\"\n for case_id in \"${CASE_IDS[@]}\"; do\n run_case \"$case_id\" \"with-skill\"\n done\n echo \"\"\n fi\n\n if $RUN_BASELINE; then\n echo \"── Baseline (no skill) ──\"\n for case_id in \"${CASE_IDS[@]}\"; do\n run_case \"$case_id\" \"baseline\"\n done\n echo \"\"\n fi\nfi\n\n# ─── Assertion evaluation helpers ──────────────────────────────────\n\n# Extract first JSON block from response\nextract_json() {\n local text=\"$1\"\n # Try ```json fenced block first\n local block\n block=$(echo \"$text\" | sed -n '/```json/,/```/p' | sed '1d;$d')\n if [[ -z \"$block\" ]]; then\n # Try bare { ... } block\n block=$(echo \"$text\" | grep -Pzo '\\{[^{}]*(\\{[^{}]*\\}[^{}]*)*\\}' 2>/dev/null | head -1 || true)\n fi\n echo \"$block\"\n}\n\n# Get a field value from JSON (uses python if available, else node)\njson_field() {\n local json=\"$1\"\n local field=\"$2\"\n if command -v python3 &>/dev/null; then\n echo \"$json\" | python3 -c \"\nimport sys, json\ntry:\n d = json.load(sys.stdin)\n v = d.get('$field', '')\n if isinstance(v, list): print(len(v))\n elif isinstance(v, (int, float)): print(v)\n else: print(v)\nexcept: print('')\n\" 2>/dev/null\n elif command -v node &>/dev/null; then\n echo \"$json\" | node -e \"\nlet d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{\n try{const o=JSON.parse(d);const v=o['$field'];\n if(Array.isArray(v))console.log(v.length);\n else console.log(v??'');}catch(e){console.log('');}\n})\" 2>/dev/null\n else\n echo \"\"\n fi\n}\n\n# Word count of a string\nword_count() {\n echo \"$1\" | wc -w | tr -d ' '\n}\n\n# ─── Score a single assertion ──────────────────────────────────────\n\neval_assertion() {\n local response=\"$1\"\n local atype=\"$2\"\n local target=\"$3\"\n local json_block=\"$4\"\n\n case \"$atype\" in\n contains)\n echo \"$response\" | grep -qi \"$target\" && echo \"PASS\" || echo \"FAIL\"\n ;;\n\n not_contains)\n # Handle descriptive targets: if target contains spaces and \"should not contain\",\n # try to extract the quoted literal(s)\n if [[ \"$target\" =~ \\'([^\\']+)\\' ]]; then\n local found=false\n while [[ \"$target\" =~ \\'([^\\']+)\\' ]]; do\n local literal=\"${BASH_REMATCH[1]}\"\n if echo \"$response\" | grep -qi \"$literal\"; then\n found=true\n break\n fi\n target=\"${target#*\"'${literal}'\"}\"\n done\n $found && echo \"FAIL\" || echo \"PASS\"\n else\n echo \"$response\" | grep -qi \"$target\" && echo \"FAIL\" || echo \"PASS\"\n fi\n ;;\n\n regex)\n echo \"$response\" | grep -qiE \"$target\" && echo \"PASS\" || echo \"FAIL\"\n ;;\n\n question_before_code)\n local q_line code_line\n q_line=$(echo \"$response\" | grep -n '?' | head -1 | cut -d: -f1)\n code_line=$(echo \"$response\" | grep -n '```' | head -1 | cut -d: -f1)\n if [[ -z \"$code_line\" ]] || [[ -n \"$q_line\" && \"$q_line\" -lt \"$code_line\" ]]; then\n echo \"PASS\"\n else\n echo \"FAIL\"\n fi\n ;;\n\n json_valid)\n if [[ -n \"$json_block\" ]]; then\n if command -v python3 &>/dev/null; then\n echo \"$json_block\" | python3 -c \"import sys,json;json.load(sys.stdin)\" 2>/dev/null && echo \"PASS\" || echo \"FAIL\"\n elif command -v node &>/dev/null; then\n echo \"$json_block\" | node -e \"let d='';process.stdin.on('data',c=>d+=c);process.stdin.on('end',()=>{try{JSON.parse(d);console.log('PASS')}catch(e){console.log('FAIL')}})\" 2>/dev/null\n else\n echo \"SKIP\"\n fi\n else\n echo \"FAIL\"\n fi\n ;;\n\n json_schema|json_fields)\n # Target is comma-separated field names\n if [[ -z \"$json_block\" ]]; then\n echo \"FAIL\"\n return\n fi\n local all_found=true\n IFS=',' read -ra FIELDS \u003c\u003c\u003c \"$target\"\n for field in \"${FIELDS[@]}\"; do\n field=$(echo \"$field\" | xargs) # trim whitespace\n if ! echo \"$json_block\" | grep -q \"\\\"$field\\\"\"; then\n all_found=false\n break\n fi\n done\n $all_found && echo \"PASS\" || echo \"FAIL\"\n ;;\n\n token_limit)\n local wc\n wc=$(word_count \"$response\")\n local est_tokens=$(( wc * 13 / 10 ))\n [[ \"$est_tokens\" -le \"${target:-99999}\" ]] && echo \"PASS\" || echo \"FAIL\"\n ;;\n\n range_check)\n # Parse common patterns from the target expression\n if [[ -z \"$json_block\" ]]; then\n echo \"FAIL\"\n return\n fi\n\n # Handle: bias_score >= X AND bias_score \u003c= Y\n if [[ \"$target\" =~ ([a-z_]+)\\ *\\>=\\ *(-?[0-9.]+)\\ +AND\\ +\\1\\ *\\\u003c=\\ *(-?[0-9.]+) ]]; then\n local field=\"${BASH_REMATCH[1]}\"\n local min=\"${BASH_REMATCH[2]}\"\n local max=\"${BASH_REMATCH[3]}\"\n local val\n val=$(json_field \"$json_block\" \"$field\")\n if [[ -n \"$val\" ]] && command -v python3 &>/dev/null; then\n python3 -c \"v=$val; print('PASS' if $min \u003c= v \u003c= $max else 'FAIL')\" 2>/dev/null || echo \"FAIL\"\n else\n echo \"SKIP\"\n fi\n return\n fi\n\n # Handle: abs(field) \u003c= X\n if [[ \"$target\" =~ abs\\(([a-z_]+)\\)\\ *\\\u003c=\\ *(-?[0-9.]+) ]]; then\n local field=\"${BASH_REMATCH[1]}\"\n local limit=\"${BASH_REMATCH[2]}\"\n local val\n val=$(json_field \"$json_block\" \"$field\")\n if [[ -n \"$val\" ]] && command -v python3 &>/dev/null; then\n python3 -c \"v=$val; print('PASS' if abs(v) \u003c= $limit else 'FAIL')\" 2>/dev/null || echo \"FAIL\"\n else\n echo \"SKIP\"\n fi\n return\n fi\n\n # Handle: quality_score >= X\n if [[ \"$target\" =~ ([a-z_]+)\\ *\\>=\\ *(-?[0-9.]+)$ ]]; then\n local field=\"${BASH_REMATCH[1]}\"\n local min=\"${BASH_REMATCH[2]}\"\n local val\n val=$(json_field \"$json_block\" \"$field\")\n if [[ -n \"$val\" ]] && command -v python3 &>/dev/null; then\n python3 -c \"v=$val; print('PASS' if v >= $min else 'FAIL')\" 2>/dev/null || echo \"FAIL\"\n else\n echo \"SKIP\"\n fi\n return\n fi\n\n # Handle: len(field) >= X AND len(field) \u003c= Y (character length)\n if [[ \"$target\" =~ len\\(([a-z_]+)\\)\\ *\\>=\\ *([0-9]+)\\ +AND\\ +len\\(\\1\\)\\ *\\\u003c=\\ *([0-9]+) ]]; then\n local field=\"${BASH_REMATCH[1]}\"\n local min=\"${BASH_REMATCH[2]}\"\n local max=\"${BASH_REMATCH[3]}\"\n local val\n val=$(json_field \"$json_block\" \"$field\")\n local len=${#val}\n [[ \"$len\" -ge \"$min\" && \"$len\" -le \"$max\" ]] && echo \"PASS\" || echo \"FAIL\"\n return\n fi\n\n # Handle: len(field) \u003c= X\n if [[ \"$target\" =~ len\\(([a-z_]+)\\)\\ *\\\u003c=\\ *([0-9]+) ]]; then\n local field=\"${BASH_REMATCH[1]}\"\n local max=\"${BASH_REMATCH[2]}\"\n local val\n val=$(json_field \"$json_block\" \"$field\")\n local len=${#val}\n [[ \"$len\" -le \"$max\" ]] && echo \"PASS\" || echo \"FAIL\"\n return\n fi\n\n # Handle: len(field) >= X (list length)\n if [[ \"$target\" =~ len\\(([a-z_]+)\\)\\ *\\>=\\ *([0-9]+) ]]; then\n local field=\"${BASH_REMATCH[1]}\"\n local min=\"${BASH_REMATCH[2]}\"\n local val\n val=$(json_field \"$json_block\" \"$field\")\n [[ \"$val\" -ge \"$min\" ]] 2>/dev/null && echo \"PASS\" || echo \"FAIL\"\n return\n fi\n\n # Handle: word_count(field) >= X AND word_count(field) \u003c= Y\n if [[ \"$target\" =~ word_count\\(([a-z_]+)\\)\\ *\\>=\\ *([0-9]+)\\ +AND\\ +word_count\\(\\1\\)\\ *\\\u003c=\\ *([0-9]+) ]]; then\n local field=\"${BASH_REMATCH[1]}\"\n local min=\"${BASH_REMATCH[2]}\"\n local max=\"${BASH_REMATCH[3]}\"\n local val\n val=$(json_field \"$json_block\" \"$field\")\n local wc\n wc=$(word_count \"$val\")\n [[ \"$wc\" -ge \"$min\" && \"$wc\" -le \"$max\" ]] && echo \"PASS\" || echo \"FAIL\"\n return\n fi\n\n echo \"SKIP\" # Unrecognized expression\n ;;\n\n # Soft assertion types — logged but always PASS (require LLM judge)\n structure_check|sequence_check)\n echo \"SOFT\"\n ;;\n\n *)\n echo \"SKIP\"\n ;;\n esac\n}\n\n# ─── Score all assertions for a case ───────────────────────────────\n\nscore_case() {\n local case_id=\"$1\"\n local mode=\"$2\"\n local output_file=\"$RESULTS_DIR/$mode/${case_id}.md\"\n local score_file=\"$RESULTS_DIR/$mode/${case_id}.score.txt\"\n local response\n response=$(cat \"$output_file\" 2>/dev/null || echo \"\")\n\n if [[ \"$response\" == EVAL_ERROR* ]]; then\n echo \"ERROR\" > \"$score_file\"\n echo \"ERROR\"\n return\n fi\n\n local json_block\n json_block=$(extract_json \"$response\")\n\n local pass=0 fail=0 soft=0 skip=0 total=0\n local critical_fail=false\n local details=\"\"\n\n # Parse assertions from YAML\n local in_case=false\n local in_assertions=false\n local assert_type=\"\" assert_target=\"\" assert_critical=\"false\" assert_desc=\"\"\n\n process_assertion() {\n if [[ -z \"$assert_type\" ]]; then return; fi\n total=$((total + 1))\n local result\n result=$(eval_assertion \"$response\" \"$assert_type\" \"$assert_target\" \"$json_block\")\n\n case \"$result\" in\n PASS) pass=$((pass + 1)) ;;\n FAIL)\n fail=$((fail + 1))\n [[ \"$assert_critical\" == \"true\" ]] && critical_fail=true\n ;;\n SOFT) soft=$((soft + 1)) ;;\n SKIP) skip=$((skip + 1)) ;;\n esac\n\n local label=\"${assert_desc:-$assert_type($assert_target)}\"\n local crit_marker=\"\"\n [[ \"$assert_critical\" == \"true\" ]] && crit_marker=\" [CRITICAL]\"\n details+=\" $result$crit_marker — $label\"

ComfyUI Prompt Interview Conduct a guided conversation to draw out the user's complete creative vision, then synthesize a perfect, model-appropriate prompt with all recommended settings. When to Invoke This Skill - User describes an image or scene idea but hasn't given enough detail for a quality prompt - User says "help me think through what I want to create" - User has a vague concept that needs refinement - User wants a structured prompt but isn't sure what to specify The Interview Philosophy Ask, don't interrogate. This is a conversation, not a form. Ask one or two questions at a time. Li…

\\n'\n }\n\n while IFS= read -r line; do\n if [[ \"$line\" =~ ^-\\ id:\\ $case_id$ ]]; then\n in_case=true\n continue\n fi\n if $in_case && [[ \"$line\" =~ ^-\\ id: ]]; then\n break\n fi\n\n if $in_case && [[ \"$line\" =~ ^\\ \\ \\ \\ -\\ type:\\ (.+) ]]; then\n process_assertion\n assert_type=\"${BASH_REMATCH[1]}\"\n assert_target=\"\"\n assert_critical=\"false\"\n assert_desc=\"\"\n fi\n if $in_case && [[ \"$line\" =~ ^\\ \\ \\ \\ \\ \\ target:\\ (.+) ]]; then\n assert_target=\"${BASH_REMATCH[1]}\"\n assert_target=\"${assert_target#\\\"}\"\n assert_target=\"${assert_target%\\\"}\"\n fi\n if $in_case && [[ \"$line\" =~ ^\\ \\ \\ \\ \\ \\ critical:\\ (.+) ]]; then\n assert_critical=\"${BASH_REMATCH[1]}\"\n fi\n if $in_case && [[ \"$line\" =~ ^\\ \\ \\ \\ \\ \\ description:\\ (.+) ]]; then\n assert_desc=\"${BASH_REMATCH[1]}\"\n assert_desc=\"${assert_desc#\\\"}\"\n assert_desc=\"${assert_desc%\\\"}\"\n fi\n done \u003c \"$SCRIPT_DIR/test-cases.yaml\"\n process_assertion # last assertion\n\n local anchored=$((pass + fail))\n local score_line=\"$pass/$total (${anchored} anchored, ${soft} soft, ${skip} skipped)\"\n if $critical_fail; then\n score_line+=\" [CRITICAL FAIL]\"\n fi\n\n {\n echo \"$score_line\"\n echo \"$details\"\n } > \"$score_file\"\n\n echo \"$score_line\"\n}\n\n# ─── Generate scorecard ───────────────────────────────────────────\n\ngenerate_scorecard() {\n local scorecard=\"$RESULTS_DIR/scorecard.md\"\n\n cat > \"$scorecard\" \u003c\u003cHEADER\n# Eval Scorecard — $SKILL_NAME\n**Timestamp:** $TIMESTAMP\n\n| Test Case | With Skill | Baseline |\n|-----------|-----------|----------|\nHEADER\n\n for case_id in \"${CASE_IDS[@]}\"; do\n local skill_score=\"—\"\n local base_score=\"—\"\n\n if $RUN_SKILL && [[ -f \"$RESULTS_DIR/with-skill/${case_id}.md\" ]]; then\n skill_score=$(score_case \"$case_id\" \"with-skill\")\n fi\n if $RUN_BASELINE && [[ -f \"$RESULTS_DIR/baseline/${case_id}.md\" ]]; then\n base_score=$(score_case \"$case_id\" \"baseline\")\n fi\n\n echo \"| $case_id | $skill_score | $base_score |\" >> \"$scorecard\"\n done\n\n echo \"\" >> \"$scorecard\"\n echo \"## Assertion Details\" >> \"$scorecard\"\n\n for case_id in \"${CASE_IDS[@]}\"; do\n echo \"\" >> \"$scorecard\"\n echo \"### $case_id\" >> \"$scorecard\"\n for mode in \"with-skill\" \"baseline\"; do\n if [[ -f \"$RESULTS_DIR/$mode/${case_id}.score.txt\" ]]; then\n echo \"**${mode}:**\" >> \"$scorecard\"\n echo '```' >> \"$scorecard\"\n cat \"$RESULTS_DIR/$mode/${case_id}.score.txt\" >> \"$scorecard\"\n echo '```' >> \"$scorecard\"\n fi\n done\n done\n\n echo \"\"\n echo \"=== Scorecard ===\"\n cat \"$scorecard\"\n}\n\ngenerate_scorecard\n\necho \"\"\necho \"=== Eval complete — $RESULTS_DIR/ ===\"\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":18242,"content_sha256":"4a5f64f9347e91d8bedb149ea5fd16263f0db37875164a5c584401f915567585"},{"filename":"eval/test-cases.yaml","content":"- id: TC-001\n name: basic-image-request-interviews-first\n prompt: \"I want to create an image of a dragon\"\n assertions:\n - type: question_before_code\n description: \"Asks at least one clarifying question BEFORE generating any prompt text\"\n critical: true\n - type: regex\n target: \"\\\\?\"\n description: \"Response contains a question mark\"\n critical: true\n - type: not_contains\n target: \"Positive prompt:\"\n critical: true\n - type: not_contains\n target: \"Negative prompt:\"\n critical: true\n expected_behavior: \"Does NOT immediately generate a prompt. Instead asks clarifying questions about style (realistic, fantasy, anime?), mood (menacing, majestic, playful?), setting, and technical preferences before producing anything\"\n edge_case: false\n\n- id: TC-002\n name: overly-detailed-request-still-interviews\n prompt: \"I want a photorealistic image of a woman in a red dress standing in a wheat field at golden hour, shot on a Canon 5D with 85mm lens, shallow depth of field, warm tones\"\n assertions:\n - type: regex\n target: \"\\\\?.*\\\\?\"\n description: \"Contains at least 2 questions\"\n critical: true\n - type: structure_check\n target: \"Questions are targeted to gaps (model preference, aspect ratio, specific mood) rather than repeating what user already said\"\n description: \"Semantic check — requires understanding whether questions address gaps vs repeating known info\"\n critical: true\n - type: not_contains\n target: \"Here is your prompt\"\n critical: true\n expected_behavior: \"Even with a detailed request, asks 1-2 targeted follow-up questions about gaps (which model/pipeline, specific mood nuance, aspect ratio) rather than immediately generating. Does not re-ask things the user already specified\"\n edge_case: true\n\n- id: TC-003\n name: full-interview-to-sdxl-prompt\n prompt: \"Help me create a prompt for a fantasy landscape\"\n assertions:\n - type: structure_check\n target: \"Interview happens first with 4-7 exchanges before prompt generation\"\n description: \"MANUAL: requires multi-turn eval harness to verify exchange count\"\n critical: true\n - type: regex\n target: \"(positive|negative).*(prompt|Prompt)\"\n description: \"Final output includes positive and negative prompt sections\"\n critical: true\n - type: regex\n target: \"(sampler|steps|CFG|resolution)\"\n description: \"Output includes settings table with key parameters\"\n critical: true\n - type: structure_check\n target: \"Positive prompt uses SDXL-appropriate formatting if SDXL is selected\"\n description: \"Semantic check — formatting correctness depends on model context\"\n critical: false\n expected_behavior: \"Conducts a 4-7 exchange interview covering subject details, style, mood, model preference, then synthesizes a complete output package with positive/negative prompts, settings table, and pipeline recommendation\"\n edge_case: false\n\n- id: TC-004\n name: flux-natural-language-formatting\n prompt: \"I need a prompt for FLUX — I want a cyberpunk street scene\"\n assertions:\n - type: question_before_code\n description: \"Interviews before generating even though model is specified\"\n critical: true\n - type: regex\n target: \"\\\\?\"\n description: \"Response contains a question mark indicating interview behavior\"\n critical: true\n - type: not_contains\n target: \"masterpiece, best quality\"\n critical: true\n - type: regex\n target: \"[A-Z][a-z]+.*\\\\.\"\n description: \"Contains full sentences (capital letter followed by words and period) — natural language, not comma-separated tags\"\n critical: false\n - type: structure_check\n target: \"Negative prompt is minimal or absent (FLUX handles negatives differently)\"\n description: \"Semantic check — requires judging whether negative prompt is appropriately minimal\"\n critical: false\n expected_behavior: \"After interviewing, generates FLUX-formatted prompts using natural language descriptions rather than tag-style formatting. Avoids SD-style quality tags like 'masterpiece, best quality' which are irrelevant for FLUX\"\n edge_case: false\n\n- id: TC-005\n name: interview-length-not-excessive\n prompt: \"Make me a cool anime character\"\n assertions:\n - type: structure_check\n target: \"Interview completes within 4-7 exchanges, not dragging to 10+\"\n description: \"MANUAL: requires multi-turn eval harness to verify exchange count\"\n critical: true\n - type: structure_check\n target: \"Questions cover essential dimensions: subject, style, mood, technical preferences\"\n description: \"Semantic check — requires judging question coverage across creative dimensions\"\n critical: true\n - type: structure_check\n target: \"Does not ask redundant or overly granular questions\"\n description: \"Semantic check — requires judging question quality and redundancy\"\n critical: false\n - type: regex\n target: \"(pipeline|workflow|SDXL|FLUX|SD1\\\\.5|Wan)\"\n description: \"Pipeline recommendation included in final output\"\n critical: true\n expected_behavior: \"Keeps the interview focused at 4-7 exchanges covering the essential creative dimensions without over-questioning. Wraps up with a complete prompt package including pipeline recommendation\"\n edge_case: false\n\n- id: TC-006\n name: skip-interview-demand\n prompt: \"Skip the interview. Just write me a FLUX prompt for a cyberpunk alley with neon signs and rain, 16:9 aspect ratio.\"\n assertions:\n - type: not_contains\n target: \"What style\"\n critical: true\n description: \"Should not ask redundant questions when user gave full details\"\n - type: regex\n target: \"(cyberpunk|neon|rain|alley)\"\n critical: true\n description: \"Must include the user's specified elements\"\n - type: regex\n target: \"(16:9|1344.*768|1216.*832|landscape)\"\n critical: false\n description: \"Should address the 16:9 aspect ratio\"\n - type: not_contains\n target: \"masterpiece, best quality\"\n critical: true\n description: \"FLUX prompts must not use SD-style quality tags\"\n expected_behavior: >\n User explicitly says skip the interview and provides all details.\n The skill should respect this and generate the prompt directly, not\n insist on interviewing. May ask 1 brief clarification at most but\n should not run a full interview sequence.\n edge_case: true\n\n- id: TC-007\n name: video-prompt-request\n prompt: \"I need a prompt for a Wan 2.1 video of a cat jumping onto a table in slow motion\"\n assertions:\n - type: question_before_code\n critical: true\n description: \"Should still ask at least one question before generating\"\n - type: regex\n target: \"(motion|movement|dynamic|action|jump)\"\n critical: true\n description: \"Must address the motion aspect for video\"\n - type: regex\n target: \"(Wan|video|I2V|img2vid|animate)\"\n critical: true\n description: \"Must acknowledge this is a video prompt\"\n - type: not_contains\n target: \"8k uhd\"\n critical: false\n description: \"Video prompts should not include still-image quality tags\"\n expected_behavior: >\n Video prompts differ from image prompts — they need motion descriptions,\n shorter length (20-50 words per SKILL.md), and different formatting.\n The interview should adapt to ask video-relevant questions (duration,\n camera movement, frame rate feel).\n edge_case: true\n","content_type":"application/yaml; charset=utf-8","language":"yaml","size":7511,"content_sha256":"1e17f955a753b369b9d032369baba6a6eed3569f9864bc5f8b5e45e02e054fd7"},{"filename":"eval/trigger-tests.yaml","content":"should_trigger:\n - \"Help me create a prompt for an image\"\n - \"I want to generate an image but I'm not sure how to describe what I want\"\n - \"Write me a prompt for a fantasy scene\"\n - \"I need a good prompt for SDXL\"\n - \"Can you help me come up with a prompt for a portrait?\"\n - \"Make me a prompt for a cyberpunk cityscape\"\n - \"I want to create an image of a dragon but need help with the prompt\"\n - \"Help me describe my creative vision for image generation\"\n - \"I need prompts for a series of product photos\"\n - \"What prompt should I use for a Studio Ghibli style landscape?\"\n\nshould_not_trigger:\n - \"Build me a ComfyUI workflow for txt2img\"\n - \"Fix this prompt — it's giving me bad results: 'a cat sitting on a table'\"\n - \"Explain how CLIP text encoding works\"\n - \"What's the difference between positive and negative prompts technically?\"\n - \"Help me debug why my prompt isn't producing good images\"\n - \"Review this ComfyUI workflow for errors\"\n - \"Generate a character with consistent identity across scenes\"\n - \"How do I train a textual inversion embedding?\"\n - \"Convert this Midjourney prompt to Stable Diffusion format\"\n - \"Write a Python script to batch-generate prompts\"\n\noptimized_description: >\n Guided conversational interview to understand a user's creative vision before generating\n model-appropriate image prompts. Asks clarifying questions about subject, mood, style, and\n technical preferences (4-7 exchanges), then synthesizes positive prompt, negative prompt,\n recommended settings table, and pipeline recommendation. Formats prompts for the target model\n (SDXL tag-style, FLUX natural language, SD1.5 weighted tokens). Does NOT cover workflow\n building, prompt debugging/fixing, technical explanations, model training, code generation,\n or identity-preserving character generation.\n","content_type":"application/yaml; charset=utf-8","language":"yaml","size":1827,"content_sha256":"adf7b0ef3a7388760778a867c98aac2f23a551e0aed8cb1ba33a4ee019845dbc"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"ComfyUI Prompt Interview","type":"text"}]},{"type":"paragraph","content":[{"text":"Conduct a guided conversation to draw out the user's complete creative vision, then synthesize a perfect, model-appropriate prompt with all recommended settings.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"When to Invoke This Skill","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"User describes an image or scene idea but hasn't given enough detail for a quality prompt","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"User says \"help me think through what I want to create\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"User has a vague concept that needs refinement","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"User wants a structured prompt but isn't sure what to specify","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"The Interview Philosophy","type":"text"}]},{"type":"paragraph","content":[{"text":"Ask, don't interrogate.","type":"text","marks":[{"type":"strong"}]},{"text":" This is a conversation, not a form. Ask one or two questions at a time. Listen to what the user gives you and follow up on what's missing. Tailor your questions to what they've already shared — don't ask about character details if they're generating a landscape.","type":"text"}]},{"type":"paragraph","content":[{"text":"Fewer questions = better.","type":"text","marks":[{"type":"strong"}]},{"text":" Aim for 4-7 exchanges maximum. Ask the most impactful questions first. Stop asking when you have enough to generate an excellent prompt.","type":"text"}]},{"type":"paragraph","content":[{"text":"Don't ask for what you can infer.","type":"text","marks":[{"type":"strong"}]},{"text":" If the user says \"cinematic portrait of a warrior woman,\" you don't need to ask if it's a person or whether to include a subject.","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Interview Flow","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 1: Open with the Big Picture","type":"text"}]},{"type":"paragraph","content":[{"text":"If the user hasn't told you what they want to create, start here:","type":"text"}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"\"What do you want to create? Give me whatever you have — even a rough idea, a mood, or a reference you're inspired by.\"","type":"text"}]}]},{"type":"paragraph","content":[{"text":"If they gave you a starting concept, skip this and go straight to what's missing.","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 2: Branch by Creation Type","type":"text"}]},{"type":"paragraph","content":[{"text":"Based on their answer, determine what kind of generation this is:","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Type","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Key Questions to Ask","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Portrait / Character","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Identity method? Existing character? Expression, clothing, setting, lighting","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Scene / Environment","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Location, time of day, mood, weather, foreground/background elements","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Product / Object","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Angle, background, lighting style, commercial vs. artistic","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Abstract / Concept","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Dominant colors, shapes, emotional tone, what to avoid","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Video","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Motion type, camera movement, duration needed, audio?","type":"text"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 3: Ask the High-Impact Questions","type":"text"}]},{"type":"paragraph","content":[{"text":"Ask only what's missing. Use natural conversational language, not a bullet list.","type":"text"}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"For character/portrait content — ask in order of impact:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Identity","type":"text","marks":[{"type":"strong"}]},{"text":" (if not specified): \"Is this a specific character you have reference images for, or are we designing someone new?\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Expression & mood","type":"text","marks":[{"type":"strong"}]},{"text":": \"What's the emotion or energy — fierce, serene, playful, haunted?\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Setting","type":"text","marks":[{"type":"strong"}]},{"text":": \"Where are they, and when? (Time of day, location, interior/exterior)\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Lighting","type":"text","marks":[{"type":"strong"}]},{"text":": \"Any specific lighting in mind? (Golden hour, dramatic side light, soft studio, neon, candlelight)\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Clothing & details","type":"text","marks":[{"type":"strong"}]},{"text":": \"What are they wearing, and any other key visual details?\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Camera/composition","type":"text","marks":[{"type":"strong"}]},{"text":": \"How are we framing this — close-up portrait, three-quarter body, wide establishing shot?\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Style","type":"text","marks":[{"type":"strong"}]},{"text":": \"Photorealistic, cinematic film, editorial fashion, painterly, or something else?\"","type":"text"}]}]}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"For scene/environment content — ask in order of impact:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Setting","type":"text","marks":[{"type":"strong"}]},{"text":": \"Describe the place — what does it look like, and when is it?\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Mood/atmosphere","type":"text","marks":[{"type":"strong"}]},{"text":": \"What feeling should hit the viewer instantly?\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Lighting","type":"text","marks":[{"type":"strong"}]},{"text":": \"What's the light source and quality?\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Key elements","type":"text","marks":[{"type":"strong"}]},{"text":": \"Any specific objects, structures, or details that must be in the shot?\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Style","type":"text","marks":[{"type":"strong"}]},{"text":": \"Photorealistic, stylized, concept art, painterly?\"","type":"text"}]}]}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"For video content — additional questions:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Motion","type":"text","marks":[{"type":"strong"}]},{"text":": \"What's moving — the subject, the camera, or both?\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Duration","type":"text","marks":[{"type":"strong"}]},{"text":": \"How long? (Short: 3-5s vs. long: 15-60s changes model choice)\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Audio","type":"text","marks":[{"type":"strong"}]},{"text":": \"Do you need sound/music, or silent?\"","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 4: Technical Questions (ask only if not obvious)","type":"text"}]},{"type":"paragraph","content":[{"text":"These can usually be inferred from context, but ask if unclear:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Aspect ratio","type":"text","marks":[{"type":"strong"}]},{"text":": \"Standard 1:1 portrait, 16:9 cinematic, 9:16 vertical/social?\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Model preference","type":"text","marks":[{"type":"strong"}]},{"text":": \"Any preference on the generation engine, or should I recommend the best one for this?\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Existing character setup","type":"text","marks":[{"type":"strong"}]},{"text":": \"Do you have a LoRA trained for this character, or reference images?\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"What to avoid","type":"text","marks":[{"type":"strong"}]},{"text":": \"Anything specific you want to make sure stays OUT of the image?\"","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 5: Confirm and Synthesize","type":"text"}]},{"type":"paragraph","content":[{"text":"Before generating the prompt, briefly reflect back the vision:","type":"text"}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"\"Got it. Here's how I'm reading this: [1-2 sentence summary of the concept]. Let me build that prompt.\"","type":"text"}]}]},{"type":"paragraph","content":[{"text":"Then immediately generate the full output below.","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Output Format","type":"text"}]},{"type":"paragraph","content":[{"text":"Deliver all four components, clearly separated:","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"🎯 Positive Prompt","type":"text"}]},{"type":"paragraph","content":[{"text":"[Craft the positive prompt applying model-specific rules from ","type":"text"},{"text":"skills/comfyui-prompt-engineer/SKILL.md","type":"text","marks":[{"type":"code_inline"}]},{"text":"]","type":"text"}]},{"type":"paragraph","content":[{"text":"Key rules:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"FLUX / Kontext","type":"text","marks":[{"type":"strong"}]},{"text":": Natural language, 50-100 words, no quality tags, describe the scene not the face if using identity method","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"SDXL","type":"text","marks":[{"type":"strong"}]},{"text":": Quality tags first, trigger word second, 50-150 words, weighted syntax supported","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"SD 1.5","type":"text","marks":[{"type":"strong"}]},{"text":": Short and tag-based, 30-80 words","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Wan / Video","type":"text","marks":[{"type":"strong"}]},{"text":": Concise, motion-focused, 20-50 words","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If a LoRA trigger word applies, put it first","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"If using InstantID/InfiniteYou: don't describe facial features, let the identity method handle them","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"🚫 Negative Prompt","type":"text"}]},{"type":"paragraph","content":[{"text":"[Select the appropriate negative template and customize it]","type":"text"}]},{"type":"paragraph","content":[{"text":"Standard templates:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Photorealism","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"(worst quality:1.4), (low quality:1.4), blurry, deformed, bad anatomy, bad hands, extra fingers, missing fingers, text, watermark, 3d render, cartoon, anime, plastic skin, airbrushed, oversaturated","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"FLUX (minimal)","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"blurry, low quality, distorted, deformed, ugly, watermark, text","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Video","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"static, frozen, jerky motion, low quality, blurry, distorted face, bad anatomy, glitch, artifacts, flickering","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"⚙️ Recommended Settings","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Parameter","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Value","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Reason","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Model","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"[Specific checkpoint]","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"[Why this model]","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Sampler","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"[e.g., DPM++ 2M Karras]","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Steps","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"[e.g., 25]","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"CFG Scale","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"[e.g., 4.5]","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph"}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Resolution","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"[e.g., 1016×1016]","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"[Avoid 1024 watermark artifacts if InstantID]","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Identity method","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"[e.g., InfiniteYou SIM]","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"[If applicable]","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"LoRA","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"[Trigger word + weight]","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"[If applicable]","type":"text"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"🔧 Pipeline Recommendation","type":"text"}]},{"type":"paragraph","content":[{"text":"[1-3 sentences describing the recommended workflow pattern and why]","type":"text"}]},{"type":"paragraph","content":[{"text":"Example: \"Use Pattern 2 from the character-gen skill: Load your LoRA, add InfiniteYou SIM for identity lock, route through FaceDetailer at 0.35 denoise, then upscale with 4x-UltraSharp. This gives you maximum identity fidelity while keeping the cinematic mood you described.\"","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Decision Rules for Model Selection","type":"text"}]},{"type":"paragraph","content":[{"text":"Apply these when recommending a model/pipeline:","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"User's Goal","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Recommend","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"Photorealistic, single character, reference images available\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"InfiniteYou or FLUX Kontext","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"Multiple characters, consistent identity\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"PuLID Flux II","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"Fast iteration, character editing\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"FLUX Kontext dev/pro","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"Highest quality portrait, trained LoRA exists\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"FLUX.1-dev + LoRA","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"Wide scene / environment\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"FLUX.1-dev or RealVisXL","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"Stylized / artistic\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"RealVisXL + style LoRA or SDXL","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"Video, short clip\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Wan 2.2 1.3B (consumer) or LTX-2 (4K)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"Video, infinite length\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Wan 2.2 I2V A14B + SVI 2.0 Pro","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"Talking head\"","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"FramePack + LatentSync 1.6","type":"text"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Example Interview","type":"text"}]},{"type":"paragraph","content":[{"text":"User","type":"text","marks":[{"type":"strong"}]},{"text":": \"I want to create a dramatic image of a woman warrior standing in ruins at dawn.\"","type":"text"}]},{"type":"paragraph","content":[{"text":"VideoAgent","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"\"Love the concept. A few things that'll lock in the look:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Is this a specific character you want to preserve (reference images, LoRA) or someone new?","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"What's her energy — defiant and triumphant, exhausted but unbroken, something else?","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Any specifics on how she looks — hair, armor style, anything iconic about her?\"","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"User","type":"text","marks":[{"type":"strong"}]},{"text":": \"New character. Defiant and triumphant. Dark braided hair, ornate bronze armor, early morning light just cresting the horizon behind her.\"","type":"text"}]},{"type":"paragraph","content":[{"text":"VideoAgent","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"\"Got it — framing this as a heroic aftermath shot: she's won, the sun rises behind her, rubble around her feet. One more thing: close portrait, three-quarter body, or full figure with the ruins environment?\"","type":"text"}]}]},{"type":"paragraph","content":[{"text":"User","type":"text","marks":[{"type":"strong"}]},{"text":": \"Full figure, show the ruins and the dawn sky.\"","type":"text"}]},{"type":"paragraph","content":[{"text":"VideoAgent","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"\"Perfect. Building that now.\"","type":"text"}]}]},{"type":"paragraph","content":[{"text":"[Delivers complete prompt output]","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Integration with Other Skills","type":"text"}]},{"type":"paragraph","content":[{"text":"After delivering the prompt, offer next steps:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Generate the workflow","type":"text","marks":[{"type":"strong"}]},{"text":": \"Want me to build the full ComfyUI workflow for this? I'll check your inventory and configure every node.\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Refine the prompt","type":"text","marks":[{"type":"strong"}]},{"text":": \"I can adjust the style, swap the identity method, or rework the negative if anything doesn't feel right.\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Save as character profile","type":"text","marks":[{"type":"strong"}]},{"text":": \"If this becomes a recurring character, I can create a character profile so we always have her settings ready.\"","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"comfyui-prompt-interview","author":"@skillopedia","source":{"stars":66,"repo_name":"comfyui-expert","origin_url":"https://github.com/mckruz/comfyui-expert/blob/HEAD/skills/comfyui-prompt-interview/SKILL.md","repo_owner":"mckruz","body_sha256":"2833147537e89241af9f495a32f85ee4e841163cbda1a72289e47dd413e2291a","cluster_key":"3614ff933816eaec422cc4d83253bf634a3a1468d29e9df479ea4951a15756d9","clean_bundle":{"format":"clean-skill-bundle-v1","source":"mckruz/comfyui-expert/skills/comfyui-prompt-interview/SKILL.md","attachments":[{"id":"47699dd1-aaa6-5303-84a5-42060a41b470","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/47699dd1-aaa6-5303-84a5-42060a41b470/attachment.md","path":"eval/EVAL.md","size":2164,"sha256":"ea003f669fdbc23aa9a0f9768c7393d93bb11ad5e27d88642ae7e03444f66c04","contentType":"text/markdown; charset=utf-8"},{"id":"0a38f8b1-11d7-58ef-b65d-617277d384a8","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/0a38f8b1-11d7-58ef-b65d-617277d384a8/attachment.yaml","path":"eval/benchmark.yaml","size":1388,"sha256":"6aab4652193f3ba92a3f4eb7e83f38106c59472e6c40d844a322347f2ebdddaa","contentType":"application/yaml; charset=utf-8"},{"id":"a733d90b-c01f-5b01-947e-0ea1ca25746d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a733d90b-c01f-5b01-947e-0ea1ca25746d/attachment","path":"eval/results/.gitignore","size":83,"sha256":"80890102cd6498fafa6e7ce3f85a4fd5ac87fef1376421e3dcc18888eba7a86d","contentType":"text/plain; charset=utf-8"},{"id":"665ac60f-7fd3-521b-8fdc-077965500f6d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/665ac60f-7fd3-521b-8fdc-077965500f6d/attachment","path":"eval/results/.gitkeep","size":0,"sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","contentType":"text/plain; charset=utf-8"},{"id":"4028a0a0-2f3a-530f-b3a0-9ccdf5c0f4a5","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/4028a0a0-2f3a-530f-b3a0-9ccdf5c0f4a5/attachment.sh","path":"eval/run-eval.sh","size":18242,"sha256":"4a5f64f9347e91d8bedb149ea5fd16263f0db37875164a5c584401f915567585","contentType":"application/x-sh; charset=utf-8"},{"id":"1516894f-d2de-504b-bd54-f007737010f7","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/1516894f-d2de-504b-bd54-f007737010f7/attachment.yaml","path":"eval/test-cases.yaml","size":7511,"sha256":"1e17f955a753b369b9d032369baba6a6eed3569f9864bc5f8b5e45e02e054fd7","contentType":"application/yaml; charset=utf-8"},{"id":"fbf2faef-2bf0-5cc7-8180-dfc8886503dd","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/fbf2faef-2bf0-5cc7-8180-dfc8886503dd/attachment.yaml","path":"eval/trigger-tests.yaml","size":1827,"sha256":"adf7b0ef3a7388760778a867c98aac2f23a551e0aed8cb1ba33a4ee019845dbc","contentType":"application/yaml; charset=utf-8"}],"bundle_sha256":"b3fedf2038784e9b87dadc0804e7b376215b25234368a3fd3a0efcc4673655f9","attachment_count":7,"text_attachments":5,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":2,"excluded_attachments":[]},"cluster_size":1,"skill_md_path":"skills/comfyui-prompt-interview/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"web-development","category_label":"Web"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"web-development","metadata":{"openclaw":{"os":["darwin","linux","win32"],"emoji":"🎬"}},"import_tag":"clean-skills-v1","description":"Guided conversational interview to understand a user's creative vision before generating model-appropriate image prompts. Asks clarifying questions about subject, mood, style, and technical preferences (4-7 exchanges), then synthesizes positive prompt, negative prompt, recommended settings table, and pipeline recommendation. Formats prompts for the target model (SDXL tag-style, FLUX natural language, SD1.5 weighted tokens). Triggers on \"I want to create...\", \"help me make an image of...\", \"I have an idea for...\", \"help me craft a prompt\", \"write me a prompt for...\", or any request for help describing a creative vision. Does NOT cover workflow building, prompt debugging/fixing, technical explanations, model training, code generation, or identity-preserving character generation.","user-invocable":true}},"renderedAt":1782980975150}

ComfyUI Prompt Interview Conduct a guided conversation to draw out the user's complete creative vision, then synthesize a perfect, model-appropriate prompt with all recommended settings. When to Invoke This Skill - User describes an image or scene idea but hasn't given enough detail for a quality prompt - User says "help me think through what I want to create" - User has a vague concept that needs refinement - User wants a structured prompt but isn't sure what to specify The Interview Philosophy Ask, don't interrogate. This is a conversation, not a form. Ask one or two questions at a time. Li…