chore: opencode冗余清理 + LLM任务级模型选择 + systemd服务化
- 删除 opencode_search.py / mcp_search_server.py 及所有 MCP 引用 - 移除搜索缓存定时任务(scheduled_refresh_search_cache) - 清理前后端所有 opencode/MCP 代码和注释 - LLM 提供商量换:opencode-go→nvidia(默认)+sensenova(合规审查) - llm_configs 新增 is_default 字段,API 层互斥逻辑 - 所有定时任务支持独立 LLM 模型选择(LLM_TASK_PROVIDER env) - compliance_optimizer.py 修复:import os / 解硬编码 / 关键词过滤 - Scheduler 日志修复:始终 INSERT,避免僵尸 running 行 - Systemd 服务化:Restart=always / 单 worker / Type=exec - 搜索提供商:替换 opencode→360/搜狗/微信(免 Key) - 更新 AGENTS.md / PROGRESS.md
This commit is contained in:
@@ -136,10 +136,15 @@
|
||||
</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="is_active" label="状态" width="90">
|
||||
<el-table-column prop="is_active" label="状态" width="80">
|
||||
<template #default="scope">
|
||||
<el-tag v-if="scope.row.is_active" type="success" size="small" effect="dark">当前使用</el-tag>
|
||||
<el-tag v-else type="info" size="small">未启用</el-tag>
|
||||
<el-tag v-if="scope.row.is_active" type="success" size="small" effect="dark">启用</el-tag>
|
||||
<el-tag v-else type="info" size="small">停用</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="is_default" label="默认" width="70">
|
||||
<template #default="scope">
|
||||
<el-tag v-if="scope.row.is_default" type="warning" size="small" effect="dark">默认</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="系统提示词" min-width="150">
|
||||
@@ -556,7 +561,6 @@
|
||||
<el-col :span="12"> <el-form-item label="类型">
|
||||
<el-select v-model="searchProviderForm.provider_type" style="width:100%">
|
||||
<el-option label="百度千帆" value="baidu"></el-option>
|
||||
<el-option label="opencode云搜索" value="mcp"></el-option>
|
||||
<el-option label="360搜索" value="360"></el-option>
|
||||
<el-option label="搜狗搜索" value="sogou"></el-option>
|
||||
<el-option label="微信搜一搜" value="wechat"></el-option>
|
||||
@@ -623,7 +627,8 @@
|
||||
</el-row>
|
||||
<el-row :gutter="16">
|
||||
<el-col :span="12"><el-form-item label="最大Token"><el-input-number v-model="llmConfigForm.max_tokens" :min="1" :max="999999" style="width:100%"/></el-form-item></el-col>
|
||||
<el-col :span="12"><el-form-item label="激活"><el-switch v-model="llmConfigForm.is_active"/></el-form-item></el-col>
|
||||
<el-col :span="6"><el-form-item label="激活"><el-switch v-model="llmConfigForm.is_active"/></el-form-item></el-col>
|
||||
<el-col :span="6"><el-form-item label="默认"><el-switch v-model="llmConfigForm.is_default"/></el-form-item></el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="16">
|
||||
<el-col :span="24"><el-form-item label="系统提示词"><el-input type="textarea" v-model="llmConfigForm.system_prompt" :rows="3" placeholder="你是一个专业的内容创作助手。"/></el-form-item></el-col>
|
||||
@@ -706,7 +711,7 @@ const llmConfigs = ref([]);
|
||||
const llmConfigsLoading = ref(false);
|
||||
const llmConfigDialogVisible = ref(false);
|
||||
const llmConfigDialogTitle = ref('新增 LLM 配置');
|
||||
const llmConfigForm = reactive({ id: null, name: '', system_prompt: '', user_prompt_template: '', temperature: 0.7, max_tokens: 131072, model: '', provider: 'opencode-go', base_url: '', api_key: '', is_active: true });
|
||||
const llmConfigForm = reactive({ id: null, name: '', system_prompt: '', user_prompt_template: '', temperature: 0.7, max_tokens: 131072, model: '', provider: 'opencode-go', base_url: '', api_key: '', is_active: true, is_default: false });
|
||||
const editingLLMConfigId = ref(null);
|
||||
const loadLLMConfigs = async () => {
|
||||
llmConfigsLoading.value = true;
|
||||
@@ -721,7 +726,7 @@ const llmConfigs = ref([]);
|
||||
llmConfigDialogTitle.value = '新增配置'; editingLLMConfigId.value = null;
|
||||
llmConfigForm.id = null; llmConfigForm.name = ''; llmConfigForm.provider = 'sensenova'; llmConfigForm.model = 'deepseek-v4-flash';
|
||||
llmConfigForm.base_url = 'https://token.sensenova.cn/v1'; llmConfigForm.api_key = ''; llmConfigForm.temperature = 0.3;
|
||||
llmConfigForm.max_tokens = 4000; llmConfigForm.system_prompt = ''; llmConfigForm.user_prompt_template = ''; llmConfigForm.is_active = true;
|
||||
llmConfigForm.max_tokens = 4000; llmConfigForm.system_prompt = ''; llmConfigForm.user_prompt_template = ''; llmConfigForm.is_active = true; llmConfigForm.is_default = false;
|
||||
}
|
||||
llmConfigDialogVisible.value = true;
|
||||
};
|
||||
@@ -1101,12 +1106,12 @@ const llmConfigs = ref([]);
|
||||
});
|
||||
|
||||
const defaultProvider = computed(() => {
|
||||
const sorted = [...llmConfigs.value].filter(x => x.is_active).sort((a, b) => a.id - b.id);
|
||||
return sorted.length ? sorted[0].provider : '-';
|
||||
const d = [...llmConfigs.value].filter(x => x.is_default);
|
||||
return d.length ? d[0].provider : '-';
|
||||
});
|
||||
const defaultModel = computed(() => {
|
||||
const sorted = [...llmConfigs.value].filter(x => x.is_active).sort((a, b) => a.id - b.id);
|
||||
return sorted.length ? sorted[0].model : '-';
|
||||
const d = [...llmConfigs.value].filter(x => x.is_default);
|
||||
return d.length ? d[0].model : '-';
|
||||
});
|
||||
const complianceProvider = computed(() => {
|
||||
const c = [...llmConfigs.value].filter(x => x.is_active && x.model === 'deepseek-v4-flash');
|
||||
|
||||
Reference in New Issue
Block a user