feat: 大模型配置添加思考模式和视觉能力属性
- 数据库 llm_configs 表新增 enable_thinking 和 enable_vision 字段 - 后台管理界面大模型列表显示思考模式/视觉能力状态 - 添加/编辑大模型配置支持设置这两个能力开关 - 前端配置API返回LLM能力信息 - 对话界面根据能力显示或隐藏深度思考按钮 - 对话界面根据能力显示或隐藏上传图片选项 - 不支持视觉能力时上传图片提示用户等待升级 enable_thinking: 控制深度思考功能可用性 enable_vision: 控制图片分析功能可用性
This commit is contained in:
@@ -46,6 +46,8 @@ def init_db():
|
||||
model TEXT NOT NULL,
|
||||
max_tokens INTEGER DEFAULT 2048,
|
||||
temperature REAL DEFAULT 0.7,
|
||||
enable_thinking INTEGER DEFAULT 0,
|
||||
enable_vision INTEGER DEFAULT 0,
|
||||
is_default INTEGER DEFAULT 0,
|
||||
is_active INTEGER DEFAULT 1,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
@@ -53,6 +55,16 @@ def init_db():
|
||||
)
|
||||
''')
|
||||
|
||||
# 兼容旧数据库:添加缺失的字段
|
||||
try:
|
||||
cursor.execute('ALTER TABLE llm_configs ADD COLUMN enable_thinking INTEGER DEFAULT 0')
|
||||
except:
|
||||
pass
|
||||
try:
|
||||
cursor.execute('ALTER TABLE llm_configs ADD COLUMN enable_vision INTEGER DEFAULT 0')
|
||||
except:
|
||||
pass
|
||||
|
||||
# 智能体配置表
|
||||
cursor.execute('''
|
||||
CREATE TABLE IF NOT EXISTS agents (
|
||||
@@ -601,10 +613,11 @@ def add_llm_config():
|
||||
conn = get_db()
|
||||
cursor = conn.cursor()
|
||||
cursor.execute('''
|
||||
INSERT INTO llm_configs (name, provider, api_url, api_key, model, max_tokens, temperature)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?)
|
||||
INSERT INTO llm_configs (name, provider, api_url, api_key, model, max_tokens, temperature, enable_thinking, enable_vision)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
''', (data['name'], data['provider'], data['api_url'], data['api_key'],
|
||||
data['model'], data.get('max_tokens', 2048), data.get('temperature', 0.7)))
|
||||
data['model'], data.get('max_tokens', 2048), data.get('temperature', 0.7),
|
||||
data.get('enable_thinking', 0), data.get('enable_vision', 0)))
|
||||
conn.commit()
|
||||
config_id = cursor.lastrowid
|
||||
conn.close()
|
||||
@@ -619,9 +632,10 @@ def update_llm_config(id):
|
||||
cursor = conn.cursor()
|
||||
cursor.execute('''
|
||||
UPDATE llm_configs SET name=?, provider=?, api_url=?, api_key=?, model=?,
|
||||
max_tokens=?, temperature=?, updated_at=CURRENT_TIMESTAMP WHERE id=?
|
||||
max_tokens=?, temperature=?, enable_thinking=?, enable_vision=?, updated_at=CURRENT_TIMESTAMP WHERE id=?
|
||||
''', (data['name'], data['provider'], data['api_url'], data['api_key'],
|
||||
data['model'], data.get('max_tokens', 2048), data.get('temperature', 0.7), id))
|
||||
data['model'], data.get('max_tokens', 2048), data.get('temperature', 0.7),
|
||||
data.get('enable_thinking', 0), data.get('enable_vision', 0), id))
|
||||
conn.commit()
|
||||
conn.close()
|
||||
return jsonify({'success': True})
|
||||
|
||||
@@ -414,8 +414,9 @@ async function loadLLMPage(content) {
|
||||
<th>名称</th>
|
||||
<th>提供商</th>
|
||||
<th>模型</th>
|
||||
<th>思考模式</th>
|
||||
<th>视觉能力</th>
|
||||
<th>API URL</th>
|
||||
<th>状态</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -425,8 +426,9 @@ async function loadLLMPage(content) {
|
||||
<td>${c.name} ${c.is_default ? '<span class="default-badge">默认</span>' : ''}</td>
|
||||
<td>${c.provider}</td>
|
||||
<td>${c.model}</td>
|
||||
<td>${c.enable_thinking ? '✅ 支持' : '❌ 不支持'}</td>
|
||||
<td>${c.enable_vision ? '✅ 支持' : '❌ 不支持'}</td>
|
||||
<td style="max-width: 200px; overflow: hidden; text-overflow: ellipsis;">${c.api_url}</td>
|
||||
<td>${c.is_active ? '✅ 启用' : '❌ 禁用'}</td>
|
||||
<td>
|
||||
<div class="action-btns">
|
||||
<button class="action-btn edit" onclick="showEditLLMModal(${c.id})">编辑</button>
|
||||
@@ -477,6 +479,18 @@ function showAddLLMModal() {
|
||||
<label class="form-label">Temperature</label>
|
||||
<input type="number" class="form-input" id="llmTemperature" value="0.7" step="0.1">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label style="display: flex; align-items: center; gap: 8px;">
|
||||
<input type="checkbox" id="llmEnableThinking"> 支持思考模式(深度思考)
|
||||
</label>
|
||||
<span style="color: #999; font-size: 12px;">模型是否支持原生思考功能(如DeepSeek的think标签)</span>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label style="display: flex; align-items: center; gap: 8px;">
|
||||
<input type="checkbox" id="llmEnableVision"> 支持视觉能力(图片分析)
|
||||
</label>
|
||||
<span style="color: #999; font-size: 12px;">模型是否支持图片输入和分析</span>
|
||||
</div>
|
||||
<button class="form-submit" onclick="saveLLM()">保存</button>
|
||||
`);
|
||||
}
|
||||
@@ -519,6 +533,18 @@ function showEditLLMModal(id) {
|
||||
<label class="form-label">Temperature</label>
|
||||
<input type="number" class="form-input" id="llmTemperature" value="${config.temperature}" step="0.1">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label style="display: flex; align-items: center; gap: 8px;">
|
||||
<input type="checkbox" id="llmEnableThinking" ${config.enable_thinking ? 'checked' : ''}> 支持思考模式(深度思考)
|
||||
</label>
|
||||
<span style="color: #999; font-size: 12px;">模型是否支持原生思考功能(如DeepSeek的think标签)</span>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label style="display: flex; align-items: center; gap: 8px;">
|
||||
<input type="checkbox" id="llmEnableVision" ${config.enable_vision ? 'checked' : ''}> 支持视觉能力(图片分析)
|
||||
</label>
|
||||
<span style="color: #999; font-size: 12px;">模型是否支持图片输入和分析</span>
|
||||
</div>
|
||||
<button class="form-submit" onclick="updateLLM(${id})">保存</button>
|
||||
`);
|
||||
}
|
||||
@@ -531,7 +557,9 @@ async function saveLLM() {
|
||||
api_key: document.getElementById('llmApiKey').value,
|
||||
model: document.getElementById('llmModel').value,
|
||||
max_tokens: parseInt(document.getElementById('llmMaxTokens').value),
|
||||
temperature: parseFloat(document.getElementById('llmTemperature').value)
|
||||
temperature: parseFloat(document.getElementById('llmTemperature').value),
|
||||
enable_thinking: document.getElementById('llmEnableThinking').checked ? 1 : 0,
|
||||
enable_vision: document.getElementById('llmEnableVision').checked ? 1 : 0
|
||||
};
|
||||
|
||||
if (!data.name || !data.api_url || !data.api_key || !data.model) {
|
||||
@@ -553,7 +581,9 @@ async function updateLLM(id) {
|
||||
api_key: document.getElementById('llmApiKey').value,
|
||||
model: document.getElementById('llmModel').value,
|
||||
max_tokens: parseInt(document.getElementById('llmMaxTokens').value),
|
||||
temperature: parseFloat(document.getElementById('llmTemperature').value)
|
||||
temperature: parseFloat(document.getElementById('llmTemperature').value),
|
||||
enable_thinking: document.getElementById('llmEnableThinking').checked ? 1 : 0,
|
||||
enable_vision: document.getElementById('llmEnableVision').checked ? 1 : 0
|
||||
};
|
||||
|
||||
await fetchAPI(`/api/admin/llm/${id}`, 'PUT', data);
|
||||
|
||||
Reference in New Issue
Block a user