落地并存测服全端:智能体 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
+68
View File
@@ -0,0 +1,68 @@
"""
Graph 骨架自检:编译 + start_thread(Memory)+ 无 sender_id 拒绝。
用法(在 inquiry-agent 目录、已装依赖):
set CHECKPOINT_BACKEND=memory
python -m agent.graph.selftest
不连企微、不连主账;正式验收仍以真实企微事件为准。
"""
from __future__ import annotations
import logging
import os
import sys
logger = logging.getLogger(__name__)
def main() -> int:
logging.basicConfig(level=logging.INFO, format="%(levelname)s %(message)s")
# 自检强制内存,避免误连生产 PG
os.environ["CHECKPOINT_BACKEND"] = "memory"
os.environ.setdefault("YTD_ENV", "test")
from agent.config import get_settings
from agent.graph.runtime import GraphIdentityError, GraphRuntime, shutdown_graph_runtime
from agent.graph.wake import WorkerWakePayload
get_settings.cache_clear()
rt = GraphRuntime.create(get_settings())
try:
try:
rt.start_thread(sender_id="")
logger.error("预期应拒绝空 sender_id")
return 1
except GraphIdentityError:
logger.info("OK: 空 sender_id 已拒绝")
started = rt.start_thread(sender_id="selftest_user")
tid = started["thread_id"]
logger.info("OK: start_thread thread_id=%s", tid)
# 骨架:wake 需要已有 thread;写入 last_wake 后再 resume 一步
wake = WorkerWakePayload(
thread_id=tid,
inquiry_no="SELFTEST-001",
quote_version=1,
wait_version=0,
kind="recognition_done",
)
woken = rt.wake_from_worker(wake)
logger.info("OK: wake_from_worker kind=%s", woken["wake"]["kind"])
resumed = rt.resume_thread(thread_id=tid, sender_id="selftest_user")
logger.info("OK: resume_thread thread_id=%s", resumed["thread_id"])
logger.info(
"Graph 骨架自检通过 checkpoint_backend=%s",
rt.checkpoint.backend,
)
return 0
finally:
rt.close()
shutdown_graph_runtime()
if __name__ == "__main__":
sys.exit(main())