Update app.py
Browse files
app.py
CHANGED
|
@@ -20,7 +20,7 @@ KEYS = {
|
|
| 20 |
"stablehorde": "56kkbwcSPfHIr2YsDkpNDQ",
|
| 21 |
"modelslab": "42zL3I6pH7Mv94jhNf4RGyuKGGT3GoEhfXZv47WwmQsfyhgC8XNttfOpvMKL",
|
| 22 |
"openrouter": "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",
|
| 23 |
-
"omniinfer": "
|
| 24 |
"fireworks": "key_kH0svuL0"
|
| 25 |
}
|
| 26 |
|
|
@@ -142,7 +142,7 @@ def generate_stable_horde(prompt):
|
|
| 142 |
raise Exception("Error")
|
| 143 |
|
| 144 |
# ==========================================
|
| 145 |
-
# 3. Pipeline & Status Logic
|
| 146 |
# ==========================================
|
| 147 |
API_PIPELINE = [
|
| 148 |
("Stability AI", generate_stability),
|
|
@@ -164,29 +164,40 @@ def render_dashboard(statuses):
|
|
| 164 |
html_content += "</div>"
|
| 165 |
return html_content
|
| 166 |
|
| 167 |
-
def generate_image_with_fallback(prompt, current_statuses):
|
| 168 |
if not prompt.strip():
|
| 169 |
yield None, "⚠️ **দয়া করে একটি প্রম্পট লিখুন!**", render_dashboard(current_statuses), current_statuses
|
| 170 |
return
|
| 171 |
|
| 172 |
-
# জ
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 173 |
for name, _ in API_PIPELINE:
|
| 174 |
current_statuses[name] = "⚪"
|
| 175 |
|
| 176 |
yield None, "⏳ শুরু হচ্ছে...", render_dashboard(current_statuses), current_statuses
|
| 177 |
|
| 178 |
for api_name, api_func in API_PIPELINE:
|
| 179 |
-
current_statuses[api_name] = "🟡"
|
| 180 |
yield None, f"⏳ **{api_name}**-এর সাথে কানেক্ট করা হচ্ছে...", render_dashboard(current_statuses), current_statuses
|
| 181 |
|
| 182 |
try:
|
| 183 |
-
|
|
|
|
| 184 |
if image:
|
| 185 |
-
current_statuses[api_name] = "🟢"
|
| 186 |
yield image, f"✅ **সফল!** {api_name} থেকে ছবি তৈরি হয়েছে।", render_dashboard(current_statuses), current_statuses
|
| 187 |
-
return
|
| 188 |
except Exception as e:
|
| 189 |
-
current_statuses[api_name] = "🔴"
|
| 190 |
yield None, f"❌ **{api_name}** ফেইল করেছে। পরেরটিতে যাচ্ছে...", render_dashboard(current_statuses), current_statuses
|
| 191 |
continue
|
| 192 |
|
|
@@ -195,23 +206,26 @@ def generate_image_with_fallback(prompt, current_statuses):
|
|
| 195 |
# ==========================================
|
| 196 |
# 4. Gradio Web UI
|
| 197 |
# ==========================================
|
| 198 |
-
# শুরুতে সবগুলোতে সাদা বাতি (⚪) থাকবে
|
| 199 |
initial_statuses = {name: "⚪" for name, _ in API_PIPELINE}
|
| 200 |
|
| 201 |
with gr.Blocks(theme=gr.themes.Base()) as demo:
|
| 202 |
-
gr.Markdown("<h1 style='text-align: center;'>🎨 Pro AI Image Generator (Live Status)</h1>")
|
| 203 |
|
| 204 |
-
# টপ ড্যাশবোর্ড (লাইট প্যানেল)
|
| 205 |
status_board = gr.HTML(render_dashboard(initial_statuses))
|
| 206 |
-
|
| 207 |
-
# স্ট্যাটাস মনে রাখার জন্য State ভেরিয়েবল
|
| 208 |
status_state = gr.State(initial_statuses)
|
| 209 |
-
|
| 210 |
gr.Markdown("<p style='text-align: center;'>⚪ অপেক্ষমান | ���� কানেক্টিং | 🟢 কানেক্টেড (সফল) | 🔴 লিমিট শেষ/ডাউন</p>")
|
| 211 |
|
| 212 |
with gr.Row():
|
| 213 |
with gr.Column(scale=1):
|
| 214 |
-
prompt_input = gr.Textbox(label="ইমেজের বর্ণনা লিখুন (Prompt)", placeholder="
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 215 |
generate_btn = gr.Button("Generate Image", variant="primary")
|
| 216 |
log_box = gr.Markdown("স্ট্যাটাস: অপেক্ষমান...")
|
| 217 |
|
|
@@ -220,7 +234,7 @@ with gr.Blocks(theme=gr.themes.Base()) as demo:
|
|
| 220 |
|
| 221 |
generate_btn.click(
|
| 222 |
fn=generate_image_with_fallback,
|
| 223 |
-
inputs=[prompt_input, status_state],
|
| 224 |
outputs=[image_output, log_box, status_board, status_state]
|
| 225 |
)
|
| 226 |
|
|
|
|
| 20 |
"stablehorde": "56kkbwcSPfHIr2YsDkpNDQ",
|
| 21 |
"modelslab": "42zL3I6pH7Mv94jhNf4RGyuKGGT3GoEhfXZv47WwmQsfyhgC8XNttfOpvMKL",
|
| 22 |
"openrouter": "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",
|
| 23 |
+
"omniinfer": "sk_fTeDYbT2PibvuC27eGFbeE4E-7wcCuWp4SVgFDFWHDU",
|
| 24 |
"fireworks": "key_kH0svuL0"
|
| 25 |
}
|
| 26 |
|
|
|
|
| 142 |
raise Exception("Error")
|
| 143 |
|
| 144 |
# ==========================================
|
| 145 |
+
# 3. Pipeline & Status Logic (With Prompt Enhancer)
|
| 146 |
# ==========================================
|
| 147 |
API_PIPELINE = [
|
| 148 |
("Stability AI", generate_stability),
|
|
|
|
| 164 |
html_content += "</div>"
|
| 165 |
return html_content
|
| 166 |
|
| 167 |
+
def generate_image_with_fallback(prompt, style, current_statuses):
|
| 168 |
if not prompt.strip():
|
| 169 |
yield None, "⚠️ **দয়া করে একটি প্রম্পট লিখুন!**", render_dashboard(current_statuses), current_statuses
|
| 170 |
return
|
| 171 |
|
| 172 |
+
# ম্যাজিক কিওয়ার্ড (যাতে ছবিগুলো হাই কোয়ালিটি এবং রিয়ালিস্টিক হয়)
|
| 173 |
+
style_modifiers = {
|
| 174 |
+
"ফটোরিয়ালিস্টিক (Photorealistic)": ", ultra realistic, highly detailed, photorealistic, 8k resolution, raw photo, masterpiece, soft cinematic lighting, stunning photography",
|
| 175 |
+
"এনিমে (Anime)": ", high quality anime style, studio ghibli, masterpiece, vibrant colors, detailed shading, gorgeous anime art",
|
| 176 |
+
"থ্রিডি আর্ট (3D)": ", 3d render, unreal engine 5, octane render, beautiful 3d masterpiece, highly detailed",
|
| 177 |
+
"ডিফল্ট (Default)": ""
|
| 178 |
+
}
|
| 179 |
+
|
| 180 |
+
# ইউজার যা লিখবে, তার সাথে ম্যাজিক কিওয়ার্ড যুক্ত হয়ে যাবে
|
| 181 |
+
enhanced_prompt = prompt.strip() + style_modifiers.get(style, "")
|
| 182 |
+
|
| 183 |
for name, _ in API_PIPELINE:
|
| 184 |
current_statuses[name] = "⚪"
|
| 185 |
|
| 186 |
yield None, "⏳ শুরু হচ্ছে...", render_dashboard(current_statuses), current_statuses
|
| 187 |
|
| 188 |
for api_name, api_func in API_PIPELINE:
|
| 189 |
+
current_statuses[api_name] = "🟡"
|
| 190 |
yield None, f"⏳ **{api_name}**-এর সাথে কানেক্ট করা হচ্ছে...", render_dashboard(current_statuses), current_statuses
|
| 191 |
|
| 192 |
try:
|
| 193 |
+
# উন্নত করা প্রম্পটটি API তে পাঠানো হচ্ছে
|
| 194 |
+
image = api_func(enhanced_prompt)
|
| 195 |
if image:
|
| 196 |
+
current_statuses[api_name] = "🟢"
|
| 197 |
yield image, f"✅ **সফল!** {api_name} থেকে ছবি তৈরি হয়েছে।", render_dashboard(current_statuses), current_statuses
|
| 198 |
+
return
|
| 199 |
except Exception as e:
|
| 200 |
+
current_statuses[api_name] = "🔴"
|
| 201 |
yield None, f"❌ **{api_name}** ফেইল করেছে। পরেরটিতে যাচ্ছে...", render_dashboard(current_statuses), current_statuses
|
| 202 |
continue
|
| 203 |
|
|
|
|
| 206 |
# ==========================================
|
| 207 |
# 4. Gradio Web UI
|
| 208 |
# ==========================================
|
|
|
|
| 209 |
initial_statuses = {name: "⚪" for name, _ in API_PIPELINE}
|
| 210 |
|
| 211 |
with gr.Blocks(theme=gr.themes.Base()) as demo:
|
| 212 |
+
gr.Markdown("<h1 style='text-align: center;'>🎨 Pro AI Image Generator (Live Status & HD Quality)</h1>")
|
| 213 |
|
|
|
|
| 214 |
status_board = gr.HTML(render_dashboard(initial_statuses))
|
|
|
|
|
|
|
| 215 |
status_state = gr.State(initial_statuses)
|
|
|
|
| 216 |
gr.Markdown("<p style='text-align: center;'>⚪ অপেক্ষমান | ���� কানেক্টিং | 🟢 কানেক্টেড (সফল) | 🔴 লিমিট শেষ/ডাউন</p>")
|
| 217 |
|
| 218 |
with gr.Row():
|
| 219 |
with gr.Column(scale=1):
|
| 220 |
+
prompt_input = gr.Textbox(label="ইমেজের বর্ণনা লিখুন (Prompt)", placeholder="Two beautiful red roses in a garden...", lines=3)
|
| 221 |
+
|
| 222 |
+
# নতুন স্টাইল অপশন যুক্ত করা হয়েছে
|
| 223 |
+
style_input = gr.Radio(
|
| 224 |
+
choices=["ফটোরিয়ালিস্টিক (Photorealistic)", "এনিমে (Anime)", "থ্রিডি আর্ট (3D)", "ডিফল্ট (Default)"],
|
| 225 |
+
label="ছবি কেমন চাচ্ছেন? (Style)",
|
| 226 |
+
value="ফটোরিয়ালিস্টিক (Photorealistic)"
|
| 227 |
+
)
|
| 228 |
+
|
| 229 |
generate_btn = gr.Button("Generate Image", variant="primary")
|
| 230 |
log_box = gr.Markdown("স্ট্যাটাস: অপেক্ষমান...")
|
| 231 |
|
|
|
|
| 234 |
|
| 235 |
generate_btn.click(
|
| 236 |
fn=generate_image_with_fallback,
|
| 237 |
+
inputs=[prompt_input, style_input, status_state],
|
| 238 |
outputs=[image_output, log_box, status_board, status_state]
|
| 239 |
)
|
| 240 |
|