plan-aggregate.service.ts
36.1 KB
-
feat: 企微话术(深度档,一次性单块可复制)+ 话术面板改渠道 tab · fa96a613
═ 沿用了什么、没沿用什么 ═ 共用(直接 import,
⛔ 不复制):ScriptContext / buildRichFactBlock 患者事实块 / 安全护栏 forbiddenWordsBlock / 福利硬约束 / 自报家门占位 / 医生姓脱敏 / 人群 skills / composeSystem 装配 —— 与"用电话还是企微说"无关。 复制的代价是护栏两处,改了一处另一处悄悄留旧版,而漏了哪条要等客服已经发给患者才发现。 自己写(draft-wecom-script/): · schema:电话 sections[](伴飞逐段高亮要它)→ 企微单块 markdown · format.md:口语/分段/口头二选一 → 书面/断行/可复制即发 · verify 多一条⑤「可直接发送」(无小标题、无占位残留、无给客服看的话、 无"您现在方便吗"这类需对方当场回话的电话句式) · plan 步语义改成"排要点顺序"而非"拆几段" ═ 几个关键取舍 ═ · composeSystem 加 formatPath 覆盖参数,⛔ 不往 ScriptTier 里塞 'wecom' —— tier 是质量档、渠道是另一维度,混进一个枚举后"深度档企微"就表达不出来了。 formatPath 一并进 composeHash(否则两个渠道 promptVersion 撞车,eval 数据混在一起)。 · plan_scripts 加 channel + 改 @@unique([planId,channel]),⛔ 不另立表: 状态机/source/agentInvocationId/聚合查询全一样,两张表必然漂。 · 企微**无模板兜底**,失败就是 failed。电话失败可以给模板(客服拿着电话必须有东西念, 平淡但不出事);企微是原样发给患者的,套话复制发出去比没有更糟,而且发出去收不回。 ═ 前端 ═ · 话术面板 3 视图切换(伴飞/卡片/原文)隐藏,那个位置改成渠道 tab 电话/企微; 电话固定「原文」渲染(视图代码整套保留,开关可恢复) · 企微视图单块 + 复制按钮;whitespace-pre-wrap 原样呈现,⛔ 不过 markdown 渲染器 —— 客服复制的必须是他看到的那些字 · 执行结果的「触达方式」选择器隐藏(⚠ ️ 期间 channel 全落 'phone',触达方式分布不可用) ═ 踩的三个坑 ═ 1. __dirname 拿不到 format.md(ENOENT):SWC dev 产物在 dist/src/,tsc prod 在 dist/, 同一个 __dirname 指向不同层级。照抄 resolveScriptRoot 的 cwd 策略。 2. serializeScript 会把正文拆成 sections 并丢原文 → 企微稿 content 长度 0。 企微单独序列化,不复用那个。 3. ai.module 的 exports 没加(正则打在了 providers 上,那里有同样的三行序列)→ Nest 启动时 UnknownDependenciesException。 实测:真库生成一份企微稿(单块、空行断段、无小标题、收尾是"您回我一下方便的时间就行" 而不是电话的口头二选一),界面 tab 切换 + 复制按钮 + 【回访客服】按登录人回填全部正常。 1020 tests,两个 tsc + next build 干净。luoqi committed