"""发布编排:知识变更后的下游缓存「自然失效」(T-P2-10 的入口)。 运营后台是唯一有「发布 / 撤稿」动作的地方,因此失效编排长在这里而不是 service 层:``KbService``/``RuleService`` 管状态机,跨域的缓存联动(规则缓存 + 检索缓存)是应用层的编排职责。T-P2-10 要求的「发布后自然失效」——顾问点 发布,检索立刻能看见新知识,不需要任何人记得去刷缓存。 """ from __future__ import annotations from packages.retrieval import service as retrieval_service from packages.rules import service as rules_service from packages.shared.logging import get_logger logger = get_logger(__name__) #: 落地后必须让下游缓存失效的目标状态:``published`` 让新知识对检索可见, #: ``archived`` 让旧知识从检索消失——两个方向都是线上知识集合的真实变更。 #: (依据 ``packages.retrieval.service.invalidate_cache`` 的契约:「发布/归档 #: 知识后调用」。) CACHE_AFFECTING_TARGETS: frozenset[str] = frozenset({"published", "archived"}) def invalidate_downstream_caches(*, domain: str, key: str, target: str) -> None: """规则进程内缓存 + 检索结果缓存整体失效。 - 规则缓存:``RuleService.publish/archive`` 内部已会失效一次,这里显式 再调是编排契约的一部分(实体发布同样要失效规则缓存——实体变更可能 改变规则命中的知识基础),幂等无副作用; - 检索缓存:当前是失效版本号桩,T14 会在背后接真正的进程内缓存实现, 调用点无需再改。 """ rules_service.invalidate_published_cache() retrieval_service.invalidate_cache() logger.info("admin_knowledge_invalidated", domain=domain, key=key, target=target)