落地并存测服全端:智能体 Graph/路由、后台切 8180、主账与部署脚本齐备,便于线上重发与验收。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
linmianxun
2026-09-13 21:15:58 +08:00
co-authored by Cursor
parent 0eb1adecc8
commit 8103b3b651
143 changed files with 8968 additions and 277 deletions
@@ -0,0 +1,23 @@
"""
Graph 节点包:一阶段一文件。
本包只做编排占位;自然语言抽取、主账写、LibreOffice 不在本包实现。
"""
from agent.graph.nodes.adopt_adjust import node_adopt_adjust
from agent.graph.nodes.close_deal import node_close_deal
from agent.graph.nodes.collaborate import node_collaborate
from agent.graph.nodes.create_order import node_create_order
from agent.graph.nodes.generate_quote import node_generate_quote
from agent.graph.nodes.parse_clarify import node_parse_clarify
from agent.graph.nodes.query_quote import node_query_quote
__all__ = [
"node_parse_clarify",
"node_create_order",
"node_query_quote",
"node_collaborate",
"node_generate_quote",
"node_adopt_adjust",
"node_close_deal",
]
@@ -0,0 +1,23 @@
"""
节点:采用 / 调价(骨架)。
正式:卡片动作 + waitVersion 校验后调主账报价版本;本文件不写主账。
"""
from __future__ import annotations
import logging
from typing import Any
from agent.graph.state import InquiryGraphState
logger = logging.getLogger(__name__)
def node_adopt_adjust(state: InquiryGraphState) -> dict[str, Any]:
"""骨架:仅标记 phase=adopt_adjust。"""
logger.info(
"graph.node adopt_adjust thread_id=%s(骨架无采用/调价)",
state.get("thread_id") or "",
)
return {"phase": "adopt_adjust"}
@@ -0,0 +1,23 @@
"""
节点:成交 / 未成交收尾(骨架)。
正式:调主账闭环;图结束 ≠ 主账已成交。
"""
from __future__ import annotations
import logging
from typing import Any
from agent.graph.state import InquiryGraphState
logger = logging.getLogger(__name__)
def node_close_deal(state: InquiryGraphState) -> dict[str, Any]:
"""骨架:仅标记 phase=close_deal。"""
logger.info(
"graph.node close_deal thread_id=%s(骨架无闭环)",
state.get("thread_id") or "",
)
return {"phase": "close_deal"}
@@ -0,0 +1,23 @@
"""
节点:协同 / 群报价等待(骨架)。
正式:等群内报价或协同结果;用户文字不得冒充文件完成(wake 另走结构化载荷)。
"""
from __future__ import annotations
import logging
from typing import Any
from agent.graph.state import InquiryGraphState
logger = logging.getLogger(__name__)
def node_collaborate(state: InquiryGraphState) -> dict[str, Any]:
"""骨架:仅标记 phase=collaborate。"""
logger.info(
"graph.node collaborate thread_id=%s(骨架无协同)",
state.get("thread_id") or "",
)
return {"phase": "collaborate"}
@@ -0,0 +1,24 @@
"""
节点:建单准备(骨架)。
正式职责将是:调用主账建单 API;六态成功只认主账返回,图成功不能冒充。
本文件不写 MySQL、不直连 TMS。
"""
from __future__ import annotations
import logging
from typing import Any
from agent.graph.state import InquiryGraphState
logger = logging.getLogger(__name__)
def node_create_order(state: InquiryGraphState) -> dict[str, Any]:
"""骨架:仅标记 phase=create_order。"""
logger.info(
"graph.node create_order thread_id=%s(骨架无建单)",
state.get("thread_id") or "",
)
return {"phase": "create_order"}
@@ -0,0 +1,23 @@
"""
节点:报价文件生成等待(骨架)。
正式:等 Worker LibreOffice/对象存储完成后的结构化 wake;本节点不跑 soffice。
"""
from __future__ import annotations
import logging
from typing import Any
from agent.graph.state import InquiryGraphState
logger = logging.getLogger(__name__)
def node_generate_quote(state: InquiryGraphState) -> dict[str, Any]:
"""骨架:仅标记 phase=generate_quote。"""
logger.info(
"graph.node generate_quote thread_id=%s(骨架不转 PDF)",
state.get("thread_id") or "",
)
return {"phase": "generate_quote"}
@@ -0,0 +1,27 @@
"""
节点:解析 / 补问阶段(骨架)。
正式职责将是:触发字段合同检查与补问等待;本文件不抽字段、不调模型。
线程:仅在 Worker Graph 槽内执行,禁止占用企微回调线程。
"""
from __future__ import annotations
import logging
from typing import Any
from agent.graph.state import InquiryGraphState
logger = logging.getLogger(__name__)
def node_parse_clarify(state: InquiryGraphState) -> dict[str, Any]:
"""
骨架节点:标记 phase=parse_clarify,不产生业务副作用。
参数:当前 checkpoint 状态。
返回:状态增量(合并进 checkpoint)。
"""
thread_id = state.get("thread_id") or ""
logger.info("graph.node parse_clarify thread_id=%s(骨架无业务)", thread_id)
return {"phase": "parse_clarify"}
@@ -0,0 +1,23 @@
"""
节点:查价 / TMS 结果编排(骨架)。
正式:经主账查价;分类结果给人选择。禁止在本节点直连 TMS。
"""
from __future__ import annotations
import logging
from typing import Any
from agent.graph.state import InquiryGraphState
logger = logging.getLogger(__name__)
def node_query_quote(state: InquiryGraphState) -> dict[str, Any]:
"""骨架:仅标记 phase=query_quote。"""
logger.info(
"graph.node query_quote thread_id=%s(骨架无查价)",
state.get("thread_id") or "",
)
return {"phase": "query_quote"}