PSNbst commited on
Commit
bef3741
·
verified ·
1 Parent(s): 4aa0c1b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +105 -100
app.py CHANGED
@@ -1,31 +1,45 @@
1
- import os
2
- import gradio as gr
3
- import openai
 
4
  import requests
 
 
 
 
5
 
6
  ##############################################################################
7
- # 1. GPT 调用示例函数
8
  ##############################################################################
9
- def generate_natural_language_description_gpt(tags, api_key, base_url=None, model="gpt-4"):
10
  """
11
- 使用 OpenAI GPT 生成自然语言描述的示例函数。
 
 
 
12
  """
 
13
  if not api_key:
14
- return "Error: GPT API Key not provided."
 
 
15
 
16
- openai.api_key = api_key
 
 
 
17
  if base_url:
18
- openai.api_base = base_url
19
 
20
- # 将 dict 转成可读字符串
21
  tag_descriptions = "\n".join([
22
- f"{key}: {', '.join(value) if isinstance(value, list) else value}"
23
- for key, value in tags.items() if value
24
  ])
25
 
26
  try:
27
- response = openai.ChatCompletion.create(
28
- model=model,
29
  messages=[
30
  {
31
  "role": "system",
@@ -41,27 +55,23 @@ def generate_natural_language_description_gpt(tags, api_key, base_url=None, mode
41
  },
42
  ]
43
  )
44
- return response.choices[0].message.content.strip()
 
45
  except Exception as e:
46
  return f"GPT generation failed. Error: {e}"
47
 
48
  ##############################################################################
49
- # 2. DeepSeek 调用示例函数 (真实请求)
50
  ##############################################################################
51
- def generate_natural_language_description_deepseek(tags, api_key, base_url=None):
52
  """
53
- 使用 DeepSeek API 生成自然语言描述的真实示例函数。
54
- 假设 DeepSeek 文档里的生成接口是:
55
- POST https://api.deepseek.com/v1/generate
56
- Headers: {"Authorization": "Bearer <api_key>"}
57
- Body(JSON): {"tags": {...}}
58
- 返回:
59
- {"success": true, "data": {"description": "..."}}
60
  """
61
  if not api_key:
62
- return "Error: DeepSeek API Key not provided."
63
-
64
- # 如果有自定义 base_url 就用,没有就用假设的默认
65
  url = base_url or "https://api.deepseek.com/v1/generate"
66
 
67
  try:
@@ -70,64 +80,56 @@ def generate_natural_language_description_deepseek(tags, api_key, base_url=None)
70
  "Authorization": f"Bearer {api_key}"
71
  }
72
  payload = {
73
- "tags": tags # 具体字段要根据实际 DeepSeek 文档
74
  }
75
  resp = requests.post(url, json=payload, headers=headers, timeout=30)
76
  if resp.status_code == 200:
77
- j = resp.json()
78
- if j.get("success"):
79
- # 假设描述存放在 data.description
80
- return j["data"].get("description", "No 'description' found in data.")
81
  else:
82
- return f"DeepSeek generation failed, success=false. {j}"
83
  else:
84
- return f"DeepSeek generation failed with status {resp.status_code}. {resp.text}"
85
  except Exception as e:
86
  return f"DeepSeek generation request error: {e}"
87
 
88
  ##############################################################################
89
- # 3. GPT 翻译函数
90
  ##############################################################################
91
- def translate_text_with_gpt(text, target_language, api_key, base_url=None, model="gpt-4"):
92
- """
93
- 使用 GPT 来进行翻译的简单示例。
94
- """
95
  if not api_key:
96
- return "Error: GPT Translation Key not provided."
97
 
98
- openai.api_key = api_key
99
  if base_url:
100
- openai.api_base = base_url
101
 
102
  try:
 
103
  system_prompt = f"You are a professional translator. Translate the following text to {target_language}:"
104
- response = openai.ChatCompletion.create(
105
  model=model,
106
  messages=[
107
  {"role": "system", "content": system_prompt},
108
- {"role": "user", "content": text},
109
  ]
110
  )
111
- return response.choices[0].message.content.strip()
112
  except Exception as e:
113
  return f"GPT translation failed. Error: {e}"
114
 
115
  ##############################################################################
116
- # 4. DeepSeek 翻译函数 (真实请求)
117
  ##############################################################################
