ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Trae CN 完整版 Skill 脚手架:从 SKILL.md 到 scripts/references 全子目录一次配齐 TaoToken

Trae CN 完整版 Skill 脚手架:从 SKILL.md 到 scripts/references 全子目录一次配齐 TaoToken

1. 为什么你的 Trae CN Skill 总是「触发一次就废」

很多人第一次在 Trae CN 里写 Skill,都是把规则一股脑塞进一个SKILL.md,跑通一次觉得挺爽,过两天换个项目再触发,要么不命中,要么命中了却输出格式乱飘。我试过最典型的一次:同一个「接口字段校验」技能,在 A 项目里输出规规矩矩,在 B 项目里直接把整段代码贴出来连注释都没了。排查半天才发现,问题不在模型,而在脚手架——目录结构没搭对,scripts、references、assets三个可选目录一个都没建,AI 每次只能靠SKILL.md里的自然语言硬猜,猜歪是必然的。

Trae CN 的 Skill 机制本质上是「懒加载 + 语义匹配」:启动时只读SKILL.md头部的name、description、globs这几个元数据字段做触发判断,命中之后才加载完整规则;只有当规则里明确要求读脚本、读规范、套模板时,才会去加载scripts/、references/、assets/里的内容。这个设计非常省 Token,但也意味着——如果你不把这三个目录建出来,AI 想「按需加载」都没有东西可加载,只能退化成纯文本推理。

所以这篇要解决的不是「怎么写一段提示词」,而是怎么在 Trae CN 里搭一套完整、可直接复制、可长期复用的 Skill 工程骨架。适合谁?适合已经在 Trae CN 里写过一两个 Skill、但输出不稳定、想把它工程化的开发者;也适合团队里想把「代码规范检查」「接口文档生成」「组件模板输出」这类高频动作沉淀成可复用技能的人。核心检索词就三个:Trae CN、Skill 脚手架、SKILL.md 目录结构。下面从目录模板开始,一路配到 TaoToken 通道下的连通性验证。

2. TaoToken 前置:统一 Key 与 API 通道怎么准备

在搭脚手架之前,先把「通道」这件事说清楚。Trae CN 本身负责 Skill 的加载与触发,但 Skill 里如果要调用模型能力(比如让脚本处理完数据后再走一次语义总结),就需要一个稳定的 API 入口。我现在的做法是统一走 TaoToken 的 API 通道,好处是 Key 和 Base URL 只维护一份,Skill 脚本、Coding Plan、控制台调试全都复用,不用每个项目单独配。

你需要准备三样东西,我把它叫「三件套」:Base URL、API Key、Model ID。这三件套在任何接入场景里都是绑定的,缺一个都跑不通。

Base URL 用https://taotoken.net/api,注意这个地址不带任何查询参数,是纯 API 根路径。API Key 在控制台的 API Keys 页面创建,创建后只显示一次,复制下来存到环境变量里,别硬编码进SKILL.md或脚本。Model ID 按你实际要用的模型填,比如做代码类任务就选对应的编码模型,做通用文本就选通用模型。

具体操作路径是这样的:先打开官网https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=注册登录,然后进控制台https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=,在 API Keys 页面点创建,拿到 Key。如果你后面要跑长期编码或 Agent 类任务,可以顺手看下 Coding Plan 页面https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=,它和按量调用是两条线,按需选。

环境变量建议这样设,Linux/macOS 写进~/.zshrc或~/.bashrc,Windows 用系统环境变量面板:

export TAOTOKEN_BASE_URL="https://taotoken.net/api" export TAOTOKEN_API_KEY="sk-你的Key" export TAOTOKEN_MODEL_ID="你的模型ID"

设完执行source ~/.zshrc让它生效,然后echo $TAOTOKEN_API_KEY确认能打印出来。这一步看着简单,但后面 Skill 脚本里读环境变量全靠它,先做扎实。注意别把 Key 写进任何会提交到 Git 的文件,.trae/skills/目录如果纳入版本管理,务必在.gitignore里排除掉含 Key 的本地配置文件。

3. 可复制配置:完整 Skill 目录模板与三件套落地

这一节是全文的核心,直接给你一套可以整段复制的目录结构和文件内容。放置位置推荐项目级,路径是项目根目录下的.trae/skills/你的技能名/。技能名必须是小写加中划线,不能有中文、不能有大写,这是 Trae CN 的硬性规则。

完整目录长这样:

.trae/skills/your-skill-name/ ├── SKILL.md # 核心必选,Trae CN 唯一识别主文件 ├── scripts/ # 可选,可执行脚本目录 │ └── tool_helper.py ├── references/ # 可选,参考规范、标准文档 │ └── rule_spec.md └── assets/ # 可选,模板、固定输出格式 └── output_template.md

