Spaces:
Running
Running
fix: pin onnxruntime==1.24.2 + cache-bust Dockerfile for FER
Browse files- Dockerfile +2 -0
- api/requirements.txt +1 -1
- web/src/app/studio/page.tsx +36 -29
Dockerfile
CHANGED
|
@@ -17,6 +17,8 @@ RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \
|
|
| 17 |
WORKDIR /app
|
| 18 |
|
| 19 |
# βββ API layer: Python dependencies ββββββββββββββββββββββββββββββββββββββββββ
|
|
|
|
|
|
|
| 20 |
COPY api/requirements.txt api/requirements.txt
|
| 21 |
RUN pip install --no-cache-dir -r api/requirements.txt
|
| 22 |
|
|
|
|
| 17 |
WORKDIR /app
|
| 18 |
|
| 19 |
# βββ API layer: Python dependencies ββββββββββββββββββββββββββββββββββββββββββ
|
| 20 |
+
# CACHE_BUST: force pip layer rebuild when bumping onnxruntime version
|
| 21 |
+
ARG CACHE_BUST=20260302
|
| 22 |
COPY api/requirements.txt api/requirements.txt
|
| 23 |
RUN pip install --no-cache-dir -r api/requirements.txt
|
| 24 |
|
api/requirements.txt
CHANGED
|
@@ -14,5 +14,5 @@ mistral-common
|
|
| 14 |
safetensors
|
| 15 |
sentencepiece
|
| 16 |
# FER inference β model uses ONNX IR v10, requires ort>=1.19.0
|
| 17 |
-
onnxruntime
|
| 18 |
opencv-python-headless>=4.8.0
|
|
|
|
| 14 |
safetensors
|
| 15 |
sentencepiece
|
| 16 |
# FER inference β model uses ONNX IR v10, requires ort>=1.19.0
|
| 17 |
+
onnxruntime==1.24.2
|
| 18 |
opencv-python-headless>=4.8.0
|
web/src/app/studio/page.tsx
CHANGED
|
@@ -713,37 +713,44 @@ function StudioContent() {
|
|
| 713 |
throw new Error(errData.error ?? "Submit failed")
|
| 714 |
}
|
| 715 |
|
| 716 |
-
const
|
| 717 |
-
|
| 718 |
-
|
| 719 |
-
|
| 720 |
-
|
| 721 |
-
|
| 722 |
-
|
| 723 |
-
|
| 724 |
-
const
|
| 725 |
-
|
| 726 |
-
|
| 727 |
-
|
| 728 |
-
|
| 729 |
-
|
| 730 |
-
|
| 731 |
-
|
| 732 |
-
|
| 733 |
-
|
| 734 |
-
|
| 735 |
-
|
| 736 |
-
|
| 737 |
-
|
| 738 |
-
|
| 739 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 740 |
}
|
| 741 |
-
} catch (e) {
|
| 742 |
-
reject(e)
|
| 743 |
}
|
| 744 |
-
|
| 745 |
-
|
| 746 |
-
}
|
|
|
|
|
|
|
|
|
|
| 747 |
|
| 748 |
updateSession(session.id, data)
|
| 749 |
const updated = getSession(session.id)
|
|
|
|
| 713 |
throw new Error(errData.error ?? "Submit failed")
|
| 714 |
}
|
| 715 |
|
| 716 |
+
const submitJson = await submitRes.json() as { job_id?: string } & Partial<DiarizeResult>
|
| 717 |
+
|
| 718 |
+
let data: DiarizeResult
|
| 719 |
+
|
| 720 |
+
if (submitJson.job_id) {
|
| 721 |
+
// New async format: poll for result
|
| 722 |
+
const job_id = submitJson.job_id
|
| 723 |
+
const POLL_INTERVAL = 3000
|
| 724 |
+
const MAX_POLLS = 60 * 20 // 60 min max
|
| 725 |
+
let polls = 0
|
| 726 |
+
|
| 727 |
+
data = await new Promise<DiarizeResult>((resolve, reject) => {
|
| 728 |
+
const tick = async () => {
|
| 729 |
+
polls++
|
| 730 |
+
if (polls > MAX_POLLS) {
|
| 731 |
+
reject(new Error("Processing timed out after 60 minutes"))
|
| 732 |
+
return
|
| 733 |
+
}
|
| 734 |
+
try {
|
| 735 |
+
const pollRes = await fetch(`${API_BASE}/api/job/${job_id}`)
|
| 736 |
+
const pollData = await pollRes.json()
|
| 737 |
+
if (pollData.status === "done") {
|
| 738 |
+
resolve(pollData.data as DiarizeResult)
|
| 739 |
+
} else if (pollData.status === "error") {
|
| 740 |
+
reject(new Error(pollData.error ?? "Processing failed"))
|
| 741 |
+
} else {
|
| 742 |
+
setTimeout(tick, POLL_INTERVAL)
|
| 743 |
+
}
|
| 744 |
+
} catch (e) {
|
| 745 |
+
reject(e)
|
| 746 |
}
|
|
|
|
|
|
|
| 747 |
}
|
| 748 |
+
setTimeout(tick, POLL_INTERVAL)
|
| 749 |
+
})
|
| 750 |
+
} else {
|
| 751 |
+
// Fallback: old proxy / local dev returned result directly
|
| 752 |
+
data = submitJson as DiarizeResult
|
| 753 |
+
}
|
| 754 |
|
| 755 |
updateSession(session.id, data)
|
| 756 |
const updated = getSession(session.id)
|