Skill ZIP upload fails with “config asset name must not be blank” when SKILL.md uses CRLF line endings

当 SKILL.md 文件使用 Windows 风格的 CRLF(\r\n)换行符打包上传时,Dify 的 frontmatter 解析逻辑会在未规范化换行符的情况下出错,导致 name 字段解析为空,报错 "config asset name must not be blank"。优先检查并转换

快速结论:当 SKILL.md 文件使用 Windows 风格的 CRLF(\r\n)换行符打包上传时,Dify 的 frontmatter 解析逻辑会在未规范化换行符的情况下出错,导致 name 字段解析为空,报错 “config asset name must not be blank”。优先检查并转换 SKILL.md 的换行符为 LF(Unix)格式。

适用环境:Dify 1.17.0,Self Hosted(Docker)部署。该报错出现在 Skill ZIP 上传功能中,属于 1.17.0 新增功能,已验证该版本存在此问题。

最快修复方案:将 SKILL.md 的换行符从 CRLF 转换为 LF(Unix)格式后再打包上传。可使用 dos2unix SKILL.md 命令,或在编辑器中设置为”使用 Unix 换行符保存”。

注意事项:此方案为临时规避手段,Dify 官方尚未发布修复补丁。根本解决方案需要 Dify 在 _decode_skill_md_parse_frontmatter 中先规范化 \r\n\n 再进行解析。

问题场景

用户在使用 Dify 1.17.0(Self Hosted Docker 部署)时,创建或编辑 Skill 包,SKILL.md 文件使用了 Windows 风格换行符(CRLF / \r\n),打包成 .zip 后通过 Dify Console 的 Skills 上传功能上传,立即触发 API 错误,上传失败。

报错原文

{
  "code": "invalid_request",
  "message": "config asset name must not be blank"
}

原因分析

问题出在 Dify 的 _parse_frontmatter 函数解析 SKILL.md 时未先规范化换行符。该函数检查 content.startswith("---"),然后按字面 "---" 分隔符进行拆分,将中间部分交给 yaml.safe_load 解析。当 SKILL.md 使用 CRLF 换行符时,\r 字符会干扰 frontmatter 分隔符的匹配或 YAML 值的解析,导致 name 字段在经过 str(...).strip() 后变成空值。

当 name 为空时,会通过 SkillManifest 验证并到达共享的 validate_config_name 辅助函数,触发通用的 “config asset name must not be blank” 错误,而不是更明确的 “SKILL.md frontmatter name is required” 错误提示。

另外,现有测试套件只使用了基于 LF 换行符的 SKILL.md 测试文件,因此未捕获此边界情况,这也与该功能在 1.17.0 才全新引入的事实相符。

环境排查

  • 确认 Dify 版本是否为 1.17.0(该问题仅在此版本的新功能中被验证)
  • 检查 SKILL.md 文件使用的换行符类型(CRLF 还是 LF)
  • 确认部署方式(Cloud 或 Self Hosted)——目前证据仅覆盖 Self Hosted Docker

解决步骤

  1. 在上传前检查 SKILL.md 的换行符类型。可在终端中执行 file SKILL.md 查看输出是否包含 “with CRLF line terminators”。
  2. 将 SKILL.md 转换为 LF 换行符。优先尝试:
    • 使用 Linux/macOS 命令:dos2unix SKILL.mdsed -i 's/\r$//' SKILL.md
    • 或在编辑器中打开文件,将换行符设置为 LF(Unix)后保存
  3. 重新将修改后的 SKILL.md 打包为 .zip。
  4. 再次通过 Dify Console 的 Skills 上传功能上传该 ZIP 包。

验证方法

上传后确认不再出现上述 “config asset name must not be blank” 错误,并且 Skill 包成功导入。也可在 Chrome DevTools 的 Network 标签页中确认上传请求返回状态码为 2xx 而非 4xx。

参考来源

langgenius/dify #41650

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 22433

发表回复

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