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)