智能体大模型接口全面切换 + 新增视觉智能体

- 全部 AI Worker 切换到 deepseek/deepseek-v4-flash(api.deepseek.com,实测757ms/次,成本降40倍)
- 团队模板默认 provider/model 同步改为 deepseek/deepseek-v4-flash
- 新增视觉智能体「视觉分析师」:autodl/qwen3.6-plus 多模态
- llm_gateway: chat_vision 多模态调用(URL/base64) + 空content自动重试 + 聚合后端路由容错
- engine: 任务描述支持 ![图](url) 图片注入(视觉任务直接派活)
- API: POST /api/workers/<id>/vision_test;前端 Worker 页新增🖼️视觉测试按钮
- 实测: 截图结构化分析  雪羊图片识别  辩论模式DeepSeek 55秒完成
This commit is contained in:
2026-08-12 13:22:56 +08:00
parent 8bae953d7d
commit dc49864af4
6 changed files with 138 additions and 10 deletions
+22
View File
@@ -623,6 +623,7 @@ async function pageWorkers() {
<td class="mono">${w.task_cost_limit ? '单任务 ¥' + w.task_cost_limit : '—'}<br>${w.monthly_cost_limit ? '月 ¥' + w.monthly_cost_limit : ''}</td>
<td><span class="badge ${w.status === 'enabled' ? 'st-done' : 'st-cancelled'}">${w.status === 'enabled' ? '启用' : '停用'}</span></td>
<td><button class="btn sm" onclick="testWorker(${w.id})">测试</button>
<button class="btn sm" onclick="visionTest(${w.id})">🖼️ 视觉测试</button>
<button class="btn sm" onclick="openWorkerModal(${JSON.stringify(w).replace(/"/g,'&quot;')}, ${JSON.stringify(ps.data).replace(/"/g,'&quot;')})">编辑</button>
<button class="btn sm danger" onclick="delWorker(${w.id})">删除</button></td>
</tr>`).join('') || '<tr><td colspan="9" class="empty">还没有 Worker,注册第一个虚拟员工吧</td></tr>'}
@@ -636,6 +637,27 @@ async function testWorker(wid) {
catch (e) { toast('❌ ' + e.message, 'err'); }
}
async function visionTest(wid) {
openModal(`
<h3>🖼️ 视觉能力测试</h3>
<div class="tab-note">多模态智能体:输入图片 URL 与问题,验证图像理解能力。示例:<br>
https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Cat03.jpg/640px-Cat03.jpg</div>
<label>图片 URL</label><input id="vt-url" placeholder="https://...">
<label>问题</label><textarea id="vt-q" rows="2">请描述这张图片的内容,并给出专业分析。</textarea>
<button class="btn primary" id="vt-go">🚀 开始分析</button>
<div id="vt-out" style="margin-top:10px"></div>`);
$('#vt-go').addEventListener('click', async () => {
const url = $('#vt-url').value.trim();
if (!url) return toast('请填写图片 URL', 'err');
$('#vt-out').innerHTML = '<div class="tab-note"><span class="spin"></span> 视觉分析中(多模态调用约 10-60 秒)…</div>';
try {
const r = await api(`/api/workers/${wid}/vision_test`, {method:'POST', body: {image_url: url, question: $('#vt-q').value}});
$('#vt-out').innerHTML = `<pre style="white-space:pre-wrap;background:#f6f8fa;padding:10px;border-radius:8px;max-height:320px;overflow:auto">${esc(r.data.text)}</pre>
<div class="tab-note">tokens ${r.data.total_tokens} · 成本 ${fmtMoney(r.data.cost)} · 延迟 ${r.data.latency_ms ?? '—'}ms</div>`;
} catch (e) { $('#vt-out').innerHTML = `<div class="err">${esc(e.message)}</div>`; }
});
}
async function delWorker(wid) {
if (!confirm('确认删除该 Worker?(历史任务将解除指派)')) return;
await api(`/api/workers/${wid}`, {method:'DELETE'});