Spaces:
Running
Running
Ron Au
commited on
Commit
·
9421891
1
Parent(s):
3750ff9
feat(errors): Add better error handling
Browse files- app.py +9 -5
- static/js/index.js +7 -2
- static/js/network.js +4 -0
- static/style.css +21 -4
app.py
CHANGED
|
@@ -66,11 +66,15 @@ def create_task():
|
|
| 66 |
def queue_task():
|
| 67 |
task_id = request.args.get('task_id')
|
| 68 |
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 74 |
|
| 75 |
return jsonify(tasks[task_id])
|
| 76 |
|
|
|
|
| 66 |
def queue_task():
|
| 67 |
task_id = request.args.get('task_id')
|
| 68 |
|
| 69 |
+
try:
|
| 70 |
+
tasks[task_id]["value"] = generate_image(tasks[task_id]["prompt"])
|
| 71 |
+
except Exception as ex:
|
| 72 |
+
tasks[task_id]["status"] = "failed"
|
| 73 |
+
tasks[task_id]["error"] = repr(ex)
|
| 74 |
+
else:
|
| 75 |
+
tasks[task_id]["status"] = "completed"
|
| 76 |
+
finally:
|
| 77 |
+
tasks[task_id]["completed_at"] = time()
|
| 78 |
|
| 79 |
return jsonify(tasks[task_id])
|
| 80 |
|
static/js/index.js
CHANGED
|
@@ -47,11 +47,16 @@ const generate = async () => {
|
|
| 47 |
const longPromises = [queueTask(task.task_id), longPollTask(task)];
|
| 48 |
const completedTask = await Promise.any(longPromises);
|
| 49 |
|
| 50 |
-
setOutput('booster', 'completed');
|
| 51 |
-
|
| 52 |
generating = false;
|
| 53 |
timerCleanup(completedTask);
|
| 54 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 55 |
cardSlot.innerHTML = cardHTML(details);
|
| 56 |
updateCardName(trainerName, pokeName, useTrainerName);
|
| 57 |
const picture = document.querySelector('img.picture');
|
|
|
|
| 47 |
const longPromises = [queueTask(task.task_id), longPollTask(task)];
|
| 48 |
const completedTask = await Promise.any(longPromises);
|
| 49 |
|
|
|
|
|
|
|
| 50 |
generating = false;
|
| 51 |
timerCleanup(completedTask);
|
| 52 |
|
| 53 |
+
if (completedTask.status === 'failed') {
|
| 54 |
+
setOutput('booster', 'failed');
|
| 55 |
+
throw new Error(`Task failed: ${completedTask.error}`);
|
| 56 |
+
}
|
| 57 |
+
|
| 58 |
+
setOutput('booster', 'completed');
|
| 59 |
+
|
| 60 |
cardSlot.innerHTML = cardHTML(details);
|
| 61 |
updateCardName(trainerName, pokeName, useTrainerName);
|
| 62 |
const picture = document.querySelector('img.picture');
|
static/js/network.js
CHANGED
|
@@ -34,6 +34,10 @@ const longPollTask = async (task, interval = 10_000, max) => {
|
|
| 34 |
return task;
|
| 35 |
}
|
| 36 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
etaDisplay.textContent = Math.round(task.eta);
|
| 38 |
|
| 39 |
await new Promise((resolve) => setTimeout(resolve, interval));
|
|
|
|
| 34 |
return task;
|
| 35 |
}
|
| 36 |
|
| 37 |
+
if (task.status === 'failed') {
|
| 38 |
+
return task;
|
| 39 |
+
}
|
| 40 |
+
|
| 41 |
etaDisplay.textContent = Math.round(task.eta);
|
| 42 |
|
| 43 |
await new Promise((resolve) => setTimeout(resolve, interval));
|
static/style.css
CHANGED
|
@@ -4,8 +4,9 @@
|
|
| 4 |
--theme-secondary: hsl(165 67% 48%);
|
| 5 |
--theme-ternary: hsl(112 46% 75%);
|
| 6 |
--theme-highlight: hsl(111 95% 92%);
|
| 7 |
-
--theme-white: hsl(0 100% 100%);
|
| 8 |
--theme-subtext: hsl(0 0% 30%);
|
|
|
|
|
|
|
| 9 |
}
|
| 10 |
|
| 11 |
html,
|
|
@@ -38,7 +39,7 @@ body {
|
|
| 38 |
body {
|
| 39 |
height: 100vh;
|
| 40 |
background-color: whitesmoke;
|
| 41 |
-
background-image: linear-gradient(300deg, var(--theme-highlight),
|
| 42 |
font-family: 'Gill Sans', 'Gill Sans Mt', 'sans-serif';
|
| 43 |
}
|
| 44 |
|
|
@@ -249,6 +250,22 @@ button.toggle-name.off {
|
|
| 249 |
opacity: 1;
|
| 250 |
}
|
| 251 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 252 |
.scene {
|
| 253 |
--scale: 0.9;
|
| 254 |
height: 40rem;
|
|
@@ -562,11 +579,11 @@ img.hf-logo {
|
|
| 562 |
}
|
| 563 |
}
|
| 564 |
|
| 565 |
-
[data-mode='booster']:is([data-state='ready'], [data-state='generating'], [data-state='completed']) .booster {
|
| 566 |
display: block;
|
| 567 |
}
|
| 568 |
|
| 569 |
-
[data-state='ready'] .booster {
|
| 570 |
animation: 5s bounce infinite ease-out;
|
| 571 |
}
|
| 572 |
|
|
|
|
| 4 |
--theme-secondary: hsl(165 67% 48%);
|
| 5 |
--theme-ternary: hsl(112 46% 75%);
|
| 6 |
--theme-highlight: hsl(111 95% 92%);
|
|
|
|
| 7 |
--theme-subtext: hsl(0 0% 30%);
|
| 8 |
+
--theme-error-bg: hsl(6 93% 71%);
|
| 9 |
+
--theme-error-border: hsl(355 85% 55%);
|
| 10 |
}
|
| 11 |
|
| 12 |
html,
|
|
|
|
| 39 |
body {
|
| 40 |
height: 100vh;
|
| 41 |
background-color: whitesmoke;
|
| 42 |
+
background-image: linear-gradient(300deg, var(--theme-highlight), white);
|
| 43 |
font-family: 'Gill Sans', 'Gill Sans Mt', 'sans-serif';
|
| 44 |
}
|
| 45 |
|
|
|
|
| 250 |
opacity: 1;
|
| 251 |
}
|
| 252 |
|
| 253 |
+
[data-state="failed"] .duration {
|
| 254 |
+
border-color: var(--theme-error-border);
|
| 255 |
+
background-color: var(--theme-error-bg);
|
| 256 |
+
color: transparent;
|
| 257 |
+
}
|
| 258 |
+
|
| 259 |
+
[data-state="failed"] .duration.displayed::after {
|
| 260 |
+
content: 'ERROR';
|
| 261 |
+
position: absolute;
|
| 262 |
+
top: 20%;
|
| 263 |
+
left: 0;
|
| 264 |
+
width: 100%;
|
| 265 |
+
text-align: center;
|
| 266 |
+
color: white;
|
| 267 |
+
}
|
| 268 |
+
|
| 269 |
.scene {
|
| 270 |
--scale: 0.9;
|
| 271 |
height: 40rem;
|
|
|
|
| 579 |
}
|
| 580 |
}
|
| 581 |
|
| 582 |
+
[data-mode='booster']:is([data-state='ready'], [data-state='generating'], [data-state='completed'], [data-state='failed']) .booster {
|
| 583 |
display: block;
|
| 584 |
}
|
| 585 |
|
| 586 |
+
:is([data-state='ready'], [data-state='failed']) .booster {
|
| 587 |
animation: 5s bounce infinite ease-out;
|
| 588 |
}
|
| 589 |
|