"""灵台引擎薄封装(Python 宿主接入,ADR-016)。 - 懒初始化进程级单例;初始化或调用失败一律抛 LingtaiUnavailable, 由调用方 fail closed(禁止在宿主内用第二实现降级)。 - 仅做类型转换与错误映射,不缓存权威状态、不复制业务语义。 """ import json import threading from typing import Any import lingtai _lock = threading.Lock() _engine: lingtai.LingtaiEngine | None = None class LingtaiUnavailable(RuntimeError): """引擎缺失、初始化失败或调用失败:依赖方必须显式失败。""" def get_engine() -> lingtai.LingtaiEngine: global _engine with _lock: if _engine is None: try: _engine = lingtai.LingtaiEngine() except Exception as exc: # nanobind LingtaiError 等 raise LingtaiUnavailable(f"灵台引擎初始化失败:{exc}") from exc return _engine def reset_engine() -> None: """测试辅助:丢弃单例,下次访问重新初始化。""" global _engine with _lock: _engine = None def transform_markdown(text: str) -> dict[str, Any]: """Markdown → canonical ContentBlock(dict:parser_version + blocks)。""" try: engine = get_engine() except LingtaiUnavailable: raise try: raw = engine.transform_markdown(text) except Exception as exc: raise LingtaiUnavailable(f"灵台引擎调用失败:{exc}") from exc parsed: dict[str, Any] = json.loads(raw) for block in parsed["blocks"]: block.setdefault("id", None) return parsed def transform_version() -> str: return str(lingtai.transform_version())