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 @@
思考功能
+
视觉能力
+
@@ -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