From 854427092deb47f0b92e1c48b9e0b2feeab1abe9 Mon Sep 17 00:00:00 2001 From: Sakurasan <26715255+Sakurasan@users.noreply.github.com> Date: Wed, 2 Sep 2026 13:49:52 +0800 Subject: [PATCH] =?UTF-8?q?remove:=20=E5=8E=BB=E6=8E=89=E4=BB=8A=E6=97=A5?= =?UTF-8?q?=E5=AE=9A=E8=B0=83=E6=91=98=E8=A6=81=EF=BC=88prompt=E4=B8=8D?= =?UTF-8?q?=E5=86=8D=E7=94=9F=E6=88=90=E3=80=81=E5=89=8D=E7=AB=AF=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E9=AB=98=E4=BA=AE=E6=A1=86=E3=80=81=E7=A9=BA=E6=A0=87?= =?UTF-8?q?=E9=A2=98=E5=8D=A1=E4=B8=8D=E6=B8=B2=E6=9F=93=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/services/ai_service.py | 15 +++------------ src/routes/ai-analysis.tsx | 19 +++++-------------- 2 files changed, 8 insertions(+), 26 deletions(-) diff --git a/backend/services/ai_service.py b/backend/services/ai_service.py index b73de82..3d08ccb 100644 --- a/backend/services/ai_service.py +++ b/backend/services/ai_service.py @@ -9,7 +9,6 @@ import asyncio import json -import re import traceback import httpx @@ -80,8 +79,7 @@ DAILY_ANALYSIS_PROMPT = """请对 {trade_date} 的A股市场进行收盘分析 REPORT_PARTS = [ """现在写报告的【第1部分】,只输出这一部分,直接输出 Markdown,不要任何开场白或说明: 1. 以 `# {title} A股收盘分析报告` 一级标题开头 -2. 标题后第一行输出定调引用块,格式严格为:`> 今日定调:<80字内核心结论,含1-2个关键数字>` -3. 写 `## 一、市场总览`(指数表格、涨跌统计须环比、市场温度)与 `## 二、题材热点分析`(涨幅前5、持续活跃、新兴热点、退潮警示、板块主力资金流TOP3) +2. 写 `## 一、市场总览`(指数表格、涨跌统计须环比、市场温度)与 `## 二、题材热点分析`(涨幅前5、持续活跃、新兴热点、退潮警示、板块主力资金流TOP3) 全文控制在1600字以内。""", """现在写报告的【第2部分】,只输出这一部分,直接输出 Markdown,不要重复之前内容: - `## 三、核心股追踪`(连板梯队完整表格:层级/股票/涨停原因/封单,首板挑3-5只人气股点评;核心股表现;龙头辨识) @@ -95,8 +93,6 @@ REPORT_PARTS = [ 全文控制在1900字以内。""", ] -# 报告头部的"今日定调"引用行,保存时提取为 summary -_TONE_LINE_RE = re.compile(r"^>\s*今日定调[::]\s*(.+)$", re.MULTILINE) async def _consume_sse(resp: httpx.Response) -> dict: @@ -302,13 +298,8 @@ async def collect_ai_analysis(trade_date: str) -> dict: def _extract_summary(content: str) -> str: - """提取报告头部的"今日定调"引用行作为摘要;缺失时退回正文截断""" - match = _TONE_LINE_RE.search(content or "") - if match: - text = match.group(1).strip() - if text: - return text[:200] - return (content or "")[:200].replace("\n", " ") + """摘要:正文截断前200字(供管理列表展示)""" + return (content or "")[:200].replace("\n", " ").strip() def _num(v) -> str: diff --git a/src/routes/ai-analysis.tsx b/src/routes/ai-analysis.tsx index 9d31320..4c89fcb 100644 --- a/src/routes/ai-analysis.tsx +++ b/src/routes/ai-analysis.tsx @@ -46,7 +46,7 @@ function colorizeChildren(children: React.ReactNode): React.ReactNode { }); } -/** 按 "## " 二级标题拆分报告为多张卡片;首段(# 标题 + 定调引用块)单独一张 */ +/** 按 "## " 二级标题拆分报告为多张卡片;首段(# 标题等)若无正文则不单独成卡 */ function splitReport(content: string): { intro: string; sections: { title: string; body: string }[] } { const parts = content.split(/\n(?=## )/); const sections = parts.slice(1).map((p) => { @@ -55,7 +55,10 @@ function splitReport(content: string): { intro: string; sections: { title: strin const body = nl === -1 ? "" : p.slice(nl + 1).trim(); return { title, body }; }); - return { intro: parts[0].trim(), sections }; + const intro = parts[0].trim(); + // intro 只剩标题(无其他内容)时置空,避免渲染一张只有大标题的空卡片 + const introBody = intro.replace(/^#[^\n]*$/m, "").trim(); + return { intro: introBody ? intro : "", sections }; } function AiAnalysisPage() { @@ -142,18 +145,6 @@ function AiAnalysisPage() { - {/* 今日定调摘要 */} - {report.summary && ( -
{report.summary}
-