JustinD commited on
Commit
9f1096f
·
verified ·
1 Parent(s): cdf1f20

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +114 -32
app.py CHANGED
@@ -30,7 +30,7 @@ logging.basicConfig(
30
  handlers=[logging.StreamHandler(sys.stdout)],
31
  )
32
  logger = logging.getLogger("NextGenEngine")
33
- logger.info("🚀 NSFW East Asian Lab boot (19+ · Adult SDXL / FLUX / SD3.5)")
34
 
35
  if hasattr(sys.stdout, "reconfigure"):
36
  sys.stdout.reconfigure(encoding="utf-8")
@@ -60,7 +60,7 @@ MODEL_REPOS = {
60
  "Hassaku XL (Illustrious).safetensors": "AriaVale2/my-safetensors-backup",
61
  }
62
 
63
- # Newer Diffusers Asian NSFW / realism chefs (2025–2026)
64
  DIFFUSERS_MODELS = {
65
  # Illustrious NSFW / hentai
66
  "WAI NSFW Illustrious v150": "John6666/wai-nsfw-illustrious-sdxl-v150-sdxl",
@@ -113,42 +113,108 @@ DIFFUSERS_MODELS = {
113
  SDXL_CHOICES = list(DIFFUSERS_MODELS.keys()) + list(MODEL_REPOS.keys())
114
  DEFAULT_SDXL = "WAI NSFW Illustrious v150"
115
 
116
- # B + C: East Asian slim/tall/big tits lane; Testing Tits is the only style pack
 
117
  STYLE_PACKS = {
118
  "Testing Tits": {
119
  "prefix": (
120
- "nice tits, big tits, fun bags, heavy cleavage focus, "
121
- "hard nipples, underboob, sideboob, massive soft breasts"
 
122
  ),
123
  "suffix": (
124
- "no bra, topless, bare breasts, nipples, chest forward, "
125
-
126
- ), },
127
- "1": {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
128
  "prefix": (
129
- "hot slut, big tits, "
130
- ),
 
 
 
 
 
 
 
 
 
 
 
131
  "suffix": (
132
- "fit cleavage, huge hard breasts, tiny waist, "
133
- "aroused expression, opulent interior, cinematic lighting"
134
  ),
135
  },
136
- "2": {
137
  "prefix": (
138
- "black and white"
 
139
  ),
140
  "suffix": (
141
- "city"
 
142
  ),
143
  },
144
  }
145
 
 
146
  DEFAULT_QUALITY = (
 
 
 
 
 
 
 
 
147
  "nsfw, explicit, erotic, porn aesthetic, nude energy"
148
  )
149
 
150
  BASE_NEGATIVES = (
151
- "child, loli, underage, teen, 18, eighteen, "
 
152
  "man, men, male, boy, guy, guys, male focus, masculine, "
153
  "old, elderly, aged, grandma, wrinkly, "
154
  "fat, chubby, obese, overweight, belly fat, thick thighs, "
@@ -157,8 +223,22 @@ BASE_NEGATIVES = (
157
  "blurry, lowres, watermark, text, censored, ugly"
158
  )
159
 
 
160
  RANDOM_PROMPTS = [
161
- "",
 
 
 
 
 
 
 
 
 
 
 
 
 
162
  ]
163
 
164
  FORBIDDEN_KEYWORDS = []
@@ -173,11 +253,11 @@ if os.path.exists("restricted_words.txt"):
173
  except Exception as e:
174
  logger.error(f"restricted words load failed: {e}")
175
 
176
- # 19+: block ages under 19 in prompt text
177
  AGE_PATTERN = re.compile(
178
  r"\b(one|two|three|four|five|six|seven|eight|nine|ten|"
179
- r"eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|"
180
- r"1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18)"
181
  r"\s*[-\s]?\s*(year|yr|y\/o|yo)\b"
182
  )
183
 
@@ -230,7 +310,7 @@ def async_log_upload(pil_img, seed, model_name, prompt, username, width, height,
230
  pil_img.save(buf, format="WEBP", quality=95)
231
  raw = buf.getvalue()
232
  if not hf_token:
233
- logger.error("HF_TOKEN missing — log upload skipped")
234
  return
235
  api = HfApi(token=hf_token)
236
  date_str = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(timestamp))
@@ -423,8 +503,9 @@ def generate(
423
  use_steps = int(max(1, min(8, int(steps) if int(steps) <= 8 else 4)))
424
  flux_prompt = (
425
  enhanced
426
- + ", 1girl, solo, adult East Asian woman only, no men, no males, "
427
- "no old people, tall slim body, large breasts"
 
428
  )
429
  for s in seeds:
430
  gen = torch.Generator(device=device).manual_seed(int(s))
@@ -480,7 +561,7 @@ def generate(
480
  logger.exception("generate failed")
481
  msg = str(e)
482
  if "gated" in msg.lower() or "401" in msg or "403" in msg:
483
- msg += " — accept the model license and ensure Space secret HF_TOKEN can read it."
484
  return None, f"❌ {msg}", "", []
485
 
486
 
@@ -506,25 +587,26 @@ THEME = gr.themes.Default(primary_hue="purple", secondary_hue="indigo", neutral_
506
  def create_ui():
507
  with gr.Blocks() as demo:
508
  user_id = gr.Textbox(visible=False)
509
- gr.Markdown("# ⚡ NSFW East Asian Lab")
510
  gr.Markdown(
511
- """### 19+ only · ZeroGPU · first model load is slow · queues happen
512
 
513
- **This Space is adult NSFW East Asian women only** (slim / tall / big tits).
 
514
  Default engine: Adult SDXL. Chef list is **porn / NSFW only** (Illustrious + Pony + photo porn). Default: **WAI NSFW Illustrious v150**.
515
- Style pack: **Testing Tits** only.
516
  FLUX and SD 3.5 stay optional. Visitor gens are **not** saved unless secret `LOG_VISITOR_UPLOADS=1`."""
517
  )
518
  with gr.Row():
519
  with gr.Column(scale=2):
520
- prompt = gr.Textbox(label="Prompt", value=random.choice(RANDOM_PROMPTS), lines=7)
521
  negative = gr.Textbox(
522
  label="Negatives (SD3.5 / SDXL; ignored by FLUX)",
523
  value=BASE_NEGATIVES,
524
  lines=4,
525
  )
526
  styles = gr.CheckboxGroup(
527
- label="Style packs",
528
  choices=list(STYLE_PACKS.keys()),
529
  value=["Testing Tits"],
530
  )
@@ -572,4 +654,4 @@ if __name__ == "__main__":
572
  os.environ["GRADIO_ANALYTICS_ENABLED"] = "False"
573
  app = create_ui()
574
  app.queue(max_size=12)
575
- app.launch(ssr_mode=False, theme=THEME, css=css)
 
30
  handlers=[logging.StreamHandler(sys.stdout)],
31
  )
32
  logger = logging.getLogger("NextGenEngine")
33
+ logger.info("🚀 NSFW East/SE Asian Lab boot (21+ · Adult SDXL / FLUX / SD3.5)")
34
 
35
  if hasattr(sys.stdout, "reconfigure"):
36
  sys.stdout.reconfigure(encoding="utf-8")
 
60
  "Hassaku XL (Illustrious).safetensors": "AriaVale2/my-safetensors-backup",
61
  }
62
 
63
+ # Newer Diffusers Asian NSFW / realism chefs (2025-2026)
64
  DIFFUSERS_MODELS = {
65
  # Illustrious NSFW / hentai
66
  "WAI NSFW Illustrious v150": "John6666/wai-nsfw-illustrious-sdxl-v150-sdxl",
 
113
  SDXL_CHOICES = list(DIFFUSERS_MODELS.keys()) + list(MODEL_REPOS.keys())
114
  DEFAULT_SDXL = "WAI NSFW Illustrious v150"
115
 
116
+ # Style packs stack via CheckboxGroup. Testing Tits is the heat base; scene packs layer on top.
117
+ # No packs named "1" or "2". Cosmic e-girl booth is FICTIONAL DJ only (no real person names).
118
  STYLE_PACKS = {
119
  "Testing Tits": {
120
  "prefix": (
121
+ "nsfw, explicit, porn, erotic nude, rating_explicit, "
122
+ "big soft tits, heavy breasts, fun bags, heavy cleavage focus, "
123
+ "hard nipples, underboob, sideboob, chest forward, bouncing tits energy"
124
  ),
125
  "suffix": (
126
+ "no bra, topless, bare breasts, nipples visible, aroused, "
127
+ "sexualized pose, wet parted lips, body greedy"
128
+ ),
129
+ },
130
+ "Cosmic e-girl booth": {
131
+ "prefix": (
132
+ "fictional DJ only, twin tails, oversized headphones, white crop top mid-set, "
133
+ "DJ booth, jog wheels, Pioneer decks in frame, neon club lights, brat glare"
134
+ ),
135
+ "suffix": (
136
+ "crop yanked up, heavy cleavage, still mixing, hands on decks, "
137
+ "neon glow on skin, mid-set tease"
138
+ ),
139
+ },
140
+ "East Asian night club": {
141
+ "prefix": (
142
+ "neon night club, sweat sheen, club strobe, tight dress, "
143
+ "public almost-caught heat, crowded dance floor blur"
144
+ ),
145
+ "suffix": (
146
+ "dress yanked down, breasts spilled, flushed cheeks, "
147
+ "sweaty cleavage, naughty public tease"
148
+ ),
149
+ },
150
+ "Hotel mirror": {
151
+ "prefix": (
152
+ "hotel bathroom mirror, reflection fuck energy, steam, "
153
+ "lipstick smear, hands on glass"
154
+ ),
155
+ "suffix": (
156
+ "tits pressed to glass, messy reflection, smudged lipstick, "
157
+ "aroused stare into mirror"
158
+ ),
159
+ },
160
+ "Rain alley": {
161
+ "prefix": (
162
+ "rain alley at night, soaked white shirt, rain drops, "
163
+ "wet hair sticking, neon puddles"
164
+ ),
165
+ "suffix": (
166
+ "no bra, nipples through cloth then bare, shirt clinging, "
167
+ "soaked see-through, alley wall pin"
168
+ ),
169
+ },
170
+ "Soft Domme": {
171
  "prefix": (
172
+ "soft domme energy, thin collar hint, finger under chin, "
173
+ "nasty smile, dominant gaze"
174
+ ),
175
+ "suffix": (
176
+ "spit string, parted lips, chin lift, controlling pose, "
177
+ "cruel soft smile"
178
+ ),
179
+ },
180
+ "Quiet beg": {
181
+ "prefix": (
182
+ "quiet beg, hand over her mouth, muffled moan, "
183
+ "eyes wet, desperate heat"
184
+ ),
185
  "suffix": (
186
+ "body greedy, trembling thighs held still, "
187
+ "pleading wet eyes, stifled sound"
188
  ),
189
  },
190
+ "Library whiskey couch": {
191
  "prefix": (
192
+ "library leather couch, green turtleneck, whiskey glass, "
193
+ "soft glam light, dark wood shelves"
194
  ),
195
  "suffix": (
196
+ "turtleneck pulled up, soft glam filthy under knit, "
197
+ "breasts out under sweater, whiskey in hand"
198
  ),
199
  },
200
  }
201
 
202
+ # Master lock: every gen inherits adult 21+ East/SE Asian woman body lock
203
  DEFAULT_QUALITY = (
204
+ "masterpiece, best quality, ultra detailed, detailed face, detailed eyes, "
205
+ "1girl, solo, adult woman 21+, young adult late 20s, "
206
+ "adult East Asian OR Southeast Asian woman late 20s, "
207
+ "beautiful East Asian face, smooth skin, glossy skin, soft jawline, "
208
+ "tall, slim body, small frame, tiny waist, "
209
+ "large breasts, full breasts, heavy breasts, big soft tits, cleavage, "
210
+ "hourglass figure, long legs, no thick thighs, "
211
+ "seductive pose, bedroom eyes, wet parted lips, aroused, "
212
  "nsfw, explicit, erotic, porn aesthetic, nude energy"
213
  )
214
 
215
  BASE_NEGATIVES = (
216
+ "child, loli, underage, teen, young teen, barely legal, "
217
+ "18, eighteen, 19, nineteen, "
218
  "man, men, male, boy, guy, guys, male focus, masculine, "
219
  "old, elderly, aged, grandma, wrinkly, "
220
  "fat, chubby, obese, overweight, belly fat, thick thighs, "
 
223
  "blurry, lowres, watermark, text, censored, ugly"
224
  )
225
 
226
+ # Sex Wildcard heat: adult East/SE Asian women 21+ only, ethnicity rotates per line
227
  RANDOM_PROMPTS = [
228
+ "adult Japanese woman late 20s, library leather couch, green turtleneck pulled up, whiskey glass, soft glam filthy under knit, big soft tits, explicit nsfw",
229
+ "adult Chinese woman late 20s, rain alley wall pin, soaked shirt half off, nipples through cloth then bare, neon puddles, aroused",
230
+ "adult Korean woman late 20s, hotel mirror used messy, tits pressed to glass, lipstick smear, reflection fuck energy, explicit",
231
+ "adult Taiwanese woman late 20s, basement stairwell Domme spit energy, collar hint, finger under chin, nasty smile, spit string",
232
+ "adult Vietnamese woman late 20s, Cosmic e-girl booth, twin tails, white crop yanked mid-set, jog wheels, Pioneer decks, heavy cleavage, still mixing, fictional DJ only",
233
+ "adult Filipino woman late 20s, after-set alley, oversized headphones, crop under tits, neon glow, sweaty skin, explicit tease",
234
+ "adult Thai woman late 20s, East Asian night club, dress yanked down, sweat sheen, public almost-caught, heavy cleavage",
235
+ "adult Japanese woman late 20s, Quiet beg, hand over her mouth, eyes wet, body greedy, muffled moan, tall slim tiny waist",
236
+ "adult Chinese woman late 20s, Soft Domme pose, collar hint, spit string, finger under chin, nasty smile, large full breasts",
237
+ "adult Korean woman late 20s, hotel bathroom steam, mirror fuck reflection, lipstick smear, bare breasts to glass",
238
+ "adult Taiwanese woman late 20s, rain alley soaked no bra, shirt clinging, nipples visible then bare, wall pin heat",
239
+ "adult Vietnamese woman late 20s, library whiskey couch, green turtleneck yanked up, leather couch, whiskey, soft glam filthy",
240
+ "adult Filipino woman late 20s, Cosmic e-girl booth twin tails crop yanked mid-set jog wheels, brat glare, neon, fictional DJ only",
241
+ "adult Thai woman late 20s, after-set alley headphones, crop under tits, neon alley, aroused look, explicit nsfw",
242
  ]
243
 
244
  FORBIDDEN_KEYWORDS = []
 
253
  except Exception as e:
254
  logger.error(f"restricted words load failed: {e}")
255
 
256
+ # 21+: block ages under 21 in prompt text (includes 19 / nineteen)
257
  AGE_PATTERN = re.compile(
258
  r"\b(one|two|three|four|five|six|seven|eight|nine|ten|"
259
+ r"eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen|"
260
+ r"1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19)"
261
  r"\s*[-\s]?\s*(year|yr|y\/o|yo)\b"
262
  )
263
 
 
310
  pil_img.save(buf, format="WEBP", quality=95)
311
  raw = buf.getvalue()
312
  if not hf_token:
313
+ logger.error("HF_TOKEN missing - log upload skipped")
314
  return
315
  api = HfApi(token=hf_token)
316
  date_str = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(timestamp))
 
503
  use_steps = int(max(1, min(8, int(steps) if int(steps) <= 8 else 4)))
504
  flux_prompt = (
505
  enhanced
506
+ + ", 1girl, solo, adult East Asian OR Southeast Asian woman 21+ only, "
507
+ "late 20s, no men, no males, no old people, "
508
+ "tall slim small frame tiny waist, large full heavy breasts"
509
  )
510
  for s in seeds:
511
  gen = torch.Generator(device=device).manual_seed(int(s))
 
561
  logger.exception("generate failed")
562
  msg = str(e)
563
  if "gated" in msg.lower() or "401" in msg or "403" in msg:
564
+ msg += " - accept the model license and ensure Space secret HF_TOKEN can read it."
565
  return None, f"❌ {msg}", "", []
566
 
567
 
 
587
  def create_ui():
588
  with gr.Blocks() as demo:
589
  user_id = gr.Textbox(visible=False)
590
+ gr.Markdown("# ⚡ 21+ Adult East/SE Asian Lab")
591
  gr.Markdown(
592
+ """### 21+ only · Fiction Space · ZeroGPU · first model load is slow · queues happen
593
 
594
+ **Scene + body lab for adult East / Southeast Asian women (21+, late 20s fiction).**
595
+ Body lock: tall slim small frame, tiny waist, large/full/heavy breasts, cleavage. No thick thighs.
596
  Default engine: Adult SDXL. Chef list is **porn / NSFW only** (Illustrious + Pony + photo porn). Default: **WAI NSFW Illustrious v150**.
597
+ Style packs stack: start with **Testing Tits**, layer scene packs (Cosmic e-girl booth, night club, hotel mirror, rain alley, Soft Domme, Quiet beg, library whiskey couch).
598
  FLUX and SD 3.5 stay optional. Visitor gens are **not** saved unless secret `LOG_VISITOR_UPLOADS=1`."""
599
  )
600
  with gr.Row():
601
  with gr.Column(scale=2):
602
+ prompt = gr.Textbox(label="Prompt (scene + body)", value=random.choice(RANDOM_PROMPTS), lines=7)
603
  negative = gr.Textbox(
604
  label="Negatives (SD3.5 / SDXL; ignored by FLUX)",
605
  value=BASE_NEGATIVES,
606
  lines=4,
607
  )
608
  styles = gr.CheckboxGroup(
609
+ label="Style packs (stack with Testing Tits)",
610
  choices=list(STYLE_PACKS.keys()),
611
  value=["Testing Tits"],
612
  )
 
654
  os.environ["GRADIO_ANALYTICS_ENABLED"] = "False"
655
  app = create_ui()
656
  app.queue(max_size=12)
657
+ app.launch(ssr_mode=False, theme=THEME, css=css)