智能体大模型接口全面切换 + 新增视觉智能体
- 全部 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: 任务描述支持  图片注入(视觉任务直接派活) - API: POST /api/workers/<id>/vision_test;前端 Worker 页新增🖼️视觉测试按钮 - 实测: 截图结构化分析 ✅ 雪羊图片识别 ✅ 辩论模式DeepSeek 55秒完成
This commit is contained in:
@@ -263,6 +263,35 @@ def worker_test(wid):
|
||||
return jsonify({'ok': False, 'error': str(e)})
|
||||
|
||||
|
||||
@app.route('/api/workers/<int:wid>/vision_test', methods=['POST'])
|
||||
@require_auth
|
||||
def worker_vision_test(wid):
|
||||
"""视觉智能体能力测试:传入图片(URL 或 base64)与问题,验证多模态理解"""
|
||||
w = db.q('SELECT * FROM workers WHERE id=?', (wid,), one=True)
|
||||
if not w:
|
||||
return jsonify({'ok': False, 'error': '不存在'}), 404
|
||||
d = request.get_json(force=True)
|
||||
image_url = (d.get('image_url') or '').strip()
|
||||
image_b64 = (d.get('image_base64') or '').strip()
|
||||
question = (d.get('question') or '请描述这张图片的内容').strip()
|
||||
if not image_url and not image_b64:
|
||||
return jsonify({'ok': False, 'error': '请提供图片 URL 或 base64 数据'}), 400
|
||||
try:
|
||||
if image_b64:
|
||||
r = llm_gateway.chat_vision(
|
||||
w['provider'], w['model'], question, image_url=f'data:image/png;base64,{image_b64}',
|
||||
temperature=0.3, max_tokens=w['max_tokens'] or 2000,
|
||||
base_url=w['base_url'] or None, api_key=w['api_key'] or None)
|
||||
else:
|
||||
r = llm_gateway.chat_vision(
|
||||
w['provider'], w['model'], question, image_url=image_url,
|
||||
temperature=0.3, max_tokens=w['max_tokens'] or 2000,
|
||||
base_url=w['base_url'] or None, api_key=w['api_key'] or None)
|
||||
return jsonify({'ok': True, 'data': r})
|
||||
except Exception as e:
|
||||
return jsonify({'ok': False, 'error': str(e)})
|
||||
|
||||
|
||||
@app.route('/api/providers')
|
||||
@require_auth
|
||||
def providers():
|
||||
@@ -273,7 +302,7 @@ def providers():
|
||||
'has_key': bool(v['api_key']),
|
||||
'models': [m for m in config.MODEL_PRICING.keys() if m.startswith(
|
||||
{'doubao': 'doubao', 'deepseek': 'deepseek', 'openai': 'gpt',
|
||||
'qwen': 'qwen', 'vllm': ''}.get(k, '__none__'))],
|
||||
'qwen': 'qwen', 'vllm': '', 'autodl': 'qwen3'}.get(k, '__none__'))],
|
||||
})
|
||||
return jsonify({'ok': True, 'data': data})
|
||||
|
||||
@@ -1119,8 +1148,8 @@ def template_apply(tid):
|
||||
pid, ids = tplmod.apply_project_template(t, variables, worker_id)
|
||||
return jsonify({'ok': True, 'kind': 'project', 'id': pid, 'task_ids': ids})
|
||||
if t['type'] == 'team':
|
||||
ids = tplmod.apply_team_template(t, variables, provider=d.get('provider', 'doubao'),
|
||||
model=d.get('model', 'doubao-seed-evolving'))
|
||||
ids = tplmod.apply_team_template(t, variables, provider=d.get('provider', 'deepseek'),
|
||||
model=d.get('model', 'deepseek-v4-flash'))
|
||||
return jsonify({'ok': True, 'kind': 'team', 'ids': ids})
|
||||
return jsonify({'ok': False, 'error': '未知模板类型'}), 400
|
||||
except Exception as e:
|
||||
|
||||
Reference in New Issue
Block a user