fix(engine): 非中/西语轮注入 other 语言提醒——英文漂中文镜像修复(Task 11 对向)
历史护栏: 中文/西语会话纯拉丁轮不注入(护住 Task 11 场景);wall other 为 可选变体(存量快照/auto/生成器回退 DEFAULT_WALL,引擎部署即全租户生效) Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -61,6 +61,14 @@ _REMINDER_VARIANTS = {
|
||||
"cc_guide": ("echo", "ask"),
|
||||
"email_light": ("en", "zh"),
|
||||
}
|
||||
# 可选变体键(在场则同规校验,缺省合法): language_follow.other = 非中/西语
|
||||
# 方向的当轮语言强制(2026-11-03 英文漂中文修复——此前该方向无任何当轮
|
||||
# 提醒,中文语境+短英文查询整轮漂中文)。存量墙(auto seed/生成器产出/
|
||||
# 生产 DB 快照)无此键,运行期由 _lang_note_for 回退 DEFAULT_WALL 文案;
|
||||
# 绝不能并入必填——否则新代码编译旧快照即炸全部租户运行时。
|
||||
_OPTIONAL_REMINDER_VARIANTS: dict[str, tuple[str, ...]] = {
|
||||
"language_follow": ("other",),
|
||||
}
|
||||
_CC_TEMPLATE_VARIANTS = {
|
||||
"ask": ("en", "zh", "es"),
|
||||
"wall": ("en", "zh", "es"),
|
||||
@@ -152,24 +160,29 @@ def _validate_template(template: str, label: str) -> None:
|
||||
|
||||
|
||||
def _str_mapping(sub, label: str, required: tuple[str, ...],
|
||||
*, template: bool = False) -> dict[str, str]:
|
||||
*, template: bool = False,
|
||||
optional: tuple[str, ...] = ()) -> dict[str, str]:
|
||||
"""一层 str 映射校验(no_contact 各键/reminders 各类变体/cc_templates 各组)。
|
||||
|
||||
template=True 时额外干跑 .format() 校验占位符(conversation.py 运行期
|
||||
回填的字段才需要;no_contact 为纯文本,不校验)。"""
|
||||
回填的字段才需要;no_contact 为纯文本,不校验)。optional 键缺省合法、
|
||||
在场则与必填同规校验(_OPTIONAL_REMINDER_VARIANTS 消费)。"""
|
||||
if not isinstance(sub, dict):
|
||||
raise _err(f"{label}: 必须为映射(缺类别或类型错误)")
|
||||
legal = tuple(required) + tuple(optional)
|
||||
out: dict[str, str] = {}
|
||||
for key in required:
|
||||
for key in legal:
|
||||
val = sub.get(key)
|
||||
if key in optional and val is None:
|
||||
continue # 可选键缺省合法
|
||||
if not isinstance(val, str) or not val:
|
||||
raise _err(f"{label}.{key}: 缺非空字符串")
|
||||
if template:
|
||||
_validate_template(val, f"{label}.{key}")
|
||||
out[key] = val
|
||||
for key in sub:
|
||||
if key not in required:
|
||||
raise _err(f"{label}.{key}: 未知变体键(合法: {', '.join(required)})")
|
||||
if key not in legal:
|
||||
raise _err(f"{label}.{key}: 未知变体键(合法: {', '.join(legal)})")
|
||||
return out
|
||||
|
||||
|
||||
@@ -199,7 +212,8 @@ def compile_wall(cfg: dict) -> CompiledWall:
|
||||
if not isinstance(cfg["reminders"], dict):
|
||||
raise _err("reminders: 必须为映射")
|
||||
reminders = {cat: _str_mapping(cfg["reminders"].get(cat), f"reminders.{cat}",
|
||||
variants, template=True)
|
||||
variants, template=True,
|
||||
optional=_OPTIONAL_REMINDER_VARIANTS.get(cat, ()))
|
||||
for cat, variants in _REMINDER_VARIANTS.items()}
|
||||
extra = set(cfg["reminders"]) - set(_REMINDER_VARIANTS)
|
||||
if extra:
|
||||
|
||||
Reference in New Issue
Block a user