Update app.py
Browse files1. Model default diganti:
❌ Qwen/Qwen2.5-3B-Instruct (kemungkinan butuh PRO)
✅ Qwen/Qwen2.5-1.5B-Instruct (lebih kecil, pasti gratis)
2. Error sekarang menampilkan DETAIL asli:
❌ dulu: "Gagal menghubungi API. Coba lagi nanti."
✅ sekarang: "Error dari API: 401: Invalid token..."
atau "404: Model not found..."
atau error lainnya yang jelas
3. Di pesan error juga dikasih saran model alternatif
app.py
CHANGED
|
@@ -23,11 +23,13 @@ import os
|
|
| 23 |
# ══════════════════════════════════════════════════════
|
| 24 |
# KONFIGURASI MODEL
|
| 25 |
# ══════════════════════════════════════════════════════
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
# MODEL_NAME = "
|
| 30 |
-
# MODEL_NAME = "google/gemma-2-2b-it"
|
|
|
|
|
|
|
| 31 |
|
| 32 |
HF_TOKEN = os.environ.get("HF_TOKEN", "")
|
| 33 |
CHAT_API = f"https://api-inference.huggingface.co/models/{MODEL_NAME}/v1/chat/completions"
|
|
@@ -99,6 +101,7 @@ def call_api(messages):
|
|
| 99 |
}
|
| 100 |
params = {"max_tokens": 1000, "temperature": 0.85, "top_p": 0.9}
|
| 101 |
|
|
|
|
| 102 |
try:
|
| 103 |
resp = requests.post(
|
| 104 |
CHAT_API, headers=headers,
|
|
@@ -111,11 +114,15 @@ def call_api(messages):
|
|
| 111 |
return "LOADING"
|
| 112 |
if resp.status_code == 429:
|
| 113 |
return "RATE_LIMIT"
|
|
|
|
|
|
|
| 114 |
except requests.exceptions.Timeout:
|
| 115 |
return "TIMEOUT"
|
| 116 |
-
except Exception:
|
| 117 |
-
|
| 118 |
|
|
|
|
|
|
|
| 119 |
try:
|
| 120 |
prompt = f"{messages[0]['content']}\n\n{messages[1]['content']}"
|
| 121 |
resp = requests.post(
|
|
@@ -142,12 +149,11 @@ def call_api(messages):
|
|
| 142 |
return "LOADING"
|
| 143 |
if resp.status_code == 429:
|
| 144 |
return "RATE_LIMIT"
|
|
|
|
| 145 |
except requests.exceptions.Timeout:
|
| 146 |
return "TIMEOUT"
|
| 147 |
-
except Exception:
|
| 148 |
-
|
| 149 |
-
|
| 150 |
-
return "ERROR"
|
| 151 |
|
| 152 |
|
| 153 |
def clean_text(text):
|
|
@@ -229,17 +235,36 @@ BUAT TEPAT {jumlah} CAPTION YANG BERBEDA."""
|
|
| 229 |
|
| 230 |
result = call_api(messages)
|
| 231 |
|
| 232 |
-
|
| 233 |
-
|
| 234 |
-
|
| 235 |
-
|
| 236 |
-
|
| 237 |
-
|
|
|
|
|
|
|
| 238 |
|
| 239 |
-
if result
|
| 240 |
-
vals = [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 241 |
return tuple(gr.update(value=v, visible=True) for v in vals)
|
| 242 |
|
|
|
|
| 243 |
captions = parse_captions(result, jumlah)
|
| 244 |
|
| 245 |
output = []
|
|
|
|
| 23 |
# ══════════════════════════════════════════════════════
|
| 24 |
# KONFIGURASI MODEL
|
| 25 |
# ══════════════════════════════════════════════════════
|
| 26 |
+
# Ganti model di sini kalau ada yang error.
|
| 27 |
+
# Model-model ini biasanya tersedia gratis:
|
| 28 |
+
MODEL_NAME = "Qwen/Qwen2.5-1.5B-Instruct"
|
| 29 |
+
# MODEL_NAME = "Qwen/Qwen2.5-0.5B-Instruct" # Paling kecil, paling pasti gratis
|
| 30 |
+
# MODEL_NAME = "google/gemma-2-2b-it" # Alternatif
|
| 31 |
+
# MODEL_NAME = "mistralai/Mistral-7B-Instruct-v0.3" # Alternatif
|
| 32 |
+
# MODEL_NAME = "HuggingFaceH4/zephyr-7b-beta" # Alternatif
|
| 33 |
|
| 34 |
HF_TOKEN = os.environ.get("HF_TOKEN", "")
|
| 35 |
CHAT_API = f"https://api-inference.huggingface.co/models/{MODEL_NAME}/v1/chat/completions"
|
|
|
|
| 101 |
}
|
| 102 |
params = {"max_tokens": 1000, "temperature": 0.85, "top_p": 0.9}
|
| 103 |
|
| 104 |
+
# ── Attempt 1: Chat Completions API ──
|
| 105 |
try:
|
| 106 |
resp = requests.post(
|
| 107 |
CHAT_API, headers=headers,
|
|
|
|
| 114 |
return "LOADING"
|
| 115 |
if resp.status_code == 429:
|
| 116 |
return "RATE_LIMIT"
|
| 117 |
+
# Error lainnya — simpan info buat debugging
|
| 118 |
+
return f"CHAT_ERROR_{resp.status_code}:{resp.text[:300]}"
|
| 119 |
except requests.exceptions.Timeout:
|
| 120 |
return "TIMEOUT"
|
| 121 |
+
except Exception as e:
|
| 122 |
+
return f"CHAT_EXCEPTION:{str(e)[:200]}"
|
| 123 |
|
| 124 |
+
# ── Attempt 2: Text Generation API (fallback) ──
|
| 125 |
+
# Kode di bawah ini hanya jalan kalau chat API tidak reachable sama sekali
|
| 126 |
try:
|
| 127 |
prompt = f"{messages[0]['content']}\n\n{messages[1]['content']}"
|
| 128 |
resp = requests.post(
|
|
|
|
| 149 |
return "LOADING"
|
| 150 |
if resp.status_code == 429:
|
| 151 |
return "RATE_LIMIT"
|
| 152 |
+
return f"TEXT_ERROR_{resp.status_code}:{resp.text[:300]}"
|
| 153 |
except requests.exceptions.Timeout:
|
| 154 |
return "TIMEOUT"
|
| 155 |
+
except Exception as e:
|
| 156 |
+
return f"TEXT_EXCEPTION:{str(e)[:200]}"
|
|
|
|
|
|
|
| 157 |
|
| 158 |
|
| 159 |
def clean_text(text):
|
|
|
|
| 235 |
|
| 236 |
result = call_api(messages)
|
| 237 |
|
| 238 |
+
# Handle error spesifik
|
| 239 |
+
if result == "LOADING":
|
| 240 |
+
vals = ["⏳ Model sedang loading... Tunggu 20-30 detik lalu coba lagi."] + [""] * 4
|
| 241 |
+
return tuple(gr.update(value=v, visible=True) for v in vals)
|
| 242 |
+
|
| 243 |
+
if result == "RATE_LIMIT":
|
| 244 |
+
vals = ["⚠️ Terlalu banyak request. Tunggu 1-2 menit lalu coba lagi."] + [""] * 4
|
| 245 |
+
return tuple(gr.update(value=v, visible=True) for v in vals)
|
| 246 |
|
| 247 |
+
if result == "TIMEOUT":
|
| 248 |
+
vals = ["⏳ Request timeout. Coba lagi."] + [""] * 4
|
| 249 |
+
return tuple(gr.update(value=v, visible=True) for v in vals)
|
| 250 |
+
|
| 251 |
+
# Kalau error dari API, tampilkan detailnya biar bisa debug
|
| 252 |
+
if result and (result.startswith("CHAT_ERROR") or result.startswith("TEXT_ERROR")
|
| 253 |
+
or result.startswith("CHAT_EXCEPTION") or result.startswith("TEXT_EXCEPTION")):
|
| 254 |
+
detail = result.replace("CHAT_ERROR_", "").replace("TEXT_ERROR_", "")
|
| 255 |
+
msg = (
|
| 256 |
+
f"❌ Error dari API:\n\n{detail}\n\n"
|
| 257 |
+
f"Model yang dipakai: {MODEL_NAME}\n\n"
|
| 258 |
+
f"Coba ganti model di kode app.py baris paling atas.\n"
|
| 259 |
+
f"Model yang biasanya gratis:\n"
|
| 260 |
+
f"• Qwen/Qwen2.5-0.5B-Instruct\n"
|
| 261 |
+
f"• Qwen/Qwen2.5-1.5B-Instruct\n"
|
| 262 |
+
f"• google/gemma-2-2b-it"
|
| 263 |
+
)
|
| 264 |
+
vals = [msg] + [""] * 4
|
| 265 |
return tuple(gr.update(value=v, visible=True) for v in vals)
|
| 266 |
|
| 267 |
+
# Sukses — parse caption
|
| 268 |
captions = parse_captions(result, jumlah)
|
| 269 |
|
| 270 |
output = []
|