118
- def translate_text_with_deepseek(text, target_language, api_key, base_url=None):
119
- """
120
- 使用 DeepSeek 来进行翻译的真实示例函数。
121
- 假设 DeepSeek 文档里的翻译接口是:
122
- POST https://api.deepseek.com/v1/translate
123
- Headers: {"Authorization": "Bearer <api_key>"}
124
- Body(JSON): {"text": "...", "target_language": "..."}
125
- 返回:
126
- {"success": true, "data": {"translated_text": "..."}}
127
- """
128
  if not api_key:
129
- return "Error: DeepSeek Translation Key not provided."
130
-
 
131
  url = base_url or "https://api.deepseek.com/v1/translate"
132
 
133
  try:
@@ -141,14 +143,13 @@ def translate_text_with_deepseek(text, target_language, api_key, base_url=None):
141
  }
142
  resp = requests.post(url, json=payload, headers=headers, timeout=30)
143
  if resp.status_code == 200:
144
- j = resp.json()
145
- if j.get("success"):
146
- # 假设翻译结果存放在 data.translated_text
147
- return j["data"].get("translated_text", "No 'translated_text' found in data.")
148
  else:
149
- return f"DeepSeek translation failed, success=false. {j}"
150
  else:
151
- return f"DeepSeek translation failed with status {resp.status_code}. {resp.text}"
152
  except Exception as e:
153
  return f"DeepSeek translation request error: {e}"
154
 
@@ -157,11 +158,12 @@ def translate_text_with_deepseek(text, target_language, api_key, base_url=None):
157
  ##############################################################################
158
  def transform_prompt(prompt, gender_option, furry_species, api_mode, api_key):
159
  """
160
- 性别/物种转换的简单示例逻辑,然后调用相应 API 进行生成。
 
161
  """
162
  tags = {}
163
 
164
- # 根据选择设置性别或物种标签
165
  if gender_option == "Trans_to_Male":
166
  tags["gender"] = "male"
167
  elif gender_option == "Trans_to_Female":
@@ -174,9 +176,10 @@ def transform_prompt(prompt, gender_option, furry_species, api_mode, api_key):
174
  tags["gender"] = "furry"
175
  tags["furry_species"] = furry_species or "unknown"
176
 
177
- # 原始提示词
178
  tags["base_prompt"] = prompt
179
 
 
180
  if api_mode == "GPT":
181
  scene_description = generate_natural_language_description_gpt(tags, api_key)
182
  else: # DeepSeek
@@ -185,15 +188,11 @@ def transform_prompt(prompt, gender_option, furry_species, api_mode, api_key):
185
  return scene_description
186
 
187
  ##############################################################################
188
- # 6. 调用翻译函数
189
  ##############################################################################
190
  def do_translation(scene_desc, translate_language, api_mode, api_key):
191
- """
192
- 根据选择的 API(GPT/DeepSeek)进行翻译。
193
- """
194
  if not scene_desc.strip():
195
  return ""
196
-
197
  if api_mode == "GPT":
198
  return translate_text_with_gpt(scene_desc, translate_language, api_key)
199
  else:
@@ -205,11 +204,11 @@ def do_translation(scene_desc, translate_language, api_mode, api_key):
205
  def build_interface():
206
  with gr.Blocks() as demo:
207
 
208
- gr.Markdown("## Prompts_TransTool-提示词一键性别物种转换器")
209
 
210
  with gr.Row():
211
  with gr.Column():
