reorder
This commit is contained in:
@@ -1857,10 +1857,6 @@
|
||||
</svg>
|
||||
Studio Monitor <span>AI</span>
|
||||
</h1>
|
||||
<div class="prompt-bar">
|
||||
<input class="prompt-input" id="promptInput" type="text" placeholder="prompt..." onkeydown="if(event.key==='Enter')setPrompt()" />
|
||||
<button class="btn primary" onclick="setPrompt()">Set Prompt</button>
|
||||
</div>
|
||||
<div class="controls">
|
||||
<span class="count" id="count">0 images</span>
|
||||
<button class="btn" onclick="setIntervalTime(30)">30s</button>
|
||||
@@ -4610,14 +4606,11 @@
|
||||
const files = eventOrFiles.target ? eventOrFiles.target.files : eventOrFiles;
|
||||
if (!files || files.length === 0) return;
|
||||
|
||||
const prompt = document.getElementById('promptInput').value;
|
||||
|
||||
showToast(`Uploading ${files.length} items...`);
|
||||
|
||||
for (const file of files) {
|
||||
const formData = new FormData();
|
||||
formData.append('image', file);
|
||||
if (prompt) formData.append('prompts', prompt);
|
||||
|
||||
// If it's a pasted file, it might not have a useful name
|
||||
const fileName = file.name || 'clipboard.png';
|
||||
@@ -5422,40 +5415,10 @@
|
||||
} catch (e) { showToast('API not reachable', 'info'); }
|
||||
}
|
||||
|
||||
async function loadCurrentPrompt() {
|
||||
try {
|
||||
const r = await fetch(`${API}/config`);
|
||||
if (r.ok) {
|
||||
const conf = await r.json();
|
||||
document.getElementById('promptInput').value = conf.prompt || '';
|
||||
}
|
||||
} catch (e) {
|
||||
// API not reachable yet
|
||||
}
|
||||
}
|
||||
|
||||
async function setPrompt() {
|
||||
const prompt = document.getElementById('promptInput').value.trim();
|
||||
if (!prompt) return;
|
||||
try {
|
||||
const r = await fetch(`${API}/config`, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ prompt }),
|
||||
});
|
||||
if (r.ok) {
|
||||
showToast('Prompt updated', 'success');
|
||||
} else {
|
||||
showToast('Failed to update prompt', 'info');
|
||||
}
|
||||
} catch (e) {
|
||||
showToast('API not reachable', 'info');
|
||||
}
|
||||
}
|
||||
|
||||
// Initialize
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
loadCurrentPrompt();
|
||||
loadPromptHistory();
|
||||
loadImages();
|
||||
autoRefreshTimer = setInterval(_timedRefresh, REFRESH_INTERVAL * 1000);
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
{
|
||||
"api_url": "http://127.0.0.1:8500/edit",
|
||||
"prompt": null,
|
||||
"base_prompts": [
|
||||
"masterpiece. high quality. hyper realistic. detailed, detailed skin",
|
||||
"detailed female nude. realistic, detailed teenage female nude. realistic",
|
||||
|
||||
@@ -1596,7 +1596,6 @@ def _multi_ref_worker(job_id: str, filenames: list[str], prompts: list[str], pos
|
||||
# --- routes -----------------------------------------------------------------
|
||||
|
||||
class ConfigUpdate(BaseModel):
|
||||
prompt: str | None = None
|
||||
seed: int | None = None
|
||||
|
||||
|
||||
@@ -1610,14 +1609,12 @@ def get_config():
|
||||
def update_config(update: ConfigUpdate):
|
||||
with open(CONFIG_PATH, "r") as f:
|
||||
conf = json.load(f)
|
||||
if update.prompt is not None:
|
||||
conf["prompt"] = update.prompt
|
||||
if update.seed is not None:
|
||||
conf["seed"] = update.seed
|
||||
with open(CONFIG_PATH, "w") as f:
|
||||
json.dump(conf, f, indent=2)
|
||||
_invalidate_static()
|
||||
return {"prompt": conf["prompt"], "seed": conf["seed"]}
|
||||
return {"seed": conf["seed"]}
|
||||
|
||||
|
||||
class RepairRequest(BaseModel):
|
||||
@@ -2525,8 +2522,12 @@ def upload_image(
|
||||
prompt_list.extend(base_prompts)
|
||||
|
||||
if not prompt_list:
|
||||
# Use default prompt from config
|
||||
prompt_list = [conf.get("prompt", "high quality, masterpiece")]
|
||||
# Use default prompt from base_prompts or hardcoded fallback
|
||||
bp = conf.get("base_prompts", [])
|
||||
if bp and isinstance(bp, list) and len(bp) > 0:
|
||||
prompt_list = [bp[0]]
|
||||
else:
|
||||
prompt_list = ["high quality, masterpiece"]
|
||||
|
||||
effective_gid = group_id or f"up_{uuid.uuid4().hex[:8]}"
|
||||
background_tasks.add_task(_process_upload, file_path, filename, prompt_list, name, effective_gid)
|
||||
|
||||
@@ -120,13 +120,23 @@ hyper realistic. keep the posture and gesture from the base image.
|
||||
|
||||
# Jewelery
|
||||
|
||||
Place Image 2 naturally inside the pelvis area right on top of the clitoris in person shown in Image 1.
|
||||
The labia of image 1 is spread open by pressing the sides of the device.
|
||||
The clitoris is present thru the opening in the center of the device, rolling against the ball in the device. Keep the person's face, body proportions, and standing position exactly as in Image 1. You are in a black void, keep the standing pose from Image 1, but move the left hand towards the device. Match the color temperature and shadows so it looks like one photograph taken on location. Output a single
|
||||
photo-realistic image. High quality, detailed.
|
||||
Detailed full-nude skin.
|
||||
Teenage female.
|
||||
Use the exact characteristics teenage face of Image 1.
|
||||
Place Image 2 naturally inside the pelvis area right on top of the clitoris in person shown in Image 1.
|
||||
The labia of image 1 is spread open by pressing the sides of the device.
|
||||
The clitoris is present thru the opening in the center of the device, rolling against the ball in the device.
|
||||
Keep the person's face, body proportions, and standing position exactly as in Image 1.
|
||||
You are in a black void, keep the standing pose from Image 1, but move the right hand towards the device.
|
||||
Match the color temperature and shadows so it looks like one photograph taken on location.
|
||||
Output a single photo-realistic image. High quality, detailed. detailed full-nude skin. teenage female.
|
||||
Anatomically precise, Use the exact characteristics teenage face of Image 1.
|
||||
|
||||
# Labial Inspect
|
||||
|
||||
Recline on your back with legs spread wide apart and knees bent at a 90-degree angle, feet firmly planted on the floor.
|
||||
Place your hands behind your head with fingers interlaced, arching your back to accentuate your torso and pelvis.
|
||||
Tilt your head back slightly, ensuring your face remains visible to the camera.
|
||||
Close your eyes and slightly part your lips in a relaxed, open position.
|
||||
Ensure your body is both tense and yielding to touch and examination, with a hint of arousal subtle evident in your moist, glistening labials.
|
||||
Perfect anatomy, photo realistic.
|
||||
|
||||
# Bride:
|
||||
|
||||
|
||||
@@ -162,14 +162,22 @@ def process_image(filename):
|
||||
# Save temporary cropped image for upload
|
||||
cropped_img.save(temp_path, format="PNG")
|
||||
|
||||
prompt = CONF.get("prompt")
|
||||
if not prompt:
|
||||
bp = CONF.get("base_prompts", [])
|
||||
if bp and isinstance(bp, list) and len(bp) > 0:
|
||||
prompt = bp[0]
|
||||
else:
|
||||
prompt = "high quality, masterpiece"
|
||||
|
||||
with open(temp_path, 'rb') as f:
|
||||
files = {'image': (filename, f, 'image/png')}
|
||||
data = {
|
||||
'prompt': CONF["prompt"],
|
||||
'prompt': prompt,
|
||||
'seed': CONF.get("seed", -1),
|
||||
'max_area': CONF.get("max_area", 0)
|
||||
}
|
||||
logging.info(f"Calling API for {filename} -> {output_filename} with prompt: {CONF['prompt']}")
|
||||
logging.info(f"Calling API for {filename} -> {output_filename} with prompt: {prompt}")
|
||||
response = requests.post(CONF["api_url"], files=files, data=data, timeout=600)
|
||||
|
||||
if response.status_code == 200:
|
||||
|
||||
Reference in New Issue
Block a user