aidn commited on
Commit
e66e3d6
Β·
verified Β·
1 Parent(s): 8e71524

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +84 -25
app.py CHANGED
@@ -10,7 +10,11 @@ from huggingface_hub.utils import EntryNotFoundError
10
  HF_TOKEN = os.environ.get("HF_TOKEN", "")
11
  DATASET_REPO = os.environ.get("DATASET_REPO", "")
12
  DATASET_FILE = "data.jsonl"
13
- MODEL_ID = "meta-llama/Llama-4-Maverick-17B-128E-Instruct"
 
 
 
 
14
  LEADERBOARD_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "leaderboard.json")
15
 
16
  # ── System Prompts ─────────────────────────────────────────────────────────────
@@ -315,10 +319,11 @@ _init_leaderboard()
315
 
316
  # ── LLM-Calls ─────────────────────────────────────────────────────────────────
317
 
318
- def _call_llm(system, user, max_tokens=1024):
 
319
  client = InferenceClient(provider="novita", api_key=HF_TOKEN)
320
  resp = client.chat.completions.create(
321
- model=MODEL_ID,
322
  messages=[{"role": "system", "content": system},
323
  {"role": "user", "content": user}],
324
  max_tokens=max_tokens,
@@ -333,6 +338,7 @@ def translate(text, direction):
333
  return "Kein HF_TOKEN gefunden."
334
  prompt = PROMPT_TO_LINKEDIN if direction == "to_linkedin" else PROMPT_FROM_LINKEDIN
335
  try:
 
336
  return _call_llm(prompt, text)
337
  except Exception as e:
338
  return f"Fehler: {e}"
@@ -366,10 +372,22 @@ def get_bingo(text):
366
  try:
367
  raw = _call_llm(PROMPT_BINGO, text, max_tokens=600)
368
  data = _extract_json(raw)
369
- metrics = data.get("metrics", [])
 
 
 
 
 
 
 
 
370
  total = sum(int(m.get("score", 0)) for m in metrics)
371
  max_s = len(metrics) * 10
372
- verdict = data.get("verdict", "")
 
 
 
 
373
 
374
  _add_to_lb(text, total, max_s, verdict)
375
 
@@ -407,11 +425,56 @@ TUNING:
407
  - Zielgruppe: {zielgruppe}
408
  - Call to Action: {cta}"""
409
  try:
410
- return _call_llm(prompt, user_msg, max_tokens=800)
 
411
  except Exception as e:
412
  return f"Fehler: {e}"
413
 
414
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
415
  def _render_bingo(data):
416
  metrics = data.get("metrics", [])
417
  verdict = data.get("verdict", "")
@@ -490,23 +553,6 @@ def swap_direction(current_dir, inp, out):
490
  return new_dir, out, inp, *_labels(new_dir)
491
 
492
 
493
- # ── Haupt-Handler ──────────────────────────────────────────────────────────────
494
-
495
- def run_translate(text, direction):
496
- result = translate(text, direction)
497
- if direction == "to_linkedin":
498
- return (result,
499
- gr.update(value=result, visible=True),
500
- gr.update(value="", visible=False),
501
- gr.update(value=_render_leaderboard()))
502
- else:
503
- bingo_html, lb_html = get_bingo(text)
504
- return (result,
505
- gr.update(value="", visible=False),
506
- gr.update(value=bingo_html, visible=True),
507
- gr.update(value=lb_html))
508
-
509
-
510
  # ── CSS ───────────────────────────────────────────────────────────────────────
511
 
512
  CSS = """
@@ -578,6 +624,19 @@ button.secondary:hover { background:var(--li-blue-light) !important; }
578
  }
579
  #hidden_sync_btn { display: none !important; }
580
  #tuning_toggle_btn { display: none !important; }
 
 
 
 
 
 
 
 
 
 
 
 
 
581
  """
582
 
583
  # ── UI ─────────────────────────────────────────────────────────────────────────
@@ -696,7 +755,7 @@ with gr.Blocks(title="LinkedIn Translator") as demo:
696
 
697
  gr.HTML("""
698
  <div class="li-footer">
699
- <span>🧠 Llama 3.3 70B Instruct</span>
700
  <span>πŸ”„ Bidirektional</span>
701
  <span>🎯 Corporate Nonsense Score</span>
702
  <span>✨ AI Tuning</span>
@@ -746,7 +805,7 @@ with gr.Blocks(title="LinkedIn Translator") as demo:
746
  )
747
 
748
  tuning_btn.click(
749
- fn=generate_tuned_post,
750
  inputs=[input_box, slider_ton, slider_substanz, slider_laenge, dd_zielgruppe, dd_cta],
751
  outputs=[tuning_out]
752
  )
 
10
  HF_TOKEN = os.environ.get("HF_TOKEN", "")
11
  DATASET_REPO = os.environ.get("DATASET_REPO", "")
12
  DATASET_FILE = "data.jsonl"
13
+
14
+ # Modelle aufteilen!
15
+ MODEL_DEFAULT = "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8"
16
+ MODEL_TUNING = "meta-llama/Llama-3.3-70B-Instruct"
17
+
18
  LEADERBOARD_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "leaderboard.json")
19
 
20
  # ── System Prompts ─────────────────────────────────────────────────────────────
 
319
 
320
  # ── LLM-Calls ─────────────────────────────────────────────────────────────────
321
 
322
+ # Neu: Nimmt modell ID als Parameter an (Default ist Llama 4)
323
+ def _call_llm(system, user, max_tokens=1024, model_id=MODEL_DEFAULT):
324
  client = InferenceClient(provider="novita", api_key=HF_TOKEN)
