""" Redis 键名拼装。 本文件职责:所有 Redis key 必须带 REDIS_KEY_PREFIX,避免与现网 ytd:prod: 冲突。 说明:Redis 的「db1」是连接 URL 里的数字库号(/1),不是库名; 可读业务名靠前缀 inquiry_robot:(见 prompt/14、13)。 禁止:写入 checkpoint / 六态 / Worker 全局单例锁键。 """ from __future__ import annotations def normalize_prefix(prefix: str) -> str: """ 规范化前缀:去掉首尾空白,确保以冒号结尾便于拼接。 例:inquiry_robot → inquiry_robot: """ p = (prefix or "").strip() if not p: return "inquiry_robot:" return p if p.endswith(":") else f"{p}:" def join_key(prefix: str, *parts: str) -> str: """ 拼完整 key:{prefix}{part1}:{part2}:… 参数 parts 不得包含前缀本身;空段丢弃。 """ base = normalize_prefix(prefix) segs = [str(p).strip(":") for p in parts if p is not None and str(p).strip() != ""] if not segs: return base.rstrip(":") return base + ":".join(segs) # 约定后缀(骨架);正式业务可扩展,勿改成无前缀的裸键 STREAM_LLM = "stream:llm" STREAM_RECOGNITION = "stream:recognition" STREAM_PDF = "stream:pdf" STREAM_ARCHIVE = "stream:archive" STREAM_WAKE = "stream:wake" IDEMPOTENCY = "idem" RATE_LIMIT = "ratelimit" TOKEN_WECOM = "token:wecom" TOKEN_WSHOTO = "token:wshoto" TOKEN_COPY_TICKET = "token:copy_ticket" TOKEN_JSAPI = "token:jsapi" # 微盛查询游标(本前缀下的 last_seq,不是现网官方 SDK 消费游标) WSHOTO_LAST_SEQ = "wshoto:last_seq" WSHOTO_ROOMS = "wshoto:rooms" WSHOTO_ROOM_TICKET = "wshoto:room_ticket" # Worker 出完报价文件后写给 HTTP:短协调,不当六态 QUOTE_FILE_READY = "quote_file_ready" # 产品刚报价、等选「在TMS上改 / 不用TMS」:短协调,不当六态 PENDING_PRODUCT_QUOTE = "pending_product_quote" # 陆运核对卡已出、等确定查价:短协调,不当六态、不当工单号 PENDING_LAND_CONFIRM = "pending_land_confirm" # 空运/海运/陆运当前书签:HTTP 与 Worker 共用,不当六态 FLOW_BOOKMARK = "flow_bookmark" # 私聊图片波次:HTTP 与 Worker 必须共用,不当六态 IMAGE_WAVE = "image_wave" IMAGE_WAVE_TEXT = "image_wave_text" # 私聊附件等材料波次:HTTP 发卡/H5 与 Worker 识别共用,不当六态 ATTACH_WAVE = "attach_wave" # 附件字节短交接:HTTP 收文件、Worker 识别读,TTL 与等待票一致,不当六态 ATTACH_BLOB = "attach_blob" # 空运群同一句:BOT 与存档补听去重,不当六态 AIR_INBOUND_MSG = "air_inbound_msg" AIR_INBOUND_TEXT = "air_inbound_text"