任务#1671 产出(产品经理)

任务#1671 产出(产品经理)

> 自动落盘:2026-11-04 18:13

---

前置检索依据:命中文件 smoke_test.py(含 run_all_steps/check_imports)、m03_dialogue.py、intent_router.py;按骨架导入清单并实际调用各模块顶层函数。

【smoke_test.py】

import argparse
import logging
import sys
from pathlib import Path
from typing import List, Optional

from m03_dialogue import recognize_intent, select_response, log_interaction, respond
from intent_router import route
from script_lib import ScriptLibrary, get_script
from self_heal_supervisor import run_smoke, build_logger, load_module


logger = logging.getLogger(__name__)


def check_imports() -> bool:
    try:
        from m03_dialogue import recognize_intent, select_response, log_interaction, respond  # noqa
        from intent_router import route
        from script_lib import ScriptLibrary, get_script
        from self_heal_supervisor import run_smoke, build_logger, load_module
    except ImportError as exc:
        logger.error("import failed: %s", exc)
        return False
    return True


def _call_route() -> str:
    result = route(message="你好")
    if isinstance(result, dict):
        return result.get("intent", "unknown")
    return "ok"


def _call_recognize_intent() -> str:
    intent = recognize_intent(query="你好")
    return intent or "unknown"


def _call_select_response() -> str:
    reply = select_response(intent="greeting", context={})
    if isinstance(reply, dict):
        return reply.get("text", "") or ""
    return str(reply)


def _call_log_interaction() -> None:
    log_interaction(
        user_input="test",
        assistant_output="ok",
        intent="greeting",
        metadata={},
    )


def _call_respond() -> str:
    text = respond(
        message="你好",
        context={"user": "guest"},
        fallback="抱歉,暂时无法处理。",
    )
    if isinstance(text, dict):
        return text.get("text", "") or ""
    return str(text)


def _call_script_library() -> str:
    library = ScriptLibrary()
    entry = get_script(key="greeting")
    if not entry:
        raise ValueError("script entry is None")
    template = entry.get("template", "").format(
        greeting=entry.get("greeting", "你好"),
        name=entry.get("name", ""),
        offer=entry.get("offer", ""),
        closing=entry.get("closing", ""),
    )
    return template or ""


def _call_run_smoke() -> dict:
    smoke = run_smoke(
        modules=["m03_dialogue", "intent_router"],
        timeout=10,
        logger=None,
    )
    return smoke


def check_workspace():
    root = Path(__file__).resolve().parent.parent.resolve()
    for marker in ["requirements.txt"]:
        if not (root / marker).exists():
            raise FileNotFoundError(f"missing {marker} at {root}")


def _build_parser():
    parser = argparse.ArgumentParser(description="smoke test runner")
    parser.add_argument("--dry-run", action="store_true", help="only check imports")
    return parser


def run_all_steps(argv=None):
    args = _build_parser().parse_args(argv)
    if not check_imports():
        raise RuntimeError("import check failed")

    results: List[dict] = []

    def _capture(step_name, fn):
        try:
            out = fn()
            results.append({"step": step_name, "status": "ok", "result": str(out)[:200]})
        except Exception as exc:
            results.append({"step": step_name, "status": "error", "message": str(exc)})

    _capture("route", lambda: _call_route())
    _capture("recognize_intent", lambda: _call_recognize_intent())
    _capture("select_response", lambda: _call_select_response())
    _capture("log_interaction", lambda: _call_log_interaction())
    _capture("respond", lambda: _call_respond())
    _capture("script_library", lambda: _call_script_library())
    _capture("run_smoke", lambda: _call_run_smoke())

    if args.dry_run:
        return True

    check_workspace()

    for r in results:
        if r.get("status") == "error":
            logger.error("%s failed: %s", r["step"], r.get("message"))
        else:
            logger.info("%s ok: %s", r["step"], r.get("result"))
    return True


def main():
    logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s")
    try:
        ok = run_all_steps()
    except Exception as exc:
        logger.error("run failed: %s", exc)
        sys.exit(1)
    if not ok:
        sys.exit(1)


if __name__ == "__main__":
    main()

【README.md】

# 集成冒烟测试(m06)

## 运行命令

python m06_smoke_test.py


## 参数
- `--dry-run`:仅做 import 检查,不执行副作用。

## 依赖
- Python 3.10+
- 本项目已建模块(m03_dialogue、intent_router、script_lib、self_heal_supervisor)

## 说明
本脚本把“路由→意图识别→话术选择→日志记录→响应生成→脚本库调用”串成一条链路,并在末尾校验 workspace。若任一步抛异常,会在日志中打印原因并退出。