×−+
Skills 技能第 8 课 · Codex 教程
第 8 课 · SKILLS

Skills 技能:
把反复交代的流程写下来

每次让 Codex 加一个接口,你都要交代同样几步:照老写法建文件、加类型、补测试、跑测试。哪次漏说一条,它就少做一条。技能(skill)就是把这套做法写成一份说明书放进项目,以后一句 $add-api-endpoint,它就照着做全。

约 35 分钟 10 节 · 6 个动手练习 章末测验 形式参考 luongnv89/claude-howto · 事实依据 OpenAI 官方文档
同一个活,点上面切换看看
入门先用起来 原理弄懂为什么 实战动手练 深入进阶与避坑

时间紧就先看"入门"和第 6 节的演练,跟着做完就有了第一个技能;"原理"讲它什么时候会被用上,决定你写的技能灵不灵。

01入门

技能是什么

技能是一个文件夹,里面有一份 SKILL.md,写着某一类活该怎么做。Codex 遇到对得上的活,就把它翻出来照着做。

技能像厨房里的一盒菜谱卡片每张卡片的标签上写着菜名和"什么时候做这道菜",做法写在卡片里,有的还夹着附页。
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。官方的建议是先在本地把技能写好、用顺;想让别人一键安装,或者要和外部工具一起打包时,再做成插件。

02入门

解剖一个技能

点文件树里的每一项,看它是做什么的、什么时候会被读到。下面是 add-api-endpoint "长大以后"的样子;第一版只要一个 SKILL.md 就够了。

示例内容是为 order-admin 编的;文件夹结构和每一项的用途与官方文档一致。

必填的只有两样:name 是技能的名字;description 写它做什么、什么时候用,Codex 靠这一行判断什么时候该用它(第 4、7 节)。建议文件夹名和 name 写成一样,省得混。

先只写说明

官方建议:每个技能只做一件事;优先写说明,只有需要确定的结果、或者要调用外部工具时,才加脚本;步骤写成"做什么"的命令句,写清输入和输出。

03原理

放在哪里,谁能看到

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。

04原理

两种触发方式:点名,或者它自己选

你可以点名要它用某个技能;不点名,它也会拿你的话去和每个技能的 description 比对,对得上就自己用。

方式怎么发生例子
显式(点名)在输入框里打 $ 选技能,或者直接写 $名字。启用的技能也会出现在 / 命令列表里$add-api-endpoint 加一个退款查询接口
隐式(自动)你的任务和某个技能的 description 对得上,Codex 自己选它"给订单加一个退款查询接口"

触发模拟器

order-admin 里装了 3 个技能。对 Codex 说一句话,看它会不会用、用哪个。再把某个技能的"允许自动触发"关掉,试试同一句话。

试试:

模拟器用关键词比对来示意。真实的 Codex 是模型读 description 后自己判断的,没有固定的关键词表,所以 description 要写得清楚、具体。

禁止自动触发

在技能文件夹里加一个 agents/openai.yaml,写上:

.agents/skills/commit/agents/openai.yaml
policy:
  allow_implicit_invocation: false

这个开关默认是 true。改成 false 后,Codex 不会再根据你的话自动选它,但 $commit 点名照样能用。它只管"自动",不是停用(真要停用见第 9 节)。

一做就改动外部状态的流程,考虑只让它点名才用

提交代码、发布、发消息这类流程,要是 Codex "觉得你大概想要"就自己跑起来,收拾起来很麻烦。给它们关掉自动触发,每次由你亲手点名。

05原理

渐进披露:装很多也不挤

装几十个技能,也不会一开始就把上下文塞满:Codex 先只看"标签",用到哪个才翻开哪个。官方管这叫渐进披露(progressive disclosure)。

1标签:一开始就看
每个技能的名字、描述,Codex 的清单里还带着文件路径。相当于扫一眼菜谱卡片的标签
2正文:选中才读
决定用哪个技能后,读完整的 SKILL.md。相当于抽出那张卡片
3附页:用到才碰
references 里的文档、scripts 里的脚本,步骤里需要时才读、才运行。相当于做到"酱汁见附页"才去翻

装得越多,清单越挤

第 1 层那份初始清单有预算:最多占模型上下文窗口的 2%;不知道窗口多大时,按 8,000 个字符算。超了,Codex 先把描述截短;还放不下,就会有些技能进不了清单,同时给出警告。拖动滑块看看。

初始清单占用的预算

数量阈值是示意:真实能放多少个,取决于模型的上下文窗口和各个描述的长短。

对写 description 的启发

官方建议:把最关键的用途和触发词放在描述最前面。描述被截短时,开头那几个字还在,Codex 还认得出它。另外,这份预算只管初始清单;选中某个技能以后,Codex 照样会读完整的 SKILL.md。

06实战

做一个技能,再用它加个接口

用 Codex 自带的 $skill-creator 把"新增接口"的流程做成 add-api-endpoint,放进仓库的 .agents/skills;再新开一个对话,用它加一个退款查询接口。中途它会停下来请你批准,你可以自己点。

画面为教学示意:Codex 说的话、文件内容和测试数量是虚构的;技能放在哪、怎么触发、.agents 受保护这些规则与官方文档一致。

07实战

练一练:写好 description

技能灵不灵,多半看 description 这一行。4 组对比,每组选出更容易"该用时被选中、不该用时不添乱"的那一条。

