Food Desert commited on
Commit
3127166
·
2 Parent(s): dfedb9dc4b9ff7

Merge remote-tracking branch 'origin/main'

Browse files
app.py CHANGED
@@ -147,8 +147,8 @@ _CORPORATE_HARDBLOCK_PATTERNS = [
147
  # Common kink/fetish markers.
148
  re.compile(r"(^|_)(fetish|bdsm|bondage|dominatrix|submission|vore|inflation|watersports)(_|$)", re.IGNORECASE),
149
  ]
150
-
151
-
152
  def _split_prompt_commas(s: str) -> List[str]:
153
  return [p.strip() for p in (s or "").split(",") if p.strip()]
154
 
@@ -213,23 +213,23 @@ def _rewrite_prompt(prompt_in: str, log) -> str:
213
  log("Rewrite source=t5 returned empty; fallback to llm")
214
  return llm_rewrite_prompt(prompt_in, log)
215
  return ""
216
-
217
- def compose_final_prompt(rewritten_prompt: str, selected_tags: List[str]) -> str:
218
- parts = _split_prompt_commas(rewritten_prompt)
219
- parts.extend(selected_tags)
220
-
221
- seen = set()
222
- out = []
223
- for p in parts:
224
- key = _norm_for_dedupe(p)
225
- if key in seen:
226
- continue
227
- seen.add(key)
228
- out.append(p)
229
-
230
- return ", ".join(out)
231
-
232
-
233
  def _display_tag_text(tag: str) -> str:
234
  return tag.replace("_", " ")
235
 
