feat: default LLM for report regen, job report_config, and API defaults

Made-with: Cursor
This commit is contained in:
hub-gif 2026-04-14 13:28:18 +08:00
parent 48ed337310
commit 134faffbe8
3 changed files with 30 additions and 11 deletions

View File

@ -168,11 +168,11 @@ def get_default_report_config() -> dict[str, Any]:
"""与 ``jd_competitor_report`` 模块常量一致的默认报告调参(供前端回填)。""" """与 ``jd_competitor_report`` 模块常量一致的默认报告调参(供前端回填)。"""
jcr, _ = _jd_crawler_modules() jcr, _ = _jd_crawler_modules()
return { return {
"llm_comment_sentiment": False, "llm_comment_sentiment": True,
"llm_section_bridges": False, "llm_section_bridges": True,
"llm_matrix_group_summaries": False, "llm_matrix_group_summaries": True,
"llm_comment_group_summaries": False, "llm_comment_group_summaries": True,
"llm_price_group_summaries": False, "llm_price_group_summaries": True,
"comment_focus_words": list(jcr.COMMENT_FOCUS_WORDS), "comment_focus_words": list(jcr.COMMENT_FOCUS_WORDS),
"comment_scenario_groups": [ "comment_scenario_groups": [
{"label": lbl, "triggers": list(trs)} {"label": lbl, "triggers": list(trs)}

View File

@ -144,6 +144,11 @@ class JobListCreateView(APIView):
ser = CreatePipelineJobSerializer(data=request.data) ser = CreatePipelineJobSerializer(data=request.data)
ser.is_valid(raise_exception=True) ser.is_valid(raise_exception=True)
data = ser.validated_data data = ser.validated_data
raw_rc = data.get("report_config")
if not isinstance(raw_rc, dict) or raw_rc == {}:
report_config_initial = get_default_report_config()
else:
report_config_initial = raw_rc
job = PipelineJob.objects.create( job = PipelineJob.objects.create(
platform=data["platform"], platform=data["platform"],
keyword=data["keyword"], keyword=data["keyword"],
@ -157,7 +162,7 @@ class JobListCreateView(APIView):
request_delay=data.get("request_delay") or "", request_delay=data.get("request_delay") or "",
list_pages=data.get("list_pages") or "", list_pages=data.get("list_pages") or "",
scenario_filter_enabled=data.get("scenario_filter_enabled"), scenario_filter_enabled=data.get("scenario_filter_enabled"),
report_config=data.get("report_config") or {}, report_config=report_config_initial,
status=JobStatus.PENDING, status=JobStatus.PENDING,
) )
t = threading.Thread(target=execute_job, args=(job.id,), daemon=True) t = threading.Thread(target=execute_job, args=(job.id,), daemon=True)

View File

@ -11,6 +11,8 @@ import { useReportConfigForm } from '../../composables/useReportConfigForm'
const { jobs } = useJobs() const { jobs } = useJobs()
const selectedId = ref('') const selectedId = ref('')
/** 勾选则本次重新生成不走整篇大模型合并(仍先跑规则引擎落盘) */
const useRulesOnly = ref(false)
const regenErr = ref('') const regenErr = ref('')
const genInFlight = generationInFlightKey() const genInFlight = generationInFlightKey()
const REGEN_PREFIX = 'regenerate-report:' const REGEN_PREFIX = 'regenerate-report:'
@ -156,7 +158,9 @@ async function regenerateReport() {
try { try {
const r = await api(`/api/jobs/${id}/regenerate-report/`, { const r = await api(`/api/jobs/${id}/regenerate-report/`, {
method: 'POST', method: 'POST',
body: JSON.stringify({ generator: 'rules' }), body: JSON.stringify({
generator: useRulesOnly.value ? 'rules' : 'llm',
}),
}) })
const text = await r.text() const text = await r.text()
if (!r.ok) { if (!r.ok) {
@ -210,12 +214,18 @@ watch(
<section class="ma-card"> <section class="ma-card">
<h2>分析报告生成</h2> <h2>分析报告生成</h2>
<p class="hint-top"> <p class="hint-top">
选择<strong>已成功</strong>的任务调整下方统计规则后点保存以上设置再点重新生成报告本页<strong>始终按规则引擎</strong>更新 选择<strong>已成功</strong>的任务调整下方统计规则后点保存以上设置再点重新生成报告默认<strong>先规则引擎</strong>写出统计稿<strong>合并大模型补充</strong>需网关与密钥不重新爬取各章评价解读等开关由填入推荐示例高级 JSON中的
<code>competitor_analysis.md</code>统计图与表格不重新爬取若需大模型整篇稿或 §8.2 等开关请用高级 JSON写入对应字段后保存或通过 API 调用 <code>llm_*</code> 字段控制
阅读与下载请至 阅读与下载请至
<RouterLink to="/jd/analysis-view">报告查看</RouterLink> <RouterLink to="/jd/analysis-view">报告查看</RouterLink>
</p> </p>
<div class="toolbar">
<label class="chk-inline chk-rules-only">
<input v-model="useRulesOnly" type="checkbox" />
本次仅用规则引擎跳过整篇大模型合并更快不调 LLM 全文接口
</label>
</div>
<div class="toolbar"> <div class="toolbar">
<label class="sel-label">任务</label> <label class="sel-label">任务</label>
<select v-model="selectedId" class="job-select"> <select v-model="selectedId" class="job-select">
@ -280,8 +290,8 @@ watch(
<p class="rc-help"> <p class="rc-help">
打开时会根据上面表单生成内容改完后点写回表单再保存可在此加入 打开时会根据上面表单生成内容改完后点写回表单再保存可在此加入
<code>llm_comment_sentiment</code><code>llm_section_bridges</code><code>llm_matrix_group_summaries</code> <code>llm_comment_sentiment</code><code>llm_section_bridges</code><code>llm_matrix_group_summaries</code>
等布尔字段须为 <code>true</code>/<code>false</code>重新生成整篇大模型稿需调接口 等布尔字段须为 <code>true</code>/<code>false</code>页顶重新生成报告默认已使用
<code>POST /regenerate-report/</code> body <code>"generator":"llm"</code> <code>generator:&quot;llm&quot;</code>若只要规则稿请勾选本次仅用规则引擎
</p> </p>
<textarea v-model="advancedJsonText" class="report-config-editor" rows="10" spellcheck="false" /> <textarea v-model="advancedJsonText" class="report-config-editor" rows="10" spellcheck="false" />
<button type="button" class="ma-btn ma-btn-secondary rc-add" @click="applyAdvancedJsonToForm"> JSON 写回表单</button> <button type="button" class="ma-btn ma-btn-secondary rc-add" @click="applyAdvancedJsonToForm"> JSON 写回表单</button>
@ -319,6 +329,10 @@ watch(
gap: 0.75rem; gap: 0.75rem;
margin-bottom: 0.5rem; margin-bottom: 0.5rem;
} }
.chk-rules-only {
width: auto;
max-width: 100%;
}
.chk-inline { .chk-inline {
display: flex; display: flex;
align-items: flex-start; align-items: flex-start;