From 7e98d7dc52abd184e3ab1fa11ae625a1b7790e4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E5=AE=8F=E5=87=AF?= Date: Thu, 21 May 2026 17:37:39 +0800 Subject: [PATCH] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=8F=82=E6=95=B0=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- offline-backend-20260512/backend/config.yaml | 2 +- .../agents/ai_writing/nodes/_utils.py | 25 +++++++++++++++++++ .../agents/ai_writing/nodes/editor.py | 5 ++-- .../agents/ai_writing/nodes/researcher.py | 5 ++-- 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/offline-backend-20260512/backend/config.yaml b/offline-backend-20260512/backend/config.yaml index 2a5ff772..4d1e66b4 100644 --- a/offline-backend-20260512/backend/config.yaml +++ b/offline-backend-20260512/backend/config.yaml @@ -202,4 +202,4 @@ memory: ai_writing: keyword_model: deepseek-chat # 检索词生成专用模型,留空回退写作主模型 rank_model: deepseek-chat # 素材排序专用模型,留空回退写作主模型 - max_materials: 50 # 合并去重后的素材总量上限,范围 [1, 100],默认 20 + max_materials: 20 # 合并去重后的素材总量上限,范围 [1, 100],默认 20 diff --git a/offline-backend-20260512/backend/packages/harness/deerflow/agents/ai_writing/nodes/_utils.py b/offline-backend-20260512/backend/packages/harness/deerflow/agents/ai_writing/nodes/_utils.py index 25236c99..4a6ff0fa 100644 --- a/offline-backend-20260512/backend/packages/harness/deerflow/agents/ai_writing/nodes/_utils.py +++ b/offline-backend-20260512/backend/packages/harness/deerflow/agents/ai_writing/nodes/_utils.py @@ -15,6 +15,31 @@ from langchain_core.runnables import RunnableConfig logger = logging.getLogger(__name__) +def get_ai_writing_config() -> dict: + """读 ``config.yaml`` 的 ``ai_writing`` 段。 + + 阶段 7 之前由路由层 ``_make_config`` 把这份 dict 注入到 ``configurable.ai_writing_config`` + 给节点使用。阶段 7 删冗余后 ``_make_config`` 和注入路径全部消失(前端 ``stream.submit`` + 的 config 只传 ``model_name``)—— 节点改成自己直接从 ``get_app_config()`` 读,跨边界 + 更干净,``config.yaml`` 改完也不用重启前端 / 重发起会话。 + + 返回字段(按使用方): + - researcher:``keyword_model`` / ``rank_model`` / ``max_materials`` / + ``search_provider`` 等 + - editor:``pass_threshold`` + """ + try: + from deerflow.config import get_app_config + + aw = getattr(get_app_config(), "ai_writing", None) + if isinstance(aw, dict): + return aw + return dict(aw) if aw else {} + except Exception: + logger.exception("ai_writing: 读取 app config 失败,使用空配置") + return {} + + def safe_get_stream_writer(): """返回一个 stream writer callable;在没有 LangGraph runtime 上下文时退化成 no-op。 diff --git a/offline-backend-20260512/backend/packages/harness/deerflow/agents/ai_writing/nodes/editor.py b/offline-backend-20260512/backend/packages/harness/deerflow/agents/ai_writing/nodes/editor.py index 781c26ff..049bc178 100644 --- a/offline-backend-20260512/backend/packages/harness/deerflow/agents/ai_writing/nodes/editor.py +++ b/offline-backend-20260512/backend/packages/harness/deerflow/agents/ai_writing/nodes/editor.py @@ -11,7 +11,7 @@ from ..state import AIWritingState, ReviewResult, ReviewIssue from ..prompts.editor_prompts import ( EDITOR_SYSTEM, FACT_REVIEW_USER, LOGIC_REVIEW_USER, LANGUAGE_REVIEW_USER, ) -from ._utils import get_model, parse_json, _content_to_text, ThinkTagParser, safe_get_stream_writer +from ._utils import get_ai_writing_config, get_model, parse_json, _content_to_text, ThinkTagParser, safe_get_stream_writer logger = logging.getLogger(__name__) @@ -105,7 +105,8 @@ async def editor_node(state: AIWritingState, config: RunnableConfig) -> dict: cfg = config.get("configurable", {}) writer = safe_get_stream_writer() - ai_writing_config = cfg.get("ai_writing_config", {}) or {} + # 阶段 7 后从 app config 直接读,不走 configurable 注入 + ai_writing_config = get_ai_writing_config() pass_threshold = int(ai_writing_config.get("pass_threshold", _DEFAULT_PASS_THRESHOLD)) REVIEW_TASKS = [ diff --git a/offline-backend-20260512/backend/packages/harness/deerflow/agents/ai_writing/nodes/researcher.py b/offline-backend-20260512/backend/packages/harness/deerflow/agents/ai_writing/nodes/researcher.py index a3b4424a..25488e18 100644 --- a/offline-backend-20260512/backend/packages/harness/deerflow/agents/ai_writing/nodes/researcher.py +++ b/offline-backend-20260512/backend/packages/harness/deerflow/agents/ai_writing/nodes/researcher.py @@ -15,7 +15,7 @@ from ..prompts.researcher_prompts import ( EXTRACT_KEYWORDS_SYSTEM, EXTRACT_KEYWORDS_USER, RANK_MATERIALS_SYSTEM, RANK_MATERIALS_USER, ) -from ._utils import llm_json, safe_get_stream_writer +from ._utils import get_ai_writing_config, llm_json, safe_get_stream_writer logger = logging.getLogger(__name__) @@ -115,7 +115,8 @@ async def researcher_node(state: AIWritingState, config: RunnableConfig) -> dict # 素材收集专家专用模型:检索词生成 / 素材排序 可在 config.yaml 的 # ai_writing 段单独配置(keyword_model / rank_model),留空则回退写作主模型。 - ai_writing_config = cfg.get("ai_writing_config", {}) or {} + # 注:阶段 7 后这份配置由节点直接读 app config,不再走 configurable 注入。 + ai_writing_config = get_ai_writing_config() keyword_model: str | None = ai_writing_config.get("keyword_model") or None rank_model: str | None = ai_writing_config.get("rank_model") or None # 素材总量上限(config.yaml: ai_writing.max_materials),按检索词数均分到每个词