212
- # 选择调用哪个 API
213
  api_mode = gr.Radio(
214
  label="选择 API 服务 (Choose API Service)",
215
  choices=["GPT", "DeepSeek"],
@@ -220,85 +219,87 @@ def build_interface():
220
  api_key = gr.Textbox(
221
  label="API 密钥 (API Key)",
222
  type="password",
223
- placeholder="请输入你的 GPT 或 DeepSeek API 密钥"
224
  )
225
 
226
- # 性别 / Furry 选择
227
  gender_option = gr.Radio(
228
- label="性别 / Furry 选项 (Gender / Furry)",
229
  choices=[
230
- "Trans_to_Male",
231
- "Trans_to_Female",
232
- "Trans_to_Mannequin",
233
- "Trans_to_Intersex",
234
- "Trans_to_Furry"
235
  ],
236
  value="Trans_to_Male",
237
  )
238
 
239
- # 选择 Furry 物种
240
  furry_species = gr.Dropdown(
241
  label="Furry 物种 (Furry Species)",
242
- choices=["Wolf", "Fox", "Tiger", "Lion"],
243
  value=None,
244
  visible=False
245
  )
246
 
247
- # 当性别选项切换时,如果选择 Furry,就显示物种下拉,否则隐藏
248
  def show_furry_species(gender):
249
  return gr.update(visible=(gender == "Trans_to_Furry"))
250
-
251
  gender_option.change(
252
- show_furry_species,
253
- inputs=[gender_option],
254
  outputs=[furry_species]
255
  )
256
 
257
  with gr.Column():
258
- # 输入 prompt
259
  user_prompt = gr.Textbox(
260
  label="提示词 (Prompt)",
261
  lines=5,
262
  placeholder=(
263
- "Please Enter your prompt words. \n"
264
- "在此输入你的提示词,例如:一位穿着红色连衣裙的少女,坐在落日余晖下的草地上..."
265
  )
266
  )
267
 
268
- # 输出场景描述
269
  generated_output = gr.Textbox(
270
  label="转换后的提示词 (Generated Trans-Description)",
271
  lines=7
272
  )
273
 
274
  with gr.Row():
 
275
  translate_language = gr.Dropdown(
276
  label="翻译语言 (Translation Language)",
277
- choices=["English", "Chinese", "Japanese", "French", "German", "Dutch", "Arabic", "Russian", "Persian", "Italian"],
 
 
 
278
  value="English",
279
  )
 
280
  translated_text = gr.Textbox(
281
  label="翻译结果 (Translated Result)",
282
  lines=7
283
  )
284
 
285
- ######################################################################
286
- # 事件绑定
287
- ######################################################################
288
-
289
  def on_generate(prompt, gender, furry, mode, key, lang):
290
- # 1) 调用 transform_prompt 拿到转换后的描述
291
  trans_desc = transform_prompt(prompt, gender, furry, mode, key)
292
- # 2) 调用翻译
293
  trans_result = do_translation(trans_desc, lang, mode, key)
294
  return trans_desc, trans_result
295
 
 
296
  user_prompt.submit(
297
  fn=on_generate,
298
  inputs=[user_prompt, gender_option, furry_species, api_mode, api_key, translate_language],
299
  outputs=[generated_output, translated_text],
300
  )
301
 
 
302
  generate_button = gr.Button("生成 / Generate")
303
  generate_button.click(
304
  fn=on_generate,
@@ -306,6 +307,7 @@ def build_interface():
306
  outputs=[generated_output, translated_text],
307
  )
308
 
 
309
  def on_translate(scene_desc, lang, mode, key):
310
  return do_translation(scene_desc, lang, mode, key)
311
 
@@ -317,6 +319,9 @@ def build_interface():
317
 
318
  return demo
319
 
 
 
 
320
  if __name__ == "__main__":
321
  demo = build_interface()
322
- demo.launch()
 
1
+ ##############################################
2
+ # app.py
3
+ ##############################################
4
+ import os
5
  import requests
6
+ import gradio as gr
7
+
8
+ # 新版 openai>=1.0.0 引用方式
9
+ from openai import OpenAI
10
 
11
  ##############################################################################
12
+ # 1. GPT 调用示例函数(新版 openai>=1.0.0)
13
  ##############################################################################
14
+ def generate_natural_language_description_gpt(tags, api_key=None, base_url=None, model="gpt-4o"):
15
  """
16
+ 使用新版 openai>=1.0.0 库来调用 GPT
17
+ 1) from openai import OpenAI
18
+ 2) client = OpenAI(api_key=...)
19
+ 3) client.chat.completions.create(...)
20
  """
21
+ # 若没传入 api_key,就从环境变量获取
22
  if not api_key:
23
+ api_key = os.getenv("OPENAI_API_KEY")
24
+ if not api_key:
25
+ return "Error: No GPT API Key provided."
26
 
27
+ # 创建一个新的 OpenAI Client
28
+ client = OpenAI(api_key=api_key)
29
+
30
+ # 如果你有自定义 base_url(如代理/私有化部署),可在此设置
31
  if base_url:
32
+ client.base_url = base_url
33
 
34
+ # 将 tags 拼出可读字符串
35
  tag_descriptions = "\n".join([
36
+ f"{k}: {', '.join(v) if isinstance(v, list) else v}"
37
+ for k, v in tags.items() if v
38
  ])
39
 
40
  try:
41
+ chat_completion = client.chat.completions.create(
42
+ model=model, # 例如 "gpt-4o", "gpt-4o-mini", "gpt-3.5-turbo" 等
43
  messages=[
44
  {
45
  "role": "system",
 
55
  },
56
  ]
57
  )
58
+ # 新版库返回对象中,内容在 chat_completion.choices[0].message.content
59
+ return chat_completion.choices[0].message.content.strip()
60
  except Exception as e:
61
  return f"GPT generation failed. Error: {e}"
62
 
63
  ##############################################################################
64
+ # 2. DeepSeek 调用示例函数(真实 HTTP 请求示例,需你修改)
65
  ##############################################################################
66
+ def generate_natural_language_description_deepseek(tags, api_key=None, base_url=None):
67
  """
68
+ 调用 DeepSeek API 获取描述。如果你不需要 DeepSeek,可删除此函数。
69
+ 注意:此处示例的接口 URL、请求体和返回格式需要替换为真实 DeepSeek 文档内容。
 
 
 
 
 
70
  """
71
  if not api_key:
72
+ return "Error: No DeepSeek API Key provided."
73
+
74
+ # 假设你的 DeepSeek 接口地址如下,请改为实际地址
75
  url = base_url or "https://api.deepseek.com/v1/generate"
76
 
77
  try:
 
80
  "Authorization": f"Bearer {api_key}"
81
  }