三个可选目录按需启用,不用可以直接删掉整个文件夹,不影响技能运行。但文件夹名固定为scripts、references、assets,不能改名,改了 AI 就找不到。

先写SKILL.md,这是唯一被 Trae CN 识别的主文件,头部元数据用 YAML front matter:

--- name: your-skill-name description: 一句话精准概括技能核心能力,用于 AI 语义匹配触发 globs: ["**/*.py", "**/*.js", "**/*.ts", "**/*.vue"] version: 1.0.0 author: custom --- # 技能中文名称 ## 适用场景 When - 明确列出本技能的触发场景 - 精准、具体、不模糊 ## 禁止场景 Not When - 不属于本技能处理的场景 - 一次性临时调试、无规范需求的任务不处理 ## 前置依赖 Precondition - 如需调用 scripts 脚本:确保脚本文件存在可执行 - 如需参考规范:优先读取 references 目录规范 - 如需固定格式:优先套用 assets 模板 ## 执行步骤 Steps 1. 读取用户需求与当前项目文件上下文 2. 按需加载 references 参考规范约束执行逻辑 3. 按需调用 scripts 工具脚本进行数据处理、解析、校验 4. 按照标准逻辑完成核心任务处理 5. 套用 assets 输出模板格式化最终结果 6. 输出结果、给出优化建议、标注注意事项 ## 输出规范 Output 严格按照固定模板输出,结构固定、格式统一。 ## 特殊规则 Rule 1. 本技能为懒加载触发,仅语义匹配命中后加载全部规则 2. 优先使用目录内脚本与模板,保证输出统一 3. 所有操作必须符合当前项目代码规范 4. 禁止输出模糊、无落地性的内容

