.agents/design/bug/stream-resume-dataid-validation.md
流恢复依赖 appId + chatId + obj + dataId 定位和合并对话记录。历史上入口没有统一校验 dataId 唯一性,调用方如果重复传入 dataId,可能导致对话项、响应项或恢复合并时定位错误。
本 PR 目标是在工作流执行前发现重复 dataId,直接抛业务错误,避免脏数据继续进入工作流和持久化链路。
本 PR 不采用 human 和 AI 共用同一个 dataId 的方案。
当前选择是保持 human/AI 各自拥有独立 dataId,但要求同一 appId + chatId 下新一轮要写入的 dataId 不与请求内或库内已有记录重复。
userContent.dataId 和 responseChatItemId 相同,会在同一轮内产生重复。dataId 已存在于当前会话历史中,会导致后续查找、恢复、合并逻辑产生歧义。新增 packages/service/core/chat/dataIdValidation.ts,提供:
assertNoDuplicateChatDataIdsInRequestassertNoExistingChatDataIdsvalidateChatRoundDataIds统一错误信息为 Chat dataId already exists: {dataId},并通过 UserError 抛出业务错误。
每一轮新写入的 dataId 集合包括:
userContent.dataIdresponseChatItemId先过滤空值,再检查集合内是否重复。重复时直接抛错,不进入数据库查询和工作流执行。
对有效 dataId 查询 MongoChatItem:
appIdchatIddataId: { $in: validDataIds }只要命中已有记录,就抛业务错误。
接入点:
/api/v1/chat/completions/api/v2/chat/completions/api/core/chat/chatTest校验发生在 saveChatId、responseChatItemId 已确定之后,且早于 workflow dispatch。
packages/service/core/chat/dataIdValidation.ts
projects/app/src/pages/api/v1/chat/completions.ts
projects/app/src/pages/api/v2/chat/completions.ts
projects/app/src/pages/api/core/chat/chatTest.ts
packages/service/test/core/chat/dataIdValidation.test.ts
userContent.dataId === responseChatItemId 时抛业务错误。MongoChatItem 时抛业务错误。本 PR 只阻止新重复数据继续产生,不处理既有历史重复。
既有数据需要通过独立迁移 PR 处理:
chat_items.dataIdchat_item_response.chatItemDataId