82
  payload = {
83
+ "tags": tags
84
  }
85
  resp = requests.post(url, json=payload, headers=headers, timeout=30)
86
  if resp.status_code == 200:
87
+ data = resp.json()
88
+ # 根据你们的返回结构来取值
89
+ if data.get("success"):
90
+ return data["data"].get("description", "No description found.")
91
  else:
92
+ return f"DeepSeek generation success=false. {data}"
93
  else:
94
+ return f"DeepSeek generation failed. Status {resp.status_code}, {resp.text}"
95
  except Exception as e:
96
  return f"DeepSeek generation request error: {e}"
97
 
98
  ##############################################################################
99
+ # 3. GPT 翻译函数(新版 openai>=1.0.0)
100
  ##############################################################################
101
+ def translate_text_with_gpt(text, target_language, api_key=None, base_url=None, model="gpt-4o"):
102
+ if not api_key:
103
+ api_key = os.getenv("OPENAI_API_KEY")
 
104
  if not api_key:
105
+ return "Error: No GPT Translation Key provided."
106
 
107
+ client = OpenAI(api_key=api_key)
108
  if base_url:
109
+ client.base_url = base_url
110
 
111
  try:
112
+ # Prompt: 让 GPT 扮演翻译
113
  system_prompt = f"You are a professional translator. Translate the following text to {target_language}:"
114
+ chat_completion = client.chat.completions.create(
115
  model=model,
116
  messages=[
117
  {"role": "system", "content": system_prompt},
118
+ {"role": "user", "content": text},
119
  ]
120
  )
121
+ return chat_completion.choices[0].message.content.strip()
122
  except Exception as e:
123
  return f"GPT translation failed. Error: {e}"
124
 
125
  ##############################################################################
126
+ # 4. DeepSeek 翻译函数(需你修改为真实接口)
127
  ##############################################################################
128
+ def translate_text_with_deepseek(text, target_language, api_key=None, base_url=None):
 
 
 
 
 
 
 
 
 
129
  if not api_key:
130
+ return "Error: No DeepSeek Translation Key provided."
131
+
132
+ # 假设 DeepSeek 翻译接口如下,请改为实际
133
  url = base_url or "https://api.deepseek.com/v1/translate"
134
 
135
  try:
 
143
  }
144
  resp = requests.post(url, json=payload, headers=headers, timeout=30)
145
  if resp.status_code == 200:
146
+ data = resp.json()
147
+ if data.get("success"):
148
+ return data["data"].get("translated_text", "No translated_text found.")
 
149
  else:
150
+ return f"DeepSeek translation success=false. {data}"
151
  else:
152
+ return f"DeepSeek translation failed. Status {resp.status_code}, {resp.text}"
153
  except Exception as e:
154
  return f"DeepSeek translation request error: {e}"
155
 
 
158
  ##############################################################################
159
  def transform_prompt(prompt, gender_option, furry_species, api_mode, api_key):
160
  """
161
+ 示例转换逻辑:将 prompt 结合 gender/furry 信息组成 tags,然后调用指定 API
162
+ 你可以在此处扩充更复杂的处理逻辑。
163
  """
164
  tags = {}
165
 
166
+ # 性别 / 物种 设定
167
  if gender_option == "Trans_to_Male":
168
  tags["gender"] = "male"
169
  elif gender_option == "Trans_to_Female":
 
176
  tags["gender"] = "furry"
177
  tags["furry_species"] = furry_species or "unknown"
178
 
179
+ # 原始 prompt
180
  tags["base_prompt"] = prompt
181
 
182
+ # 调用对应 API
183
  if api_mode == "GPT":
184
  scene_description = generate_natural_language_description_gpt(tags, api_key)
185
  else: # DeepSeek
 
188
  return scene_description
189
 
190
  ##############################################################################
191
+ # 6. 翻译逻辑:看用户选择,用 GPT 或 DeepSeek 做翻译
192
  ##############################################################################
193
  def do_translation(scene_desc, translate_language, api_mode, api_key):
 
 
 
194
  if not scene_desc.strip():
195
  return ""
 
196
  if api_mode == "GPT":
197
  return translate_text_with_gpt(scene_desc, translate_language, api_key)
198
  else:
 
204
  def build_interface():
205
  with gr.Blocks() as demo:
206
 
207
+ gr.Markdown("## Prompts_TransTool - 提示词一键性别物种转换器(openai>=1.0.0 版)")
208
 
209
  with gr.Row():
210
  with gr.Column():
211
+ # 选择 API 服务(GPT / DeepSeek)
212
  api_mode = gr.Radio(
213
  label="选择 API 服务 (Choose API Service)",
214
  choices=["GPT", "DeepSeek"],
 
219
  api_key = gr.Textbox(
220
  label="API 密钥 (API Key)",
221
  type="password",
222
+ placeholder="在此输入 GPT 或 DeepSeek API 密钥"
223
  )
224
 
225
+ # 性别 / Furry 选项
226
  gender_option = gr.Radio(
227
+ label="性别 / Furry 选项",
228
  choices=[
229
+ "Trans_to_Male",
230
+ "Trans_to_Female",
231
+ "Trans_to_Mannequin",
232
+ "Trans_to_Intersex",
233
+ "Trans_to_Furry",
234
  ],
235
  value="Trans_to_Male",
236
  )
237
 
238
+ # 如果是 Furry,显示可选物种
239
  furry_species = gr.Dropdown(
240
  label="Furry 物种 (Furry Species)",
241
+ choices=["Wolf", "Fox", "Tiger", "Lion"],
242
  value=None,
243
  visible=False
244
  )
245
 
 
246
  def show_furry_species(gender):
247
  return gr.update(visible=(gender == "Trans_to_Furry"))
 
248
  gender_option.change(
249
+ fn=show_furry_species,
250
+ inputs=[gender_option],
251
  outputs=[furry_species]
252
  )
253
 
254
  with gr.Column():
255
+ # 用户输入 prompt
256
  user_prompt = gr.Textbox(
257
  label="提示词 (Prompt)",
258
  lines=5,
259
  placeholder=(
260
+ "示例:一位穿着红色连衣裙的少女,坐在落日余晖下的草地上..."
 
261
  )
262
  )
263
 
264
+ # 转换后输出
265
  generated_output = gr.Textbox(
266
  label="转换后的提示词 (Generated Trans-Description)",
267
  lines=7
268
  )
269
 
270
  with gr.Row():
271
+ # 翻译语言
272
  translate_language = gr.Dropdown(
273
  label="翻译语言 (Translation Language)",
274
+ choices=[
275
+ "English", "Chinese", "Japanese", "French", "German",
276
+ "Dutch", "Arabic", "Russian", "Persian", "Italian"
277
+ ],
278
  value="English",
279
  )
280
+ # 翻译结果
281
  translated_text = gr.Textbox(
282
  label="翻译结果 (Translated Result)",
283
  lines=7
284
  )
285
 
286
+ ############################################################################
287
+ # 事件逻辑
288
+ ############################################################################
289
+ # 1) 生成并翻译
290
  def on_generate(prompt, gender, furry, mode, key, lang):
 
291
  trans_desc = transform_prompt(prompt, gender, furry, mode, key)
 
292
  trans_result = do_translation(trans_desc, lang, mode, key)
293
  return trans_desc, trans_result
294
 
295
+ # 回车提交
296
  user_prompt.submit(
297
  fn=on_generate,
298
  inputs=[user_prompt, gender_option, furry_species, api_mode, api_key, translate_language],
299
  outputs=[generated_output, translated_text],
300
  )
301
 
302
+ # 按钮点击
303
  generate_button = gr.Button("生成 / Generate")
304
  generate_button.click(
305
  fn=on_generate,
 
307
  outputs=[generated_output, translated_text],
308
  )
309
 
310
+ # 2) 语言切换再翻译
311
  def on_translate(scene_desc, lang, mode, key):
312
  return do_translation(scene_desc, lang, mode, key)
313
 
 
319
 
320
  return demo
321
 
322
+ ##############################################################################
323
+ # 主入口
324
+ ##############################################################################
325
  if __name__ == "__main__":
326
  demo = build_interface()
327
+ demo.launch()