Spaces:
Sleeping
Sleeping
File size: 12,986 Bytes
bef3741 0f91f56 bef3741 64322bd bef3741 64322bd bef3741 64322bd bef3741 64322bd bef3741 64322bd bef3741 64322bd bef3741 64322bd bef3741 64322bd bef3741 64322bd bef3741 64322bd bef3741 64322bd bef3741 64322bd 0f91f56 bef3741 0f91f56 bef3741 64322bd bef3741 64322bd bef3741 0f91f56 64322bd 0f91f56 bef3741 0f91f56 bef3741 0f91f56 bef3741 0f91f56 bef3741 0f91f56 64322bd bef3741 64322bd bef3741 64322bd bef3741 64322bd bef3741 64322bd bef3741 64322bd bef3741 64322bd bef3741 64322bd bef3741 64322bd bef3741 64322bd 0f91f56 bef3741 0f91f56 bef3741 64322bd bef3741 0f91f56 64322bd 0f91f56 bef3741 0f91f56 bef3741 0f91f56 bef3741 0f91f56 64322bd 0f91f56 64322bd bef3741 64322bd bef3741 14b159d 64322bd 14b159d 64322bd 14b159d 64322bd 14b159d 64322bd bef3741 64322bd bef3741 64322bd bef3741 64322bd 1819fc4 64322bd 0f91f56 64322bd bef3741 64322bd bef3741 64322bd bef3741 64322bd bef3741 64322bd bef3741 64322bd bef3741 64322bd 14b159d 64322bd bef3741 64322bd bef3741 64322bd 0f91f56 64322bd 05bf4a2 64322bd bef3741 64322bd bef3741 64322bd 05bf4a2 bef3741 05bf4a2 64322bd bef3741 64322bd 14b159d 64322bd bef3741 64322bd bef3741 14b159d 64322bd bef3741 64322bd bef3741 05bf4a2 bef3741 64322bd 05bf4a2 64322bd bef3741 64322bd 05bf4a2 64322bd bef3741 64322bd bef3741 64322bd bef3741 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 |
##############################################
# 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() |