Skills 技能:
把反复交代的流程写下来
每次让 Codex 加一个接口,你都要交代同样几步:照老写法建文件、加类型、补测试、跑测试。哪次漏说一条,它就少做一条。技能(skill)就是把这套做法写成一份说明书放进项目,以后一句 $add-api-endpoint,它就照着做全。
时间紧就先看"入门"和第 6 节的演练,跟着做完就有了第一个技能;"原理"讲它什么时候会被用上,决定你写的技能灵不灵。
技能是什么
技能是一个文件夹,里面有一份 SKILL.md,写着某一类活该怎么做。Codex 遇到对得上的活,就把它翻出来照着做。
什么时候值得做成技能
官方给了一条好记的经验:同一段提示词你老在复制,或者同一套流程你老在纠正,它大概就该变成一个技能。官方举的常见例子有:排查日志、写发布说明、按清单审 PR、规划迁移、汇总监控或事故、固定的调试流程。
在 order-admin 里,"新增一个 API 接口"就是这样的活:每次都是建路由、加类型、补两条测试、跑 npm test。这一课把它做成技能 add-api-endpoint,放进仓库,全组共用。
在哪些地方能用
| 在哪 | 能不能用技能 |
|---|---|
| ChatGPT 桌面 App 里的 Codex | 能。侧栏里有 Skills,能看到你各个项目里的技能 |
| Codex CLI、IDE 扩展 | 能 |
| ChatGPT 的 Chat 和 Work(网页、桌面、手机) | 装在插件里的技能能用(插件在第 11 课) |
技能用的是开放的 agent skills 标准(agentskills.io):一个文件夹、一份 SKILL.md。官方的建议是先在本地把技能写好、用顺;想让别人一键安装,或者要和外部工具一起打包时,再做成插件。
解剖一个技能
点文件树里的每一项,看它是做什么的、什么时候会被读到。下面是 add-api-endpoint "长大以后"的样子;第一版只要一个 SKILL.md 就够了。
示例内容是为 order-admin 编的;文件夹结构和每一项的用途与官方文档一致。
必填的只有两样:name 是技能的名字;description 写它做什么、什么时候用,Codex 靠这一行判断什么时候该用它(第 4、7 节)。建议文件夹名和 name 写成一样,省得混。
官方建议:每个技能只做一件事;优先写说明,只有需要确定的结果、或者要调用外部工具时,才加脚本;步骤写成"做什么"的命令句,写清输入和输出。
放在哪里,谁能看到
Codex 从四类地方找技能:仓库里、你的个人文件夹、管理员放的位置、Codex 自带的。放进仓库的技能跟着代码一起提交,全组都能用。
| 范围 | 位置 | 适合放什么 |
|---|---|---|
| 仓库 | .agents/skills:从当前工作目录开始,每往上一层都找,一直到仓库根 | 跟这个项目有关的流程,全组共用;只跟某个模块有关的,放进那个模块的文件夹 |
| 个人 | ~/.agents/skills | 你自己在所有项目里都想用的 |
| 管理员 | /etc/codex/skills | 给这台机器上每个人的默认技能,也常用于 SDK 脚本和自动化 |
| 内置 | 随 Codex 一起装好 | 人人都用得上的,比如 skill-creator、plan |
试一试:换一个起点
Codex 从"当前工作目录"往上一层层找 .agents/skills,直到仓库根,不往下找。这个起点在哪:
- 在 App 里,是项目的主文件夹。项目菜单里点 Edit project,指向一个文件夹选 Make primary,就换了主文件夹;新对话都从它开始找。项目里附加的其他文件夹(次要文件夹)能读能改,但里面的技能不会被自动发现。
- 在命令行里,是你运行
codex的那个目录。
假设同事在 src/api/ 里也放了一个只管接口评审的 api-review,切换起点看看(App 里是换主文件夹,命令行里是换启动目录):
① 同名不合并:两个技能 name 一样时,Codex 不会把它们合成一个,两个都可能出现在技能选择器里,所以起名要避开重名。② 技能文件夹可以是符号链接,Codex 会跟到链接指向的地方去读。③ 新建或修改技能,Codex 会自动发现;没出现的话,重启 Codex。
两种触发方式:点名,或者它自己选
你可以点名要它用某个技能;不点名,它也会拿你的话去和每个技能的 description 比对,对得上就自己用。
| 方式 | 怎么发生 | 例子 |
|---|---|---|
| 显式(点名) | 在输入框里打 $ 选技能,或者直接写 $名字。启用的技能也会出现在 / 命令列表里 | $add-api-endpoint 加一个退款查询接口 |
| 隐式(自动) | 你的任务和某个技能的 description 对得上,Codex 自己选它 | "给订单加一个退款查询接口" |
触发模拟器
order-admin 里装了 3 个技能。对 Codex 说一句话,看它会不会用、用哪个。再把某个技能的"允许自动触发"关掉,试试同一句话。
模拟器用关键词比对来示意。真实的 Codex 是模型读 description 后自己判断的,没有固定的关键词表,所以 description 要写得清楚、具体。
禁止自动触发
在技能文件夹里加一个 agents/openai.yaml,写上:
policy: allow_implicit_invocation: false
这个开关默认是 true。改成 false 后,Codex 不会再根据你的话自动选它,但 $commit 点名照样能用。它只管"自动",不是停用(真要停用见第 9 节)。
提交代码、发布、发消息这类流程,要是 Codex "觉得你大概想要"就自己跑起来,收拾起来很麻烦。给它们关掉自动触发,每次由你亲手点名。
渐进披露:装很多也不挤
装几十个技能,也不会一开始就把上下文塞满:Codex 先只看"标签",用到哪个才翻开哪个。官方管这叫渐进披露(progressive disclosure)。
装得越多,清单越挤
第 1 层那份初始清单有预算:最多占模型上下文窗口的 2%;不知道窗口多大时,按 8,000 个字符算。超了,Codex 先把描述截短;还放不下,就会有些技能进不了清单,同时给出警告。拖动滑块看看。
数量阈值是示意:真实能放多少个,取决于模型的上下文窗口和各个描述的长短。
官方建议:把最关键的用途和触发词放在描述最前面。描述被截短时,开头那几个字还在,Codex 还认得出它。另外,这份预算只管初始清单;选中某个技能以后,Codex 照样会读完整的 SKILL.md。
做一个技能,再用它加个接口
用 Codex 自带的 $skill-creator 把"新增接口"的流程做成 add-api-endpoint,放进仓库的 .agents/skills;再新开一个对话,用它加一个退款查询接口。中途它会停下来请你批准,你可以自己点。
画面为教学示意:Codex 说的话、文件内容和测试数量是虚构的;技能放在哪、怎么触发、.agents 受保护这些规则与官方文档一致。
练一练:写好 description
技能灵不灵,多半看 description 这一行。4 组对比,每组选出更容易"该用时被选中、不该用时不添乱"的那一条。
官方的写法要点
- 说清做什么、什么时候用,也说清什么时候不用。官方模板里 description 的占位文字就是"写清楚这个技能什么时候该触发、什么时候不该"。
- 放进用户真会说的话。你们平时说"加个接口",就把"加个接口"写进去。
- 关键用途和触发词放最前面。技能多了描述会被截短(第 5 节)。
- 一个技能只做一件事。先从 2 到 3 个具体用例开始,别一上来就想覆盖所有边角情况。
- 拿真实的提示词测一测。对着 description 试几句你平时会说的话,看它该用时用没用、不该用时有没有乱用。
练一练:这件事该交给谁
AGENTS.md、技能、MCP、插件常被混着说。官方的原意是:它们互相配合,不是互相替代。先看分工,再做 6 道题。
| 谁 | 管什么 | order-admin 里的例子 |
|---|---|---|
| AGENTS.md | 每次都要遵守的规矩,开工前就读 | 怎么跑测试、别动 .env(第 5 课) |
| 技能 | 某一类活的固定做法,用到时才读 | add-api-endpoint(本课) |
| MCP | 连上本地仓库以外的系统和工具 | 读 GitHub 上的 issue(第 9 课) |
| 插件 | 把技能、MCP 等打成一个包,别人一键安装 | order-admin-kit(第 11 课) |
它们常常一起用:技能里可以写明"用哪个 MCP 工具";把技能和 MCP 打包在一起就是插件。另外官方有一句好记的话:技能定方法,定时任务定时间(定时任务在第 13 课)。
进阶与避坑
给想把技能用深的人:元数据文件、依赖 MCP、停用、预算、装别人写好的技能、团队分发。最后是旧教程对照和常见问题。
agents/openai.yaml 全貌
这个文件可选,管三件事:在 App 里怎么显示、能不能自动触发、依赖哪些工具。
interface:
display_name: "新增 API 接口"
short_description: "路由、类型、测试一次加齐"
icon_small: "./assets/small-logo.svg"
icon_large: "./assets/large-logo.png"
brand_color: "#3B82F6"
default_prompt: "用 add-api-endpoint 新增一个接口"
policy:
allow_implicit_invocation: true
dependencies:
tools:
- type: "mcp"
value: "openaiDeveloperDocs"
description: "OpenAI Docs MCP server"
transport: "streamable_http"
url: "https://developers.openai.com/mcp"| 字段 | 作用 |
|---|---|
interface | 给 App 界面用的:显示名、简介、大小图标、主色、配合技能使用的默认提示词。都是可选的 |
policy | allow_implicit_invocation,默认 true;false 时只能点名使用(第 4 节) |
dependencies | 声明技能要用的工具。上面这段是官方示例:依赖一个远程 MCP 服务器。声明以后,Codex 能帮你装好、接好 |
技能依赖 MCP 时,缺的服务器 Codex 会提示你安装。这个行为由功能开关 features.skill_mcp_dependency_install 控制,已经稳定、默认开着。MCP 本身第 9 课讲。
停用一个技能,但不删它
在 ~/.codex/config.toml 里加一段(config.toml 第 7 课讲),改完重启 Codex:
[[skills.config]] path = "/path/to/skill/SKILL.md" enabled = false
官方示例里 path 写的是 SKILL.md 的路径;配置参考表把它描述成"技能文件夹的路径"。两处说法不同,先照示例写,不生效再改成文件夹路径试试。App 的 Skills 页面里能不能直接开关,以你的 App 为准。
调大或调小初始清单的预算
[skills] max_context_tokens = 2000
默认是上下文窗口的 2%;自己写的值必须是正整数,最多 10000 个 token。一般不用改,技能太多、清单总被截短时再考虑。
装别人写好的技能
想在自己电脑上加几个官方精选的技能,用内置的 $skill-installer,比如 $skill-installer linear 会装上 $linear 技能;也可以让它从别的仓库下载。装完 Codex 会自动发现,没出现就重启。官方的定位是:这适合自己试用;要把自己的技能分发给别人,优先做成插件。
技能里的脚本也在审批范围里
官方的审批配置里专门列了一类"技能脚本审批"(skill_approval),和沙箱审批、MCP 审批并列。也就是说,技能里的脚本同样可能停下来请你批准。想让某一类提示自动拒绝、其余照常问你,可以用 approval_policy 的 granular 写法,比如 approval_policy = { granular = { skill_approval = false, … } },false 表示这一类提示直接拒绝(完整示例见官方 Agent approvals & security 页;config.toml 怎么写见第 7 课)。
团队和企业:三条分发路径
| 路径 | 适合 | 谁来管 |
|---|---|---|
| ChatGPT 工作区技能 | 通过 ChatGPT 工作区功能共享、安装审批过的流程 | 工作区的技能权限和生命周期设置 |
| 本地文件夹技能 | 从仓库、个人、管理员或内置位置加载(就是本课讲的这种) | 文件怎么分发、本机配置、运行时权限 |
| 插件 | 把一个或多个技能和连接器、MCP、hooks 打包 | 插件的可用性和安装,加上包里每样东西各自的设置 |
三条路互相独立:把技能从一条路挪到另一条,不会带走所有者、共享、角色、安装状态或连接器授权。
- custom prompts(在
~/.codex/prompts/里写 Markdown,用/prompts:名字调用):2026 年 1 月起已废弃,官方让改用技能。它只能手动调用、只存在你本机,不能随仓库共享;技能既能点名、也能按 description 自动用,还能提交进仓库。旧的 custom prompts 目前还会以/prompts:名字的样子出现在斜杠列表里。 - 技能放在
~/.codex/skills、.codex/skills:这是 2025 年底技能刚推出时的写法;现在官方文档写的位置是~/.agents/skills和仓库里的.agents/skills。 - "技能只能在 CLI 和 IDE 扩展里用":现在 ChatGPT 桌面 App 里的 Codex 也能用;装在插件里的技能,在 ChatGPT 的 Chat、Work 里也能用。
有些流程"做给它看"比"写出来"容易。Record & Replay 能把你在 Mac 上操作的一遍录下来,整理成技能草稿(仅 macOS,还要开着 Computer Use)。专题 E 讲。
常见问题
新写的技能没出现
- 文件名是不是
SKILL.md,开头有没有name和description。 - 放的位置对不对:当前工作目录往上到仓库根的某一层
.agents/skills,或者~/.agents/skills。放在当前目录下面的子文件夹里是找不到的;放在 App 项目的次要文件夹里,也不会被自动发现。 - 是不是在
config.toml里被停用了。 - Codex 会自动发现改动;都没问题还不出现,重启 Codex。
它就是不自动用我的技能
allow_implicit_invocation。着急的话,直接用 $名字 点名。不该用的时候,它用了
Chat 里是 @skill-creator,Codex 里是 $skill-creator?
@ 选技能,Codex 用 $ 点名。App 里 Codex 输入框的 @ 菜单里也能找到技能(以你的 App 为准),但写提示词时认 $ 最稳。写技能要它批准,正常吗?
.agents 文件夹时,它和 .git、.codex 一样是只读的,Codex 往里写要你点头(第 3 课)。不想批准,也可以让它把内容贴出来,你自己建文件。定时任务里能用技能吗?
$技能名 就会用上它。流程还需要你频繁纠偏的,先做成技能、用稳了,再定时(第 13 课)。技能能让 Codex 派子代理吗?
Claude Code 里的 skill 和自定义斜杠命令能搬过来吗?
小测验
8 道题,每题选完会立刻看到解析。
