文档修改

This commit is contained in:
董宏凯 committed 2026-05-19 13:00:40 +08:00
1 parent b8adefbb88
commit 294d06f22b
9 files changed
+83 -3

No files matched your search

@@ -40,6 +40,8 @@ class StartWritingRequest(BaseModel):
target_audience: str = "普通读者"
word_count_target: int = 800
model_name: str = ""
# 素材检索关键词数量:用户指定用几个关键词检索(1~10,默认 6)
keyword_count: int = 6
class StartWritingResponse(BaseModel):
@@ -230,6 +232,8 @@ async def start_writing(body: StartWritingRequest, request: Request):
"article_type": body.article_type,
"target_audience": body.target_audience,
"word_count_target": body.word_count_target,
# 规整到 [1, 10],非法值回退默认 6
"keyword_count": max(1, min(10, body.keyword_count)),
"revision_count": 0,
"max_revisions": 3,
"status": "researching",
@@ -20,6 +20,19 @@ logger = logging.getLogger(__name__)
_MAX_MATERIALS = 12
# 素材检索关键词数量边界:用户可指定 1~10 个,非法值回退默认 6
_DEFAULT_KEYWORD_COUNT = 6
_MAX_KEYWORD_COUNT = 10
def _resolve_keyword_count(raw: object) -> int:
"""把用户传入的检索关键词数量规整到 [1, _MAX_KEYWORD_COUNT],非法值回退默认 6。"""
try:
n = int(raw) # type: ignore[arg-type]
except (TypeError, ValueError):
return _DEFAULT_KEYWORD_COUNT
return max(1, min(_MAX_KEYWORD_COUNT, n))
def _notice(title: str, detail: str, raw: str = "") -> dict:
"""构造一个非致命告警事件,前端在时间线显示「标题 + 真实原因」,不打断写作流程。
@@ -41,6 +54,9 @@ async def researcher_node(state: AIWritingState, config: RunnableConfig) -> dict
intervention = state.get("last_user_intervention") or {}
extra_keywords: list[str] = intervention.get("_extra_keywords") or intervention.get("extra_keywords") or []
# 用户指定的检索关键词数量(1~10),决定生成多少个检索词、检索多少个方向
keyword_count = _resolve_keyword_count(state.get("keyword_count"))
# SSE 实时进度推送(与 outline/draft 节点共用 sse_queue 机制)
cfg = config.get("configurable", {})
sse_queue = cfg.get("sse_queue")
@@ -68,6 +84,7 @@ async def researcher_node(state: AIWritingState, config: RunnableConfig) -> dict
user_intent=intent,
article_type=article_type,
target_audience=target_audience,
keyword_count=keyword_count,
),
fallback={"keywords": [intent]},
config=config,
@@ -80,7 +97,11 @@ async def researcher_node(state: AIWritingState, config: RunnableConfig) -> dict
# Step 2: 并发搜索
provider = get_search_provider(ai_writing_config)
search_keywords = keywords[:6]
# 按用户指定的关键词数量截断;补充搜索时不截断用户额外添加的关键词
search_limit = keyword_count
if extra_keywords:
search_limit = max(search_limit, len(keywords))
search_keywords = keywords[:search_limit]
total = len(search_keywords)
await _emit(f"检索词已生成,开始检索 {total} 个方向…")
@@ -3,7 +3,7 @@ EXTRACT_KEYWORDS_SYSTEM = """你是一名专业情报研究员(素材收集专
你的工作背景:你在一家权威媒体机构任职,熟悉各类信息源的可信度评估。
你只能做以下事情:
1. 从写作意图中提取 3-6 个搜索关键词
1. 从写作意图中按要求的数量提取搜索关键词
你不能写文章,不能评价内容好坏,只做关键词提取。
【严禁思考】
@@ -25,7 +25,8 @@ EXTRACT_KEYWORDS_USER = """写作意图:{user_intent}
文章类型:{article_type}
目标读者:{target_audience}
请提取 3-6 个搜索关键词,用于搜集相关素材。只输出 JSON:
请提取 {keyword_count} 个搜索关键词,用于搜集相关素材。
关键词数量必须为 {keyword_count} 个,不多不少。只输出 JSON:
{{"keywords": ["关键词1", "关键词2"]}}"""
RANK_MATERIALS_SYSTEM = """你是一名专业情报研究员(素材收集专家)。
@@ -84,6 +84,8 @@ class AIWritingState(TypedDict):
article_type: str
target_audience: str
word_count_target: int
# 素材检索关键词数量(用户指定,1~10,默认 6)
keyword_count: int
# Agent A 输出
material_package: Optional[MaterialPackage]