快速结论:当 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.py中publish_skill是否使用两个数据库会话(第 1818–1878 行附近)。 - 确认前端在发布后是否持有旧
updated_at值(debug 网络请求响应中的_serialize_version返回内容)。
解决步骤
- 优先尝试:在发布 Skill 后,从前端清除或重新获取 Skill 的最新
updated_at,再执行重命名操作。 - 如果问题依旧,检查
publish_skill实现,考虑将其合并为单一数据库会话,使updated_at只被修改一次。 - 另一种可优先尝试的方案:修改发布接口响应,使其包含 Skill 最终提交后的
updated_at,作为后续更新操作的乐观锁 token。 - 如果以上都不可行,临时降低乐观锁校验强度,或在前端提交前重新拉取 Skill 最新元数据再执行重命名。
验证方法
修复后,按以下步骤验证:1)发布一个 Skill;2)立即重命名其显示名称;3)确认不再出现 skill_conflict 报错,且重命名成功保存。同时检查数据库中 updated_at 是否只递增一次,或发布响应中返回的 updated_at 可用于后续更新操作。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


![[Bug]: vllm: error: unrecognized arguments: --task embedding](https://www.chat-gpts.plus/wp-content/uploads/2026/08/35603-f55775b0-768x403.jpg)