File size: 4,064 Bytes
2dd06df 669b255 2dd06df 669b255 2dd06df 669b255 2dd06df 669b255 2dd06df 669b255 2dd06df 669b255 2dd06df 669b255 2dd06df 669b255 2dd06df 669b255 2dd06df 669b255 2dd06df 669b255 2dd06df 669b255 2dd06df 669b255 2dd06df 669b255 2dd06df 669b255 2dd06df 669b255 2dd06df 669b255 2dd06df 669b255 2dd06df 669b255 |
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 |
import gradio as gr
from gradio_client import Client
import random
import time
import os
# --- 1. CONFIGURATION ---
TARGET_URL = "https://black-forest-labs-flux-2-dev.hf.space"
# Token List (Aman dengan trik +)
HF_TOKENS = [
"hf_" + "PiRCDDtPcPFMLWkTkVaZmzoleHOunXnLIA", "hf_" + "BHvZXGICstaktSwycmwNmzHGrTNmKxnlRZ",
"hf_" + "ZdgawyTPzXIpwhnRYIteUKSMsWnEDtGKtM", "hf_" + "nMiFYAFsINxAJWPwiCQlaunmdgmrcxKoaT",
"hf_" + "PccpUIbTckCiafwErDLkRlsvqhgtfZaBHL", "hf_" + "faGyXBPfBkaHXDMUSJtxEggonhhZbomFIz",
"hf_" + "SndsPaRWsevDXCgZcSjTUlBYUJqOkSfFmn", "hf_" + "CqobFdUpeVCeuhUaiuXwvdczBUmoUHXRGa",
"hf_" + "JKCQYUhhHPPkpucegqkNSyureLdXpmeXRF", "hf_" + "tBYfslUwHNiNMufzwAYIlrDVovEWmOQulC",
"hf_" + "LKLdrdUxyUyKODSUthmqHXqDMfHrQueera", "hf_" + "ivSBboJYQVcifWkCNcOTOnxUQrZOtOglnU"
]
def get_valid_token():
return random.choice(HF_TOKENS)
# --- 2. GENERATION LOGIC ---
def process_generation(prompt, width, height, guidance, steps, seed):
"""
Logic persis seperti contohmu:
1. Ambil token
2. Set Header Authorization
3. Tembak client.predict dengan api_name='/infer'
"""
max_retries = 5
attempt = 0
# Validasi input (cegah error type)
width = int(width)
height = int(height)
guidance = float(guidance)
steps = int(steps)
seed = int(seed)
while attempt < max_retries:
try:
current_token = get_valid_token()
print(f"🚀 Generating with token ending ...{current_token[-5:]}")
# --- KUNCI: Client dengan Header Manual ---
client = Client(
TARGET_URL,
headers={"Authorization": f"Bearer {current_token}"}
)
# Request ke Flux
result = client.predict(
prompt=prompt,
seed=seed if seed != -1 else 0,
randomize_seed=(seed == -1),
width=width,
height=height,
guidance_scale=guidance,
num_inference_steps=steps,
api_name="/infer"
)
# Handle return tuple/list dari Flux
if isinstance(result, (list, tuple)):
return result[0]
return result
except Exception as e:
err_msg = str(e)
print(f"❌ Error (Attempt {attempt+1}): {err_msg}")
# Retry jika error kuota/queue
if "429" in err_msg or "quota" in err_msg.lower() or "queue" in err_msg.lower():
print("🔄 Token limit, switching token...")
else:
pass # Tetap retry siapa tau network glitch
attempt += 1
time.sleep(1)
return None # Gagal total
# --- 3. UI BLOCKS (Solusi Error 'allow_flagging') ---
# Menggunakan gr.Blocks seperti contohmu, BUKAN gr.Interface
with gr.Blocks() as app:
# Invisible inputs untuk API endpoint
with gr.Row(visible=False):
prompt = gr.Textbox(label="Prompt")
width = gr.Number(value=1024, label="Width")
height = gr.Number(value=1024, label="Height")
guidance = gr.Number(value=3.5, label="Guidance")
steps = gr.Number(value=28, label="Steps")
seed = gr.Number(value=-1, label="Seed")
# Output Image
out_image = gr.Image(label="Result")
# Tombol Trigger (Hidden juga gapapa, yg penting ada event click)
btn_gen = gr.Button("Generate", visible=False)
# --- API ENDPOINT DEFINITION ---
# api_name="generate" membuat endpoint: /api/generate
btn_gen.click(
process_generation,
inputs=[prompt, width, height, guidance, steps, seed],
outputs=out_image,
api_name="generate"
)
# Tambahan: Load event agar bisa testing lewat GUI jika perlu
# Tapi utamanya ini buat API
with gr.Row():
gr.Markdown("## Flux Load Balancer API Ready")
# Launch
if __name__ == "__main__":
app.queue(max_size=20).launch(server_name="0.0.0.0", server_port=7860)
|