description这一行是触发命中的关键,写的时候要像给搜索引擎写摘要,把「什么场景、处理什么、产出什么」压进一句话。globs决定这个技能在哪些文件类型上被激活,按你的实际场景收窄,别一股脑写**/*,否则到处误触发。

接着是scripts/tool_helper.py,一个通用数据处理脚本,AI 可以按需调用:

#!/usr/bin/env python3 # Trae CN Skill 辅助工具脚本,存放于 scripts/ 目录 import sys import json import os def skill_data_handler(input_data: str) -> dict: """ 通用数据处理工具,可按技能场景自定义: 解析、校验、格式化、统计 """ result = { "success": True, "input_len": len(input_data), "process_msg": "脚本处理完成", "data": input_data.strip(), "base_url": os.environ.get("TAOTOKEN_BASE_URL", ""), } return result if __name__ == "__main__": stdin_data = sys.stdin.read() res = skill_data_handler(stdin_data) print(json.dumps(res, ensure_ascii=False, indent=2))

注意脚本里读的是环境变量TAOTOKEN_BASE_URL,而不是把地址写死。这样三件套只维护一份,脚本、Skill、其他工具全复用。

然后是references/rule_spec.md,放执行约束标准:

# 技能执行参考规范 ## 概述 本文档为当前 Skill 的执行约束标准,AI 执行时必须严格遵守。 ## 代码规范约束 1. 代码必须具备可读性、可维护性 2. 必须补充必要注释,复杂逻辑增加说明 3. 优先使用项目已有工具类、公共方法 ## 输出约束 1. 输出结构固定,不可随意删减模块 2. 问题必须精准定位,给出具体行号、原因、方案 3. 修复代码可直接复制运行,无报错 ## 执行约束 1. 禁止过度修改原有业务逻辑 2. 优先兼容原有代码风格 3. 所有优化必须正向提升代码质量

最后是assets/output_template.md,固定输出模板:

# 技能执行结果模板 ## 执行状态 【成功/待优化/异常】 ## 核心总结 此处填写本次任务的核心结论、关键问题、核心成果 ## 详细处理内容 ### 问题/内容说明 ### 解决方案/成果展示 ## 后续建议 1. 2. 3.

到这里,一套完整脚手架就落地了。目录优先级记住四句话:规则优先读SKILL.md,工具优先读scripts,约束优先读references,输出优先套assets。懒加载机制下,只有命中触发后才会逐层加载,Token 消耗非常克制。

4. 验证请求:从脚本自测到 Skill 触发全链路

脚手架搭完不能只看文件在不在,得跑一遍验证。分三层:脚本层、通道层、Skill 层。

脚本层先单独测tool_helper.py能不能跑通。在项目根目录执行:

echo "测试数据:订单号 A1001,状态待校验" | python3 .trae/skills/your-skill-name/scripts/tool_helper.py

预期输出是一段 JSON,包含success: true、input_len、process_msg和data字段,base_url应该能读到https://taotoken.net/api。如果base_url是空的,说明环境变量没生效,回到第 2 节重新source一次。

通道层验证 API 是否通。用 curl 打一次模型对话接口,确认三件套正确:

curl -s https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "'"$TAOTOKEN_MODEL_ID"'", "messages": [{"role": "user", "content": "只回复两个字:连通"}] }'

返回体里choices[0].message.content应该是「连通」。这一步通了,说明 Base URL、Key、Model ID 三件套没问题。你也可以直接在模型对话页面https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=手动发一条消息对照,页面能回、curl 能回,通道就稳了。

Skill 层验证触发。在 Trae CN 里打开一个符合globs的文件,比如一个.py文件,输入一段符合「适用场景」描述的需求,观察技能是否被命中。命中后看输出结构是不是严格按assets/output_template.md的模板走——有「执行状态」「核心总结」「详细处理内容」「后续建议」四个块。如果输出结构散了,多半是SKILL.md里「输出规范」那段没写死模板路径,补一句「严格套用 assets/output_template.md」即可。

三层都过,说明脚手架和通道全链路打通。这时候你再去改references/rule_spec.md里的约束,AI 下次执行就会自动带上新规则,不用动SKILL.md一个字,这就是目录分离的价值。

5. 本篇常见错排查:401、local proxy failed 与 choices 读取失败

搭 Skill 脚手架时踩的坑,八成集中在通道和路径两类。下面按真实报错对照排查。

报错一:401 Unauthorized。返回体里通常是{"error": {"message": "Invalid API key"}}。原因有三种:Key 复制时带了空格或换行;环境变量没source生效;Key 被撤销了。排查顺序是先echo $TAOTOKEN_API_KEY看值对不对,再确认请求头是Authorization: Bearer sk-xxx格式,中间一个空格都不能多。如果都对还是 401,去控制台 API Keys 页面https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=确认 Key 状态是否有效。

报错二:local proxy failed 或连接被拒。这个报错通常出现在你本地配了某个转发工具、但工具没启动或端口不对。处理方式是检查本地是否有残留的代理配置,把HTTP_PROXY、HTTPS_PROXY这类环境变量清掉,直接用https://taotoken.net/api访问。命令行走不通时,先在浏览器或模型对话页面确认服务本身可达,排除是本地网络配置问题。

报错三:reading 'choices' 报 undefined。这是解析返回体时最常见的错误,代码里写了response.choices[0]但choices是undefined。根因是返回体根本不是标准结构,可能是 401、429 或 500 的错误体,被当成正常响应解析了。正确做法是先判断 HTTP 状态码,再判断返回体里有没有choices字段:

import os, json, urllib.request def call_model(prompt: str) -> str: url = os.environ["TAOTOKEN_BASE_URL"] + "/v1/chat/completions" payload = json.dumps({ "model": os.environ["TAOTOKEN_MODEL_ID"], "messages": [{"role": "user", "content": prompt}] }).encode() req = urllib.request.Request(url, data=payload, headers={ "Authorization": "Bearer " + os.environ["TAOTOKEN_API_KEY"], "Content-Type": "application/json" }) with urllib.request.urlopen(req) as resp: body = json.loads(resp.read()) if "choices" not in body: raise RuntimeError("返回体异常: " + json.dumps(body, ensure_ascii=False)) return body["choices"][0]["message"]["content"]

报错四:OAuth 相关报错。如果你用的是 Claude Code 类工具接入,报 OAuth 失败,通常是认证方式选错了。这类工具要走 API Key 模式,而不是 OAuth 登录模式。配置时把 Base URL 填https://taotoken.net/api,Key 填TAOTOKEN_API_KEY,Model ID 填对应模型,三件套齐全就不会再走 OAuth 流程。Claude Code 的接入细节可以对照文档https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=里的说明逐项核对。

报错五:Skill 不触发。文件都在但 Trae CN 就是不命中,先查name是不是小写中划线、description是不是太泛、globs是不是没覆盖当前文件类型。这三个字段任何一个不对,语义匹配就命中不了。改完SKILL.md后重启一下 Trae CN 让它重新加载元数据。

6. 把脚手架用起来:从模板到长期复用的下一步

一套脚手架搭好只是起点,真正省时间的是把它变成团队资产。我的做法是:把.trae/skills/下每个技能目录当成一个独立小工程,SKILL.md只放触发和流程,具体规则全下沉到references/,输出格式全锁在assets/,需要跑数据就走scripts/。这样改规则不动主文件,换模板不动脚本,职责清晰。

如果你要跑的是长期编码或 Agent 类任务,建议把通道切到 Coding Planhttps://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=,它和按量调用分开管理,适合高频、持续的场景。日常调试和验证模型能力,用模型对话页面https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=最快。Key 的创建和管理都在 API Keys 页面https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=,接入细节查文档https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=。

最后留一个实用习惯:每建一个新 Skill,先复制这套目录模板,改name和description,跑一遍第 4 节的三层验证,确认触发和输出都正常,再往里填业务逻辑。别一上来就写复杂规则,脚手架稳了,规则怎么加都不会乱。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进