官方的写法要点

  1. 说清做什么、什么时候用,也说清什么时候不用。官方模板里 description 的占位文字就是"写清楚这个技能什么时候该触发、什么时候不该"。
  2. 放进用户真会说的话。你们平时说"加个接口",就把"加个接口"写进去。
  3. 关键用途和触发词放最前面。技能多了描述会被截短(第 5 节)。
  4. 一个技能只做一件事。先从 2 到 3 个具体用例开始,别一上来就想覆盖所有边角情况。
  5. 拿真实的提示词测一测。对着 description 试几句你平时会说的话,看它该用时用没用、不该用时有没有乱用。
08实战

练一练:这件事该交给谁

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 课)。

09深入

进阶与避坑

给想把技能用深的人:元数据文件、依赖 MCP、停用、预算、装别人写好的技能、团队分发。最后是旧教程对照和常见问题。

agents/openai.yaml 全貌

这个文件可选,管三件事:在 App 里怎么显示、能不能自动触发、依赖哪些工具。

.agents/skills/add-api-endpoint/agents/openai.yaml
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 界面用的:显示名、简介、大小图标、主色、配合技能使用的默认提示词。都是可选的
policyallow_implicit_invocation,默认 true;false 时只能点名使用(第 4 节)
dependencies声明技能要用的工具。上面这段是官方示例:依赖一个远程 MCP 服务器。声明以后,Codex 能帮你装好、接好

技能依赖 MCP 时,缺的服务器 Codex 会提示你安装。这个行为由功能开关 features.skill_mcp_dependency_install 控制,已经稳定、默认开着。MCP 本身第 9 课讲。

停用一个技能,但不删它

在 ~/.codex/config.toml 里加一段(config.toml 第 7 课讲),改完重启 Codex:

~/.codex/config.toml
[[skills.config]]
path = "/path/to/skill/SKILL.md"
enabled = false

官方示例里 path 写的是 SKILL.md 的路径;配置参考表把它描述成"技能文件夹的路径"。两处说法不同,先照示例写,不生效再改成文件夹路径试试。App 的 Skills 页面里能不能直接开关,以你的 App 为准。

调大或调小初始清单的预算

~/.codex/config.toml
[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 打包插件的可用性和安装,加上包里每样东西各自的设置

三条路互相独立:把技能从一条路挪到另一条,不会带走所有者、共享、角色、安装状态或连接器授权。

旧教程对照
  1. custom prompts(在 ~/.codex/prompts/ 里写 Markdown,用 /prompts:名字 调用):2026 年 1 月起已废弃,官方让改用技能。它只能手动调用、只存在你本机,不能随仓库共享;技能既能点名、也能按 description 自动用,还能提交进仓库。旧的 custom prompts 目前还会以 /prompts:名字 的样子出现在斜杠列表里。
  2. 技能放在 ~/.codex/skills、.codex/skills:这是 2025 年底技能刚推出时的写法;现在官方文档写的位置是 ~/.agents/skills 和仓库里的 .agents/skills。
  3. "技能只能在 CLI 和 IDE 扩展里用":现在 ChatGPT 桌面 App 里的 Codex 也能用;装在插件里的技能,在 ChatGPT 的 Chat、Work 里也能用。
演示一遍,录成技能

有些流程"做给它看"比"写出来"容易。Record & Replay 能把你在 Mac 上操作的一遍录下来,整理成技能草稿(仅 macOS,还要开着 Computer Use)。专题 E 讲。

常见问题

新写的技能没出现
  1. 文件名是不是 SKILL.md,开头有没有 name 和 description。
  2. 放的位置对不对:当前工作目录往上到仓库根的某一层 .agents/skills,或者 ~/.agents/skills。放在当前目录下面的子文件夹里是找不到的;放在 App 项目的次要文件夹里,也不会被自动发现。
  3. 是不是在 config.toml 里被停用了。
  4. Codex 会自动发现改动;都没问题还不出现,重启 Codex。
它就是不自动用我的技能
先看 description:有没有写清用途和触发词、关键的词是不是在最前面。技能装得太多时,描述会被截短,甚至有的技能进不了初始清单(会有警告)。再看是不是关了 allow_implicit_invocation。着急的话,直接用 $名字 点名。
不该用的时候,它用了
在 description 里写清"什么时候不要用",比如"只改前端页面时不要用"。一做就改动外部状态的流程(提交、发布),关掉自动触发,只让它点名才用。
Chat 里是 @skill-creator,Codex 里是 $skill-creator?
基本是这样:ChatGPT 的 Chat 和 Work 用 @ 选技能,Codex 用 $ 点名。App 里 Codex 输入框的 @ 菜单里也能找到技能(以你的 App 为准),但写提示词时认 $ 最稳。
写技能要它批准,正常吗?
正常。项目里已经有 .agents 文件夹时,它和 .git、.codex 一样是只读的,Codex 往里写要你点头(第 3 课)。不想批准,也可以让它把内容贴出来,你自己建文件。
定时任务里能用技能吗?
能。在定时任务的提示词里写 $技能名 就会用上它。流程还需要你频繁纠偏的,先做成技能、用稳了,再定时(第 13 课)。
技能能让 Codex 派子代理吗?
能。Codex 平时不会自己派子代理,只有你要求、或者 AGENTS.md、技能里写明要派时才派(第 12 课)。
Claude Code 里的 skill 和自定义斜杠命令能搬过来吗?
ChatGPT 桌面 App 的导入功能(Settings > Import)会把它们都导成 Codex 的技能。官方列的导入后检查清单里,和技能有关的是这两样:技能里写的工具限制和权限;依赖参数、shell 插值或文件路径占位符的命令式提示词。专题 D 讲。
10检验

小测验

8 道题,每题选完会立刻看到解析。