feat(api): 叙事 prompt、职业上下文、读路径章节、WS 解耦与错误脱敏

- 回忆录:事实边界补充允许清单;传记文体示例与 JSON 叙事要求对齐
- default 职业提示 occupation_context;cadre/military 退休语境
- GET 章节读路径零写入,prepare_chapter_read_view + markdown_for_response
- 文本归一抽到 core/text_normalize;移除弃用 reply 策略与 recompose_chapters_for_story
- ConversationService:WS 连接/用户段落/结束对话;对外错误固定文案
- 测试:HTTP 脱敏契约、章节读视图、occupation 与 background_voice
This commit is contained in:
Kevin
2026-04-01 11:49:33 +08:00
parent a5473e8fe2
commit 53d9e003af
28 changed files with 598 additions and 397 deletions

View File

@@ -2,24 +2,22 @@
from unittest.mock import patch
from app.features.memoir.oral_normalize import (
apply_oral_normalization_rules,
normalize_oral_for_memoir,
)
from app.core.text_normalize import apply_oral_rules
from app.features.memoir.oral_normalize import normalize_oral_for_memoir
def test_apply_rules_mei_kanshang_wo() -> None:
assert "没看上我" in apply_oral_normalization_rules("我去试镜了 美看上我 张伟")
assert "没看上我" in apply_oral_rules("我去试镜了 美看上我 张伟")
def test_apply_rules_mei_kanshang_ni() -> None:
assert apply_oral_normalization_rules("美看上你") == "没看上你"
assert apply_oral_rules("美看上你") == "没看上你"
def test_apply_rules_no_false_positive_rong() -> None:
"""「美容」等不应被误替换。"""
s = "我去了解美容项目"
assert apply_oral_normalization_rules(s) == s
assert apply_oral_rules(s) == s
def test_normalize_respects_global_off() -> None: