save code
This commit is contained in:
+6
-5
@@ -271,11 +271,12 @@ async def face_features(
|
|||||||
img_bytes = None
|
img_bytes = None
|
||||||
if image_file:
|
if image_file:
|
||||||
raw = await image_file.read()
|
raw = await image_file.read()
|
||||||
if len(raw) > 1_000_000:
|
# TODO: 临时取消限制,后续恢复
|
||||||
return JSONResponse(status_code=200, content={
|
# if len(raw) > 1_000_000:
|
||||||
"code": 1006, "message": "文件超出 1 MB 限制",
|
# return JSONResponse(status_code=200, content={
|
||||||
"request_id": f"gw-{_uuid.uuid4().hex[:8]}", "data": None,
|
# "code": 1006, "message": "文件超出 1 MB 限制",
|
||||||
})
|
# "request_id": f"gw-{_uuid.uuid4().hex[:8]}", "data": None,
|
||||||
|
# })
|
||||||
img_bytes = raw
|
img_bytes = raw
|
||||||
elif image_base64:
|
elif image_base64:
|
||||||
b64 = image_base64
|
b64 = image_base64
|
||||||
|
|||||||
Executable
+19
@@ -0,0 +1,19 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# 重启网关 + worker 服务
|
||||||
|
set -e
|
||||||
|
|
||||||
|
cd "$(dirname "$0")"
|
||||||
|
|
||||||
|
echo "=== 重启网关 ==="
|
||||||
|
sudo systemctl restart hair-gateway
|
||||||
|
sudo systemctl status hair-gateway --no-pager -l | head -8
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== 网关池状态 ==="
|
||||||
|
sleep 3
|
||||||
|
curl -s http://127.0.0.1:8080/gateway-health 2>/dev/null || echo "⚠ 网关未就绪"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== 重启 worker(GPU 机)==="
|
||||||
|
echo "如需重启 GPU worker,请登录 GPU 机器执行:"
|
||||||
|
echo " sudo systemctl restart hair"
|
||||||
@@ -61,7 +61,7 @@
|
|||||||
<body>
|
<body>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<h1>🔬 接口4 — 用户特征分析 测试</h1>
|
<h1>🔬 接口4 — 用户特征分析 测试</h1>
|
||||||
<p class="subtitle">POST /api/v1/face/features | 上传照片 → 火山方舟豆包视觉模型 → 42项面部特征 | data.features 为 JSON 字符串</p>
|
<p class="subtitle">POST /api/v1/face/features | 上传照片 → AI视觉模型 → 42项面部特征 | data.features 为 JSON 字符串</p>
|
||||||
|
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
@@ -70,7 +70,7 @@
|
|||||||
<button class="btn btn-primary" id="submitBtn" onclick="submitTest()">🚀 分析特征</button>
|
<button class="btn btn-primary" id="submitBtn" onclick="submitTest()">🚀 分析特征</button>
|
||||||
<button class="btn btn-outline btn-sm" onclick="clearResults()">清除</button>
|
<button class="btn btn-outline btn-sm" onclick="clearResults()">清除</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="hint">JPG/PNG ≤1MB 正面照 | 调用火山方舟豆包视觉模型,耗时约数秒</div>
|
<div class="hint">JPG/PNG 正面照 | 调用AI视觉模型,耗时约数秒</div>
|
||||||
<div id="statusBar" class="status hidden"></div>
|
<div id="statusBar" class="status hidden"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -123,11 +123,10 @@ function setStatus(t, type) { const b=$('statusBar'); b.textContent=t; b.classNa
|
|||||||
async function submitTest() {
|
async function submitTest() {
|
||||||
const f = $('imageFile').files[0];
|
const f = $('imageFile').files[0];
|
||||||
if (!f) { setStatus('请选择图片', 'error'); return; }
|
if (!f) { setStatus('请选择图片', 'error'); return; }
|
||||||
if (f.size > 1_000_000) { setStatus('文件超过 1 MB', 'error'); return; }
|
|
||||||
|
|
||||||
$('imgPreview').innerHTML = '<img src="'+URL.createObjectURL(f)+'" alt="preview">';
|
$('imgPreview').innerHTML = '<img src="'+URL.createObjectURL(f)+'" alt="preview">';
|
||||||
$('submitBtn').disabled = true; $('submitBtn').textContent = '⏳ 分析中...';
|
$('submitBtn').disabled = true; $('submitBtn').textContent = '⏳ 分析中...';
|
||||||
setStatus('⏳ 调用豆包视觉模型...', 'info'); $('resultsArea').classList.add('hidden');
|
setStatus('⏳ 调用AI视觉模型...', 'info'); $('resultsArea').classList.add('hidden');
|
||||||
|
|
||||||
const fd = new FormData(); fd.append('image_file', f);
|
const fd = new FormData(); fd.append('image_file', f);
|
||||||
try {
|
try {
|
||||||
|
|||||||
Reference in New Issue
Block a user