diff --git a/main_v2.py b/main_v2.py index 4bb09dd..e9f6cdc 100644 --- a/main_v2.py +++ b/main_v2.py @@ -120,6 +120,8 @@ async def get_providers(db: Session = Depends(get_db)): "default_model": p.default_model, "supports_thinking": p.supports_thinking, "thinking_model": p.thinking_model, + "supports_vision": p.supports_vision, + "vision_model": p.vision_model, "max_tokens": p.max_tokens, "temperature": p.temperature, "is_active": p.is_active, diff --git a/models_v2.py b/models_v2.py index 833cfba..ffbdd07 100644 --- a/models_v2.py +++ b/models_v2.py @@ -32,6 +32,10 @@ class LLMProvider(Base): supports_thinking = Column(Boolean, default=False) # 是否原生支持思考 thinking_model = Column(String(100), nullable=True) # 思考模式模型名(如有单独模型) + # 视觉能力支持 + supports_vision = Column(Boolean, default=False) # 是否支持图片理解(多模态) + vision_model = Column(String(100), nullable=True) # 视觉模型名(如与默认模型不同) + # 配额和限制 max_tokens = Column(Integer, default=4096) temperature = Column(Float, default=0.7) diff --git a/templates/admin_v2/index.html b/templates/admin_v2/index.html index 724603f..82ee5b4 100644 --- a/templates/admin_v2/index.html +++ b/templates/admin_v2/index.html @@ -58,8 +58,8 @@
- - + +
名称API地址默认模型思考支持状态操作
加载中...
名称API地址默认模型思考视觉状态操作
加载中...
@@ -162,6 +162,8 @@

思考功能
+
视觉能力
+
启用后可上传图片让AI识别分析内容
@@ -274,6 +276,7 @@ tbody.innerHTML = providersData.map(p => ` ${p.name}${p.api_base||'-'}${p.default_model||'auto'} ${p.supports_thinking?'支持':'不支持'} + ${p.supports_vision?'支持':'不支持'} ${p.is_active?'启用':'禁用'} @@ -290,6 +293,8 @@ document.getElementById('provider-form').reset(); document.getElementById('provider-id').value = ''; document.getElementById('provider-active').checked = true; + document.getElementById('provider-supports-thinking').checked = false; + document.getElementById('provider-supports-vision').checked = false; document.getElementById('provider-models-preview').innerHTML = ''; document.getElementById('provider-test-result').innerHTML = ''; new bootstrap.Modal(document.getElementById('providerModal')).show(); @@ -310,6 +315,8 @@ document.getElementById('provider-active').checked = p.is_active; document.getElementById('provider-supports-thinking').checked = p.supports_thinking; document.getElementById('provider-thinking-model').value = p.thinking_model || ''; + document.getElementById('provider-supports-vision').checked = p.supports_vision; + document.getElementById('provider-vision-model').value = p.vision_model || ''; new bootstrap.Modal(document.getElementById('providerModal')).show(); } @@ -326,7 +333,9 @@ description: document.getElementById('provider-description').value, is_active: document.getElementById('provider-active').checked, supports_thinking: document.getElementById('provider-supports-thinking').checked, - thinking_model: document.getElementById('provider-thinking-model').value + thinking_model: document.getElementById('provider-thinking-model').value, + supports_vision: document.getElementById('provider-supports-vision').checked, + vision_model: document.getElementById('provider-vision-model').value }; const res = await fetch(id ? `/api/v2/providers/${id}` : '/api/v2/providers', { method: id ? 'PUT' : 'POST', headers: {'Content-Type':'application/json'}, body: JSON.stringify(data) }); const result = await res.json(); diff --git a/uploads/images/1776134549_0c993820.jpeg b/uploads/images/1776134549_0c993820.jpeg new file mode 100644 index 0000000..dcfdf43 Binary files /dev/null and b/uploads/images/1776134549_0c993820.jpeg differ diff --git a/uploads/images/1776134674_10f77dae.png b/uploads/images/1776134674_10f77dae.png new file mode 100644 index 0000000..46ddf5c Binary files /dev/null and b/uploads/images/1776134674_10f77dae.png differ