This commit is contained in:
mike
2026-06-27 13:51:51 +02:00
parent 4e23374093
commit 08a8cc9b82
5 changed files with 34 additions and 53 deletions

View File

@@ -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);

View File

@@ -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",

View File

@@ -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)

View File

@@ -122,11 +122,21 @@ hyper realistic. keep the posture and gesture from the base image.
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.
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:

View File

@@ -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: