Spaces:
Sleeping
Sleeping
############################################## | |
# app.py | |
############################################## | |
import os | |
import requests | |
import gradio as gr | |
# 新版 openai>=1.0.0 引用方式 | |
from openai import OpenAI | |
############################################################################## | |
# 1. GPT 调用示例函数(新版 openai>=1.0.0) | |
############################################################################## | |
def generate_natural_language_description_gpt(tags, api_key=None, base_url=None, model="gpt-4o"): | |
""" | |
使用新版 openai>=1.0.0 库来调用 GPT。 | |
1) from openai import OpenAI | |
2) client = OpenAI(api_key=...) | |
3) client.chat.completions.create(...) | |
""" | |
# 若没传入 api_key,就从环境变量获取 | |
if not api_key: | |
api_key = os.getenv("OPENAI_API_KEY") | |
if not api_key: | |
return "Error: No GPT API Key provided." | |
# 创建一个新的 OpenAI Client | |
client = OpenAI(api_key=api_key) | |
# 如果你有自定义 base_url(如代理/私有化部署),可在此设置 | |
if base_url: | |
client.base_url = base_url | |
# 将 tags 拼出可读字符串 | |
tag_descriptions = "\n".join([ | |
f"{k}: {', '.join(v) if isinstance(v, list) else v}" | |
for k, v in tags.items() if v | |
]) | |
try: | |
chat_completion = client.chat.completions.create( | |
model=model, # 例如 "gpt-4o", "gpt-4o-mini", "gpt-3.5-turbo" 等 | |
messages=[ | |
{ | |
"role": "system", | |
"content": ( | |
"You are a creative assistant that generates detailed and imaginative scene descriptions " | |
"for AI generation prompts. Focus on the details provided and incorporate them into a " | |
"cohesive narrative. Use at least three sentences but no more than five sentences." | |
), | |
}, | |
{ | |
"role": "user", | |
"content": f"Here are the tags and details:\n{tag_descriptions}\nPlease generate a vivid, imaginative scene description.", | |
}, | |
] | |
) | |
# 新版库返回对象中,内容在 chat_completion.choices[0].message.content | |
return chat_completion.choices[0].message.content.strip() | |
except Exception as e: | |
return f"GPT generation failed. Error: {e}" | |
############################################################################## | |
# 2. DeepSeek 调用示例函数(真实 HTTP 请求示例,需你修改) | |
############################################################################## | |
def generate_natural_language_description_deepseek(tags, api_key=None, base_url=None): | |
""" | |
调用 DeepSeek API 获取描述。如果你不需要 DeepSeek,可删除此函数。 | |
注意:此处示例的接口 URL、请求体和返回格式需要替换为真实 DeepSeek 文档内容。 | |
""" | |
if not api_key: | |
return "Error: No DeepSeek API Key provided." | |
# 假设你的 DeepSeek 接口地址如下,请改为实际地址 | |
url = base_url or "https://api.deepseek.com/v1/generate" | |
try: | |
headers = { | |
"Content-Type": "application/json", | |
"Authorization": f"Bearer {api_key}" | |
} | |
payload = { | |
"tags": tags | |
} | |
resp = requests.post(url, json=payload, headers=headers, timeout=30) | |
if resp.status_code == 200: | |
data = resp.json() | |
# 根据你们的返回结构来取值 | |
if data.get("success"): | |
return data["data"].get("description", "No description found.") | |
else: | |
return f"DeepSeek generation success=false. {data}" | |
else: | |
return f"DeepSeek generation failed. Status {resp.status_code}, {resp.text}" | |
except Exception as e: | |
return f"DeepSeek generation request error: {e}" | |
############################################################################## | |
# 3. GPT 翻译函数(新版 openai>=1.0.0) | |
############################################################################## | |
def translate_text_with_gpt(text, target_language, api_key=None, base_url=None, model="gpt-4o"): | |
if not api_key: | |
api_key = os.getenv("OPENAI_API_KEY") | |
if not api_key: | |
return "Error: No GPT Translation Key provided." | |
client = OpenAI(api_key=api_key) | |
if base_url: | |
client.base_url = base_url | |
try: | |
# Prompt: 让 GPT 扮演翻译 | |
system_prompt = f"You are a professional translator. Translate the following text to {target_language}:" | |
chat_completion = client.chat.completions.create( | |
model=model, | |
messages=[ | |
{"role": "system", "content": system_prompt}, | |
{"role": "user", "content": text}, | |
] | |
) | |
return chat_completion.choices[0].message.content.strip() | |
except Exception as e: | |
return f"GPT translation failed. Error: {e}" | |
############################################################################## | |
# 4. DeepSeek 翻译函数(需你修改为真实接口) | |
############################################################################## | |
def translate_text_with_deepseek(text, target_language, api_key=None, base_url=None): | |
if not api_key: | |
return "Error: No DeepSeek Translation Key provided." | |
# 假设 DeepSeek 翻译接口如下,请改为实际 | |
url = base_url or "https://api.deepseek.com/v1/translate" | |
try: | |
headers = { | |
"Content-Type": "application/json", | |
"Authorization": f"Bearer {api_key}" | |
} | |
payload = { | |
"text": text, | |
"target_language": target_language | |
} | |
resp = requests.post(url, json=payload, headers=headers, timeout=30) | |
if resp.status_code == 200: | |
data = resp.json() | |
if data.get("success"): | |
return data["data"].get("translated_text", "No translated_text found.") | |
else: | |
return f"DeepSeek translation success=false. {data}" | |
else: | |
return f"DeepSeek translation failed. Status {resp.status_code}, {resp.text}" | |
except Exception as e: | |
return f"DeepSeek translation request error: {e}" | |
############################################################################## | |
# 5. 根据用户选择进行提示词转换并调用 GPT/DeepSeek 生成描述 | |
############################################################################## | |
def transform_prompt(prompt, gender_option, furry_species, api_mode, api_key): | |
""" | |
示例转换逻辑:将 prompt 结合 gender/furry 信息组成 tags,然后调用指定 API。 | |
你可以在此处扩充更复杂的处理逻辑。 | |
""" | |
tags = {} | |
# 性别 / 物种 设定 | |
if gender_option == "Trans_to_Male": | |
tags["gender"] = "male" | |
elif gender_option == "Trans_to_Female": | |
tags["gender"] = "female" | |
elif gender_option == "Trans_to_Mannequin": | |
tags["gender"] = "genderless" | |
elif gender_option == "Trans_to_Intersex": | |
tags["gender"] = "intersex" | |
elif gender_option == "Trans_to_Furry": | |
tags["gender"] = "furry" | |
tags["furry_species"] = furry_species or "unknown" | |
# 原始 prompt | |
tags["base_prompt"] = prompt | |
# 调用对应 API | |
if api_mode == "GPT": | |
scene_description = generate_natural_language_description_gpt(tags, api_key) | |
else: # DeepSeek | |
scene_description = generate_natural_language_description_deepseek(tags, api_key) | |
return scene_description | |
############################################################################## | |
# 6. 翻译逻辑:看用户选择,用 GPT 或 DeepSeek 做翻译 | |
############################################################################## | |
def do_translation(scene_desc, translate_language, api_mode, api_key): | |
if not scene_desc.strip(): | |
return "" | |
if api_mode == "GPT": | |
return translate_text_with_gpt(scene_desc, translate_language, api_key) | |
else: | |
return translate_text_with_deepseek(scene_desc, translate_language, api_key) | |
############################################################################## | |
# 7. 搭建 Gradio 界面 | |
############################################################################## | |
def build_interface(): | |
with gr.Blocks() as demo: | |
gr.Markdown("## Prompts_TransTool - 提示词一键性别物种转换器(openai>=1.0.0 版)") | |
with gr.Row(): | |
with gr.Column(): | |
# 选择 API 服务(GPT / DeepSeek) | |
api_mode = gr.Radio( | |
label="选择 API 服务 (Choose API Service)", | |
choices=["GPT", "DeepSeek"], | |
value="GPT" | |
) | |
# 输入 API Key | |
api_key = gr.Textbox( | |
label="API 密钥 (API Key)", | |
type="password", | |
placeholder="在此输入 GPT 或 DeepSeek 的 API 密钥" | |
) | |
# 性别 / Furry 选项 | |
gender_option = gr.Radio( | |
label="性别 / Furry 选项", | |
choices=[ | |
"Trans_to_Male", | |
"Trans_to_Female", | |
"Trans_to_Mannequin", | |
"Trans_to_Intersex", | |
"Trans_to_Furry", | |
], | |
value="Trans_to_Male", | |
) | |
# 如果是 Furry,显示可选物种 | |
furry_species = gr.Dropdown( | |
label="Furry 物种 (Furry Species)", | |
choices=["Wolf", "Fox", "Tiger", "Lion"], | |
value=None, | |
visible=False | |
) | |
def show_furry_species(gender): | |
return gr.update(visible=(gender == "Trans_to_Furry")) | |
gender_option.change( | |
fn=show_furry_species, | |
inputs=[gender_option], | |
outputs=[furry_species] | |
) | |
with gr.Column(): | |
# 用户输入 prompt | |
user_prompt = gr.Textbox( | |
label="提示词 (Prompt)", | |
lines=5, | |
placeholder=( | |
"示例:一位穿着红色连衣裙的少女,坐在落日余晖下的草地上..." | |
) | |
) | |
# 转换后输出 | |
generated_output = gr.Textbox( | |
label="转换后的提示词 (Generated Trans-Description)", | |
lines=7 | |
) | |
with gr.Row(): | |
# 翻译语言 | |
translate_language = gr.Dropdown( | |
label="翻译语言 (Translation Language)", | |
choices=[ | |
"English", "Chinese", "Japanese", "French", "German", | |
"Dutch", "Arabic", "Russian", "Persian", "Italian" | |
], | |
value="English", | |
) | |
# 翻译结果 | |
translated_text = gr.Textbox( | |
label="翻译结果 (Translated Result)", | |
lines=7 | |
) | |
############################################################################ | |
# 事件逻辑 | |
############################################################################ | |
# 1) 生成并翻译 | |
def on_generate(prompt, gender, furry, mode, key, lang): | |
trans_desc = transform_prompt(prompt, gender, furry, mode, key) | |
trans_result = do_translation(trans_desc, lang, mode, key) | |
return trans_desc, trans_result | |
# 回车提交 | |
user_prompt.submit( | |
fn=on_generate, | |
inputs=[user_prompt, gender_option, furry_species, api_mode, api_key, translate_language], | |
outputs=[generated_output, translated_text], | |
) | |
# 按钮点击 | |
generate_button = gr.Button("生成 / Generate") | |
generate_button.click( | |
fn=on_generate, | |
inputs=[user_prompt, gender_option, furry_species, api_mode, api_key, translate_language], | |
outputs=[generated_output, translated_text], | |
) | |
# 2) 语言切换再翻译 | |
def on_translate(scene_desc, lang, mode, key): | |
return do_translation(scene_desc, lang, mode, key) | |
translate_language.change( | |
fn=on_translate, | |
inputs=[generated_output, translate_language, api_mode, api_key], | |
outputs=[translated_text] | |
) | |
return demo | |
############################################################################## | |
# 主入口 | |
############################################################################## | |
if __name__ == "__main__": | |
demo = build_interface() | |
demo.launch() |