很多做内容的朋友都会遇到一个烦恼:视频剪好了,图文写完了,真正的“战斗”才刚刚开始。同一个内容,要发 YouTube、B站、小红书,标题长度要求不一样,描述风格不一样,标签数量不一样,小红书还得配一堆表情符号。手动改完一轮,半小时过去了,改出来的东西还未必符合平台调性。
这篇文章里的“Skill”,指的就是 ChatGPT 这类 Agent 工具的技能扩展机制。我在梳理内容发布流程时发现,与其每次手动排版,不如把整套“多平台发布包生成”流程固化成 Skill。核心思路是用一份说明文件告诉 AI 怎么拆分任务,再用一个脚本真正生成发布内容。这样喂入一篇 Markdown 草稿,几分钟内就能拿到三个平台各自的发布包。
文章会从痛点分析开始,讲清楚 Skill 的本质,然后逐步演示目录结构、SKILL.md 配置、Python 生成脚本、调用方式和验证方法,最后补充常见问题和工程建议。哪怕你以前没接触过 Skill,也可以照着跑通一个最小示例。
1. 5分钟生成多平台发布包,真的可行吗
先说结论:可行。但要理解为什么可行,得先看清这到底是一个什么问题。
内容创作的完整链路里,最难的是“从无到有”的阶段,也就是选题、写脚本、拍视频、剪辑。做内容的人在这个阶段投入大量精力。但到了“把一条内容发到多个平台”的时候,任务性质完全变了,它不再需要创造性,而是格式化、确定性的转换工作。YouTube 的标题适合 60 到 100 字符,B站标题最好控制在 30 到 60 字以内,小红书标题更短,正文要分点、加话题标签。这些规则一旦确定,就是机械操作。
机械操作最适合交给 Agent 工具来处理。传统 Prompt 只能让 AI“按经验写文案”,但 Skill 提供了一种更可靠的方式:给 AI 一份技能说明书,里面写清楚触发条件、执行步骤和脚本路径,让 AI 在需要时真正调用本机脚本去生成结果。这样一来,输出的格式是稳定可控的,不是每次对话随缘发挥。
这个思路适合谁?如果你本身是开发者,或者愿意花一晚上折腾脚本,那这套方案能把每周几十分钟的重复劳动压缩到几分钟。如果你只是偶尔发一条内容,手动改改也行,但理解这个流程对理解 Agent 工作方式也很有帮助,因为它代表了 AI 工具从“聊天”走向“执行”的关键一步。
2. Skill 是什么:Agent 时代的“可执行说明书”
在不同工具里,Skill 的实现和命名不完全一致,比如有的叫 Skill,有的叫 Plugin,有的叫 Action,但它们背后的设计思想正在趋同:让 Agent 不再只是“生成文本”,而是能按说明书去操作脚本、读写文件、执行命令。
2.1 从 Prompt 到 Skill 的演进
传统 Prompt 的本质是“在对话里提出要求”。比如你告诉 AI:“帮我写一个 B站视频简介,要有时间轴,要有标签。”AI 会按照训练数据里的模式生成一段文本。问题在于,你每次都要重新描述需求,而且 AI 对“时间轴”的理解每次可能略有不同,格式很难完全稳定。
Skill 的解决方式是把需求预先结构化。一个 Skill 通常包含以下几个部分:
| 组成 | 作用 | 对比传统 Prompt |
|---|---|---|
| SKILL.md | 描述技能用途、触发条件、执行步骤 | 相当于一份长期有效的系统提示词 |
| scripts 目录 | 存放真正可执行的脚本,如 Python、Shell | 传统 Prompt 无法直接跑脚本 |
| 资源文件 | 模板、词库、参考配置 | 让输出内容可以复用固定素材 |
| 输出约定 | 定义结果文件格式和存放位置 | 让 AI 的输出结构化,便于下游使用 |
所以简单理解,Skill 就是“给 Agent 的一套可执行说明书”。你不需要在每次对话里重新描述规则,Agent 遇到匹配任务时,会自动读取 SKILL.md,按说明去调用脚本。
2.2 Skill 的核心工作流程
一次完整的 Skill 调用流程大致如下:
- 用户在对话中提出任务,例如“用发布包生成技能处理今天的草稿”。
- Agent 根据技能描述判断当前任务匹配哪个 Skill。
- Agent 读取 SKILL.md,理解输入要求和执行步骤。
- Agent 执行 scripts 目录下的脚本,传入草稿路径等参数。
- 脚本在本地或沙箱中运行,生成结果文件。
- Agent 读取结果文件,把摘要返回给用户。
从产品形态上看,这已经把 AI 从“内容生成器”往前推了一步,开始变成“任务执行引擎”。
2.3 Skill 的边界与限制
Skill 并非万能。它适合任务边界清楚、输入输出明确、有固定处理逻辑的场景,比如格式转换、批量生成、模板填充、数据清洗。它不太适合需要深度创作的任务,比如从零策划一个爆款脚本,这类任务仍然需要人的判断力。
另外要注意的是,Skill 一旦能执行脚本,就涉及本机操作。使用第三方 Skill 前,应该检查脚本内容,确认它不会读取敏感文件、不会执行危险命令。这个安全边界在后面专门讲。
3. 需求拆解:三个平台的发布包各需要什么
要做出好用的 Skill,第一步不是写代码,而是把需求拆清楚。我们可以先看三个平台的发布物差异。
| 平台 | 标题要求 | 描述/正文特点 | 标签/话题 | 其他注意点 |
|---|---|---|---|---|
| YouTube | 一般建议 60 到 100 字符 | 描述可以较长,适合放时间轴和关键词 | 标签最多约 500 字符,不一定要很多 | 描述第一段很重要,影响搜索结果 |
| B站 | 标题建议简洁,过长会被截断 | 简介可以写段落,也可放时间轴 | 有付费/普通标签,数量有限 | 分区选择会影响推荐 |
| 小红书 | 标题一般 20 字以内更友好 | 正文适合分点、短句,可带少量 emoji | 话题标签最多约 10 个 | 封面和正文第一句话是关键 |
从这个表格能看出,三个平台对“同一篇内容”的表达要求是不同的。如果手动处理,你需要在标题里做取舍,在描述里调整结构,在标签里挑选关键词。这个工作很适合自动化,因为规则是可以写进脚本的。
3.1 定义 Skill 的输入
我们约定 Skill 的输入是一份 Markdown 草稿,文件内容包含两部分:
- front matter 元信息:title、summary、tags。
- 正文:以
##开头的章节,代表视频或文章的主要段落。
示例输入草稿如下,文件路径假设为drafts/hello-skill.md:
--- title: "我用 ChatGPT 做了个 Skill" summary: "一次把多平台发布流程自动化的尝试" tags: [ChatGPT, Skill, 内容自动化] --- ## 为什么需要 Skill ## Skill 的基本原理 ## 实战:生成发布包 ## 总结与思考3.2 定义 Skill 的输出
输出是一个发布包目录,里面包含三个 JSON 文件:
youtube_package.json:包含 YouTube 标题、描述、标签。bilibili_package.json:包含 B站标题、简介、标签。xiaohongshu_package.json:包含小红书标题、正文、话题标签。
使用 JSON 而不是纯文本,是为了方便后续接入发布 API,也方便读者检查字段。
需求拆到这里,就可以开始搭建 Skill 了。
4. 搭建 Skill 项目目录与配置
4.1 项目目录结构
一个最小可用的 Skill 项目,目录结构可以这样设计:
content-publisher-skill/ ├── SKILL.md ├── scripts/ │ └── generate_package.py └── templates/ # 后续可扩展,例如不同风格的标题模板SKILL.md是 Agent 读取的入口文件,scripts/generate_package.py是真正执行生成逻辑的脚本。
4.2 编写 SKILL.md
SKILL.md 的作用是让 Agent 知道:什么情况下使用这个技能、输入是什么、输出是什么、执行步骤是什么。这里给出一份可用的示例,你可以根据自己的工具调整 front matter 字段。
--- name: multi-platform-publisher description: 根据一篇 Markdown 内容草稿,生成 YouTube、B站、小红书三个平台的发布包。当用户要求生成发布包、多平台发布文案、或处理内容草稿时使用。 version: 1.0.0 --- # Multi-Platform Publisher ## 功能概述 把内容创作者的 Markdown 草稿,转换为三个平台可以直接使用的发布文件: - YouTube:标题、描述、标签。 - B站:标题、简介、标签。 - 小红书:标题、正文、话题标签。 ## 输入 用户提供 Markdown 草稿路径,草稿必须包含 front matter: - `title`:内容标题。 - `summary`:一句话摘要。 - `tags`:内容标签数组。 正文请使用 `##` 分章节,每章代表内容的一部分。 ## 执行步骤 1. 确认草稿文件存在,并读取文件内容。 2. 调用脚本 `scripts/generate_package.py`,传入草稿路径。 3. 脚本输出到 `out/` 目录,文件名分别为 `youtube_package.json`、`bilibili_package.json`、`xiaohongshu_package.json`。 4. 检查三个文件是否生成成功,并把文件路径返回给用户。 ## 输出 输出目录结构: ```text out/ ├── youtube_package.json ├── bilibili_package.json └── xiaohongshu_package.json注意事项
- 不要修改草稿原文。
- 不要在输出文件之外创建额外文件。
- 如果草稿缺少 front matter,提示用户补充。
这里的关键是“执行步骤”写得很明确,Agent 看到后可以直接照做,而不是再自由发挥。 ### 4.3 配置 ChatGPT 或 Codex 类工具 不同 Agent 工具对 Skill 的加载方式不同。以 ChatGPT 桌面版和 Codex CLI 生态为例,通常需要在设置中指定 Skill 目录,或者在项目中放置可识别的技能配置。具体入口因版本而异,最稳妥的方式是查看你所用工具关于 Skills 或插件机制的官方文档。 如果工具支持命令行方式,也可以在终端直接用类似下面的方式测试脚本是否可用: ```bash python3 scripts/generate_package.py --help先把脚本跑通,再接入 Agent,能够降低排错难度。
5. 完整示例:用 Python 脚本生成发布包
整个 Skill 里,脚本是核心。这里提供一个完整的 Python 示例,它读取草稿 Markdown,提取 front matter 和章节,然后按平台规则生成 JSON 文件。
5.1 创建脚本文件
文件路径:content-publisher-skill/scripts/generate_package.py
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 根据 Markdown 内容草稿生成多平台发布包。 用法: python3 generate_package.py path/to/draft.md --output-dir out """ import argparse import json import pathlib import re def parse_draft(draft_path: pathlib.Path) -> dict: """解析 Markdown 草稿,提取 front matter 和章节信息。""" text = draft_path.read_text(encoding="utf-8") meta = {} body = text # 解析 front matter if text.startswith("---"): parts = text.split("---", 2) if len(parts) >= 3: fm_text = parts[1] body = parts[2] for line in fm_text.strip().splitlines(): if ":" not in line: continue key, value = line.split(":", 1) key = key.strip() value = value.strip().strip('"') if key == "tags": # 将 "[A, B, C]" 转为列表 value = [item.strip() for item in value.strip("[]").split(",")] meta[key] = value title = meta.get("title", draft_path.stem) summary = meta.get("summary", "") tags = meta.get("tags", []) sections = re.findall(r"^##\s+(.+)$", body, re.MULTILINE) return { "title": title, "summary": summary, "tags": tags, "sections": sections, } def build_youtube_package(data: dict) -> dict: """生成 YouTube 发布信息。""" title = data["title"][:80] description_lines = [data["summary"], ""] for index, section in enumerate(data["sections"], start=1): description_lines.append(f"{index}. {section}") description = "\n".join(description_lines) tags = data["tags"] # YouTube 标签总量不建议过长,这里截取前 15 个 tags = tags[:15] return { "platform": "youtube", "title": title, "description": description, "tags": tags, } def build_bilibili_package(data: dict) -> dict: """生成 B站发布信息。""" title = data["title"][:60] intro = data["summary"] chapter_lines = [] for index, section in enumerate(data["sections"], start=1): chapter_lines.append(f"{index}:{section}") description = f"{intro}\n\n章节列表:\n" + "\n".join(chapter_lines) return { "platform": "bilibili", "title": title, "desc": description, "tags": data["tags"][:10], } def build_xiaohongshu_package(data: dict) -> dict: """生成小红书发布信息。""" title = data["title"][:20] body_parts = [data["summary"], ""] body_parts.append("重点内容:") for section in data["sections"][:5]: body_parts.append(f"> {section}") body_parts.append("") topic_tags = [] for tag in data["tags"]: topic_tags.append(f"#{tag}") body_parts.append(" ".join(topic_tags)) return { "platform": "xiaohongshu", "title": title, "body": "\n".join(body_parts), "topic_tags": topic_tags, } def main(): parser = argparse.ArgumentParser(description="生成多平台发布包") parser.add_argument("draft", help="Markdown 草稿路径") parser.add_argument("--output-dir", default="out", help="输出目录,默认为 out") args = parser.parse_args() draft_path = pathlib.Path(args.draft) if not draft_path.exists(): print(f"[ERROR] 草稿文件不存在:{draft_path}") return data = parse_draft(draft_path) out_dir = pathlib.Path(args.output_dir) out_dir.mkdir(parents=True, exist_ok=True) packages = [ build_youtube_package(data), build_bilibili_package(data), build_xiaohongshu_package(data), ] for package in packages: platform = package["platform"] output_path = out_dir / f"{platform}_package.json" output_path.write_text( json.dumps(package, ensure_ascii=False, indent=2), encoding="utf-8", ) print(f"[OK] {platform} -> {output_path}") if __name__ == "__main__": main()这个脚本有几个设计点值得说明。
第一,parse_draft函数负责解析草稿。它把 front matter 和正文分离,正文里所有##开头的行会被识别为章节。如果草稿格式不标准,解析结果可能为空,但脚本不会崩溃,只是生成的描述会缺少章节信息。
第二,三个build_*函数分别处理平台差异。YouTube 标题限制 80 字符,B站限制 60 字符,小红书限制 20 字符。这是演示用的简化规则,实际项目中你可以根据平台规则继续微调。
第三,输出目录通过--output-dir指定,默认为out。这保证了脚本不会乱写文件,降低误操作风险。
5.2 准备测试草稿
为了验证脚本,先创建一个简单的草稿文件。
文件路径:drafts/hello-skill.md
--- title: "我用 ChatGPT 做了个 Skill,5分钟生成多平台发布包" summary: "把重复的内容排版工作,交给带脚本能力的 Agent。" tags: [ChatGPT, Skill, 自动化] --- ## 为什么需要自动化 ## Skill 是什么 ## 实战演示 ## 总结注意,草稿的tags数组里包含“自动化”,这和脚本里生成的话题标签有关。
6. 运行并验证 Skill
6.1 手动运行脚本
在项目根目录执行:
python3 scripts/generate_package.py drafts/hello-skill.md --output-dir out如果一切正常,终端会输出:
[OK] youtube -> out/youtube_package.json [OK] bilibili -> out/bilibili_package.json [OK] xiaohongshu -> out/xiaohongshu_package.json6.2 查看生成结果
以 YouTube 为例,out/youtube_package.json的内容应该是:
{ "platform": "youtube", "title": "我用 ChatGPT 做了个 Skill,5分钟生成多平台发布包", "description": "把重复的内容排版工作,交给带脚本能力的 Agent。\n\n1. 为什么需要自动化\n2. Skill 是什么\n3. 实战演示\n4. 总结", "tags": [ "ChatGPT", "Skill", "自动化" ] }B站和小红书的文件也会各自生成。整个流程里,用户只需要提供草稿,剩下的格式化工作由脚本完成。
6.3 接入 Agent 后的调用方式
当 Skill 配置好之后,可以在对话中直接说:
使用 multi-platform-publisher 技能,处理草稿 drafts/hello-skill.mdAgent 会读取 SKILL.md,找到脚本,执行命令,然后把生成的文件路径反馈给你。如果 Agent 工具没有自动执行脚本的权限,你可以手动运行命令,再把输出结果作为上下文输入对话。
6.4 如何判断成功
判断标准有三个:
out/目录下生成了三个 JSON 文件。- 每个文件的必填字段都存在,且标题长度没有超过脚本设定的限制。
- 草稿中的章节完整出现在描述或正文里。
如果某个平台的文件缺失,优先检查脚本是否报错,以及草稿解析到的章节是否为空。
7. 常见问题与排查思路
在实际使用中,主要会遇到几类问题。这里整理成表格,方便排查。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
ChatGPT 启动时提示unable to locate the codex cli binary | Codex CLI 二进制路径未配置,或客户端安装不完整 | 检查环境变量CODEX_CLI_PATH是否指向 codex 可执行文件 | 重新安装 Codex CLI,或在工具设置中指定正确路径 |
启动时提示无法加载 config.toml | ChatGPT/Codex 的配置文件损坏或模型配置无效 | 查看配置文件位置,检查model字段是否填了不存在的模型名 | 备份后修复或重置 config.toml,改为官方支持的模型名称 |
脚本执行报Permission denied | 脚本没有执行权限 | 运行ls -l scripts/generate_package.py | 执行chmod +x scripts/generate_package.py |
脚本报No such file or directory | Python 环境未安装或路径不对 | 运行python3 --version检查版本 | 安装 Python 3,或使用绝对路径调用脚本 |
| 生成的标题过长 | 平台规则设置不准确 | 检查脚本中[:80]、[:60]、[:20]等切片逻辑 | 按实际平台上限调整切片长度 |
| 小红书正文没有 emoji | 示例脚本没有内置 emoji 词库 | 查看生成文件内容 | 在生成逻辑中引入 emoji 映射表,或交给 Agent 后处理 |
| 担心 Skill 执行危险命令 | 第三方 Skill 可能包含恶意脚本 | 阅读 SKILL.md 和 scripts 目录下的所有文件,确认操作范围 | 只使用可信来源的 Skill,并在隔离环境测试 |
| Agent 没有自动调用脚本 | 工具不支持自动执行命令,或 SKILL.md 描述不够明确 | 检查 SKILL.md 的触发条件和执行步骤措辞 | 在对话中明确要求执行脚本,或手动运行命令 |
其中关于 codex cli binary 和 config.toml 的报错,最常见的原因是本机环境问题和配置项写错。遇到这类错误,不要急着重装工具,先看环境变量和配置路径,往往比直接卸载重装更快。
8. 最佳实践与工程建议
Skill 的思路很简单,但真正用起来,有几个工程层面的建议值得记住。
8.1 SKILL.md 要写得像“接口文档”
SKILL.md 是 Agent 和技能之间的接口。触发条件要明确,输入输出要写明,执行步骤要可操作。如果写得太泛,Agent 就不知道该在什么时候调用,也不知道怎么调用。我建议至少包含:技能名称、功能描述、输入格式、执行步骤、输出结构、注意事项。
8.2 脚本要保持幂等
同一个草稿,无论执行多少次,输出结果应该一致。这样才能放心交给 Agent 自动化。不要在脚本里引入随机内容,不要依赖当前目录下不存在的临时文件。
8.3 输出目录与源文件分离
脚本的默认输出目录是out/,草稿放在drafts/,两者分开。这样即使脚本写错,也不太可能覆盖源文件。如果需要在生产流程中使用,建议加上日期或草稿名组成输出子目录,避免不同内容的输出互相覆盖。
8.4 把平台规则抽成配置
现在标题长度、标签数量都写在脚本里。平台规则可能变化,更好的做法是抽成一个config.yaml或 JSON 配置。这样后续调整平台限制时,不需要改动 Python 代码。
8.5 敏感信息不要进 Skill
Skill 脚本里不要硬编码任何 API 密钥、Token、账号密码。如果未来想接入发布 API,密钥应通过环境变量或密钥管理服务加载,并遵循最小权限原则。
8.6 先用最小示例跑通,再覆盖真实内容
第一次创建 Skill,不要一上来就处理几十个草稿。先用一个最小 Markdown 文件验证流程,确认输出正确后,再扩展功能。这个最小示例也是未来排错时的重要基线。
8.7 区分“自动生成”与“自动发布”
当前这个 Skill 只生成发布包,不负责发布。主动把“生成”和“发布”分开,能减少很多风险。内容发布涉及账号安全、平台审核、版权问题,自动化发布一定要谨慎,先小范围测试,确认逻辑稳定后再考虑接入。
9. 总结与下一步方向
这篇文章核心讲清楚了一件事:Skill 不是更复杂的 Prompt,而是“说明文件 + 脚本”的组合,让 Agent 能执行确定性任务。多平台发布包生成就是一个典型的确定性任务,输入是 Markdown 草稿,输出是三个平台的 JSON 发布文件,中间的处理规则固定。
按照文中步骤,你已经可以自己搭建一个最小可用的 Skill 项目:创建 SKILL.md、编写生成脚本、准备测试草稿、运行验证。整个过程不依赖特定平台,适配的是 Agent 工具的核心机制。
下一步值得深入的方向有三个。
第一,优化输出质量。在现有 JSON 基础上,增加标题风格模板,比如“干货型”“故事型”“热点型”,让发布文案更贴近各平台调性。
第二,扩展素材检查能力。脚本可以检查草稿里是否包含配图建议、封面标题、引用链接,并在发布包里生成待办清单,提醒人工补充素材。
第三,接入发布 API。确认平台审核规则后,在 Skill 里增加 Python 脚本调用的发布接口,把“生成发布包”升级为“一键发布”。这是自动化程度更高的一步,但务必做好权限管理和测试环境验证。
先从一个简单草稿开始,跑通一个平台,再逐步加功能。Skill 真正的价值,不在于一次生成多少内容,而在于把创作者从重复劳动里解放出来,把时间留给真正需要人判断的事情。