1. 为什么你的 Agent 总是“说得好听做不出文件”如果你最近在折腾 Anthropic Agent Skills大概率遇到过这种落差SKILL.md 写得挺完整Agent 也一本正经地回复“已为你生成报告”结果你翻遍工作目录连个.xlsx的影子都没有。问题不在模型不够聪明而在于你只给了它“任务说明书”没给它“动手的通道”。Agent Skills 的本质是把“如何完成某类任务”的知识从每次对话的临时提示词里抽出来固化成一个可复用、可测试的工程制品。它的核心载体就是SKILL.md——一份声明式合约写清楚这个 Skill 能做什么、什么前提下启动、依赖哪些工具、最终产出什么形态。听起来很美好但真正让它跑起来你需要三样东西同时到位一份结构正确的 SKILL.md、一套能被 Agent 读取的目录约定、以及一个稳定的模型调用通道。前两样靠规范就能解决第三样才是大多数人卡住的地方。你要么在多个平台之间来回切换 Key要么担心调用通道不稳定导致文件生成中途断掉。我试过把 Skills 的配置和模型接入拆开处理用 TaoToken 统一管 Key 和 API 通道整个链路会清爽很多——SKILL.md 只管定义任务模型调用交给统一入口端到端验证一次就能复现文件生成结果。这篇文章就按这个思路走先讲清楚 SKILL.md 和目录结构怎么落地再给出可复制的settings.json与config.toml骨架最后用 TaoToken 跑通一次从 Skill 激活到真实文件产出的完整验证。目标很明确——你照着配就能拿到那个.xlsx。2. SKILL.md 与目录结构先把“任务合约”写对2.1 一个能跑通的 SKILL.md 长什么样很多人写 SKILL.md 容易写成一篇散文Agent 读起来抓不到重点。正确的做法是把它当成一份结构化合约来写。下面是一个生成销售分析 Excel 的最小可用示例--- name: sales-report-excel version: 1.0.0 level: execution preconditions: - 用户已提供结构化销售数据CSV 或 JSON - 数据包含 date、product、amount 三个字段 tools: - data_cleaner - stats_calculator - excel_builder output: type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet filename: sales_report.xlsx depends_on: [] --- ## 能力描述 将原始销售数据清洗后生成带图表和条件格式的 Excel 报告。 ## 执行步骤 1. 调用 data_cleaner 去除重复行与空值 2. 调用 stats_calculator 计算环比、同比、TopN 产品 3. 调用 excel_builder 组装三个工作表并写入图表 4. 返回生成的 xlsx 文件路径 ## 工具说明 - data_cleaner输入原始数据输出清洗后数据 - stats_calculator输入清洗数据输出衍生指标 - excel_builder输入指标与图表配置输出二进制文件这里的关键是output.type字段。当你写成application/vnd.openxmlformats-officedocument.spreadsheetml.sheet时Agent 会知道这不是让它输出一段 Markdown 表格而是调用底层渲染引擎生成真实的二进制文件。level: execution表示这个 Skill 在执行阶段才加载完整内容摘要层只暴露名称和前置条件节省上下文。2.2 目录约定让 Agent 自己找到能力Skills 不是孤立文件它长在一套约定目录里。推荐结构如下project/ ├── skills/ │ ├── sales-report-excel/ │ │ ├── SKILL.md │ │ ├── examples/ │ │ │ ├── input.csv │ │ │ └── output.xlsx │ │ ├── schemas/ │ │ │ └── output.schema.json │ │ └── assets/ │ │ └── template.xlsx │ └──>https://taotoken.net/api注意这个地址不带任何查询参数鉴权通过请求头里的Authorization: Bearer 你的Key完成。Skills 的配置里只需要填这个基地址和 Key剩下的交给统一通道处理。4. 可复制配置settings.json 与 config.toml 骨架4.1 settings.jsonSkills 运行参数settings.json负责告诉 Agent 去哪里找 Skills、用哪个模型、输出到哪个目录。下面是一份可直接改用的骨架{ skills_root: ./skills, active_skills: [sales-report-excel], model: { provider: taotoken, base_url: https://taotoken.net/api, api_key_env: TAOTOKEN_API_KEY, model_name: claude-sonnet-4-20250514, max_tokens: 8192, temperature: 0.2 }, output: { dir: ./output, overwrite: true }, disclosure: { summary_token_limit: 100, enable_detail_layer: true } }几个参数说明api_key_env指向环境变量名不要把 Key 硬编码进文件temperature设低一点Skills 执行需要稳定而非创意disclosure.summary_token_limit控制摘要层上限超过会被截断。4.2 config.toml通道与超时控制config.toml负责更底层的通道参数尤其是超时和重试——Skills 生成文件时可能耗时较长超时设太短会中途断掉[api] base_url https://taotoken.net/api timeout_seconds 120 max_retries 3 retry_backoff 2.0 [api.headers] Content-Type application/json [skills] auto_discover true validate_schema true strict_preconditions false [logging] level info log_file ./logs/skills.logtimeout_seconds 120是给文件生成留足时间max_retries 3配合retry_backoff 2.0做指数退避strict_preconditions false表示前置条件不满足时先警告而非直接拒绝方便调试。4.3 环境变量与目录初始化把 Key 写进环境变量避免泄露export TAOTOKEN_API_KEY你的Key mkdir -p skills/sales-report-excel/{examples,schemas,assets} mkdir -p output logs如果你用的是长期编码或 Agent 场景可以考虑 Coding Plan它在多步骤任务上的配额更宽松Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite5. 验证请求跑通一次端到端文件生成5.1 准备测试数据在skills/sales-report-excel/examples/input.csv写入测试数据date,product,amount 2026-01-05,A,1200 2026-01-12,B,800 2026-01-20,A,1500 2026-02-03,C,600 2026-02-15,B,900 2026-02-28,A,11005.2 用 curl 验证通道先用一个最小请求确认 TaoToken 通道正常curl -X POST https://taotoken.net/api/v1/messages \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: claude-sonnet-4-20250514, max_tokens: 256, messages: [ {role: user, content: 回复 OK 两个字母即可} ] }返回里能看到content字段包含OK说明 Key 和通道都通了。如果返回 401检查 Key 是否复制完整返回 404检查base_url是否写成了带路径的形式。5.3 触发 Skill 并检查产物通道确认后让 Agent 加载settings.json并激活sales-report-excel。执行完成后检查输出目录ls -lh output/ file output/sales_report.xlsxfile命令应该返回类似Microsoft Excel 2007的信息说明生成的是真实二进制文件而非文本。再用 Python 快速验证内容import openpyxl wb openpyxl.load_workbook(output/sales_report.xlsx) print(工作表:, wb.sheetnames) ws wb.active print(首行:, [cell.value for cell in ws[1]]) print(行数:, ws.max_row)如果打印出三个工作表名和正确的表头说明从 SKILL.md 定义到真实文件生成的链路完整跑通了。6. 本篇常见错排查6.1 Agent 说生成了但目录里没有文件最常见的原因是output.type没写对。如果你写成了text/markdown或干脆没写Agent 会认为产物是文本不会调用文件渲染工具。检查 SKILL.md 的output块确保type是完整的 MIME 类型。另一个可能是output.dir路径不存在。settings.json里的输出目录需要提前创建或者确认 Agent 有写入权限。6.2 调用返回 401 或 403先确认环境变量是否生效echo $TAOTOKEN_API_KEY | head -c 8如果输出为空说明环境变量没导出。注意settings.json里用的是api_key_env而非直接写 Key两者要对应上。如果环境变量正常但仍报 401到 API Keys 页面确认 Key 是否被禁用或过期。6.3 执行中途超时Skills 生成 Excel 时可能涉及多轮模型调用和文件渲染默认超时往往不够。把config.toml里的timeout_seconds调到 120 以上同时确认max_retries至少为 2。如果频繁超时检查是不是 SKILL.md 的执行步骤写得过于笼统导致 Agent 反复推理。6.4 前置条件不满足导致 Skill 不激活preconditions写得太严格会让 Skill 在数据稍有偏差时就拒绝启动。调试阶段可以把strict_preconditions设为false让 Agent 先尝试执行并给出警告。等流程稳定后再收紧条件。6.5 生成的 Excel 打不开或内容错位多半是schemas/output.schema.json与实际数据结构不匹配。用validate_schema true让 Agent 在写入前校验能提前发现字段缺失或类型错误。另外确认assets/template.xlsx的占位符区域与excel_builder的填充逻辑一致。7. 把 Skills 接入你的真实工作流跑通一次验证只是起点。真正让 Skills 产生价值是把它接入日常任务链。我的做法是先把最高频的一两个任务写成 SKILL.md用 TaoToken 统一通道跑稳再逐步增加 Skill 数量。每加一个 Skill先确认它的摘要层足够精简、执行层步骤足够明确、详情层覆盖了你能想到的边界情况。接入文档和 API Keys 管理页建议放在手边配置调整时随时对照接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewriteAPI Keyshttps://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite如果你主要做长期编码或 Agent 类任务Coding Plan 的配额模型更适合多步骤、长链路的场景Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite最后提醒一句SKILL.md 里的output.type和settings.json里的base_url是整条链路最容易出错的两个点。每次新增 Skill先单独验证这两个字段再跑完整流程能省下大量排查时间。