import gradio as gr import random import os from openai import OpenAI from dotenv import load_dotenv # 加载环境变量 load_dotenv() # ========== 默认选项和数据 ========== EXPRESSIONS = ["smiling", "determined", "surprised", "serene"] ITEMS = ["magic wand", "sword", "flower", "book of spells", "ancient scroll", "music instrument"] OTHER_DETAILS = ["sparkles", "magical aura", "lens flare", "fireworks in the background"] SCENES = ["sunset beach", "rainy city street at night", "fantasy forest with glowing mushrooms", "futuristic skyline at dawn"] CAMERA_ANGLES = ["low-angle shot", "close-up shot", "bird's-eye view", "wide-angle shot"] QUALITY_PROMPTS = ["8k", "ultra-realistic", "high detail", "cinematic lighting", "award-winning"] # ========== 工具函数 ========== def load_candidates_from_files(files): """ 从多个文件中加载候选项。 """ all_lines = [] if files: for file in files: # Gradio 的 Files 返回文件路径 if isinstance(file, str): with open(file, "r", encoding="utf-8") as f: all_lines.extend([line.strip() for line in f if line.strip()]) return all_lines def get_random_item(candidates): """ 随机选取候选项。 """ return random.choice(candidates) if candidates else "" def generate_natural_language_description(tags, api_key=None): """ 使用 OpenAI GPT 生成自然语言描述(适配 GPT-4o)。 """ # 如果用户未输入 API Key,则尝试从环境变量获取 if not api_key: api_key = os.getenv("OPENAI_API_KEY") if not api_key: return "Error: No API Key provided and none found in environment variables." try: # 初始化 OpenAI 客户端 client = OpenAI(api_key=api_key) # 调用 chat.completions.create response = client.chat.completions.create( messages=[ { "role": "system", "content": ( "You are a helpful assistant that generates creative painting/prompt descriptions. " "Write at least three sentences in English, separated by periods." ), }, { "role": "user", "content": f"Here are the tags: {tags}\nPlease generate a vivid, imaginative scene description.", }, ], model="gpt-4o", ) generated_content = response.choices[0].message.content.strip() return generated_content except Exception as e: return f"GPT generation failed. Error: {e}" def generate_prompt(action_file, style_file, artist_files, character_files, api_key, selected_categories): """ 生成随机提示词和描述。 """ # 从文件加载候选项 actions = load_candidates_from_files([action_file]) if action_file else [] styles = load_candidates_from_files([style_file]) if style_file else [] artists = load_candidates_from_files(artist_files) if artist_files else [] characters = load_candidates_from_files(character_files) if character_files else [] # 确定角色类型 number_of_characters = ", ".join(selected_categories) if selected_categories else random.choice(["1girl", "1boy"]) # 随机生成提示词 tags = { "number_of_characters": number_of_characters, "character_name": get_random_item(characters), "artist_prompt": get_random_item(artists), "style": get_random_item(styles), "scene": get_random_item(SCENES), "camera_angle": get_random_item(CAMERA_ANGLES), "action": get_random_item(actions), "expression": get_random_item(EXPRESSIONS), "items": get_random_item(ITEMS), "other_details": get_random_item(OTHER_DETAILS), "quality_prompts": get_random_item(QUALITY_PROMPTS), } # 生成描述 description = generate_natural_language_description(tags, api_key) # 返回结果 tags_list = [value for value in tags.values() if value] final_tags = ", ".join(tags_list) combined_output = f"{final_tags}\n {description}" return final_tags, description, combined_output # ========== Gradio 界面 ========== def gradio_interface(): """ 定义 Gradio 应用界面。 """ with gr.Blocks() as demo: gr.Markdown("## Random Prompt Generator with User-Provided GPT API Key") # API Key 输入区 api_key_input = gr.Textbox( label="Enter your OpenAI API Key (Optional) 请输入你充值好了的GPT的API不然不好使", placeholder="sk-...", type="password" ) # 文件上传 with gr.Row(): action_file = gr.File(label="Upload Action File (Optional)", file_types=[".txt"]) style_file = gr.File(label="Upload Style File (Optional)", file_types=[".txt"]) with gr.Row(): artist_files = gr.Files(label="Upload Artist Files (Multiple Allowed)", file_types=[".txt"]) character_files = gr.Files(label="Upload Character Files (Multiple Allowed)", file_types=[".txt"]) # 角色类型选择 selected_categories = gr.CheckboxGroup( ["1boy", "1girl", "furry", "mecha", "fantasy monster", "animal", "still life"], label="Choose Character Categories (Optional)" ) # 输出区域 with gr.Row(): tags_output = gr.Textbox(label="Generated Tags") description_output = gr.Textbox(label="Generated Description") combined_output = gr.Textbox(label="Combined Output: Tags + Description") # 按钮 generate_button = gr.Button("Generate Prompt") # 按钮动作 generate_button.click( generate_prompt, inputs=[action_file, style_file, artist_files, character_files, api_key_input, selected_categories], outputs=[tags_output, description_output, combined_output], ) return demo # 启动 Gradio 应用 if __name__ == "__main__": gradio_interface().launch(share=True)