client / static /js /generate.js
P01yH3dr0n's picture
launch
774fe36
Raw
History Blame Contribute Delete
5.86 kB
/* ===== Generation Logic ===== */
window.NAIGenerate = {
collectParams() {
return {
model: $('#model-select').value,
prompt: $('#prompt-input').value.trim(),
quality_prompt: $('#quality-input').value.trim(),
negative_prompt: $('#negative-input').value.trim(),
sampler: $('#sampler-select').value,
cfg_scale: parseFloat($('#cfg-slider').value),
steps: parseInt($('#steps-slider').value),
seed: parseInt($('#seed-input').value) || -1,
width: parseInt($('#width-slider').value),
height: parseInt($('#height-slider').value),
save_to_cloud: window.NAISettings ? NAISettings.get('saveToCloud') : ($('#save-to-cloud')?.checked ?? true),
};
},
collectVibeParams() {
const model = $('#model-select').value;
const v4 = model.startsWith('nai-diffusion-4');
const strNorm = $('#vibe-str-normalize');
if (v4) {
return {
mode: 'v4',
vibes: NAIState.vibeFiles.map(vf => {
const ek = model.endsWith('full') ? 'v4full' : 'v4curated';
const encodings = vf.data.encodings?.[ek] || {};
const firstKey = Object.keys(encodings)[0];
const enc = firstKey ? encodings[firstKey] : null;
return {
encoding: enc?.encoding || '',
info_extract: enc?.params?.information_extracted ?? 1,
strength: vf.strength ?? 0.6,
};
}).filter(v => v.encoding),
normalize_strength: strNorm ? strNorm.checked : true,
};
}
return {
mode: 'legacy',
images: NAIState.vibeRefImages.map(ri => ({
b64: NAIUtils.dataUrlToBase64(ri.dataUrl),
info_extract: ri.infoExtract,
strength: ri.strength,
})),
normalize_strength: strNorm ? strNorm.checked : true,
};
},
startGeneration() {
const state = NAIState;
if (state.generating || state.vibeEncoding || !state.wsReady) return;
// Auto-convert unconverted ref images for v4
if (NAIVibe.isV4Model() && state.vibeRefImages.length > 0) {
NAIVibe.startEncode(true);
return;
}
this.doGenerate();
},
doGenerate() {
if (NAIState.generating) return;
NAIState.generating = true;
const btn = $('#btn-generate');
btn.disabled = true;
btn.classList.add('generating');
btn.textContent = '็”Ÿๆˆไธญ...';
NAITimer.start();
const charParams = NAICharacter.collectParams();
const referenceParams = NAIReference.collectParams();
const advParams = NAIAdvanced.collectParams();
NAIWS.send({
action: 'generate',
params: this.collectParams(),
vibe: this.collectVibeParams(),
extra_input: NAIExtraInput.collectParams(),
character: charParams,
reference: referenceParams,
advanced: advParams,
});
},
onResult(data) {
NAIState.generating = false;
const btn = $('#btn-generate');
btn.disabled = false;
btn.classList.remove('generating');
btn.textContent = '็”Ÿๆˆ';
NAIWS.updateStatus('็”ŸๆˆๅฎŒๆˆ โœ“', false);
NAITimer.stop(true);
// Refresh anlas after generation
NAICost.fetchAnlas();
if (data.image) {
const img_area = $('#result-image-area');
img_area.innerHTML =
`<img src="data:image/png;base64,` + data.image + `" class="gen-result-image">`;
const img = img_area.querySelector('img');
const badge = document.createElement('button');
badge.className = 'download-card-badge';
badge.textContent = '๐Ÿ’พ';
img_area.appendChild(badge);
img.addEventListener('click', () => {
if (document.fullscreenElement) {
document.exitFullscreen();
} else {
img.requestFullscreen();
}
});
badge.addEventListener('click', () => {
const link = document.createElement('a');
link.href = `data:image/png;base64,${data.image}`;
link.download = `nai_image_${Date.now()}.png`;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
});
}
if (data.seed !== undefined) NAIState.lastSeed = data.seed;
const params = this.collectParams();
// Save to history with searchable text
if (data.image) {
NAIHistory.saveWithSearch(data.image, 'generate', {
...params, seed: data.seed,
});
}
const rows = {
Model: params.model, Seed: data.seed, Sampler: params.sampler,
'CFG Scale': params.cfg_scale, Steps: params.steps,
Size: `${params.width}x${params.height}`,
};
let html = '';
for (const [k, v] of Object.entries(rows)) {
html += `<div class="info-row"><span class="info-key">${k}:</span><span class="info-value">${v}</span></div>`;
}
$('#result-info-content').innerHTML = html;
},
onError(message) {
NAIState.generating = false;
const btn = $('#btn-generate');
btn.disabled = false;
btn.classList.remove('generating');
btn.textContent = '็”Ÿๆˆ';
NAIWS.updateStatus(`้”™่ฏฏ: ${message}`, false);
NAITimer.stop(false);
},
};