PSNbst commited on
Commit
9fd65e9
·
verified ·
1 Parent(s): 762642d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +60 -20
app.py CHANGED
@@ -1,5 +1,6 @@
1
  import os
2
  import json
 
3
  import gradio as gr
4
  from openai import OpenAI
5
 
@@ -53,25 +54,20 @@ def merge_transform_rules_into_prompt(rules_json):
53
 
54
  # 1) 读取 gender_transform
55
  gt = rules_json.get("gender_transform", {})
56
- male_tag_rules = gt.get("male_tag_rules", {})
57
- replacements = gt.get("tag_replacements", {})
58
- additional = gt.get("additional_reminders", {})
59
-
60
- # 2) shared_preferences
61
- sp = rules_json.get("shared_preferences", {})
62
-
63
- # 3) table_details
64
- td = rules_json.get("table_details", {})
65
-
66
- # 这只是一个简单示例,将 key-value 拼起来,真实项目可更精细
67
  text_parts = []
68
 
69
  text_parts.append("==== GENDER TRANSFORM RULES ====")
70
  text_parts.append(str(gt)) # 直接转为字符串或更有条理地拼写
71
-
 
 
72
  text_parts.append("==== SHARED PREFERENCES ====")
73
  text_parts.append(str(sp))
74
 
 
 
75
  text_parts.append("==== TABLE DETAILS (PRO ACTIONS) ====")
76
  text_parts.append(str(td))
77
 
@@ -80,7 +76,39 @@ def merge_transform_rules_into_prompt(rules_json):
80
  RULES_TEXT_FULL = merge_transform_rules_into_prompt(TRANSFORM_DICT)
81
 
82
  ##############################################################################
83
- # 4. 核心 GPT/DeepSeek 调用
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  ##############################################################################
85
  def generate_transformed_output(prompt, gender_option, top_cat, sub_cat, species_item, api_mode, api_key):
86
  """
@@ -103,14 +131,12 @@ def generate_transformed_output(prompt, gender_option, top_cat, sub_cat, species
103
 
104
  # 如果选 Furry:
105
  if gender_option == "Trans_to_Furry":
106
- # 在 system prompt 内也可写点提示:
107
  furry_path = f"{top_cat} > {sub_cat} > {species_item}" if (top_cat and sub_cat and species_item) else "unknown"
108
  extra_line = f"\nFurry chosen: {furry_path}\n"
109
  else:
110
  extra_line = ""
111
 
112
- # 这里把 "RULES_TEXT_FULL" (来自 transform_rules.json) + GENDER_RULES +
113
- # "extra_line" 一并放到 system_prompt
114
  gender_specific_rule = ""
115
  if gender_option == "Trans_to_Male":
116
  gender_specific_rule = GENDER_RULES.get("male", "")
@@ -148,13 +174,17 @@ Instructions:
148
  model=model_name,
149
  messages=[
150
  {"role": "system", "content": system_prompt},
151
- {"role": "user", "content": "Generate final tags and description now."}
152
  ],
153
  )
154
  return resp.choices[0].message.content.strip()
 
155
  except Exception as e:
156
  return f"{api_mode} generation failed. Error: {e}"
157
 
 
 
 
158
  def translate_text(content, lang, api_mode, api_key):
159
  if not api_key:
160
  return "Error: No API Key provided."
@@ -183,7 +213,7 @@ No extra headings.
183
  model=model_name,
184
  messages=[
185
  {"role": "system", "content": translate_system_prompt},
186
- {"role": "user", "content": content}
187
  ],
188
  )
189
  return resp.choices[0].message.content.strip()
@@ -191,7 +221,7 @@ No extra headings.
191
  return f"{api_mode} translation failed. Error: {e}"
192
 
193
  ##############################################################################
194
- # 5. Gradio 界面
195
  ##############################################################################
196
  def build_interface():
197
  with gr.Blocks() as demo:
@@ -290,7 +320,8 @@ def build_interface():
290
  with gr.Row():
291
  translate_lang = gr.Dropdown(
292
  label="Translate to Language 翻译语言",
293
- choices=["English", "Chinese", "Japanese", "French", "German", "Italian", "Spanish", "Russian", "Dutch", "Persian", "Arabic", "Thai"],
 
294
  value="English"
295
  )
296
  translated_text = gr.Textbox(
@@ -302,7 +333,16 @@ def build_interface():
302
  # 生成
303
  ######################################################################
304
  def on_generate(prompt, gender, tc, sc, spc, mode, key, lang):
 
 
 
 
 
 
 
305
  merged = generate_transformed_output(prompt, gender, tc, sc, spc, mode, key)
 
 
306
  trans = translate_text(merged, lang, mode, key)
307
  return merged, trans
308
 
 
1
  import os
2
  import json
3
+ import re
4
  import gradio as gr
5
  from openai import OpenAI
6
 
 
54
 
55
  # 1) 读取 gender_transform
56
  gt = rules_json.get("gender_transform", {})
57
+ # 注意:这里不一定要用 male_tag_rules, replacements 等字段,
58
+ # 仅做一个演示将 gt 转成文本
 
 
 
 
 
 
 
 
 
59
  text_parts = []
60
 
61
  text_parts.append("==== GENDER TRANSFORM RULES ====")
62
  text_parts.append(str(gt)) # 直接转为字符串或更有条理地拼写
63
+
64
+ # 2) shared_preferences
65
+ sp = rules_json.get("shared_preferences", {})
66
  text_parts.append("==== SHARED PREFERENCES ====")
67
  text_parts.append(str(sp))
68
 
69
+ # 3) table_details
70
+ td = rules_json.get("table_details", {})
71
  text_parts.append("==== TABLE DETAILS (PRO ACTIONS) ====")
72
  text_parts.append(str(td))
73
 
 
76
  RULES_TEXT_FULL = merge_transform_rules_into_prompt(TRANSFORM_DICT)
77
 
78
  ##############################################################################
79
+ # 4. 强制替换逻辑
80
+ ##############################################################################
81
+
82
+ # 建立一个映射:用户在前端选 "Trans_to_Male" -> 我们用 transform_rules.json["override_conflicting_descriptors"]["female_to_male"] 等
83
+ transform_map = {
84
+ "Trans_to_Male": "female_to_male",
85
+ "Trans_to_Female": "male_to_female",
86
+ "Trans_to_Mannequin": "any_to_genderless",
87
+ "Trans_to_Intersex": "any_to_intersex",
88
+ "Trans_to_Furry": "trans_to_furry", # 也可在这里加: if we want forced replacement for "she->anthro_female" etc.
89
+ }
90
+
91
+ def forced_replace(prompt, direction):
92
+ """
93
+ 根据 TRANSFORM_DICT["override_conflicting_descriptors"] 下的映射,
94
+ 对 prompt 中的词做强制替换。
95
+ """
96
+ # direction 是 "female_to_male" / "male_to_female" / ...
97
+ override_section = TRANSFORM_DICT.get("override_conflicting_descriptors", {})
98
+ replacements = override_section.get(direction, {})
99
+ if not replacements:
100
+ # 该方向没有映射,直接返回
101
+ return prompt
102
+
103
+ # 逐条用正则整词替换
104
+ for old, new in replacements.items():
105
+ # \b 表示单词边界,(?i) 表示不区分大小写
106
+ pattern = r"(?i)\b" + re.escape(old) + r"\b"
107
+ prompt = re.sub(pattern, new, prompt)
108
+ return prompt
109
+
110
+ ##############################################################################
111
+ # 5. 核心 GPT/DeepSeek 调用
112
  ##############################################################################
113
  def generate_transformed_output(prompt, gender_option, top_cat, sub_cat, species_item, api_mode, api_key):
114
  """
 