325
  resp = client.chat.completions.create(
326
+ model=model_id,
327
  messages=[{"role": "system", "content": system},
328
  {"role": "user", "content": user}],
329
  max_tokens=max_tokens,
 
338
  return "Kein HF_TOKEN gefunden."
339
  prompt = PROMPT_TO_LINKEDIN if direction == "to_linkedin" else PROMPT_FROM_LINKEDIN
340
  try:
341
+ # Nutzt standardmÀßig Llama 4
342
  return _call_llm(prompt, text)
343
  except Exception as e:
344
  return f"Fehler: {e}"
 
372
  try:
373
  raw = _call_llm(PROMPT_BINGO, text, max_tokens=600)
374
  data = _extract_json(raw)
375
+
376
+ # --- TÜRSTEHER FÜR DAS LLM-JSON ---
377
+ erlaubte_labels = ["Buzzword-Dichte", "LΓ€nge vs. Inhalt", "SelbstbeweihrΓ€uche", "Hashtag-Overload", "Sinnlosigkeits-Index"]
378
+
379
+ # 1. Nur die 5 exakten Metriken erlauben
380
+ metrics = [m for m in data.get("metrics", []) if m.get("label") in erlaubte_labels]
381
+ data["metrics"] = metrics # FΓΌr den Renderer aktualisieren
382
+
383
+ # 2. Score berechnen (jetzt garantiert max 50)
384
  total = sum(int(m.get("score", 0)) for m in metrics)
385
  max_s = len(metrics) * 10
386
+
387
+ # 3. Fallback fΓΌr das Urteil
388
+ verdict = data.get("verdict", "Die KI war sprachlos: Kein Urteil generiert.")
389
+ data["verdict"] = verdict
390
+ # ----------------------------------
391
 
392
  _add_to_lb(text, total, max_s, verdict)
393
 
 
425
  - Zielgruppe: {zielgruppe}
426
  - Call to Action: {cta}"""
427
  try:
428
+ # Hier nutzen wir das mΓ€chtige 70B Modell!
429
+ return _call_llm(prompt, user_msg, max_tokens=800, model_id=MODEL_TUNING)
430
  except Exception as e:
431
  return f"Fehler: {e}"
432
 
433
 
434
+ # --- LADE ANIMATIONEN ---
435
+ def generate_tuned_post_with_loader(original_text, ton, substanz, laenge, zielgruppe, cta):
436
+ if not original_text.strip():
437
+ yield "Bitte zuerst einen Post eingeben."
438
+ return
439
+
440
+ yield "⏳ KI (Llama 3.3 70B) optimiert den Post nach deinen Vorgaben... Bitte warten."
441
+ result = generate_tuned_post(original_text, ton, substanz, laenge, zielgruppe, cta)
442
+ yield result
443
+
444
+
445
+ def run_translate(text, direction):
446
+ if not text.strip():
447
+ yield "", gr.update(), gr.update(), gr.update()
448
+ return
449
+
450
+ if direction == "to_linkedin":
451
+ yield ("",
452
+ gr.update(value="⏳ **Generiere epische LinkedIn-Prosa...** Bitte warten.", visible=True),
453
+ gr.update(visible=False),
454
+ gr.update())
455
+
456
+ result = translate(text, direction)
457
+
458
+ yield (result,
459
+ gr.update(value=result, visible=True),
460
+ gr.update(visible=False),
461
+ gr.update())
462
+ else:
463
+ loader_html = '<div class="loading-box"><div class="spinner"></div><span>Analysiere Corporate Nonsense...</span></div>'
464
+ yield ("",
465
+ gr.update(visible=False),
466
+ gr.update(value=loader_html, visible=True),
467
+ gr.update())
468
+
469
+ result = translate(text, direction)
470
+ bingo_html, lb_html = get_bingo(text)
471
+
472
+ yield (result,
473
+ gr.update(visible=False),
474
+ gr.update(value=bingo_html, visible=True),
475
+ gr.update(value=lb_html))
476
+
477
+
478
  def _render_bingo(data):
479
  metrics = data.get("metrics", [])
480
  verdict = data.get("verdict", "")
 
553
  return new_dir, out, inp, *_labels(new_dir)
554
 
555
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
556
  # ── CSS ───────────────────────────────────────────────────────────────────────
557
 
558
  CSS = """
 
624
  }
625
  #hidden_sync_btn { display: none !important; }
626
  #tuning_toggle_btn { display: none !important; }
627
+
628
+ /* SPINNER CSS */
629
+ .loading-box {
630
+ display: flex; align-items: center; justify-content: center; gap: 12px;
631
+ padding: 30px; background: #fff; border: 1px solid #E0DFDC;
632
+ border-radius: 12px; margin-top: 4px; color: #0A66C2; font-weight: 600;
633
+ }
634
+ .spinner {
635
+ width: 20px; height: 20px; border: 3px solid #EBF3FB;
636
+ border-top: 3px solid #0A66C2; border-radius: 50%;
637
+ animation: spin 1s linear infinite;
638
+ }
639
+ @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
640
  """
641
 
642
  # ── UI ─────────────────────────────────────────────────────────────────────────
 
755
 
756
  gr.HTML("""
757
  <div class="li-footer">
758
+ <span>🧠 Llama 4 (17B) & Llama 3.3 (70B)</span>
759
  <span>πŸ”„ Bidirektional</span>
760
  <span>🎯 Corporate Nonsense Score</span>
761
  <span>✨ AI Tuning</span>
 
805
  )
806
 
807
  tuning_btn.click(
808
+ fn=generate_tuned_post_with_loader,
809
  inputs=[input_box, slider_ton, slider_substanz, slider_laenge, dd_zielgruppe, dd_cta],
810
  outputs=[tuning_out]
811
  )