Prompt Explorer

Best of Nine

Describe an idea and get 9 distinct creative directions in one preview grid. Pick your favorite, then generate it in full quality here or send it to any other tool.

Generated image

Your recent grids

const PROMPT_ENHANCE_IMAGE_EXT_RE = /\.(jpg|jpeg|png|gif|webp|bmp|ico|tiff|svg|avif|avifs|heic|heics|heif|heifs|jxl|psd|dng|cr2|cr3|nef|arw|orf|rw2|raf|pef|x3f)(?:\?|$)/i; function promptEnhanceFieldTitle(fieldName) { const meta = PROMPT_ENHANCE_CONFIG.fields?.[fieldName] || {}; return String(meta.title || fieldName).replace(/\s+/g, ' ').trim(); } function promptEnhanceControlValue(fieldName, meta = {}) { const nodes = Array.from(document.getElementsByName(fieldName)); if (!nodes.length) return null; if (meta.type === 'radio' || meta.type === 'aspect') { const checked = nodes.find((node) => node.checked); if (!checked) return null; const label = checked.id ? document.querySelector(`label[for="${checked.id}"]`) : null; return { value: String(checked.value || '').trim(), label: (label?.textContent || '').replace(/\s+/g, ' ').trim(), }; } const node = nodes[0]; if (!node) return null; if (node.type === 'checkbox') { return { value: node.checked ? 'yes' : 'no', label: node.checked ? 'Yes' : 'No', }; } const value = String($(node).val() ?? '').trim(); if (value === '') return null; let label = ''; if (node.tagName === 'SELECT') { label = (node.selectedOptions?.[0]?.textContent || '').replace(/\s+/g, ' ').trim(); } return { value, label }; } function promptEnhanceShouldCaptureControl(fieldName, meta = {}) { if (meta.format === 'uri') return false; const key = fieldName.toLowerCase(); if (['resolution', 'size', 'width', 'height', 'quality', 'output_format'].includes(key)) { return false; } return meta.type === 'aspect' || key.includes('aspect') || key.includes('camera') || key.includes('motion') || key.includes('duration') || key.includes('length') || key.includes('frame') || key.includes('seconds') || key.endsWith('_ratio') || [ 'task', 'method', 'mode', 'duration', 's_duration', 'length', 'num_frames', 'frames_per_second', 'fps', 'frame_rate', 'aspect-width', 'aspect-height', 'generate_audio' ].includes(key); } function promptEnhanceMediaLooksImage(media, meta = {}) { const accept = String(meta.accept || '').toLowerCase(); return media.kind === 'img' || media.kind === 'image' || accept.includes('image/') || PROMPT_ENHANCE_IMAGE_EXT_RE.test(media.fileId || '') || PROMPT_ENHANCE_IMAGE_EXT_RE.test(media.src || ''); } function promptEnhanceMediaLooksAudio(media, meta = {}) { const accept = String(meta.accept || '').toLowerCase(); return media.kind === 'audio' || accept.includes('audio/'); } function promptEnhanceMediaSnapshots(fieldName) { const group = typeof uriGroupByField === 'function' ? uriGroupByField(fieldName) : null; if (group && typeof uriGroupItems === 'function') { const items = uriGroupItems(group) || {}; const config = typeof uriGroupConfig === 'function' ? uriGroupConfig(group) : {}; const slots = Array.isArray(config.slots) ? config.slots : Object.keys(items); // Grouped upload fields such as SeedAudio's audio_urls have synthetic // hidden slot ids (audio_urls__1, etc.). Reading only the owner field // misses every uploaded clip, so preserve slot order from the group. return slots.map((slot) => { const item = items[slot]; const fileId = String(item?.value || '').trim(); if (!fileId) return null; const src = String(item?.preview || item?.value || '').trim(); const kind = item?.kind || (typeof uriGroupKindFromValue === 'function' ? uriGroupKindFromValue(item?.value || item?.preview || '') : ''); const duration = Number(item?.duration || 0); return { src, kind, duration: Number.isFinite(duration) ? duration : 0, fileId, }; }).filter(Boolean); } const snap = typeof readMedia === 'function' ? readMedia(fieldName) : null; return String(snap?.fileId || '').trim() ? [snap] : []; } function collectPromptEnhanceContext(field) { const fields = PROMPT_ENHANCE_CONFIG.fields || {}; const controls = []; const media = []; Object.entries(fields).forEach(([fieldName, meta]) => { if (meta.format === 'uri') { promptEnhanceMediaSnapshots(fieldName).forEach((snap) => { const fileId = String(snap?.fileId || '').trim(); if (!fileId) return; const item = { field: fieldName, title: promptEnhanceFieldTitle(fieldName), kind: snap?.kind || '', src: snap?.src || '', fileId, duration: Number.isFinite(Number(snap?.duration)) ? Number(snap.duration) : 0, }; item.visionEligible = promptEnhanceMediaLooksImage(item, meta); item.audioReference = promptEnhanceMediaLooksAudio(item, meta); media.push(item); }); return; } if (!promptEnhanceShouldCaptureControl(fieldName, meta)) return; const selected = promptEnhanceControlValue(fieldName, meta); if (!selected || selected.value === '') return; controls.push({ field: fieldName, title: promptEnhanceFieldTitle(fieldName), value: selected.value, label: selected.label, }); }); const imageMedia = media.filter((item) => item.visionEligible); const audioMedia = media.filter((item) => item.audioReference).map((item, index) => ({ field: item.field, title: item.title, duration: item.duration, slot: index + 1, tag: '@Audio' + (index + 1), })); const cap = Number(PROMPT_ENHANCE_CONFIG.visionImageCap || 5); return { model: PROMPT_ENHANCE_CONFIG.model || {}, field: { name: field, title: promptEnhanceFieldTitle(field), }, selectedControls: controls, uploadedMedia: media, visionImages: imageMedia.slice(0, cap), visionImageTotal: imageMedia.length, referenceAudio: audioMedia.slice(0, 3), }; } function promptEnhanceEscapeHtml(value) { return $('
').text(String(value ?? '')).html(); }