131
 
132
  # 如果选 Furry:
133
  if gender_option == "Trans_to_Furry":
 
134
  furry_path = f"{top_cat} > {sub_cat} > {species_item}" if (top_cat and sub_cat and species_item) else "unknown"
135
  extra_line = f"\nFurry chosen: {furry_path}\n"
136
  else:
137
  extra_line = ""
138
 
139
+ # 根据 gender_option,取对应 GENDER_RULES
 
140
  gender_specific_rule = ""
141
  if gender_option == "Trans_to_Male":
142
  gender_specific_rule = GENDER_RULES.get("male", "")
 
174
  model=model_name,
175
  messages=[
176
  {"role": "system", "content": system_prompt},
177
+ {"role": "user", "content": "Generate final tags and description now."}
178
  ],
179
  )
180
  return resp.choices[0].message.content.strip()
181
+
182
  except Exception as e:
183
  return f"{api_mode} generation failed. Error: {e}"
184
 
185
+ ##############################################################################
186
+ # 6. 翻译函数
187
+ ##############################################################################
188
  def translate_text(content, lang, api_mode, api_key):
189
  if not api_key:
190
  return "Error: No API Key provided."
 
213
  model=model_name,
214
  messages=[
215
  {"role": "system", "content": translate_system_prompt},
216
+ {"role": "user", "content": content}
217
  ],
218
  )
219
  return resp.choices[0].message.content.strip()
 
221
  return f"{api_mode} translation failed. Error: {e}"
222
 
223
  ##############################################################################
224
+ # 7. Gradio 界面
225
  ##############################################################################
226
  def build_interface():
227
  with gr.Blocks() as demo:
 
320
  with gr.Row():
321
  translate_lang = gr.Dropdown(
322
  label="Translate to Language 翻译语言",
323
+ choices=["English", "Chinese", "Japanese", "French", "German",
324
+ "Italian", "Spanish", "Russian", "Dutch", "Persian", "Arabic", "Thai"],
325
  value="English"
326
  )
327
  translated_text = gr.Textbox(
 
333
  # 生成
334
  ######################################################################
335
  def on_generate(prompt, gender, tc, sc, spc, mode, key, lang):
336
+ # 1) 先根据 "gender" 选项判断要执行哪种 forced_replace
337
+ direction = transform_map.get(gender, None)
338
+ if direction:
339
+ # 在提交给 GPT 之前,对 prompt 做强制替换
340
+ prompt = forced_replace(prompt, direction)
341
+
342
+ # 2) 再调用原先的 generate_transformed_output
343
  merged = generate_transformed_output(prompt, gender, tc, sc, spc, mode, key)
344
+
345
+ # 3) 翻译
346
  trans = translate_text(merged, lang, mode, key)
347
  return merged, trans
348