- systemPrompt条件从'aiModifyEnabled && targetRegionEl'改为'aiModifyEnabled',确保开启修改模式后大模型始终返回updatedHtml
- 接收updatedHtml逻辑增加if/else分支:targetRegionEl存在时走diff弹窗,不存在时调用execCmd('insertHTML')降级插入光标位置
- 参考参考-ReportEditor.tsx中injectAIText的降级机制
1.8 KiB
1.8 KiB
需求分析
时间戳
2026-04-19 03:44
需求来源
用户在 report-editor 中输入「请随机填充文本内容」,AI 在聊天气泡中正常回复,但编辑器中的「手术步骤-AI可编辑部分」没有修改。
现象
- AI 聊天面板有输出(reply)
- 编辑器中的 AI 可编辑区域内容未更新
- 没有触发 diff 确认弹窗
根因分析
对比当前代码与 参考-ReportEditor.tsx,问题有两个层面:
层面 1:System Prompt 条件过于严苛
当前代码:
const systemPrompt = aiModifyEnabled && targetRegionEl ? '...修改HTML...' : '...纯聊天...'
targetRegionEl 的获取依赖 aiTargetRegion(默认 'none')。如果用户未在下拉框中选中具体区域,targetRegionEl 为 null,systemPrompt 降级为纯聊天模式,大模型根本不会返回 updatedHtml 字段。
参考代码:
const systemPrompt = aiModifyEnabled ? '...修改HTML...' : '...纯聊天...'
只依赖 aiModifyEnabled,只要用户开启「允许修改正文」,大模型就会返回 updatedHtml。
层面 2:接收逻辑缺少降级插入
当前代码:
if (responseJson.updatedHtml && aiModifyEnabled && targetRegionEl) {
setDiffModal({...})
}
同样因为 targetRegionEl 为 null,即使大模型返回了 updatedHtml,也会被丢弃。
参考代码 injectAIText:
if (targetRegion) {
targetRegion.innerHTML = ... // 注入目标区域
} else {
execCmd('insertHTML', htmlContent); // 降级:插入光标位置
}
找不到目标区域时,直接将内容插入编辑器当前光标位置。
约束条件
- 当前代码已有
execCmd辅助函数,可直接复用 - 需要保留 diff 弹窗流程(目标区域存在时)
aiTargetRegion默认值'none'可保留,但需通过降级逻辑补偿