
如何为 LibreChat 配置部署级共享技能让 SKILL.md 在服务端启动时对所有用户只读加载【免费下载链接】LibreChatEnhanced ChatGPT Clone: Features Agents, MCP, Skills, DeepSeek, Anthropic, AWS, OpenAI, Responses API, Azure, Groq, o1, GPT-5, Mistral, OpenRouter, Vertex AI, Gemini, Artifacts, AI model switching, message search, Code Interpreter, langchain, DALL-E-3, OpenAPI Actions, Functions, Secure Multi-User Auth, Presets, open-source for self-hosting. Active项目地址: https://gitcode.com/GitHub_Trending/li/LibreChat如果你的目标是让运维人员统一分发一份“技能”Skill给整个 LibreChat 实例的所有用户而不是靠每个用户在界面里各自创建就需要配置“部署技能”deployment skills。它的效果是服务端启动时扫描指定目录下的SKILL.md把技能以只读、公开isPublic: true的身份暴露给所有启用了 Skills 能力的用户并且不会作为 Skill 文档写入 MongoDB。本文给出目录结构、环境变量配置、启动方式和可逐条核对的验证步骤全部内容来自本项目仓库中的 skill/README.md、.env.example 与 packages/api/src/skills/deployment.ts。部署技能的加载规则在动手之前先明确文档和源码定义的几条规则它们决定了目录怎么摆、出错时如何判断每个技能放在技能目录下的独立子文件夹中文件夹内必须有SKILL.md可以附带其他资源文件如references/notes.md见 skill/README.md 给出的结构示例skill/ my-shared-skill/ SKILL.md references/ notes.md技能目录由环境变量DEPLOYMENT_SKILLS_DIR指定未设置时默认取项目根目录下的./skill源码中DEFAULT_DEPLOYMENT_SKILLS_DIR skill支持绝对路径或相对路径相对路径基于process.cwd()解析。技能在服务端启动时加载对启用了 Skills 能力的用户以只读方式暴露且不持久化到 MongoDB。扫描范围根目录下直接含SKILL.md的情况、以及第一层子目录中含SKILL.md的情况都会被识别为一个技能目录findSkillDirectories的实现。每个技能文件夹下的所有文件都会作为该技能的文件条目登记SKILL.md本身除外技能内不允许出现符号链接否则加载直接失败文本文件只有不超过 512KBMAX_CACHED_TEXT_BYTES 512 * 1024时内容才会被缓存进内存。若同时启用了 Agent Plugins 包DEPLOYMENT_PLUGINS_DIR插件贡献的技能与部署目录中的技能同名时插件侧会被跳过并打印警告日志Plugin skill name conflicts with a deployment skill and was skipped——部署目录优先。编写 SKILL.mdSKILL.md由可选的 YAML frontmatter 加正文组成。仓库里的 e2e 示例技能 展示了完整的合法写法可直接照抄结构替换为你自己的技能内容--- name: e2e-deployment-skill description: Use this deployment skill to verify shared skills load during Playwright startup. always-apply: true user-invocable: true --- # E2E Deployment Skill E2E deployment skill loaded through Playwright from the configured deployment skills directory.加载时会对 frontmatter 做校验需要注意文件以---开头时必须有配对的闭合---否则报错Invalid SKILL.md frontmatter: missing closing ---frontmatter 必须是一个 YAML mapping不能是数组或标量。name、description、body会分别通过validateSkillName、validateSkillDescription、validateSkillBody校验任何一条 error 级问题都会让启动失败错误信息前缀为技能相对目录/SKILL.md: field: message。布尔类字段如always-apply只能写true或false写了别的值会以INVALID_TYPE报错例如always-apply must be a boolean (true or false)。warning 级问题不会中断启动只会输出logger.warn。校验通过后技能会被登记为author固定为保留 ID显示名Deployment、source: deployment、sourceMetadata: { deployment: true, directory: 相对路径 }、alwaysApply取 frontmatter 中always-apply的值缺省false、isPublic: true、version: 1。这些字段正是后文验证 API 返回时要逐项核对的内容。配置 DEPLOYMENT_SKILLS_DIR在.env中启用该配置项。.env.example 中的原始注释说明了它的语义# Deployment skills are loaded read-only at startup and exposed to all users # with the Skills capability enabled. Defaults to project root ./skill. DEPLOYMENT_SKILLS_DIR./skill如果你的技能就放在项目自带的skill/目录也可以不设置该变量默认值已经是./skill但显式写出更利于审查部署配置。需要指向其他位置时使用绝对路径或相对项目根的路径例如把技能放在独立的共享目录中DEPLOYMENT_SKILLS_DIR/opt/librechat/skills。注意一个边界如果显式配置的目录不存在启动会直接抛出Deployment skills directory not found: directory而失败而默认目录./skill不存在时只会静默跳过记录 debug 日志No deployment skills loaded from dir。也就是说显式配置了路径就必须保证路径存在且是一个目录否则报Deployment skills path must be a directory: directory。仓库的 e2e 配置 e2e/playwright.config.mock.ts 中的DEPLOYMENT_SKILLS_DIR: deploymentSkillsPath提供了一个真实用法把变量指向e2e/fixtures/deployment-skills这类纯技能目录供测试实例在启动时加载。修改.env或目录内容后需要重启 LibreChat 服务才能生效因为加载发生在服务端启动阶段。启动后如何验证加载结果验证分三层启动日志、技能列表/详情 API、只读约束。以下接口路径取自 e2e/specs/mock/deployment-skills.spec.ts 中真实执行过的请求。1. 看启动日志。加载成功时服务端会输出 info 级日志[deploymentSkills] Loaded 1 deployment skill(s) from 技能目录路径N是识别到的技能数量目录存在但没有技能时只会有 debug 级日志。2. 用 Bearer Token 请求技能列表。以 e2e 测试中的请求方式为例token 来自登录后的访问令牌curl -s http://host:port/api/skills?searche2e-deployment-skilllimit10 \ -H Authorization: Bearer accessToken在返回的skills数组中找到你的技能测试断言中核对的字段就是成功条件{ name: e2e-deployment-skill, description: Use this deployment skill to verify shared skills load during Playwright startup., source: deployment, sourceMetadata: { deployment: true }, fileCount: 1, alwaysApply: true, isPublic: true }其中fileCount是该技能文件夹内除SKILL.md之外的文件数量示例技能的 guide.txt 使计数为 1。source必须为deployment这说明它来自部署目录而不是某个用户创建。3. 拉取详情和文件。# 技能详情应包含正文 body 与 frontmatter curl -s http://host:port/api/skills/skillId -H Authorization: Bearer accessToken # 技能文件列表 curl -s http://host:port/api/skills/skillId/files -H Authorization: Bearer accessToken # 单个文件内容 curl -s http://host:port/api/skills/skillId/files/guide.txt -H Authorization: Bearer accessTokene2e 测试对这三处请求的断言给出了可核对的成功条件详情接口的body包含SKILL.md正文测试断言toContain(E2E deployment skill loaded through Playwright)frontmatter包含name、description和always-apply: true文件列表项包含relativePath、filename、source: deployment、mimeType、bytes、category、isExecutable: false且列表项中不含content字段单文件接口才会返回content与isBinary示例断言content: deployment skill file fixture\n、isBinary: false。注意以上 JSON 中的具体值是 e2e 测试针对示例技能的文档示例你自己的技能会按实际 frontmatter 和文件内容返回核对字段名和类型即可不要要求逐字相同。4. 确认只读约束。对部署技能执行修改请求预期返回 403curl -s -X PATCH http://host:port/api/skills/skillId \ -H Authorization: Bearer accessToken \ -H Content-Type: application/json \ -d {description: Deployment skills should stay read-only.}成功条件HTTP 状态码403响应体为{message: Deployment skills are read-only}。e2e 测试中这一条断言正是用来证明“所有用户可见但不可改”的。常见问题与限制启动报Duplicate deployment skill name name部署目录内出现了同名技能name取自 frontmatter 或文件名解析删除或改名其一。这与插件同名冲突不同——插件侧冲突只告警不失败。启动报relativePath: symlinks are not allowed in deployment skills技能文件夹内存在符号链接文件替换为真实文件。技能没出现在列表里先确认启动日志是Loaded N ...还是No deployment skills loaded from ...再检查目录层级——SKILL.md必须在根目录或第一层子目录中更深层的嵌套不会被识别。内容不会写库部署技能只存在于内存注册表中MongoDB 里查不到对应的 Skill 文档这是设计行为skill/README.md不要试图用数据库备份手段管理它们管理的唯一入口是磁盘上的目录。大文件行为超过 512KB 的文本文件只登记元数据、不缓存正文内容但可通过单文件接口按需读取含 NUL 字节的文件按二进制处理isBinary: true。完成以上配置并通过列表、详情、只读三项验证后实例内所有启用 Skills 的用户在下次与服务端交互时即可看到这份共享技能后续更新技能内容只需修改磁盘上的SKILL.md并重启服务无需也无法在界面里逐个用户分发。【免费下载链接】LibreChatEnhanced ChatGPT Clone: Features Agents, MCP, Skills, DeepSeek, Anthropic, AWS, OpenAI, Responses API, Azure, Groq, o1, GPT-5, Mistral, OpenRouter, Vertex AI, Gemini, Artifacts, AI model switching, message search, Code Interpreter, langchain, DALL-E-3, OpenAPI Actions, Functions, Secure Multi-User Auth, Presets, open-source for self-hosting. Active项目地址: https://gitcode.com/GitHub_Trending/li/LibreChat创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考