fix: add LLM config status display + routing info
- 状态列: icon → el-tag 文字标签(当前使用/未启用) - 新增路由状态提示条, 显示默认 vs 审查固定路由 - 移动端卡片同样改为文字标签
This commit is contained in:
@@ -106,6 +106,14 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-if="activeTab === 'llmconfigs'">
|
<div v-if="activeTab === 'llmconfigs'">
|
||||||
|
<div style="margin-bottom:12px;padding:10px 16px;background:#f0f9eb;border-radius:6px;border:1px solid #e1f3d8;font-size:13px;display:flex;align-items:center;gap:8px;flex-wrap:wrap">
|
||||||
|
<span>🤖 LLM 路由:</span>
|
||||||
|
<el-tag type="success" size="small" effect="dark" v-for="c in llmConfigs.filter(x=>x.is_active)" :key="c.id">{{ c.provider }} ({{ c.model }})</el-tag>
|
||||||
|
<span style="color:#999">← 默认(趋势/采集/创作)</span>
|
||||||
|
<span style="margin:0 4px;color:#ccc">|</span>
|
||||||
|
<el-tag type="warning" size="small" effect="dark">opencode-go (deepseek-v4-flash)</el-tag>
|
||||||
|
<span style="color:#999">← 合规审查固定</span>
|
||||||
|
</div>
|
||||||
<div class="toolbar">
|
<div class="toolbar">
|
||||||
<el-button type="primary" size="small" @click="showLLMConfigDialog()">新增配置</el-button>
|
<el-button type="primary" size="small" @click="showLLMConfigDialog()">新增配置</el-button>
|
||||||
</div>
|
</div>
|
||||||
@@ -128,10 +136,10 @@
|
|||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="temperature" label="温度" width="70"></el-table-column>
|
<el-table-column prop="temperature" label="温度" width="70"></el-table-column>
|
||||||
<el-table-column prop="max_tokens" label="最大Token" width="100"></el-table-column>
|
<el-table-column prop="max_tokens" label="最大Token" width="100"></el-table-column>
|
||||||
<el-table-column prop="is_active" label="激活" width="60">
|
<el-table-column prop="is_active" label="状态" width="90">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-icon v-if="scope.row.is_active" style="color:#67C23A;"><IconCheck /></el-icon>
|
<el-tag v-if="scope.row.is_active" type="success" size="small" effect="dark">当前使用</el-tag>
|
||||||
<el-icon v-else style="color:#F56C6C;"><IconClose /></el-icon>
|
<el-tag v-else type="info" size="small">未启用</el-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="系统提示词" min-width="150">
|
<el-table-column label="系统提示词" min-width="150">
|
||||||
@@ -151,7 +159,7 @@
|
|||||||
<div class="card-row"><span class="card-label">供应商</span><span class="card-value">{{ item.provider }}</span></div>
|
<div class="card-row"><span class="card-label">供应商</span><span class="card-value">{{ item.provider }}</span></div>
|
||||||
<div class="card-row"><span class="card-label">模型</span><span class="card-value">{{ item.model }}</span></div>
|
<div class="card-row"><span class="card-label">模型</span><span class="card-value">{{ item.model }}</span></div>
|
||||||
<div class="card-row"><span class="card-label">温度/最大Token</span><span class="card-value">{{ item.temperature }} / {{ item.max_tokens }}</span></div>
|
<div class="card-row"><span class="card-label">温度/最大Token</span><span class="card-value">{{ item.temperature }} / {{ item.max_tokens }}</span></div>
|
||||||
<div class="card-row"><span class="card-label">激活</span><span class="card-value">{{ item.is_active ? '是' : '否' }}</span></div>
|
<div class="card-row"><span class="card-label">状态</span><span class="card-value"><el-tag v-if="item.is_active" type="success" size="small" effect="dark">当前使用</el-tag><el-tag v-else type="info" size="small">未启用</el-tag></span></div>
|
||||||
<div class="card-actions">
|
<div class="card-actions">
|
||||||
<el-button size="small" @click="showLLMConfigDialog(item)">编辑</el-button>
|
<el-button size="small" @click="showLLMConfigDialog(item)">编辑</el-button>
|
||||||
<el-button size="small" type="danger" @click="deleteLLMConfig(item.id)">删除</el-button>
|
<el-button size="small" type="danger" @click="deleteLLMConfig(item.id)">删除</el-button>
|
||||||
@@ -865,7 +873,7 @@ const llmConfigs = ref([]);
|
|||||||
catch (e) { if (e !== 'cancel') ElMessage.error('删除失败: ' + e.message); }
|
catch (e) { if (e !== 'cancel') ElMessage.error('删除失败: ' + e.message); }
|
||||||
};
|
};
|
||||||
|
|
||||||
const logType = ref('creator');
|
const logType = ref('');
|
||||||
const logTypes = ref([]);
|
const logTypes = ref([]);
|
||||||
const users = ref([]);
|
const users = ref([]);
|
||||||
const usersLoading = ref(false);
|
const usersLoading = ref(false);
|
||||||
@@ -919,20 +927,12 @@ const llmConfigs = ref([]);
|
|||||||
const loadLogTypes = async () => {
|
const loadLogTypes = async () => {
|
||||||
try {
|
try {
|
||||||
logTypes.value = await api.get('/api/admin/task-logs/log-types');
|
logTypes.value = await api.get('/api/admin/task-logs/log-types');
|
||||||
logTypes.value.unshift({ module_id: 'creator', name: '创作日志', log_file: 'creator' });
|
|
||||||
logTypes.value.unshift({ module_id: 'optimizer', name: '审查日志', log_file: 'optimizer' });
|
|
||||||
logTypes.value.unshift({ module_id: 'research', name: '研究日志', log_file: 'research' });
|
|
||||||
logTypes.value.unshift({ module_id: 'outline', name: '大纲日志', log_file: 'outline' });
|
|
||||||
logTypes.value.unshift({ module_id: 'writer', name: '写作日志', log_file: 'writer' });
|
|
||||||
logTypes.value.unshift({ module_id: 'publisher', name: '发布日志', log_file: 'publisher' });
|
|
||||||
logTypes.value.unshift({ module_id: 'collector', name: '收集日志', log_file: 'collector' });
|
|
||||||
logTypes.value.unshift({ module_id: 'trends', name: '趋势日志', log_file: 'trends' });
|
|
||||||
} catch (e) { console.error('加载日志类型失败:', e); }
|
} catch (e) { console.error('加载日志类型失败:', e); }
|
||||||
};
|
};
|
||||||
const fetchLogs = async () => {
|
const fetchLogs = async () => {
|
||||||
logsLoading.value = true;
|
logsLoading.value = true;
|
||||||
try {
|
try {
|
||||||
const module = logTypes.value.find(t => t.name === logType.value);
|
const module = logTypes.value.find(t => t.module_id === logType.value);
|
||||||
const logFile = module ? module.log_file : logType.value;
|
const logFile = module ? module.log_file : logType.value;
|
||||||
const resp = await fetch(`/api/system/logs/${logDate.value}?log_type=${logFile}`, {
|
const resp = await fetch(`/api/system/logs/${logDate.value}?log_type=${logFile}`, {
|
||||||
headers: { 'Authorization': `Bearer ${localStorage.getItem('authToken')}` }
|
headers: { 'Authorization': `Bearer ${localStorage.getItem('authToken')}` }
|
||||||
|
|||||||
Reference in New Issue
Block a user