when skill published, rename skill display name will lead conflict error

当 Skill 已发布后,立即重命名其显示名称(display name)会触发 skill_conflict 报错。优先排查发布返回的 updated_at 是否为最新值,以及前端是否使用了过期的时间戳进行乐观锁校验。

快速结论:当 Skill 已发布后,立即重命名其显示名称(display name)会触发 skill_conflict 报错。优先排查发布返回的 updated_at 是否为最新值,以及前端是否使用了过期的时间戳进行乐观锁校验。

适用环境:Dify v1.16.1,Self Hosted(源码部署)。Issue 中未提及操作系统、Python、CUDA、显卡等环境信息。

最快修复方案:暂无确认的一步修复方案。可能原因已定位到 publish_skill 使用了两个独立数据库会话,导致返回给前端的 updated_at 不是最终提交后的值。

注意事项:以下解决方案仅基于代码分析推断,尚未在 Issue 中验证,请谨慎操作。

问题场景

用户在 Dify 中发布(publish)一个 Skill 后,紧接着重命名该 Skill 的显示名称(display name),此时系统抛出 skill_conflict 错误,提示“skill has been modified by another user”。该问题在 Dify v1.16.1 自托管(源码部署)环境中复现。

报错原文

{
    "code": "skill_conflict",
    "message": "skill has been modified by another user",
    "details": {
        "current_updated_at": 1787636163,
        "expected_updated_at": 1787636164
    }
}

原因分析

可能原因:publish_skill 实现中使用了两个独立的数据库会话。第一个会话(第 1818–1846 行)负责加载 Skill 并从 SKILL.md 同步元数据、构建归档文件,会话关闭时隐式提交了脏 ORM 状态(包括 updated_at 的变更)。第二个会话(第 1855–1878 行)重新获取 Skill,写入元数据字段、添加 SkillVersion、设置 skill.updated_by 并再次提交,这会再次刷新 updated_at

由于发布接口返回的 _serialize_version(第 2959–2980 行)只包含版本元数据,不包含 skill.updated_at,前端拿到的是第二次提交前的旧值。当用户立即重命名时,update_metadata 调用 _check_expected_updated_at(第 3476–3489 行)比对客户端旧的时间戳,发现与数据库当前值不一致,于是抛出 skill_conflict 错误。

环境排查

  • 确认 Dify 版本为 v1.16.1 或更早版本。
  • 检查是否为 Self Hosted 源码部署方式。
  • 查看 api/services/skill_management_service.pypublish_skill 是否使用两个数据库会话(第 1818–1878 行附近)。
  • 确认前端在发布后是否持有旧 updated_at 值(debug 网络请求响应中的 _serialize_version 返回内容)。

解决步骤

  1. 优先尝试:在发布 Skill 后,从前端清除或重新获取 Skill 的最新 updated_at,再执行重命名操作。
  2. 如果问题依旧,检查 publish_skill 实现,考虑将其合并为单一数据库会话,使 updated_at 只被修改一次。
  3. 另一种可优先尝试的方案:修改发布接口响应,使其包含 Skill 最终提交后的 updated_at,作为后续更新操作的乐观锁 token。
  4. 如果以上都不可行,临时降低乐观锁校验强度,或在前端提交前重新拉取 Skill 最新元数据再执行重命名。

验证方法

修复后,按以下步骤验证:1)发布一个 Skill;2)立即重命名其显示名称;3)确认不再出现 skill_conflict 报错,且重命名成功保存。同时检查数据库中 updated_at 是否只递增一次,或发布响应中返回的 updated_at 可用于后续更新操作。

参考来源

langgenius/dify #41228

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 20234

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注