@@ -569,13 +569,13 @@ def _order_selected_tags_for_row(
569
 
570
 
571
  def _escape_prompt_tag(tag: str) -> str:
572
- return (
573
- tag.replace("_", " ")
574
- .replace("(", "\\(")
575
- .replace(")", "\\)")
576
- )
577
-
578
-
579
  def _ordered_selected_for_prompt(selected: Set[str], row_defs: List[Dict[str, Any]]) -> List[str]:
580
  out: List[str] = []
581
  seen: Set[str] = set()
@@ -585,22 +585,22 @@ def _ordered_selected_for_prompt(selected: Set[str], row_defs: List[Dict[str, An
585
  out.append(tag)
586
  seen.add(tag)
587
  return out
588
-
589
-
590
- def _compose_toggle_prompt_text(selected_tags: List[str], row_defs: List[Dict[str, Any]]) -> str:
591
- selected = {t for t in (selected_tags or []) if t}
592
- ordered = _ordered_selected_for_prompt(selected, row_defs or [])
593
- return ", ".join(_escape_prompt_tag(t) for t in ordered)
594
-
595
-
596
- def _is_artist_tag(tag: str) -> bool:
597
- t = _norm_tag_for_lookup(str(tag))
598
- if not t:
599
- return False
600
- # Keep a resilient fallback for malformed/missing tag typing metadata.
601
- return get_tag_type_name(t) == "artist" or t.startswith("by_")
602
-
603
-
604
  @lru_cache(maxsize=1)
605
  def _load_excluded_recommendation_tags() -> Set[str]:
606
  out: Set[str] = set()
@@ -686,27 +686,27 @@ def _filter_min_count_tags(tags: List[str], min_count: int) -> Tuple[List[str],
686
  seen.add(t)
687
  keep.append(t)
688
  return keep, sorted(set(removed))
689
-
690
-
691
  def _filter_excluded_recommendation_tags(tags: List[str]) -> Tuple[List[str], List[str]]:
692
- excluded = _load_excluded_recommendation_tags()
693
- if not excluded:
694
- return list(dict.fromkeys(_norm_tag_for_lookup(t) for t in (tags or []) if t)), []
695
-
696
- keep: List[str] = []
697
- removed: List[str] = []
698
- seen: Set[str] = set()
699
- for raw in (tags or []):
700
- t = _norm_tag_for_lookup(str(raw))
701
- if not t:
702
- continue
703
- if t in excluded:
704
- removed.append(t)
705
- continue
706
- if t in seen:
707
- continue
708
- seen.add(t)
709
- keep.append(t)
710
  return keep, sorted(set(removed))
711
 
712
 
@@ -1044,12 +1044,12 @@ def _build_toggle_rows(
1044
  top_tags_per_group: int,
1045
  group_rank_top_k: int,
1046
  ) -> List[Dict[str, Any]]:
1047
- ranked_rows = rank_groups_from_tfidf(
1048
- seed_terms=seed_terms,
1049
- top_groups=max(1, int(top_groups)),
1050
- top_tags_per_group=max(1, int(top_tags_per_group)),
1051
- group_rank_top_k=max(1, int(group_rank_top_k)),
1052
- )
1053
  groups_map = _load_enabled_groups()
1054
  selected_active = list(
1055
  dict.fromkeys(
@@ -1085,7 +1085,7 @@ def _build_toggle_rows(
1085
  tags_in_any_displayed_group: Set[str] = set()
1086
  for tag_set in displayed_group_tag_sets.values():
1087
  tags_in_any_displayed_group.update(tag_set)
1088
-
1089
  retrieved_uncategorized_ranked = list(
1090
  dict.fromkeys(
1091
  _norm_tag_for_lookup(t)
@@ -1198,36 +1198,36 @@ def _build_toggle_rows(
1198
  row_defs.append(retrieved_other_row)
1199
 
1200
  return row_defs
1201
-
1202
-
1203
  def _build_display_audit_line(
1204
- row_defs: List[Dict[str, Any]],
1205
- *,
1206
- active_selected_tags: List[str],
1207
- direct_selected_tags: List[str],
1208
- implied_selected_tags: List[str],
1209
- ) -> str:
1210
- active_set = {
1211
- _norm_tag_for_lookup(t)
1212
- for t in (active_selected_tags or [])
1213
- if t and not _is_artist_tag(t)
1214
- }
1215
- direct_set = {
1216
- _norm_tag_for_lookup(t)
1217
- for t in (direct_selected_tags or [])
1218
- if t and not _is_artist_tag(t)
1219
- }
1220
- implied_set = {
1221
- _norm_tag_for_lookup(t)
1222
- for t in (implied_selected_tags or [])
1223
- if t and not _is_artist_tag(t)
1224
- }
1225
- info_by_tag: Dict[str, Dict[str, Any]] = {}
1226
-
1227
- for row in row_defs or []:
1228
- row_name = row.get("name", "")
1229
- row_label = row.get("label", row_name)
1230
- for tag in row.get("tags", []):
1231
  rec = info_by_tag.setdefault(tag, {"rows": [], "sources": set()})
1232
  rec["rows"].append(row_label)
1233
  if row_name == "selected_other":
@@ -1236,23 +1236,23 @@ def _build_display_audit_line(
1236
  rec["sources"].add("other_retrieved_row")
1237
  else:
1238
  rec["sources"].add("ranked_group_row")
1239
- if tag in active_set:
1240
- rec["sources"].add("selected_active")
1241
- if tag in direct_set:
1242
- rec["sources"].add("selected_direct")
1243
- if tag in implied_set:
1244
- rec["sources"].add("selected_implied")
1245
-
1246
- payload = {
1247
- "n_tags": len(info_by_tag),
1248
- "tags": [
1249
- {
1250
- "tag": tag,
1251
- "rows": rec["rows"],
1252
- "sources": sorted(rec["sources"]),
1253
- }
1254
- for tag, rec in sorted(info_by_tag.items())
1255
- ],
1256
  }
1257
  return "Display Tag Audit: " + json.dumps(payload, ensure_ascii=True)
1258
 
@@ -1313,16 +1313,16 @@ def _build_row_component_updates(
1313
  choices=choices,
1314
  value=values,
1315
  visible=visible,
1316
- )
1317
- )
1318
  else:
1319
  header_updates.append(gr.update(value="", visible=False))
1320
  checkbox_updates.append(gr.update(choices=[], value=[], visible=False))
1321
 
1322
  prompt_text = _compose_toggle_prompt_text(list(selected), row_defs_ui)
1323
  return prompt_text, row_values_state, header_updates, checkbox_updates
1324
-
1325
-
1326
  def _on_toggle_row(
1327
  row_idx: int,
1328
  changed_values: List[str],
@@ -1408,8 +1408,8 @@ def _on_toggle_row(
1408
  prompt_text,
1409
  *checkbox_updates,
1410
  ]
1411
-
1412
-
1413
  def _build_ui_payload(
1414
  *,
1415
  console_text: str,
@@ -1774,114 +1774,114 @@ def _build_selection_query(
1774
  probe_tags: List[str],
1775
  classifier_auto_tags: Optional[List[str]] = None,
1776
  ) -> str:
1777
- lines = [f"IMAGE DESCRIPTION: {prompt_in.strip()}"]
1778
- if rewritten and rewritten.strip():
1779
- lines.append(f"REWRITE PHRASES: {rewritten.strip()}")
1780
- hint_tags = []
1781
- if structural_tags:
1782
- hint_tags.extend(structural_tags)
1783
  if probe_tags:
1784
  hint_tags.extend(probe_tags)
1785
  if classifier_auto_tags:
1786
  hint_tags.extend(classifier_auto_tags)
1787
- if hint_tags:
1788
- # Keep hints as context only; selection still must choose by candidate indices.
1789
- lines.append(
1790
- "INFERRED TAG HINTS (context only): " + ", ".join(sorted(set(hint_tags)))
1791
- )
1792
- return "\n".join(lines)
1793
-
1794
-
1795
- # Set up logging
1796
- # Minimal prod logging: warnings+ to stderr, no file by default
1797
- import os, logging
1798
-
1799
- LOG_LEVEL = os.environ.get("PSQ_LOG_LEVEL", "WARNING").upper()
1800
- logging.basicConfig(
1801
- level=getattr(logging, LOG_LEVEL, logging.WARNING),
1802
- format="%(asctime)s %(levelname)s:%(message)s",
1803
- handlers=[logging.StreamHandler()] # no file -> avoids huge logs on Spaces
1804
- )
1805
-
1806
- # Quiet down common noisy libs (optional)
1807
- for _name in ("gensim", "gradio", "hnswlib", "httpx", "uvicorn"):
1808
- logging.getLogger(_name).setLevel(logging.ERROR)
1809
-
1810
- # Turn off Gradio analytics phone-home to avoid those background thread errors (optional)
1811
- os.environ["GRADIO_ANALYTICS_ENABLED"] = "0"
1812
-
1813
-
1814
- MASCOT_DIR = Path(__file__).parent / "mascotimages"
1815
- MASCOT_FILE = MASCOT_DIR / "transparentsquirrel.png"
1816
-
1817
-
1818
- def _load_mascot_image():
1819
- """Load mascot image if available; return None when missing/unreadable."""
1820
- if not MASCOT_FILE.exists():
1821
- logging.warning("Mascot image missing: %s", MASCOT_FILE)
1822
- return None
1823
- try:
1824
- return Image.open(MASCOT_FILE).convert("RGBA")
1825
- except Exception as e:
1826
- logging.warning("Failed to load mascot image (%s): %s", MASCOT_FILE, e)
1827
- return None
1828
-
1829
- try:
1830
- from gradio_client import utils as _gc_utils
1831
-
1832
- _orig_get_type = _gc_utils.get_type
1833
- _orig_j2p = _gc_utils._json_schema_to_python_type
1834
- _orig_pub = _gc_utils.json_schema_to_python_type
1835
-
1836
- def _get_type_safe(schema):
1837
- # Sometimes schema is a bare True/False (JSON Schema boolean form)
1838
- if not isinstance(schema, dict):
1839
- return "any"
1840
- return _orig_get_type(schema)
1841
-
1842
- def _j2p_safe(schema, defs=None):
1843
- # Accept non-dict schemas (True/False/None) and treat as "any"
1844
- if not isinstance(schema, dict):
1845
- return "any"
1846
- return _orig_j2p(schema, defs or schema.get("$defs"))
1847
-
1848
- def _pub_safe(schema):
1849
- # Public wrapper used by Gradio; keep it resilient too
1850
- if not isinstance(schema, dict):
1851
- return "any"
1852
- return _j2p_safe(schema, schema.get("$defs"))
1853
-
1854
- _gc_utils.get_type = _get_type_safe
1855
- _gc_utils._json_schema_to_python_type = _j2p_safe
1856
- _gc_utils.json_schema_to_python_type = _pub_safe
1857
-
1858
- except Exception as e:
1859
- print("gradio_client hotfix not applied:", e)
1860
- # -------------------------------------------------------------------------------
1861
-
1862
-
1863
- allow_nsfw_tags = False
1864
- def _is_production_runtime() -> bool:
1865
- """Best-effort detection for deployed runtime (HF Spaces or explicit env)."""
1866
- if os.environ.get("PSQ_PRODUCTION", "").strip().lower() in {"1", "true", "yes"}:
1867
- return True
1868
- if os.environ.get("SPACE_ID"):
1869
- return True
1870
- if os.environ.get("HF_SPACE_ID"):
1871
- return True
1872
- if os.environ.get("SYSTEM") == "spaces":
1873
- return True
1874
- return False
1875
-
1876
-
1877
- verbose_retrieval_default = "0" if _is_production_runtime() else "1"
1878
  verbose_retrieval = os.environ.get("PSQ_VERBOSE_RETRIEVAL", verbose_retrieval_default).strip().lower() in {"1", "true", "yes"}
1879
  verbose_retrieval_all = False
1880
  verbose_retrieval_limit = 20
1881
  display_top_groups_default = int(os.environ.get("PSQ_DISPLAY_TOP_GROUPS", "10"))
1882
  display_top_tags_per_group_default = int(os.environ.get("PSQ_DISPLAY_TOP_TAGS_PER_GROUP", "7"))
1883
  display_rank_top_k_default = int(os.environ.get("PSQ_DISPLAY_GROUP_RANK_TOP_K", "7"))
1884
- display_max_rows_default = int(os.environ.get("PSQ_DISPLAY_MAX_ROWS", "14"))
1885
  retrieval_global_k = int(os.environ.get("PSQ_RETRIEVAL_GLOBAL_K", "300"))
1886
  retrieval_per_phrase_k = int(os.environ.get("PSQ_RETRIEVAL_PER_PHRASE_K", "10"))
1887
  retrieval_per_phrase_final_k = int(os.environ.get("PSQ_RETRIEVAL_PER_PHRASE_FINAL_K", "1"))
@@ -1919,28 +1919,28 @@ _startup_profile_mark(
1919
  "startup_preflight.done",
1920
  error_count=len(STARTUP_PREFLIGHT_ERRORS),
1921
  )
1922
-
1923
  css = """
1924
- .scrollable-content{
1925
- max-height: 420px;
1926
- overflow-y: scroll; /* always show scrollbar */
1927
- overflow-x: hidden;
1928
- padding-right: 8px;
1929
- padding-bottom: 14px; /* <— add this */
1930
- scrollbar-gutter: stable; /* prevent layout shift as it fills */
1931
-
1932
- /* Firefox */
1933
- scrollbar-width: auto;
1934
- scrollbar-color: rgba(180,180,180,.9) rgba(0,0,0,.15);
1935
- }
1936
-
1937
- /* WebKit/Chromium (Chrome/Edge/Safari) */
1938
- .scrollable-content::-webkit-scrollbar{ width: 10px; }
1939
- .scrollable-content::-webkit-scrollbar-thumb{ background: rgba(180,180,180,.9); border-radius: 8px; }
1940
- .scrollable-content::-webkit-scrollbar-track{ background: rgba(0,0,0,.15); }
1941
-
1942
- /* (Optional) make both scroll panes taller so they fill more of the column */
1943
- .pane-left .scrollable-content,
1944
  .pane-right .scrollable-content {
1945
  max-height: 610px; /* was 420px; tweak to taste */
1946
  }
@@ -2765,28 +2765,28 @@ def rag_pipeline_ui(
2765
 
2766
  def _record_timing(stage: str, dt_s: float):
2767
  stage_timings[stage] = float(dt_s)
2768
-
2769
- def _emit_timing_summary(total_s: float):
2770
- summary_order = [
2771
  "preprocess",
2772
  "rewrite",
2773
  "structural",
2774
  "classifier",
2775
  "retrieval",
2776
- "selection",
2777
- "implication_expansion",
2778
- "prompt_composition",
2779
- "group_display",
2780
- ]
2781
- lines = []
2782
- for k in summary_order:
2783
- if k in stage_timings:
2784
- lines.append(f"{k}={stage_timings[k]:.2f}s")
2785
- slowest = max(stage_timings.items(), key=lambda kv: kv[1])[0] if stage_timings else "n/a"
2786
- log("Timing Summary: " + ", ".join(lines))
2787
- log(f"Timing Slowest Stage: {slowest}")
2788
- log(f"Timing Total: {total_s:.2f}s")
2789
-
2790
  def _append_timing_jsonl(total_s: float):
2791
  try:
2792
  timing_log_path.parent.mkdir(parents=True, exist_ok=True)
@@ -2805,12 +2805,12 @@ def rag_pipeline_ui(
2805
  "timeout_select_s": stage3_select_timeout_s,
2806
  },
2807
  }
2808
- with timing_log_path.open("a", encoding="utf-8") as f:
2809
- f.write(json.dumps(rec, ensure_ascii=True) + "\n")
2810
- log(f"Timing Log: wrote {timing_log_path}")
2811
  except Exception as e:
2812
  log(f"Timing Log: failed ({type(e).__name__}: {_redact_console_error_text(e)})")
2813
-
2814
  def _future_with_timeout(
2815
  fut,
2816
  timeout_s: float,
@@ -2856,7 +2856,7 @@ def rag_pipeline_ui(
2856
  raise RuntimeError(msg)
2857
  log(f"{msg}; using fallback")
2858
  return fallback
2859
-
2860
  t_total0 = time.perf_counter()
2861
  log("Start: received prompt")
2862
  if STARTUP_PREFLIGHT_ERRORS:
@@ -2883,7 +2883,7 @@ def rag_pipeline_ui(
2883
  suggested_prompt_text='Enter a prompt and click "Run".',
2884
  )
2885
  return
2886
-
2887
  log("Input:")
2888
  log(prompt_in)
2889
  log("")
@@ -2997,7 +2997,7 @@ def rag_pipeline_ui(
2997
  f"{', '.join(removed_exact_excluded)}"
2998
  )
2999
  log("")
3000
-
3001
  rewrite_prefilled = (rewrite_override or "").strip()
3002
  if rewrite_prefilled:
3003
  log("Step 1: structural + classifier inference (rewrite already prepared)")
@@ -3117,9 +3117,9 @@ def rag_pipeline_ui(
3117
  if retrieval_query_hints:
3118
  # keep them separate in logs, but allow them to help retrieval
3119
  rewrite_for_retrieval = (rewrite_for_retrieval + ", " + ", ".join(retrieval_query_hints)).strip(", ").strip()
3120
-
3121
-
3122
- log("Step 2: Prompt Squirrel retrieval (hidden)")
3123
  try:
3124
  t0 = time.perf_counter()
3125
  retrieval_context_tags = list(dict.fromkeys((structural_tags or []) + (probe_tags or [])))
@@ -3181,42 +3181,42 @@ def rag_pipeline_ui(
3181
  _record_timing("retrieval", dt)
3182
  log(f"Retrieval: {dt:.2f}s")
3183
  log(f"Retrieved {len(candidates)} candidate tags")
3184
- if verbose_retrieval:
3185
- log(f"Total unique candidates: {len(candidates)}")
3186
- limit = None if verbose_retrieval_all else max(1, int(verbose_retrieval_limit))
3187
- for report in phrase_reports:
3188
- phrase = report.get("normalized") or report.get("phrase") or ""
3189
- lookup = report.get("lookup") or ""
3190
- tfidf_vocab = report.get("tfidf_vocab")
3191
- log(f"Phrase: {phrase} (lookup={lookup}) tfidf_vocab={tfidf_vocab}")
3192
- rows = report.get("candidates", [])
3193
- shown = rows if limit is None else rows[:limit]
3194
- for row in shown:
3195
- tag = row.get("tag")
3196
- alias_token = row.get("alias_token")
3197
- score_fasttext = row.get("score_fasttext")
3198
- score_context = row.get("score_context")
3199
- score_combined = row.get("score_combined")
3200
- count = row.get("count")
3201
- alias_part = ""
3202
- if alias_token and alias_token != tag:
3203
- alias_part = f" [alias_token={alias_token}]"
3204
- fasttext_str = (
3205
- f"{score_fasttext:.3f}" if isinstance(score_fasttext, (int, float)) else score_fasttext
3206
- )
3207
- if score_context is None:
3208
- context_str = "None"
3209
- else:
3210
- context_str = (
3211
- f"{score_context:.3f}" if isinstance(score_context, (int, float)) else score_context
3212
- )
3213
- combined_str = (
3214
- f"{score_combined:.3f}" if isinstance(score_combined, (int, float)) else score_combined
3215
- )
3216
- log(
3217
- f" {tag}{alias_part} | fasttext={fasttext_str} context={context_str} "
3218
- f"combined={combined_str} count={count}"
3219
- )
3220
  if limit is not None and len(rows) > limit:
3221
  log(f" ... ({len(rows) - limit} more)")
3222
  except Exception as e:
@@ -3301,16 +3301,16 @@ def rag_pipeline_ui(
3301
  f"(<{min_tag_count}): {', '.join(removed_stage3_low)}"
3302
  )
3303
  selected_tags = list(selection_selected_tags)
3304
-
3305
- if structural_tags:
3306
- # Add structural tags that aren't already selected
3307
- existing = {t for t in selected_tags}
3308
- new_structural = [t for t in structural_tags if t not in existing]
3309
- selected_tags.extend(new_structural)
3310
- log(f" Added {len(new_structural)} structural tags: {', '.join(new_structural)}")
3311
- else:
3312
- log(" No structural tags inferred")
3313
-
3314
  if probe_tags:
3315
  existing = {t for t in selected_tags}
3316
  new_probe = [t for t in probe_tags if t not in existing]
@@ -3335,9 +3335,9 @@ def rag_pipeline_ui(
3335
  log(" No high-confidence classifier tags")
3336
 
3337
  selected_tags, removed_excluded_direct = _filter_excluded_recommendation_tags(selected_tags)
3338
- if removed_excluded_direct:
3339
- log(f" Removed {len(removed_excluded_direct)} excluded tags: {', '.join(removed_excluded_direct)}")
3340
-
3341
  direct_selected_tags = list(dict.fromkeys(selected_tags))
3342
 
3343
  status_states["reranker"] = {
@@ -3349,12 +3349,12 @@ def rag_pipeline_ui(
3349
  yield _progress_payload()
3350
 
3351
  log("Step 3c: Expand via tag implications")
3352
- t0 = time.perf_counter()
3353
- tag_set = set(selected_tags)
3354
- expanded, implied_only = expand_tags_via_implications(tag_set)
3355
- dt = time.perf_counter()-t0
3356
- _record_timing("implication_expansion", dt)
3357
- log(f"Implication expansion: {dt:.2f}s")
3358
  implied_selected_tags = sorted(implied_only) if implied_only else []
3359
  if implied_only:
3360
  implied_added = sorted(implied_only)
@@ -3370,24 +3370,24 @@ def rag_pipeline_ui(
3370
  )
3371
  else:
3372
  log(" No additional implied tags")
3373
-
3374
- selected_tags, removed_excluded_implied = _filter_excluded_recommendation_tags(selected_tags)
3375
- implied_selected_tags = [
3376
- t for t in implied_selected_tags if not _is_excluded_recommendation_tag(t)
3377
- ]
3378
- if removed_excluded_implied:
3379
- log(
3380
- f" Removed {len(removed_excluded_implied)} excluded tags after implications: "
3381
- f"{', '.join(removed_excluded_implied)}"
3382
- )
3383
-
3384
- log("Step 4: Compose final prompt")
3385
- t0 = time.perf_counter()
3386
- final_prompt = compose_final_prompt(rewritten, selected_tags)
3387
- dt = time.perf_counter()-t0
3388
- _record_timing("prompt_composition", dt)
3389
- log(f"Prompt composition: {dt:.2f}s")
3390
-
3391
  log("Step 5: Build ranked group/category display")
3392
  t0 = time.perf_counter()
3393
  seed_terms = []
@@ -3398,7 +3398,7 @@ def rag_pipeline_ui(
3398
  seed_terms.extend(classifier_auto_tags or [])
3399
  seed_terms.extend(classifier_candidate_tags or [])
3400
  seed_terms.extend(selected_tags)
3401
- seed_terms = list(dict.fromkeys(seed_terms))
3402
 
3403
  active_selected_tags = list(dict.fromkeys(selected_tags))
3404
  structural_set = {_norm_tag_for_lookup(t) for t in (structural_tags or []) if t}
@@ -3514,8 +3514,8 @@ def rag_pipeline_ui(
3514
  suggested_prompt_text=_format_user_facing_error(e),
3515
  )
3516
  return
3517
-
3518
-
3519
  _startup_profile_mark("ui.blocks_build_begin")
3520
  with gr.Blocks(css=css, js=client_js) as app:
3521
  with gr.Row():
@@ -3615,21 +3615,21 @@ with gr.Blocks(css=css, js=client_js) as app:
3615
  visible=False,
3616
  interactive=False,
3617
  )
3618
-
3619
- with gr.Accordion("Display Settings", open=False):
3620
- with gr.Row():
3621
- display_top_groups = gr.Number(
3622
- value=display_top_groups_default,
3623
- precision=0,
3624
- label="Rows (Top Groups/Categories)",
3625
- minimum=1,
3626
- )
3627
- display_top_tags_per_group = gr.Number(
3628
- value=display_top_tags_per_group_default,
3629
- precision=0,
3630
- label="Top Tags Shown Per Row",
3631
- minimum=1,
3632
- )
3633
  display_rank_top_k = gr.Number(
3634
  value=display_rank_top_k_default,
3635
  precision=0,
@@ -3710,7 +3710,7 @@ with gr.Blocks(css=css, js=client_js) as app:
3710
  *row_checkboxes,
3711
  ]
3712
  run_outputs_with_rewrite = [*run_outputs, rewrite_state]
3713
-
3714
  image_tags.change(
3715
  _update_run_button_visibility,
3716
  inputs=[image_tags, last_run_prompt_state],
@@ -3785,7 +3785,7 @@ with gr.Blocks(css=css, js=client_js) as app:
3785
  show_progress="minimal",
3786
  show_progress_on=[mascot_img],
3787
  )
3788
-
3789
  for idx, row_cb in enumerate(row_checkboxes):
3790
  row_cb.change(
3791
  fn=lambda changed_values, selected_state, rows_dirty, row_defs, row_values, i=idx: _on_toggle_row(
 
147
  # Common kink/fetish markers.
148
  re.compile(r"(^|_)(fetish|bdsm|bondage|dominatrix|submission|vore|inflation|watersports)(_|$)", re.IGNORECASE),
149
  ]
150
+
151
+
152
  def _split_prompt_commas(s: str) -> List[str]:
153
  return [p.strip() for p in (s or "").split(",") if p.strip()]
154
 
 
213
  log("Rewrite source=t5 returned empty; fallback to llm")
214
  return llm_rewrite_prompt(prompt_in, log)
215
  return ""
216
+
217
+ def compose_final_prompt(rewritten_prompt: str, selected_tags: List[str]) -> str:
218
+ parts = _split_prompt_commas(rewritten_prompt)
219
+ parts.extend(selected_tags)
220
+
221
+ seen = set()
222
+ out = []
223
+ for p in parts:
224
+ key = _norm_for_dedupe(p)
225
+ if key in seen:
226
+ continue
227
+ seen.add(key)
228
+ out.append(p)
229
+
230
+ return ", ".join(out)
231
+
232
+
233
  def _display_tag_text(tag: str) -> str:
234
  return tag.replace("_", " ")
235
 
 
569
 
570
 
571
  def _escape_prompt_tag(tag: str) -> str:
572
+ return (
573
+ tag.replace("_", " ")
574
+ .replace("(", "\\(")
575
+ .replace(")", "\\)")
576
+ )
577
+
578
+
579
  def _ordered_selected_for_prompt(selected: Set[str], row_defs: List[Dict[str, Any]]) -> List[str]:
580
  out: List[str] = []
581
  seen: Set[str] = set()
 
585
  out.append(tag)
586
  seen.add(tag)
587
  return out
588
+
589
+
590
+ def _compose_toggle_prompt_text(selected_tags: List[str], row_defs: List[Dict[str, Any]]) -> str:
591
+ selected = {t for t in (selected_tags or []) if t}
592
+ ordered = _ordered_selected_for_prompt(selected, row_defs or [])
593
+ return ", ".join(_escape_prompt_tag(t) for t in ordered)
594
+
595
+
596
+ def _is_artist_tag(tag: str) -> bool:
597
+ t = _norm_tag_for_lookup(str(tag))
598
+ if not t:
599
+ return False
600
+ # Keep a resilient fallback for malformed/missing tag typing metadata.
601
+ return get_tag_type_name(t) == "artist" or t.startswith("by_")
602
+
603
+
604
  @lru_cache(maxsize=1)
605
  def _load_excluded_recommendation_tags() -> Set[str]:
606
  out: Set[str] = set()
 
686
  seen.add(t)
687
  keep.append(t)
688
  return keep, sorted(set(removed))
689
+
690
+
691
  def _filter_excluded_recommendation_tags(tags: List[str]) -> Tuple[List[str], List[str]]:
692
+ excluded = _load_excluded_recommendation_tags()
693
+ if not excluded:
694
+ return list(dict.fromkeys(_norm_tag_for_lookup(t) for t in (tags or []) if t)), []
695
+
696
+ keep: List[str] = []
697
+ removed: List[str] = []
698
+ seen: Set[str] = set()
699
+ for raw in (tags or []):
700
+ t = _norm_tag_for_lookup(str(raw))
701
+ if not t:
702
+ continue
703
+ if t in excluded:
704
+ removed.append(t)
705
+ continue
706
+ if t in seen:
707
+ continue
708
+ seen.add(t)
709
+ keep.append(t)
710
  return keep, sorted(set(removed))
711
 
712
 
 
1044
  top_tags_per_group: int,
1045
  group_rank_top_k: int,
1046
  ) -> List[Dict[str, Any]]:
1047
+ ranked_rows = rank_groups_from_tfidf(
1048
+ seed_terms=seed_terms,
1049
+ top_groups=max(1, int(top_groups)),
1050
+ top_tags_per_group=max(1, int(top_tags_per_group)),
1051
+ group_rank_top_k=max(1, int(group_rank_top_k)),
1052
+ )
1053
  groups_map = _load_enabled_groups()
1054
  selected_active = list(
1055
  dict.fromkeys(
 
1085
  tags_in_any_displayed_group: Set[str] = set()
1086
  for tag_set in displayed_group_tag_sets.values():
1087
  tags_in_any_displayed_group.update(tag_set)
1088
+
1089
  retrieved_uncategorized_ranked = list(
1090
  dict.fromkeys(
1091
  _norm_tag_for_lookup(t)
 
1198
  row_defs.append(retrieved_other_row)
1199
 
1200
  return row_defs
1201
+
1202
+
1203
  def _build_display_audit_line(
1204
+ row_defs: List[Dict[str, Any]],
1205
+ *,
1206
+ active_selected_tags: List[str],
1207
+ direct_selected_tags: List[str],
1208
+ implied_selected_tags: List[str],
1209
+ ) -> str:
1210
+ active_set = {
1211
+ _norm_tag_for_lookup(t)
1212
+ for t in (active_selected_tags or [])
1213
+ if t and not _is_artist_tag(t)
1214
+ }
1215
+ direct_set = {
1216
+ _norm_tag_for_lookup(t)
1217
+ for t in (direct_selected_tags or [])
1218
+ if t and not _is_artist_tag(t)
1219
+ }
1220
+ implied_set = {
1221
+ _norm_tag_for_lookup(t)
1222
+ for t in (implied_selected_tags or [])
1223
+ if t and not _is_artist_tag(t)
1224
+ }
1225
+ info_by_tag: Dict[str, Dict[str, Any]] = {}
1226
+
1227
+ for row in row_defs or []:
1228
+ row_name = row.get("name", "")
1229
+ row_label = row.get("label", row_name)
1230
+ for tag in row.get("tags", []):
1231
  rec = info_by_tag.setdefault(tag, {"rows": [], "sources": set()})
1232
  rec["rows"].append(row_label)
1233
  if row_name == "selected_other":
 
1236
  rec["sources"].add("other_retrieved_row")
1237
  else:
1238
  rec["sources"].add("ranked_group_row")
1239
+ if tag in active_set:
1240
+ rec["sources"].add("selected_active")
1241
+ if tag in direct_set:
1242
+ rec["sources"].add("selected_direct")
1243
+ if tag in implied_set:
1244
+ rec["sources"].add("selected_implied")
1245
+
1246
+ payload = {
1247
+ "n_tags": len(info_by_tag),
1248
+ "tags": [
1249
+ {
1250
+ "tag": tag,
1251
+ "rows": rec["rows"],
1252
+ "sources": sorted(rec["sources"]),
1253
+ }
1254
+ for tag, rec in sorted(info_by_tag.items())
1255
+ ],
1256
  }
1257
  return "Display Tag Audit: " + json.dumps(payload, ensure_ascii=True)
1258
 
 
1313
  choices=choices,
1314
  value=values,
1315
  visible=visible,
1316
+ )
1317
+ )
1318
  else:
1319
  header_updates.append(gr.update(value="", visible=False))
1320
  checkbox_updates.append(gr.update(choices=[], value=[], visible=False))
1321
 
1322
  prompt_text = _compose_toggle_prompt_text(list(selected), row_defs_ui)
1323
  return prompt_text, row_values_state, header_updates, checkbox_updates
1324
+
1325
+
1326
  def _on_toggle_row(
1327
  row_idx: int,
1328
  changed_values: List[str],
 
1408
  prompt_text,
1409
  *checkbox_updates,
1410
  ]
1411
+
1412
+
1413
  def _build_ui_payload(
1414
  *,
1415
  console_text: str,
 
1774
  probe_tags: List[str],
1775
  classifier_auto_tags: Optional[List[str]] = None,
1776
  ) -> str:
1777
+ lines = [f"IMAGE DESCRIPTION: {prompt_in.strip()}"]
1778
+ if rewritten and rewritten.strip():
1779
+ lines.append(f"REWRITE PHRASES: {rewritten.strip()}")
1780
+ hint_tags = []
1781
+ if structural_tags:
1782
+ hint_tags.extend(structural_tags)
1783
  if probe_tags:
1784
  hint_tags.extend(probe_tags)
1785
  if classifier_auto_tags:
1786
  hint_tags.extend(classifier_auto_tags)
1787
+ if hint_tags:
1788
+ # Keep hints as context only; selection still must choose by candidate indices.
1789
+ lines.append(
1790
+ "INFERRED TAG HINTS (context only): " + ", ".join(sorted(set(hint_tags)))
1791
+ )
1792
+ return "\n".join(lines)
1793
+
1794
+
1795
+ # Set up logging
1796
+ # Minimal prod logging: warnings+ to stderr, no file by default
1797
+ import os, logging
1798
+
1799
+ LOG_LEVEL = os.environ.get("PSQ_LOG_LEVEL", "WARNING").upper()
1800
+ logging.basicConfig(
1801
+ level=getattr(logging, LOG_LEVEL, logging.WARNING),
1802
+ format="%(asctime)s %(levelname)s:%(message)s",
1803
+ handlers=[logging.StreamHandler()] # no file -> avoids huge logs on Spaces
1804
+ )
1805
+
1806
+ # Quiet down common noisy libs (optional)
1807
+ for _name in ("gensim", "gradio", "hnswlib", "httpx", "uvicorn"):
1808
+ logging.getLogger(_name).setLevel(logging.ERROR)
1809
+
1810
+ # Turn off Gradio analytics phone-home to avoid those background thread errors (optional)
1811
+ os.environ["GRADIO_ANALYTICS_ENABLED"] = "0"
1812
+
1813
+
1814
+ MASCOT_DIR = Path(__file__).parent / "mascotimages"
1815
+ MASCOT_FILE = MASCOT_DIR / "transparentsquirrel.png"
1816
+
1817
+
1818
+ def _load_mascot_image():
1819
+ """Load mascot image if available; return None when missing/unreadable."""
1820
+ if not MASCOT_FILE.exists():
1821
+ logging.warning("Mascot image missing: %s", MASCOT_FILE)
1822
+ return None
1823
+ try:
1824
+ return Image.open(MASCOT_FILE).convert("RGBA")
1825
+ except Exception as e:
1826
+ logging.warning("Failed to load mascot image (%s): %s", MASCOT_FILE, e)
1827
+ return None
1828
+
1829
+ try:
1830
+ from gradio_client import utils as _gc_utils
1831
+
1832
+ _orig_get_type = _gc_utils.get_type
1833
+ _orig_j2p = _gc_utils._json_schema_to_python_type
1834
+ _orig_pub = _gc_utils.json_schema_to_python_type
1835
+
1836
+ def _get_type_safe(schema):
1837
+ # Sometimes schema is a bare True/False (JSON Schema boolean form)
1838
+ if not isinstance(schema, dict):
1839
+ return "any"
1840
+ return _orig_get_type(schema)
1841
+
1842
+ def _j2p_safe(schema, defs=None):
1843
+ # Accept non-dict schemas (True/False/None) and treat as "any"
1844
+ if not isinstance(schema, dict):
1845
+ return "any"
1846
+ return _orig_j2p(schema, defs or schema.get("$defs"))
1847
+
1848
+ def _pub_safe(schema):
1849
+ # Public wrapper used by Gradio; keep it resilient too
1850
+ if not isinstance(schema, dict):
1851
+ return "any"
1852
+ return _j2p_safe(schema, schema.get("$defs"))
1853
+
1854
+ _gc_utils.get_type = _get_type_safe
1855
+ _gc_utils._json_schema_to_python_type = _j2p_safe
1856
+ _gc_utils.json_schema_to_python_type = _pub_safe
1857
+
1858
+ except Exception as e:
1859
+ print("gradio_client hotfix not applied:", e)
1860
+ # -------------------------------------------------------------------------------
1861
+
1862
+
1863
+ allow_nsfw_tags = False
1864
+ def _is_production_runtime() -> bool:
1865
+ """Best-effort detection for deployed runtime (HF Spaces or explicit env)."""
1866
+ if os.environ.get("PSQ_PRODUCTION", "").strip().lower() in {"1", "true", "yes"}:
1867
+ return True
1868
+ if os.environ.get("SPACE_ID"):
1869
+ return True
1870
+ if os.environ.get("HF_SPACE_ID"):
1871
+ return True
1872
+ if os.environ.get("SYSTEM") == "spaces":
1873
+ return True
1874
+ return False
1875
+
1876
+
1877
+ verbose_retrieval_default = "0" if _is_production_runtime() else "1"
1878
  verbose_retrieval = os.environ.get("PSQ_VERBOSE_RETRIEVAL", verbose_retrieval_default).strip().lower() in {"1", "true", "yes"}
1879
  verbose_retrieval_all = False
1880
  verbose_retrieval_limit = 20
1881
  display_top_groups_default = int(os.environ.get("PSQ_DISPLAY_TOP_GROUPS", "10"))
1882
  display_top_tags_per_group_default = int(os.environ.get("PSQ_DISPLAY_TOP_TAGS_PER_GROUP", "7"))
1883
  display_rank_top_k_default = int(os.environ.get("PSQ_DISPLAY_GROUP_RANK_TOP_K", "7"))
1884
+ display_max_rows_default = int(os.environ.get("PSQ_DISPLAY_MAX_ROWS", "14"))
1885
  retrieval_global_k = int(os.environ.get("PSQ_RETRIEVAL_GLOBAL_K", "300"))
1886
  retrieval_per_phrase_k = int(os.environ.get("PSQ_RETRIEVAL_PER_PHRASE_K", "10"))
1887
  retrieval_per_phrase_final_k = int(os.environ.get("PSQ_RETRIEVAL_PER_PHRASE_FINAL_K", "1"))
 
1919
  "startup_preflight.done",
1920
  error_count=len(STARTUP_PREFLIGHT_ERRORS),
1921
  )
1922
+
1923
  css = """
1924
+ .scrollable-content{
1925
+ max-height: 420px;
1926
+ overflow-y: scroll; /* always show scrollbar */
1927
+ overflow-x: hidden;
1928
+ padding-right: 8px;
1929
+ padding-bottom: 14px; /* <— add this */
1930
+ scrollbar-gutter: stable; /* prevent layout shift as it fills */
1931
+
1932
+ /* Firefox */
1933
+ scrollbar-width: auto;
1934
+ scrollbar-color: rgba(180,180,180,.9) rgba(0,0,0,.15);
1935
+ }
1936
+
1937
+ /* WebKit/Chromium (Chrome/Edge/Safari) */
1938
+ .scrollable-content::-webkit-scrollbar{ width: 10px; }
1939
+ .scrollable-content::-webkit-scrollbar-thumb{ background: rgba(180,180,180,.9); border-radius: 8px; }
1940
+ .scrollable-content::-webkit-scrollbar-track{ background: rgba(0,0,0,.15); }
1941
+
1942
+ /* (Optional) make both scroll panes taller so they fill more of the column */
1943
+ .pane-left .scrollable-content,
1944
  .pane-right .scrollable-content {
1945
  max-height: 610px; /* was 420px; tweak to taste */
1946
  }
 
2765
 
2766
  def _record_timing(stage: str, dt_s: float):
2767
  stage_timings[stage] = float(dt_s)
2768
+
2769
+ def _emit_timing_summary(total_s: float):
2770
+ summary_order = [
2771
  "preprocess",
2772
  "rewrite",
2773
  "structural",
2774
  "classifier",
2775
  "retrieval",
2776
+ "selection",
2777
+ "implication_expansion",
2778
+ "prompt_composition",
2779
+ "group_display",
2780
+ ]
2781
+ lines = []
2782
+ for k in summary_order:
2783
+ if k in stage_timings:
2784
+ lines.append(f"{k}={stage_timings[k]:.2f}s")
2785
+ slowest = max(stage_timings.items(), key=lambda kv: kv[1])[0] if stage_timings else "n/a"
2786
+ log("Timing Summary: " + ", ".join(lines))
2787
+ log(f"Timing Slowest Stage: {slowest}")
2788
+ log(f"Timing Total: {total_s:.2f}s")
2789
+
2790
  def _append_timing_jsonl(total_s: float):
2791
  try:
2792
  timing_log_path.parent.mkdir(parents=True, exist_ok=True)
 
2805
  "timeout_select_s": stage3_select_timeout_s,
2806
  },
2807
  }
2808
+ with timing_log_path.open("a", encoding="utf-8") as f:
2809
+ f.write(json.dumps(rec, ensure_ascii=True) + "\n")
2810
+ log(f"Timing Log: wrote {timing_log_path}")
2811
  except Exception as e:
2812
  log(f"Timing Log: failed ({type(e).__name__}: {_redact_console_error_text(e)})")
2813
+
2814
  def _future_with_timeout(
2815
  fut,
2816
  timeout_s: float,
 
2856
  raise RuntimeError(msg)
2857
  log(f"{msg}; using fallback")
2858
  return fallback
2859
+
2860
  t_total0 = time.perf_counter()
2861
  log("Start: received prompt")
2862
  if STARTUP_PREFLIGHT_ERRORS:
 
2883
  suggested_prompt_text='Enter a prompt and click "Run".',
2884
  )
2885
  return
2886
+
2887
  log("Input:")
2888
  log(prompt_in)
2889
  log("")
 
2997
  f"{', '.join(removed_exact_excluded)}"
2998
  )
2999
  log("")
3000
+
3001
  rewrite_prefilled = (rewrite_override or "").strip()
3002
  if rewrite_prefilled:
3003
  log("Step 1: structural + classifier inference (rewrite already prepared)")
 
3117
  if retrieval_query_hints:
3118
  # keep them separate in logs, but allow them to help retrieval
3119
  rewrite_for_retrieval = (rewrite_for_retrieval + ", " + ", ".join(retrieval_query_hints)).strip(", ").strip()
3120
+
3121
+
3122
+ log("Step 2: Prompt Squirrel retrieval (hidden)")
3123
  try:
3124
  t0 = time.perf_counter()
3125
  retrieval_context_tags = list(dict.fromkeys((structural_tags or []) + (probe_tags or [])))
 
3181
  _record_timing("retrieval", dt)
3182
  log(f"Retrieval: {dt:.2f}s")
3183
  log(f"Retrieved {len(candidates)} candidate tags")
3184
+ if verbose_retrieval:
3185
+ log(f"Total unique candidates: {len(candidates)}")
3186
+ limit = None if verbose_retrieval_all else max(1, int(verbose_retrieval_limit))
3187
+ for report in phrase_reports:
3188
+ phrase = report.get("normalized") or report.get("phrase") or ""
3189
+ lookup = report.get("lookup") or ""
3190
+ tfidf_vocab = report.get("tfidf_vocab")
3191
+ log(f"Phrase: {phrase} (lookup={lookup}) tfidf_vocab={tfidf_vocab}")
3192
+ rows = report.get("candidates", [])
3193
+ shown = rows if limit is None else rows[:limit]
3194
+ for row in shown:
3195
+ tag = row.get("tag")
3196
+ alias_token = row.get("alias_token")
3197
+ score_fasttext = row.get("score_fasttext")
3198
+ score_context = row.get("score_context")
3199
+ score_combined = row.get("score_combined")
3200
+ count = row.get("count")
3201
+ alias_part = ""
3202
+ if alias_token and alias_token != tag:
3203
+ alias_part = f" [alias_token={alias_token}]"
3204
+ fasttext_str = (
3205
+ f"{score_fasttext:.3f}" if isinstance(score_fasttext, (int, float)) else score_fasttext
3206
+ )
3207
+ if score_context is None:
3208
+ context_str = "None"
3209
+ else:
3210
+ context_str = (
3211
+ f"{score_context:.3f}" if isinstance(score_context, (int, float)) else score_context
3212
+ )
3213
+ combined_str = (
3214
+ f"{score_combined:.3f}" if isinstance(score_combined, (int, float)) else score_combined
3215
+ )
3216
+ log(
3217
+ f" {tag}{alias_part} | fasttext={fasttext_str} context={context_str} "
3218
+ f"combined={combined_str} count={count}"
3219
+ )
3220
  if limit is not None and len(rows) > limit:
3221
  log(f" ... ({len(rows) - limit} more)")
3222
  except Exception as e:
 
3301
  f"(<{min_tag_count}): {', '.join(removed_stage3_low)}"
3302
  )
3303
  selected_tags = list(selection_selected_tags)
3304
+
3305
+ if structural_tags:
3306
+ # Add structural tags that aren't already selected
3307
+ existing = {t for t in selected_tags}
3308
+ new_structural = [t for t in structural_tags if t not in existing]
3309
+ selected_tags.extend(new_structural)
3310
+ log(f" Added {len(new_structural)} structural tags: {', '.join(new_structural)}")
3311
+ else:
3312
+ log(" No structural tags inferred")
3313
+
3314
  if probe_tags:
3315
  existing = {t for t in selected_tags}
3316
  new_probe = [t for t in probe_tags if t not in existing]
 
3335
  log(" No high-confidence classifier tags")
3336
 
3337
  selected_tags, removed_excluded_direct = _filter_excluded_recommendation_tags(selected_tags)
3338
+ if removed_excluded_direct:
3339
+ log(f" Removed {len(removed_excluded_direct)} excluded tags: {', '.join(removed_excluded_direct)}")
3340
+
3341
  direct_selected_tags = list(dict.fromkeys(selected_tags))
3342
 
3343
  status_states["reranker"] = {
 
3349
  yield _progress_payload()
3350
 
3351
  log("Step 3c: Expand via tag implications")
3352
+ t0 = time.perf_counter()
3353
+ tag_set = set(selected_tags)
3354
+ expanded, implied_only = expand_tags_via_implications(tag_set)
3355
+ dt = time.perf_counter()-t0
3356
+ _record_timing("implication_expansion", dt)
3357
+ log(f"Implication expansion: {dt:.2f}s")
3358
  implied_selected_tags = sorted(implied_only) if implied_only else []
3359
  if implied_only:
3360
  implied_added = sorted(implied_only)
 
3370
  )
3371
  else:
3372
  log(" No additional implied tags")
3373
+
3374
+ selected_tags, removed_excluded_implied = _filter_excluded_recommendation_tags(selected_tags)
3375
+ implied_selected_tags = [
3376
+ t for t in implied_selected_tags if not _is_excluded_recommendation_tag(t)
3377
+ ]
3378
+ if removed_excluded_implied:
3379
+ log(
3380
+ f" Removed {len(removed_excluded_implied)} excluded tags after implications: "
3381
+ f"{', '.join(removed_excluded_implied)}"
3382
+ )
3383
+
3384
+ log("Step 4: Compose final prompt")
3385
+ t0 = time.perf_counter()
3386
+ final_prompt = compose_final_prompt(rewritten, selected_tags)
3387
+ dt = time.perf_counter()-t0
3388
+ _record_timing("prompt_composition", dt)
3389
+ log(f"Prompt composition: {dt:.2f}s")
3390
+
3391
  log("Step 5: Build ranked group/category display")
3392
  t0 = time.perf_counter()
3393
  seed_terms = []
 
3398
  seed_terms.extend(classifier_auto_tags or [])
3399
  seed_terms.extend(classifier_candidate_tags or [])
3400
  seed_terms.extend(selected_tags)
3401
+ seed_terms = list(dict.fromkeys(seed_terms))
3402
 
3403
  active_selected_tags = list(dict.fromkeys(selected_tags))
3404
  structural_set = {_norm_tag_for_lookup(t) for t in (structural_tags or []) if t}
 
3514
  suggested_prompt_text=_format_user_facing_error(e),
3515
  )
3516
  return
3517
+
3518
+
3519
  _startup_profile_mark("ui.blocks_build_begin")
3520
  with gr.Blocks(css=css, js=client_js) as app:
3521
  with gr.Row():
 
3615
  visible=False,
3616
  interactive=False,
3617
  )
3618
+
3619
+ with gr.Accordion("Display Settings", open=False):
3620
+ with gr.Row():
3621
+ display_top_groups = gr.Number(
3622
+ value=display_top_groups_default,
3623
+ precision=0,
3624
+ label="Rows (Top Groups/Categories)",
3625
+ minimum=1,
3626
+ )
3627
+ display_top_tags_per_group = gr.Number(
3628
+ value=display_top_tags_per_group_default,
3629
+ precision=0,
3630
+ label="Top Tags Shown Per Row",
3631
+ minimum=1,
3632
+ )
3633
  display_rank_top_k = gr.Number(
3634
  value=display_rank_top_k_default,
3635
  precision=0,
 
3710
  *row_checkboxes,
3711
  ]
3712
  run_outputs_with_rewrite = [*run_outputs, rewrite_state]
3713
+
3714
  image_tags.change(
3715
  _update_run_button_visibility,
3716
  inputs=[image_tags, last_run_prompt_state],
 
3785
  show_progress="minimal",
3786
  show_progress_on=[mascot_img],
3787
  )
3788
+
3789
  for idx, row_cb in enumerate(row_checkboxes):
3790
  row_cb.change(
3791
  fn=lambda changed_values, selected_state, rows_dirty, row_defs, row_values, i=idx: _on_toggle_row(
models/finetune/tag-classifier-modernbert-full/classifier_precision_thresholds_calibrated.csv ADDED
@@ -0,0 +1,131 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ tag,target_precision,threshold,val_gold_n,val_pred_n,val_tp,val_precision,val_recall,test_gold_n,test_pred_n,test_tp,test_fp,test_fn,test_precision,test_recall,test_f1
2
+ solo,0.95,0.61279296875,1842,1784,1695,0.9501121076233184,0.9201954397394136,1785,1768,1649,119,136,0.9326923076923077,0.9238095238095239,0.9282296650717704
3
+ solo,0.9,0.1419677734375,1842,2010,1809,0.9,0.9820846905537459,1785,2009,1746,263,39,0.8690890990542558,0.9781512605042016,0.9204006325777543
4
+ solo,0.8,0.056976318359375,1842,2292,1834,0.800174520069808,0.995656894679696,1785,2269,1770,499,15,0.7800793301013662,0.9915966386554622,0.8732116428219043
5
+ solo,0.5,0.0022430419921875,1842,3000,1842,0.614,1.0,1785,2993,1785,1208,0,0.5963915803541597,1.0,0.7471745500209293
6
+ solo,0.2,0.0022430419921875,1842,3000,1842,0.614,1.0,1785,2993,1785,1208,0,0.5963915803541597,1.0,0.7471745500209293
7
+ anthro,0.95,0.81591796875,1968,1010,960,0.9504950495049505,0.4878048780487805,1926,997,944,53,982,0.9468405215646941,0.490134994807892,0.6459117345193295
8
+ anthro,0.9,0.47412109375,1968,1873,1686,0.9001601708489055,0.8567073170731707,1926,1811,1607,204,319,0.8873550524572059,0.8343717549325026,0.8600481669788601
9
+ anthro,0.8,0.1680908203125,1968,2372,1898,0.8001686340640809,0.9644308943089431,1926,2360,1856,504,70,0.7864406779661017,0.9636552440290758,0.8660755949603359
10
+ anthro,0.5,0.0045928955078125,1968,3000,1968,0.656,1.0,1926,3000,1926,1074,0,0.642,1.0,0.781973203410475
11
+ anthro,0.2,0.0045928955078125,1968,3000,1968,0.656,1.0,1926,3000,1926,1074,0,0.642,1.0,0.781973203410475
12
+ mammal,0.95,0.46044921875,2200,2070,1967,0.9502415458937198,0.894090909090909,2222,2064,1973,91,249,0.9559108527131783,0.8879387938793879,0.9206719552029864
13
+ mammal,0.9,0.1807861328125,2200,2355,2120,0.9002123142250531,0.9636363636363636,2222,2368,2120,248,102,0.8952702702702703,0.9540954095409541,0.9237472766884531
14
+ mammal,0.8,0.033966064453125,2200,2727,2183,0.8005133846718006,0.9922727272727273,2222,2741,2210,531,12,0.8062750820868296,0.9945994599459946,0.8905903687285917
15
+ mammal,0.5,0.0003554821014404297,2200,3000,2200,0.7333333333333333,1.0,2222,3000,2222,778,0,0.7406666666666667,1.0,0.8510149368058215
16
+ mammal,0.2,0.0003554821014404297,2200,3000,2200,0.7333333333333333,1.0,2222,3000,2222,778,0,0.7406666666666667,1.0,0.8510149368058215
17
+ clothing,0.95,0.9404296875,1774,224,213,0.9508928571428571,0.12006764374295378,1730,195,187,8,1543,0.958974358974359,0.10809248554913295,0.1942857142857143
18
+ clothing,0.9,0.76953125,1774,1064,958,0.900375939849624,0.5400225479143179,1730,999,910,89,820,0.9109109109109109,0.5260115606936416,0.6669109563942837
19
+ clothing,0.8,0.298095703125,1774,2082,1666,0.8001921229586936,0.939120631341601,1730,2065,1614,451,116,0.7815980629539951,0.9329479768786128,0.850592885375494
20
+ clothing,0.5,0.0038394927978515625,1774,3000,1774,0.5913333333333334,1.0,1730,2997,1730,1267,0,0.5772439105772439,1.0,0.7319653056907128
21
+ clothing,0.2,0.0038394927978515625,1774,3000,1774,0.5913333333333334,1.0,1730,2997,1730,1267,0,0.5772439105772439,1.0,0.7319653056907128
22
+ clothed,0.95,,1001,0,0,,,997,0,0,0,997,0.0,0.0,0.0
23
+ clothed,0.9,,1001,0,0,,,997,0,0,0,997,0.0,0.0,0.0
24
+ clothed,0.8,,1001,0,0,,,997,0,0,0,997,0.0,0.0,0.0
25
+ clothed,0.5,0.429931640625,1001,1760,880,0.5,0.8791208791208791,997,1691,860,831,137,0.5085748078060319,0.8625877632898696,0.6398809523809523
26
+ clothed,0.2,0.006511688232421875,1001,3000,1001,0.33366666666666667,1.0,997,3000,997,2003,0,0.3323333333333333,1.0,0.4988741556167125
27
+ fur,0.95,0.908203125,1270,67,64,0.9552238805970149,0.050393700787401574,1250,70,62,8,1188,0.8857142857142857,0.0496,0.09393939393939393
28
+ fur,0.9,0.89111328125,1270,101,91,0.900990099009901,0.07165354330708662,1250,108,97,11,1153,0.8981481481481481,0.0776,0.14285714285714285
29
+ fur,0.8,0.8017578125,1270,370,296,0.8,0.23307086614173228,1250,376,316,60,934,0.8404255319148937,0.2528,0.3886838868388684
30
+ fur,0.5,0.159423828125,1270,2506,1253,0.5,0.9866141732283464,1250,2452,1224,1228,26,0.499184339314845,0.9792,0.6612641815235007
31
+ fur,0.2,0.01078033447265625,1270,3000,1270,0.42333333333333334,1.0,1250,2998,1250,1748,0,0.41694462975316876,1.0,0.588512241054614
32
+ hair,0.95,0.9326171875,1148,63,60,0.9523809523809523,0.05226480836236934,1169,72,65,7,1104,0.9027777777777778,0.055603079555175364,0.10475423045930701
33
+ hair,0.9,0.8955078125,1148,171,154,0.9005847953216374,0.13414634146341464,1169,187,161,26,1008,0.8609625668449198,0.1377245508982036,0.23746312684365783
34
+ hair,0.8,0.79931640625,1148,526,421,0.8003802281368821,0.3667247386759582,1169,529,434,95,735,0.8204158790170132,0.3712574850299401,0.5111896348645466
35
+ hair,0.5,0.2115478515625,1148,2206,1103,0.5,0.960801393728223,1169,2185,1117,1068,52,0.5112128146453089,0.9555175363558597,0.6660703637447822
36
+ hair,0.2,0.0087127685546875,1148,3000,1148,0.38266666666666665,1.0,1169,2995,1169,1826,0,0.3903171953255426,1.0,0.5614793467819404
37
+ blue_eyes,0.95,0.9482421875,431,37,36,0.972972972972973,0.08352668213457076,390,34,28,6,362,0.8235294117647058,0.07179487179487179,0.1320754716981132
38
+ blue_eyes,0.9,0.93359375,431,54,49,0.9074074074074074,0.1136890951276102,390,53,44,9,346,0.8301886792452831,0.11282051282051282,0.1986455981941309
39
+ blue_eyes,0.8,0.833984375,431,199,160,0.8040201005025126,0.37122969837587005,390,184,141,43,249,0.7663043478260869,0.36153846153846153,0.4912891986062717
40
+ blue_eyes,0.5,0.60205078125,431,556,278,0.5,0.6450116009280742,390,548,258,290,132,0.4708029197080292,0.6615384615384615,0.5501066098081023
41
+ blue_eyes,0.2,0.218994140625,431,2050,410,0.2,0.951276102088167,390,2003,370,1633,20,0.18472291562656015,0.9487179487179487,0.3092352695361471
42
+ canid,0.95,0.92236328125,889,706,671,0.9504249291784702,0.7547806524184477,824,663,630,33,194,0.9502262443438914,0.7645631067961165,0.847343644922663
43
+ canid,0.9,0.70654296875,889,864,778,0.9004629629629629,0.875140607424072,824,810,723,87,101,0.8925925925925926,0.8774271844660194,0.8849449204406364
44
+ canid,0.8,0.3583984375,889,1036,829,0.8001930501930502,0.9325084364454443,824,983,765,218,59,0.7782299084435402,0.9283980582524272,0.8467072495849475
45
+ canid,0.5,0.053009033203125,889,1750,875,0.5,0.984251968503937,824,1724,812,912,12,0.4709976798143852,0.9854368932038835,0.6373626373626374
46
+ canid,0.2,2.6047229766845703e-05,889,3000,889,0.29633333333333334,1.0,824,3000,824,2176,0,0.27466666666666667,1.0,0.4309623430962343
47
+ canine,0.95,0.94384765625,866,615,585,0.9512195121951219,0.6755196304849884,804,580,554,26,250,0.9551724137931035,0.6890547263681592,0.800578034682081
48
+ canine,0.9,0.69921875,866,843,759,0.900355871886121,0.8764434180138568,804,806,709,97,95,0.8796526054590571,0.8818407960199005,0.8807453416149069
49
+ canine,0.8,0.366943359375,866,1014,812,0.8007889546351085,0.9376443418013857,804,972,748,224,56,0.7695473251028807,0.9303482587064676,0.8423423423423424
50
+ canine,0.5,0.058990478515625,866,1706,853,0.5,0.9849884526558892,804,1669,791,878,13,0.47393648891551826,0.9838308457711443,0.639708855640922
51
+ canine,0.2,0.00010389089584350586,866,3000,866,0.2886666666666667,1.0,804,3000,804,2196,0,0.268,1.0,0.42271293375394325
52
+ simple_background,0.95,0.95361328125,981,6,6,1.0,0.0061162079510703364,979,5,5,0,974,1.0,0.005107252298263534,0.01016260162601626
53
+ simple_background,0.9,0.8837890625,981,81,73,0.9012345679012346,0.0744138634046891,979,93,79,14,900,0.8494623655913979,0.08069458631256383,0.14738805970149252
54
+ simple_background,0.8,0.8173828125,981,227,182,0.801762114537445,0.18552497451580022,979,258,201,57,778,0.7790697674418605,0.20531154239019409,0.3249797898140663
55
+ simple_background,0.5,0.388427734375,981,1701,851,0.5002939447383892,0.8674821610601428,979,1738,852,886,127,0.4902186421173763,0.8702757916241062,0.6271623113728377
56
+ simple_background,0.2,0.008575439453125,981,3000,981,0.327,1.0,979,2996,979,2017,0,0.3267690253671562,1.0,0.49257861635220124
57
+ male,0.95,0.9306640625,1276,312,297,0.9519230769230769,0.23275862068965517,1301,290,278,12,1023,0.9586206896551724,0.21368178324365872,0.349465744814582
58
+ male,0.9,0.84521484375,1276,593,535,0.9021922428330523,0.41927899686520376,1301,576,529,47,772,0.9184027777777778,0.40661029976940816,0.5636654235482151
59
+ male,0.8,0.5595703125,1276,1215,974,0.8016460905349794,0.7633228840125392,1301,1234,992,242,309,0.8038897893030794,0.7624903920061491,0.7826429980276134
60
+ male,0.5,0.0616455078125,1276,2528,1264,0.5,0.9905956112852664,1301,2520,1294,1226,7,0.5134920634920634,0.994619523443505,0.6773096048154932
61
+ male,0.2,0.0026531219482421875,1276,3000,1276,0.42533333333333334,1.0,1301,3000,1301,1699,0,0.43366666666666664,1.0,0.6049755870727738
62
+ female,0.95,0.78857421875,1540,1151,1094,0.950477845351868,0.7103896103896103,1504,1163,1090,73,414,0.937231298366294,0.7247340425531915,0.817397825271841
63
+ female,0.9,0.56640625,1540,1420,1278,0.9,0.8298701298701299,1504,1423,1268,155,236,0.8910751932536893,0.8430851063829787,0.8664161257259992
64
+ female,0.8,0.2783203125,1540,1785,1428,0.8,0.9272727272727272,1504,1805,1408,397,96,0.7800554016620499,0.9361702127659575,0.8510123904502872
65
+ female,0.5,0.0008296966552734375,1540,3000,1540,0.5133333333333333,1.0,1504,2998,1504,1494,0,0.5016677785190127,1.0,0.6681474900044425
66
+ female,0.2,0.0008296966552734375,1540,3000,1540,0.5133333333333333,1.0,1504,2998,1504,1494,0,0.5016677785190127,1.0,0.6681474900044425
67
+ ambiguous_gender,0.95,,488,0,0,,,497,0,0,0,497,0.0,0.0,0.0
68
+ ambiguous_gender,0.9,,488,0,0,,,497,0,0,0,497,0.0,0.0,0.0
69
+ ambiguous_gender,0.8,0.93359375,488,115,92,0.8,0.1885245901639344,497,98,75,23,422,0.7653061224489796,0.15090543259557343,0.25210084033613445
70
+ ambiguous_gender,0.5,0.59375,488,734,367,0.5,0.7520491803278688,497,726,365,361,132,0.5027548209366391,0.7344064386317908,0.5968928863450532
71
+ ambiguous_gender,0.2,0.07574462890625,488,2430,486,0.2,0.9959016393442623,497,2445,494,1951,3,0.20204498977505111,0.993963782696177,0.335825968728756
72
+ text,0.95,0.9365234375,831,260,247,0.95,0.2972322503008424,782,285,265,20,517,0.9298245614035088,0.3388746803069054,0.4967197750702905
73
+ text,0.9,0.84716796875,831,424,382,0.9009433962264151,0.45968712394705175,782,436,387,49,395,0.8876146788990825,0.4948849104859335,0.6354679802955665
74
+ text,0.8,0.67724609375,831,637,511,0.8021978021978022,0.614921780986763,782,612,497,115,285,0.8120915032679739,0.6355498721227621,0.7130559540889526
75
+ text,0.5,0.343994140625,831,1342,671,0.5,0.8074608904933814,782,1344,655,689,127,0.48735119047619047,0.8375959079283888,0.6161806208842898
76
+ text,0.2,0.0240936279296875,831,3000,831,0.277,1.0,782,3000,782,2218,0,0.26066666666666666,1.0,0.41353781068217876
77
+ looking_at_viewer,0.95,,566,0,0,,,525,0,0,0,525,0.0,0.0,0.0
78
+ looking_at_viewer,0.9,,566,0,0,,,525,0,0,0,525,0.0,0.0,0.0
79
+ looking_at_viewer,0.8,,566,0,0,,,525,0,0,0,525,0.0,0.0,0.0
80
+ looking_at_viewer,0.5,0.84912109375,566,79,40,0.5063291139240507,0.0706713780918728,525,78,40,38,485,0.5128205128205128,0.0761904761904762,0.1326699834162521
81
+ looking_at_viewer,0.2,0.0953369140625,566,2809,562,0.20007119971520113,0.9929328621908127,525,2780,522,2258,3,0.18776978417266188,0.9942857142857143,0.3158850226928896
82
+ open_mouth,0.95,,555,0,0,,,547,0,0,0,547,0.0,0.0,0.0
83
+ open_mouth,0.9,,555,0,0,,,547,0,0,0,547,0.0,0.0,0.0
84
+ open_mouth,0.8,0.92529296875,555,12,10,0.8333333333333334,0.018018018018018018,547,9,8,1,539,0.8888888888888888,0.014625228519195612,0.028776978417266185
85
+ open_mouth,0.5,0.69775390625,555,402,201,0.5,0.3621621621621622,547,382,172,210,375,0.450261780104712,0.31444241316270566,0.37029063509149623
86
+ open_mouth,0.2,0.16357421875,555,2730,546,0.2,0.9837837837837838,547,2707,538,2169,9,0.19874399704469892,0.9835466179159049,0.3306699446834665
87
+ smile,0.95,0.94970703125,774,9,9,1.0,0.011627906976744186,768,4,4,0,764,1.0,0.005208333333333333,0.010362694300518135
88
+ smile,0.9,0.94873046875,774,10,9,0.9,0.011627906976744186,768,4,4,0,764,1.0,0.005208333333333333,0.010362694300518135
89
+ smile,0.8,0.84375,774,143,115,0.8041958041958042,0.14857881136950904,768,156,120,36,648,0.7692307692307693,0.15625,0.2597402597402597
90
+ smile,0.5,0.55322265625,774,1062,531,0.5,0.686046511627907,768,1016,486,530,282,0.47834645669291337,0.6328125,0.5448430493273543
91
+ smile,0.2,0.0257110595703125,774,3000,774,0.258,1.0,768,2995,768,2227,0,0.25642737896494155,1.0,0.4081849588094605
92
+ group,0.95,0.98974609375,323,24,23,0.9583333333333334,0.07120743034055728,347,33,33,0,314,1.0,0.09510086455331412,0.17368421052631577
93
+ group,0.9,0.9794921875,323,62,56,0.9032258064516129,0.17337461300309598,347,69,64,5,283,0.927536231884058,0.1844380403458213,0.30769230769230765
94
+ group,0.8,0.9130859375,323,212,170,0.8018867924528302,0.5263157894736842,347,236,192,44,155,0.8135593220338984,0.553314121037464,0.6586620926243568
95
+ group,0.5,0.54638671875,323,566,283,0.5,0.8761609907120743,347,588,291,297,56,0.49489795918367346,0.8386167146974063,0.6224598930481283
96
+ group,0.2,0.0794677734375,323,1589,318,0.2001258653241032,0.9845201238390093,347,1613,340,1273,7,0.21078735275883448,0.9798270893371758,0.3469387755102041
97
+ duo,0.95,0.97802734375,683,123,117,0.9512195121951219,0.17130307467057102,708,146,134,12,574,0.9178082191780822,0.18926553672316385,0.31381733021077285
98
+ duo,0.9,0.9482421875,683,260,234,0.9,0.34260614934114203,708,289,254,35,454,0.8788927335640139,0.3587570621468927,0.5095285857572719
99
+ duo,0.8,0.7666015625,683,666,533,0.8003003003003003,0.780380673499268,708,681,555,126,153,0.8149779735682819,0.7838983050847458,0.7991360691144708
100
+ duo,0.5,0.1884765625,683,1302,651,0.5,0.9531478770131772,708,1257,674,583,34,0.5361972951471758,0.9519774011299436,0.6860050890585242
101
+ duo,0.2,0.0023784637451171875,683,3000,683,0.22766666666666666,1.0,708,3000,708,2292,0,0.236,1.0,0.38187702265372164
102
+ feral,0.95,0.97802734375,612,80,76,0.95,0.12418300653594772,611,92,80,12,531,0.8695652173913043,0.1309328968903437,0.22759601706970128
103
+ feral,0.9,0.95947265625,612,193,174,0.9015544041450777,0.28431372549019607,611,178,157,21,454,0.8820224719101124,0.2569558101472995,0.3979721166032953
104
+ feral,0.8,0.88525390625,612,397,318,0.801007556675063,0.5196078431372549,611,407,327,80,284,0.8034398034398035,0.5351882160392799,0.6424361493123772
105
+ feral,0.5,0.35009765625,612,1140,570,0.5,0.9313725490196079,611,1162,557,605,54,0.4793459552495697,0.911620294599018,0.6283135927805978
106
+ feral,0.2,0.0009436607360839844,612,3000,612,0.204,1.0,611,2999,611,2388,0,0.20373457819273091,1.0,0.33850415512465376
107
+ red_eyes,0.95,0.978515625,196,5,5,1.0,0.025510204081632654,182,4,4,0,178,1.0,0.02197802197802198,0.043010752688172046
108
+ red_eyes,0.9,0.978515625,196,5,5,1.0,0.025510204081632654,182,4,4,0,178,1.0,0.02197802197802198,0.043010752688172046
109
+ red_eyes,0.8,0.86474609375,196,86,69,0.8023255813953488,0.3520408163265306,182,84,53,31,129,0.6309523809523809,0.29120879120879123,0.39849624060150374
110
+ red_eyes,0.5,0.62158203125,196,243,122,0.5020576131687243,0.6224489795918368,182,277,105,172,77,0.37906137184115524,0.5769230769230769,0.45751633986928103
111
+ red_eyes,0.2,0.34765625,196,790,158,0.2,0.8061224489795918,182,796,142,654,40,0.17839195979899497,0.7802197802197802,0.29038854805725967
112
+ topwear,0.95,0.9736328125,603,5,5,1.0,0.008291873963515755,602,1,1,0,601,1.0,0.0016611295681063123,0.0033167495854063015
113
+ topwear,0.9,0.9736328125,603,5,5,1.0,0.008291873963515755,602,1,1,0,601,1.0,0.0016611295681063123,0.0033167495854063015
114
+ topwear,0.8,0.939453125,603,40,32,0.8,0.05306799336650083,602,39,33,6,569,0.8461538461538461,0.054817275747508304,0.1029641185647426
115
+ topwear,0.5,0.61669921875,603,826,413,0.5,0.6849087893864013,602,779,418,361,184,0.5365853658536586,0.6943521594684385,0.6053584359160029
116
+ topwear,0.2,0.0037364959716796875,603,3000,603,0.201,1.0,602,2999,602,2397,0,0.20073357785928642,1.0,0.3343515690086087
117
+ bottomwear,0.95,0.970703125,423,5,5,1.0,0.01182033096926714,439,7,5,2,434,0.7142857142857143,0.011389521640091117,0.022421524663677136
118
+ bottomwear,0.9,0.970703125,423,5,5,1.0,0.01182033096926714,439,7,5,2,434,0.7142857142857143,0.011389521640091117,0.022421524663677136
119
+ bottomwear,0.8,0.97021484375,423,6,5,0.8333333333333334,0.01182033096926714,439,7,5,2,434,0.7142857142857143,0.011389521640091117,0.022421524663677136
120
+ bottomwear,0.5,0.73095703125,423,478,240,0.502092050209205,0.5673758865248227,439,421,208,213,231,0.49406175771971494,0.47380410022779046,0.48372093023255813
121
+ bottomwear,0.2,0.1458740234375,423,2060,412,0.2,0.9739952718676123,439,2047,430,1617,9,0.21006350757205666,0.979498861047836,0.34593724859211583
122
+ teeth,0.95,,492,0,0,,,494,0,0,0,494,0.0,0.0,0.0
123
+ teeth,0.9,0.96435546875,492,12,11,0.9166666666666666,0.022357723577235773,494,7,6,1,488,0.8571428571428571,0.012145748987854251,0.023952095808383235
124
+ teeth,0.8,0.892578125,492,71,57,0.8028169014084507,0.11585365853658537,494,69,48,21,446,0.6956521739130435,0.09716599190283401,0.17051509769094136
125
+ teeth,0.5,0.68408203125,492,442,221,0.5,0.4491869918699187,494,430,195,235,299,0.45348837209302323,0.39473684210526316,0.422077922077922
126
+ teeth,0.2,0.22021484375,492,2410,482,0.2,0.9796747967479674,494,2426,471,1955,23,0.1941467436108821,0.9534412955465587,0.3226027397260274
127
+ wings,0.95,0.97998046875,377,118,113,0.9576271186440678,0.29973474801061006,404,122,121,1,283,0.9918032786885246,0.2995049504950495,0.4600760456273764
128
+ wings,0.9,0.9404296875,377,253,228,0.9011857707509882,0.6047745358090185,404,236,213,23,191,0.902542372881356,0.5272277227722773,0.665625
129
+ wings,0.8,0.8583984375,377,356,285,0.800561797752809,0.7559681697612732,404,343,275,68,129,0.8017492711370262,0.6806930693069307,0.7362784471218207
130
+ wings,0.5,0.3701171875,377,694,347,0.5,0.9204244031830239,404,709,375,334,29,0.5289139633286318,0.9282178217821783,0.6738544474393531
131
+ wings,0.2,0.0386962890625,377,1855,371,0.2,0.9840848806366048,404,1800,402,1398,2,0.22333333333333333,0.995049504950495,0.3647912885662432
models/finetune/tag-classifier-modernbert-full/config.json ADDED
The diff for this file is too large to render. See raw diff
 
models/finetune/tag-classifier-modernbert-full/labels.json ADDED
The diff for this file is too large to render. See raw diff
 
models/finetune/tag-classifier-modernbert-full/model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9f120a4119c4805ff55ecafe08f1b5b5683b0aebbd7a6809fabc41bcd6f0fec0
3
+ size 309059422
models/finetune/tag-classifier-modernbert-full/special_tokens_map.json ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cls_token": {
3
+ "content": "[CLS]",
4
+ "lstrip": false,
5
+ "normalized": false,
6
+ "rstrip": false,
7
+ "single_word": false
8
+ },
9
+ "mask_token": {
10
+ "content": "[MASK]",
11
+ "lstrip": true,
12
+ "normalized": false,
13
+ "rstrip": false,
14
+ "single_word": false
15
+ },
16
+ "pad_token": {
17
+ "content": "[PAD]",
18
+ "lstrip": false,
19
+ "normalized": false,
20
+ "rstrip": false,
21
+ "single_word": false
22
+ },
23
+ "sep_token": {
24
+ "content": "[SEP]",
25
+ "lstrip": false,
26
+ "normalized": false,
27
+ "rstrip": false,
28
+ "single_word": false
29
+ },
30
+ "unk_token": {
31
+ "content": "[UNK]",
32
+ "lstrip": false,
33
+ "normalized": false,
34
+ "rstrip": false,
35
+ "single_word": false
36
+ }
37
+ }
models/finetune/tag-classifier-modernbert-full/tokenizer.json ADDED
The diff for this file is too large to render. See raw diff
 
models/finetune/tag-classifier-modernbert-full/tokenizer_config.json ADDED
@@ -0,0 +1,945 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "added_tokens_decoder": {
3
+ "0": {
4
+ "content": "|||IP_ADDRESS|||",
5
+ "lstrip": false,
6
+ "normalized": true,
7
+ "rstrip": false,
8
+ "single_word": false,
9
+ "special": false
10
+ },
11
+ "1": {
12
+ "content": "<|padding|>",
13
+ "lstrip": false,
14
+ "normalized": false,
15
+ "rstrip": false,
16
+ "single_word": false,
17
+ "special": true
18
+ },
19
+ "50254": {
20
+ "content": " ",
21
+ "lstrip": false,
22
+ "normalized": true,
23
+ "rstrip": false,
24
+ "single_word": false,
25
+ "special": false
26
+ },
27
+ "50255": {
28
+ "content": " ",
29
+ "lstrip": false,
30
+ "normalized": true,
31
+ "rstrip": false,
32
+ "single_word": false,
33
+ "special": false
34
+ },
35
+ "50256": {
36
+ "content": " ",
37
+ "lstrip": false,
38
+ "normalized": true,
39
+ "rstrip": false,
40
+ "single_word": false,
41
+ "special": false
42
+ },
43
+ "50257": {
44
+ "content": " ",
45
+ "lstrip": false,
46
+ "normalized": true,
47
+ "rstrip": false,
48
+ "single_word": false,
49
+ "special": false
50
+ },
51
+ "50258": {
52
+ "content": " ",
53
+ "lstrip": false,
54
+ "normalized": true,
55
+ "rstrip": false,
56
+ "single_word": false,
57
+ "special": false
58
+ },
59
+ "50259": {
60
+ "content": " ",
61
+ "lstrip": false,
62
+ "normalized": true,
63
+ "rstrip": false,
64
+ "single_word": false,
65
+ "special": false
66
+ },
67
+ "50260": {
68
+ "content": " ",
69
+ "lstrip": false,
70
+ "normalized": true,
71
+ "rstrip": false,
72
+ "single_word": false,
73
+ "special": false
74
+ },
75
+ "50261": {
76
+ "content": " ",
77
+ "lstrip": false,
78
+ "normalized": true,
79
+ "rstrip": false,
80
+ "single_word": false,
81
+ "special": false
82
+ },
83
+ "50262": {
84
+ "content": " ",
85
+ "lstrip": false,
86
+ "normalized": true,
87
+ "rstrip": false,
88
+ "single_word": false,
89
+ "special": false
90
+ },
91
+ "50263": {
92
+ "content": " ",
93
+ "lstrip": false,
94
+ "normalized": true,
95
+ "rstrip": false,
96
+ "single_word": false,
97
+ "special": false
98
+ },
99
+ "50264": {
100
+ "content": " ",
101
+ "lstrip": false,
102
+ "normalized": true,
103
+ "rstrip": false,
104
+ "single_word": false,
105
+ "special": false
106
+ },
107
+ "50265": {
108
+ "content": " ",
109
+ "lstrip": false,
110
+ "normalized": true,
111
+ "rstrip": false,
112
+ "single_word": false,
113
+ "special": false
114
+ },
115
+ "50266": {
116
+ "content": " ",
117
+ "lstrip": false,
118
+ "normalized": true,
119
+ "rstrip": false,
120
+ "single_word": false,
121
+ "special": false
122
+ },
123
+ "50267": {
124
+ "content": " ",
125
+ "lstrip": false,
126
+ "normalized": true,
127
+ "rstrip": false,
128
+ "single_word": false,
129
+ "special": false
130
+ },
131
+ "50268": {
132
+ "content": " ",
133
+ "lstrip": false,
134
+ "normalized": true,
135
+ "rstrip": false,
136
+ "single_word": false,
137
+ "special": false
138
+ },
139
+ "50269": {
140
+ "content": " ",
141
+ "lstrip": false,
142
+ "normalized": true,
143
+ "rstrip": false,
144
+ "single_word": false,
145
+ "special": false
146
+ },
147
+ "50270": {
148
+ "content": " ",
149
+ "lstrip": false,
150
+ "normalized": true,
151
+ "rstrip": false,
152
+ "single_word": false,
153
+ "special": false
154
+ },
155
+ "50271": {
156
+ "content": " ",
157
+ "lstrip": false,
158
+ "normalized": true,
159
+ "rstrip": false,
160
+ "single_word": false,
161
+ "special": false
162
+ },
163
+ "50272": {
164
+ "content": " ",
165
+ "lstrip": false,
166
+ "normalized": true,
167
+ "rstrip": false,
168
+ "single_word": false,
169
+ "special": false
170
+ },
171
+ "50273": {
172
+ "content": " ",
173
+ "lstrip": false,
174
+ "normalized": true,
175
+ "rstrip": false,
176
+ "single_word": false,
177
+ "special": false
178
+ },
179
+ "50274": {
180
+ "content": " ",
181
+ "lstrip": false,
182
+ "normalized": true,
183
+ "rstrip": false,
184
+ "single_word": false,
185
+ "special": false
186
+ },
187
+ "50275": {
188
+ "content": " ",
189
+ "lstrip": false,
190
+ "normalized": true,
191
+ "rstrip": false,
192
+ "single_word": false,
193
+ "special": false
194
+ },
195
+ "50276": {
196
+ "content": " ",
197
+ "lstrip": false,
198
+ "normalized": true,
199
+ "rstrip": false,
200
+ "single_word": false,
201
+ "special": false
202
+ },
203
+ "50277": {
204
+ "content": "|||EMAIL_ADDRESS|||",
205
+ "lstrip": false,
206
+ "normalized": true,
207
+ "rstrip": false,
208
+ "single_word": false,
209
+ "special": false
210
+ },
211
+ "50278": {
212
+ "content": "|||PHONE_NUMBER|||",
213
+ "lstrip": false,
214
+ "normalized": true,
215
+ "rstrip": false,
216
+ "single_word": false,
217
+ "special": false
218
+ },
219
+ "50279": {
220
+ "content": "<|endoftext|>",
221
+ "lstrip": false,
222
+ "normalized": false,
223
+ "rstrip": false,
224
+ "single_word": false,
225
+ "special": true
226
+ },
227
+ "50280": {
228
+ "content": "[UNK]",
229
+ "lstrip": false,
230
+ "normalized": false,
231
+ "rstrip": false,
232
+ "single_word": false,
233
+ "special": true
234
+ },
235
+ "50281": {
236
+ "content": "[CLS]",
237
+ "lstrip": false,
238
+ "normalized": false,
239
+ "rstrip": false,
240
+ "single_word": false,
241
+ "special": true
242
+ },
243
+ "50282": {
244
+ "content": "[SEP]",
245
+ "lstrip": false,
246
+ "normalized": false,
247
+ "rstrip": false,
248
+ "single_word": false,
249
+ "special": true
250
+ },
251
+ "50283": {
252
+ "content": "[PAD]",
253
+ "lstrip": false,
254
+ "normalized": false,
255
+ "rstrip": false,
256
+ "single_word": false,
257
+ "special": true
258
+ },
259
+ "50284": {
260
+ "content": "[MASK]",
261
+ "lstrip": true,
262
+ "normalized": false,
263
+ "rstrip": false,
264
+ "single_word": false,
265
+ "special": true
266
+ },
267
+ "50285": {
268
+ "content": "[unused0]",
269
+ "lstrip": false,
270
+ "normalized": true,
271
+ "rstrip": false,
272
+ "single_word": false,
273
+ "special": false
274
+ },
275
+ "50286": {
276
+ "content": "[unused1]",
277
+ "lstrip": false,
278
+ "normalized": true,
279
+ "rstrip": false,
280
+ "single_word": false,
281
+ "special": false
282
+ },
283
+ "50287": {
284
+ "content": "[unused2]",
285
+ "lstrip": false,
286
+ "normalized": true,
287
+ "rstrip": false,
288
+ "single_word": false,
289
+ "special": false
290
+ },
291
+ "50288": {
292
+ "content": "[unused3]",
293
+ "lstrip": false,
294
+ "normalized": true,
295
+ "rstrip": false,
296
+ "single_word": false,
297
+ "special": false
298
+ },
299
+ "50289": {
300
+ "content": "[unused4]",
301
+ "lstrip": false,
302
+ "normalized": true,
303
+ "rstrip": false,
304
+ "single_word": false,
305
+ "special": false
306
+ },
307
+ "50290": {
308
+ "content": "[unused5]",
309
+ "lstrip": false,
310
+ "normalized": true,
311
+ "rstrip": false,
312
+ "single_word": false,
313
+ "special": false
314
+ },
315
+ "50291": {
316
+ "content": "[unused6]",
317
+ "lstrip": false,
318
+ "normalized": true,
319
+ "rstrip": false,
320
+ "single_word": false,
321
+ "special": false
322
+ },
323
+ "50292": {
324
+ "content": "[unused7]",
325
+ "lstrip": false,
326
+ "normalized": true,
327
+ "rstrip": false,
328
+ "single_word": false,
329
+ "special": false
330
+ },
331
+ "50293": {
332
+ "content": "[unused8]",
333
+ "lstrip": false,
334
+ "normalized": true,
335
+ "rstrip": false,
336
+ "single_word": false,
337
+ "special": false
338
+ },
339
+ "50294": {
340
+ "content": "[unused9]",
341
+ "lstrip": false,
342
+ "normalized": true,
343
+ "rstrip": false,
344
+ "single_word": false,
345
+ "special": false
346
+ },
347
+ "50295": {
348
+ "content": "[unused10]",
349
+ "lstrip": false,
350
+ "normalized": true,
351
+ "rstrip": false,
352
+ "single_word": false,
353
+ "special": false
354
+ },
355
+ "50296": {
356
+ "content": "[unused11]",
357
+ "lstrip": false,
358
+ "normalized": true,
359
+ "rstrip": false,
360
+ "single_word": false,
361
+ "special": false
362
+ },
363
+ "50297": {
364
+ "content": "[unused12]",
365
+ "lstrip": false,
366
+ "normalized": true,
367
+ "rstrip": false,
368
+ "single_word": false,
369
+ "special": false
370
+ },
371
+ "50298": {
372
+ "content": "[unused13]",
373
+ "lstrip": false,
374
+ "normalized": true,
375
+ "rstrip": false,
376
+ "single_word": false,
377
+ "special": false
378
+ },
379
+ "50299": {
380
+ "content": "[unused14]",
381
+ "lstrip": false,
382
+ "normalized": true,
383
+ "rstrip": false,
384
+ "single_word": false,
385
+ "special": false
386
+ },
387
+ "50300": {
388
+ "content": "[unused15]",
389
+ "lstrip": false,
390
+ "normalized": true,
391
+ "rstrip": false,
392
+ "single_word": false,
393
+ "special": false
394
+ },
395
+ "50301": {
396
+ "content": "[unused16]",
397
+ "lstrip": false,
398
+ "normalized": true,
399
+ "rstrip": false,
400
+ "single_word": false,
401
+ "special": false
402
+ },
403
+ "50302": {
404
+ "content": "[unused17]",
405
+ "lstrip": false,
406
+ "normalized": true,
407
+ "rstrip": false,
408
+ "single_word": false,
409
+ "special": false
410
+ },
411
+ "50303": {
412
+ "content": "[unused18]",
413
+ "lstrip": false,
414
+ "normalized": true,
415
+ "rstrip": false,
416
+ "single_word": false,
417
+ "special": false
418
+ },
419
+ "50304": {
420
+ "content": "[unused19]",
421
+ "lstrip": false,
422
+ "normalized": true,
423
+ "rstrip": false,
424
+ "single_word": false,
425
+ "special": false
426
+ },
427
+ "50305": {
428
+ "content": "[unused20]",
429
+ "lstrip": false,
430
+ "normalized": true,
431
+ "rstrip": false,
432
+ "single_word": false,
433
+ "special": false
434
+ },
435
+ "50306": {
436
+ "content": "[unused21]",
437
+ "lstrip": false,
438
+ "normalized": true,
439
+ "rstrip": false,
440
+ "single_word": false,
441
+ "special": false
442
+ },
443
+ "50307": {
444
+ "content": "[unused22]",
445
+ "lstrip": false,
446
+ "normalized": true,
447
+ "rstrip": false,
448
+ "single_word": false,
449
+ "special": false
450
+ },
451
+ "50308": {
452
+ "content": "[unused23]",
453
+ "lstrip": false,
454
+ "normalized": true,
455
+ "rstrip": false,
456
+ "single_word": false,
457
+ "special": false
458
+ },
459
+ "50309": {
460
+ "content": "[unused24]",
461
+ "lstrip": false,
462
+ "normalized": true,
463
+ "rstrip": false,
464
+ "single_word": false,
465
+ "special": false
466
+ },
467
+ "50310": {
468
+ "content": "[unused25]",
469
+ "lstrip": false,
470
+ "normalized": true,
471
+ "rstrip": false,
472
+ "single_word": false,
473
+ "special": false
474
+ },
475
+ "50311": {
476
+ "content": "[unused26]",
477
+ "lstrip": false,
478
+ "normalized": true,
479
+ "rstrip": false,
480
+ "single_word": false,
481
+ "special": false
482
+ },
483
+ "50312": {
484
+ "content": "[unused27]",
485
+ "lstrip": false,
486
+ "normalized": true,
487
+ "rstrip": false,
488
+ "single_word": false,
489
+ "special": false
490
+ },
491
+ "50313": {
492
+ "content": "[unused28]",
493
+ "lstrip": false,
494
+ "normalized": true,
495
+ "rstrip": false,
496
+ "single_word": false,
497
+ "special": false
498
+ },
499
+ "50314": {
500
+ "content": "[unused29]",
501
+ "lstrip": false,
502
+ "normalized": true,
503
+ "rstrip": false,
504
+ "single_word": false,
505
+ "special": false
506
+ },
507
+ "50315": {
508
+ "content": "[unused30]",
509
+ "lstrip": false,
510
+ "normalized": true,
511
+ "rstrip": false,
512
+ "single_word": false,
513
+ "special": false
514
+ },
515
+ "50316": {
516
+ "content": "[unused31]",
517
+ "lstrip": false,
518
+ "normalized": true,
519
+ "rstrip": false,
520
+ "single_word": false,
521
+ "special": false
522
+ },
523
+ "50317": {
524
+ "content": "[unused32]",
525
+ "lstrip": false,
526
+ "normalized": true,
527
+ "rstrip": false,
528
+ "single_word": false,
529
+ "special": false
530
+ },
531
+ "50318": {
532
+ "content": "[unused33]",
533
+ "lstrip": false,
534
+ "normalized": true,
535
+ "rstrip": false,
536
+ "single_word": false,
537
+ "special": false
538
+ },
539
+ "50319": {
540
+ "content": "[unused34]",
541
+ "lstrip": false,
542
+ "normalized": true,
543
+ "rstrip": false,
544
+ "single_word": false,
545
+ "special": false
546
+ },
547
+ "50320": {
548
+ "content": "[unused35]",
549
+ "lstrip": false,
550
+ "normalized": true,
551
+ "rstrip": false,
552
+ "single_word": false,
553
+ "special": false
554
+ },
555
+ "50321": {
556
+ "content": "[unused36]",
557
+ "lstrip": false,
558
+ "normalized": true,
559
+ "rstrip": false,
560
+ "single_word": false,
561
+ "special": false
562
+ },
563
+ "50322": {
564
+ "content": "[unused37]",
565
+ "lstrip": false,
566
+ "normalized": true,
567
+ "rstrip": false,
568
+ "single_word": false,
569
+ "special": false
570
+ },
571
+ "50323": {
572
+ "content": "[unused38]",
573
+ "lstrip": false,
574
+ "normalized": true,
575
+ "rstrip": false,
576
+ "single_word": false,
577
+ "special": false
578
+ },
579
+ "50324": {
580
+ "content": "[unused39]",
581
+ "lstrip": false,
582
+ "normalized": true,
583
+ "rstrip": false,
584
+ "single_word": false,
585
+ "special": false
586
+ },
587
+ "50325": {
588
+ "content": "[unused40]",
589
+ "lstrip": false,
590
+ "normalized": true,
591
+ "rstrip": false,
592
+ "single_word": false,
593
+ "special": false
594
+ },
595
+ "50326": {
596
+ "content": "[unused41]",
597
+ "lstrip": false,
598
+ "normalized": true,
599
+ "rstrip": false,
600
+ "single_word": false,
601
+ "special": false
602
+ },
603
+ "50327": {
604
+ "content": "[unused42]",
605
+ "lstrip": false,
606
+ "normalized": true,
607
+ "rstrip": false,
608
+ "single_word": false,
609
+ "special": false
610
+ },
611
+ "50328": {
612
+ "content": "[unused43]",
613
+ "lstrip": false,
614
+ "normalized": true,
615
+ "rstrip": false,
616
+ "single_word": false,
617
+ "special": false
618
+ },
619
+ "50329": {
620
+ "content": "[unused44]",
621
+ "lstrip": false,
622
+ "normalized": true,
623
+ "rstrip": false,
624
+ "single_word": false,
625
+ "special": false
626
+ },
627
+ "50330": {
628
+ "content": "[unused45]",
629
+ "lstrip": false,
630
+ "normalized": true,
631
+ "rstrip": false,
632
+ "single_word": false,
633
+ "special": false
634
+ },
635
+ "50331": {
636
+ "content": "[unused46]",
637
+ "lstrip": false,
638
+ "normalized": true,
639
+ "rstrip": false,
640
+ "single_word": false,
641
+ "special": false
642
+ },
643
+ "50332": {
644
+ "content": "[unused47]",
645
+ "lstrip": false,
646
+ "normalized": true,
647
+ "rstrip": false,
648
+ "single_word": false,
649
+ "special": false
650
+ },
651
+ "50333": {
652
+ "content": "[unused48]",
653
+ "lstrip": false,
654
+ "normalized": true,
655
+ "rstrip": false,
656
+ "single_word": false,
657
+ "special": false
658
+ },
659
+ "50334": {
660
+ "content": "[unused49]",
661
+ "lstrip": false,
662
+ "normalized": true,
663
+ "rstrip": false,
664
+ "single_word": false,
665
+ "special": false
666
+ },
667
+ "50335": {
668
+ "content": "[unused50]",
669
+ "lstrip": false,
670
+ "normalized": true,
671
+ "rstrip": false,
672
+ "single_word": false,
673
+ "special": false
674
+ },
675
+ "50336": {
676
+ "content": "[unused51]",
677
+ "lstrip": false,
678
+ "normalized": true,
679
+ "rstrip": false,
680
+ "single_word": false,
681
+ "special": false
682
+ },
683
+ "50337": {
684
+ "content": "[unused52]",
685
+ "lstrip": false,
686
+ "normalized": true,
687
+ "rstrip": false,
688
+ "single_word": false,
689
+ "special": false
690
+ },
691
+ "50338": {
692
+ "content": "[unused53]",
693
+ "lstrip": false,
694
+ "normalized": true,
695
+ "rstrip": false,
696
+ "single_word": false,
697
+ "special": false
698
+ },
699
+ "50339": {
700
+ "content": "[unused54]",
701
+ "lstrip": false,
702
+ "normalized": true,
703
+ "rstrip": false,
704
+ "single_word": false,
705
+ "special": false
706
+ },
707
+ "50340": {
708
+ "content": "[unused55]",
709
+ "lstrip": false,
710
+ "normalized": true,
711
+ "rstrip": false,
712
+ "single_word": false,
713
+ "special": false
714
+ },
715
+ "50341": {
716
+ "content": "[unused56]",
717
+ "lstrip": false,
718
+ "normalized": true,
719
+ "rstrip": false,
720
+ "single_word": false,
721
+ "special": false
722
+ },
723
+ "50342": {
724
+ "content": "[unused57]",
725
+ "lstrip": false,
726
+ "normalized": true,
727
+ "rstrip": false,
728
+ "single_word": false,
729
+ "special": false
730
+ },
731
+ "50343": {
732
+ "content": "[unused58]",
733
+ "lstrip": false,
734
+ "normalized": true,
735
+ "rstrip": false,
736
+ "single_word": false,
737
+ "special": false
738
+ },
739
+ "50344": {
740
+ "content": "[unused59]",
741
+ "lstrip": false,
742
+ "normalized": true,
743
+ "rstrip": false,
744
+ "single_word": false,
745
+ "special": false
746
+ },
747
+ "50345": {
748
+ "content": "[unused60]",
749
+ "lstrip": false,
750
+ "normalized": true,
751
+ "rstrip": false,
752
+ "single_word": false,
753
+ "special": false
754
+ },
755
+ "50346": {
756
+ "content": "[unused61]",
757
+ "lstrip": false,
758
+ "normalized": true,
759
+ "rstrip": false,
760
+ "single_word": false,
761
+ "special": false
762
+ },
763
+ "50347": {
764
+ "content": "[unused62]",
765
+ "lstrip": false,
766
+ "normalized": true,
767
+ "rstrip": false,
768
+ "single_word": false,
769
+ "special": false
770
+ },
771
+ "50348": {
772
+ "content": "[unused63]",
773
+ "lstrip": false,
774
+ "normalized": true,
775
+ "rstrip": false,
776
+ "single_word": false,
777
+ "special": false
778
+ },
779
+ "50349": {
780
+ "content": "[unused64]",
781
+ "lstrip": false,
782
+ "normalized": true,
783
+ "rstrip": false,
784
+ "single_word": false,
785
+ "special": false
786
+ },
787
+ "50350": {
788
+ "content": "[unused65]",
789
+ "lstrip": false,
790
+ "normalized": true,
791
+ "rstrip": false,
792
+ "single_word": false,
793
+ "special": false
794
+ },
795
+ "50351": {
796
+ "content": "[unused66]",
797
+ "lstrip": false,
798
+ "normalized": true,
799
+ "rstrip": false,
800
+ "single_word": false,
801
+ "special": false
802
+ },
803
+ "50352": {
804
+ "content": "[unused67]",
805
+ "lstrip": false,
806
+ "normalized": true,
807
+ "rstrip": false,
808
+ "single_word": false,
809
+ "special": false
810
+ },
811
+ "50353": {
812
+ "content": "[unused68]",
813
+ "lstrip": false,
814
+ "normalized": true,
815
+ "rstrip": false,
816
+ "single_word": false,
817
+ "special": false
818
+ },
819
+ "50354": {
820
+ "content": "[unused69]",
821
+ "lstrip": false,
822
+ "normalized": true,
823
+ "rstrip": false,
824
+ "single_word": false,
825
+ "special": false
826
+ },
827
+ "50355": {
828
+ "content": "[unused70]",
829
+ "lstrip": false,
830
+ "normalized": true,
831
+ "rstrip": false,
832
+ "single_word": false,
833
+ "special": false
834
+ },
835
+ "50356": {
836
+ "content": "[unused71]",
837
+ "lstrip": false,
838
+ "normalized": true,
839
+ "rstrip": false,
840
+ "single_word": false,
841
+ "special": false
842
+ },
843
+ "50357": {
844
+ "content": "[unused72]",
845
+ "lstrip": false,
846
+ "normalized": true,
847
+ "rstrip": false,
848
+ "single_word": false,
849
+ "special": false
850
+ },
851
+ "50358": {
852
+ "content": "[unused73]",
853
+ "lstrip": false,
854
+ "normalized": true,
855
+ "rstrip": false,
856
+ "single_word": false,
857
+ "special": false
858
+ },
859
+ "50359": {
860
+ "content": "[unused74]",
861
+ "lstrip": false,
862
+ "normalized": true,
863
+ "rstrip": false,
864
+ "single_word": false,
865
+ "special": false
866
+ },
867
+ "50360": {
868
+ "content": "[unused75]",
869
+ "lstrip": false,
870
+ "normalized": true,
871
+ "rstrip": false,
872
+ "single_word": false,
873
+ "special": false
874
+ },
875
+ "50361": {
876
+ "content": "[unused76]",
877
+ "lstrip": false,
878
+ "normalized": true,
879
+ "rstrip": false,
880
+ "single_word": false,
881
+ "special": false
882
+ },
883
+ "50362": {
884
+ "content": "[unused77]",
885
+ "lstrip": false,
886
+ "normalized": true,
887
+ "rstrip": false,
888
+ "single_word": false,
889
+ "special": false
890
+ },
891
+ "50363": {
892
+ "content": "[unused78]",
893
+ "lstrip": false,
894
+ "normalized": true,
895
+ "rstrip": false,
896
+ "single_word": false,
897
+ "special": false
898
+ },
899
+ "50364": {
900
+ "content": "[unused79]",
901
+ "lstrip": false,
902
+ "normalized": true,
903
+ "rstrip": false,
904
+ "single_word": false,
905
+ "special": false
906
+ },
907
+ "50365": {
908
+ "content": "[unused80]",
909
+ "lstrip": false,
910
+ "normalized": true,
911
+ "rstrip": false,
912
+ "single_word": false,
913
+ "special": false
914
+ },
915
+ "50366": {
916
+ "content": "[unused81]",
917
+ "lstrip": false,
918
+ "normalized": true,
919
+ "rstrip": false,
920
+ "single_word": false,
921
+ "special": false
922
+ },
923
+ "50367": {
924
+ "content": "[unused82]",
925
+ "lstrip": false,
926
+ "normalized": true,
927
+ "rstrip": false,
928
+ "single_word": false,
929
+ "special": false
930
+ }
931
+ },
932
+ "clean_up_tokenization_spaces": true,
933
+ "cls_token": "[CLS]",
934
+ "extra_special_tokens": {},
935
+ "mask_token": "[MASK]",
936
+ "model_input_names": [
937
+ "input_ids",
938
+ "attention_mask"
939
+ ],
940
+ "model_max_length": 8192,
941
+ "pad_token": "[PAD]",
942
+ "sep_token": "[SEP]",
943
+ "tokenizer_class": "PreTrainedTokenizerFast",
944
+ "unk_token": "[UNK]"
945
+ }