reorder
This commit is contained in:
@@ -1857,10 +1857,6 @@
|
|||||||
</svg>
|
</svg>
|
||||||
Studio Monitor <span>AI</span>
|
Studio Monitor <span>AI</span>
|
||||||
</h1>
|
</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">
|
<div class="controls">
|
||||||
<span class="count" id="count">0 images</span>
|
<span class="count" id="count">0 images</span>
|
||||||
<button class="btn" onclick="setIntervalTime(30)">30s</button>
|
<button class="btn" onclick="setIntervalTime(30)">30s</button>
|
||||||
@@ -4610,14 +4606,11 @@
|
|||||||
const files = eventOrFiles.target ? eventOrFiles.target.files : eventOrFiles;
|
const files = eventOrFiles.target ? eventOrFiles.target.files : eventOrFiles;
|
||||||
if (!files || files.length === 0) return;
|
if (!files || files.length === 0) return;
|
||||||
|
|
||||||
const prompt = document.getElementById('promptInput').value;
|
|
||||||
|
|
||||||
showToast(`Uploading ${files.length} items...`);
|
showToast(`Uploading ${files.length} items...`);
|
||||||
|
|
||||||
for (const file of files) {
|
for (const file of files) {
|
||||||
const formData = new FormData();
|
const formData = new FormData();
|
||||||
formData.append('image', file);
|
formData.append('image', file);
|
||||||
if (prompt) formData.append('prompts', prompt);
|
|
||||||
|
|
||||||
// If it's a pasted file, it might not have a useful name
|
// If it's a pasted file, it might not have a useful name
|
||||||
const fileName = file.name || 'clipboard.png';
|
const fileName = file.name || 'clipboard.png';
|
||||||
@@ -5422,40 +5415,10 @@
|
|||||||
} catch (e) { showToast('API not reachable', 'info'); }
|
} 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
|
// Initialize
|
||||||
document.addEventListener('DOMContentLoaded', () => {
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
loadCurrentPrompt();
|
|
||||||
loadPromptHistory();
|
loadPromptHistory();
|
||||||
loadImages();
|
loadImages();
|
||||||
autoRefreshTimer = setInterval(_timedRefresh, REFRESH_INTERVAL * 1000);
|
autoRefreshTimer = setInterval(_timedRefresh, REFRESH_INTERVAL * 1000);
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
{
|
{
|
||||||
"api_url": "http://127.0.0.1:8500/edit",
|
"api_url": "http://127.0.0.1:8500/edit",
|
||||||
"prompt": null,
|
|
||||||
"base_prompts": [
|
"base_prompts": [
|
||||||
"masterpiece. high quality. hyper realistic. detailed, detailed skin",
|
"masterpiece. high quality. hyper realistic. detailed, detailed skin",
|
||||||
"detailed female nude. realistic, detailed teenage female nude. realistic",
|
"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 -----------------------------------------------------------------
|
# --- routes -----------------------------------------------------------------
|
||||||
|
|
||||||
class ConfigUpdate(BaseModel):
|
class ConfigUpdate(BaseModel):
|
||||||
prompt: str | None = None
|
|
||||||
seed: int | None = None
|
seed: int | None = None
|
||||||
|
|
||||||
|
|
||||||
@@ -1610,14 +1609,12 @@ def get_config():
|
|||||||
def update_config(update: ConfigUpdate):
|
def update_config(update: ConfigUpdate):
|
||||||
with open(CONFIG_PATH, "r") as f:
|
with open(CONFIG_PATH, "r") as f:
|
||||||
conf = json.load(f)
|
conf = json.load(f)
|
||||||
if update.prompt is not None:
|
|
||||||
conf["prompt"] = update.prompt
|
|
||||||
if update.seed is not None:
|
if update.seed is not None:
|
||||||
conf["seed"] = update.seed
|
conf["seed"] = update.seed
|
||||||
with open(CONFIG_PATH, "w") as f:
|
with open(CONFIG_PATH, "w") as f:
|
||||||
json.dump(conf, f, indent=2)
|
json.dump(conf, f, indent=2)
|
||||||
_invalidate_static()
|
_invalidate_static()
|
||||||
return {"prompt": conf["prompt"], "seed": conf["seed"]}
|
return {"seed": conf["seed"]}
|
||||||
|
|
||||||
|
|
||||||
class RepairRequest(BaseModel):
|
class RepairRequest(BaseModel):
|
||||||
@@ -2525,8 +2522,12 @@ def upload_image(
|
|||||||
prompt_list.extend(base_prompts)
|
prompt_list.extend(base_prompts)
|
||||||
|
|
||||||
if not prompt_list:
|
if not prompt_list:
|
||||||
# Use default prompt from config
|
# Use default prompt from base_prompts or hardcoded fallback
|
||||||
prompt_list = [conf.get("prompt", "high quality, masterpiece")]
|
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]}"
|
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)
|
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
|
# Jewelery
|
||||||
|
|
||||||
Place Image 2 naturally inside the pelvis area right on top of the clitoris in person shown in 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 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
|
The clitoris is present thru the opening in the center of the device, rolling against the ball in the device.
|
||||||
photo-realistic image. High quality, detailed.
|
Keep the person's face, body proportions, and standing position exactly as in Image 1.
|
||||||
Detailed full-nude skin.
|
You are in a black void, keep the standing pose from Image 1, but move the right hand towards the device.
|
||||||
Teenage female.
|
Match the color temperature and shadows so it looks like one photograph taken on location.
|
||||||
Use the exact characteristics teenage face of Image 1.
|
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:
|
# Bride:
|
||||||
|
|
||||||
|
|||||||
@@ -162,14 +162,22 @@ def process_image(filename):
|
|||||||
# Save temporary cropped image for upload
|
# Save temporary cropped image for upload
|
||||||
cropped_img.save(temp_path, format="PNG")
|
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:
|
with open(temp_path, 'rb') as f:
|
||||||
files = {'image': (filename, f, 'image/png')}
|
files = {'image': (filename, f, 'image/png')}
|
||||||
data = {
|
data = {
|
||||||
'prompt': CONF["prompt"],
|
'prompt': prompt,
|
||||||
'seed': CONF.get("seed", -1),
|
'seed': CONF.get("seed", -1),
|
||||||
'max_area': CONF.get("max_area", 0)
|
'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)
|
response = requests.post(CONF["api_url"], files=files, data=data, timeout=600)
|
||||||
|
|
||||||
if response.status_code == 200:
|
if response.status_code == 200:
|
||||||
|
|||||||
Reference in New Issue
Block a user