feat: 提示词和 AI 参数移至数据库管理

- AiSetting 模型新增 6 个提示词字段 + 3 个阶段温度字段
- main.py 迁移逻辑改为检测 ai_settings 表的新字段并填充默认值
- generate.py 从数据库读取生成提示词,去掉硬编码
- optimizer 从 API 读取各阶段提示词和温度,删除 prompts.py
- crawler 从 API 读取提取/改写提示词和温度,删除 prompts.py
- settings/active 端点去掉 token 认证(供爬虫/优化器使用)
- 后台设置页新增提示词编辑区和温度调节控件
- 新增 _ensure_default_settings 自动创建默认配置
This commit is contained in:
bwstudio
2026-06-13 17:27:09 +08:00
parent 6d015bb56d
commit db8cea02f8
11 changed files with 457 additions and 195 deletions
+105 -3
View File
@@ -2,10 +2,10 @@
<div class="setting-page">
<h2>AI 配置</h2>
<!-- AI 配置表单 -->
<!-- AI 基础配置 -->
<el-card style="margin-top: 20px">
<template #header>
<span>AI 配置</span>
<span>API 基础配置</span>
</template>
<el-form :model="form" label-width="120px">
<el-form-item label="提供商">
@@ -57,6 +57,81 @@
</el-form>
</el-card>
<!-- 提示词配置 -->
<el-card style="margin-top: 20px">
<template #header>
<span>提示词模板</span>
</template>
<el-form :model="form" label-width="140px">
<el-form-item label="AI 生成笑话">
<el-input
v-model="form.generate_prompt"
type="textarea"
:rows="6"
placeholder="使用 {context}/{style}/{length_requirement} 作为占位符"
style="width: 100%"
/>
</el-form-item>
<el-divider />
<el-form-item label="优化器-质量检测">
<el-input
v-model="form.optimizer_quality_prompt"
type="textarea"
:rows="4"
style="width: 100%"
/>
</el-form-item>
<el-form-item label="质量检测温度">
<el-input-number v-model="form.optimizer_quality_temperature" :min="0" :max="2" :step="0.1" />
</el-form-item>
<el-divider />
<el-form-item label="优化器-润色">
<el-input
v-model="form.optimizer_polish_prompt"
type="textarea"
:rows="4"
style="width: 100%"
/>
</el-form-item>
<el-form-item label="润色温度">
<el-input-number v-model="form.optimizer_polish_temperature" :min="0" :max="2" :step="0.1" />
</el-form-item>
<el-divider />
<el-form-item label="优化器-评价分类">
<el-input
v-model="form.optimizer_evaluate_prompt"
type="textarea"
:rows="4"
style="width: 100%"
/>
</el-form-item>
<el-form-item label="评价温度">
<el-input-number v-model="form.optimizer_evaluate_temperature" :min="0" :max="2" :step="0.1" />
</el-form-item>
<el-divider />
<el-form-item label="爬虫-提取笑话">
<el-input
v-model="form.crawler_extract_prompt"
type="textarea"
:rows="4"
style="width: 100%"
/>
</el-form-item>
<el-form-item label="爬虫-改写">
<el-input
v-model="form.crawler_rewrite_prompt"
type="textarea"
:rows="4"
style="width: 100%"
/>
</el-form-item>
</el-form>
</el-card>
<div style="margin-top: 20px">
<el-button type="primary" @click="handleSave" :loading="saving">保存配置</el-button>
</div>
@@ -106,6 +181,15 @@ const form = ref({
crawl_enabled: false,
crawl_keywords: '冷笑话,段子,谐音梗',
max_pages_per_run: 3,
generate_prompt: '',
optimizer_quality_prompt: '',
optimizer_polish_prompt: '',
optimizer_evaluate_prompt: '',
optimizer_quality_temperature: 0.3,
optimizer_polish_temperature: 0.8,
optimizer_evaluate_temperature: 0.3,
crawler_extract_prompt: '',
crawler_rewrite_prompt: '',
})
const allSettings = ref([])
@@ -126,6 +210,15 @@ const loadData = async () => {
crawl_enabled: active.crawl_enabled,
crawl_keywords: active.crawl_keywords || '',
max_pages_per_run: active.max_pages_per_run,
generate_prompt: active.generate_prompt || '',
optimizer_quality_prompt: active.optimizer_quality_prompt || '',
optimizer_polish_prompt: active.optimizer_polish_prompt || '',
optimizer_evaluate_prompt: active.optimizer_evaluate_prompt || '',
optimizer_quality_temperature: active.optimizer_quality_temperature ?? 0.3,
optimizer_polish_temperature: active.optimizer_polish_temperature ?? 0.8,
optimizer_evaluate_temperature: active.optimizer_evaluate_temperature ?? 0.3,
crawler_extract_prompt: active.crawler_extract_prompt || '',
crawler_rewrite_prompt: active.crawler_rewrite_prompt || '',
}
} catch (e) {
// 没有激活配置,使用默认值
@@ -147,7 +240,7 @@ const handleSave = async () => {
} else {
const created = await createSetting(form.value)
editingId.value = created.id
await toggleSetting(created.id) // 设为激活
await toggleSetting(created.id)
ElMessage.success('创建并激活成功')
}
await loadData()
@@ -170,6 +263,15 @@ const handleEdit = (row) => {
crawl_enabled: row.crawl_enabled,
crawl_keywords: row.crawl_keywords || '',
max_pages_per_run: row.max_pages_per_run,
generate_prompt: row.generate_prompt || '',
optimizer_quality_prompt: row.optimizer_quality_prompt || '',
optimizer_polish_prompt: row.optimizer_polish_prompt || '',
optimizer_evaluate_prompt: row.optimizer_evaluate_prompt || '',
optimizer_quality_temperature: row.optimizer_quality_temperature ?? 0.3,
optimizer_polish_temperature: row.optimizer_polish_temperature ?? 0.8,
optimizer_evaluate_temperature: row.optimizer_evaluate_temperature ?? 0.3,
crawler_extract_prompt: row.crawler_extract_prompt || '',
crawler_rewrite_prompt: row.crawler_rewrite_prompt || '',
}
}