1. 从人工指令到自动进化:Hermes Skill 系统到底解决什么问题
Hermes Skill 系统是一套把「怎么做某件事」写成 Markdown 文件、让 Agent 按文件执行并在反馈中自动改写的机制。它适合已经在用 Hermes 或类似 Agent 框架、想让重复任务不再每次从零推理的开发者。核心检索词就是 Hermes Skill 配置、Markdown 定义、自动进化触发条件。
我最初接触 Hermes 时,最大的困惑不是模型能力,而是「为什么每次都要重新说一遍」。比如每周都要分析几个 GitHub 仓库的健康度,每次对话都得把步骤复述一遍:先拿 stars,再看 README,再算 issue 响应时间。模型每次都能做,但每次都要我重新教。这种无状态体验在一次性问答里无所谓,放到长期重复任务里就很低效。
Hermes 的解法是把这套步骤固化成.skill.md文件。文件里用 YAML frontmatter 声明元数据,用 Markdown 正文写执行流程、参数表、示例输入输出。Agent 加载这个文件后,遇到匹配的触发词就直接按流程走,不需要你再说一遍。更关键的是,执行日志和用户反馈会被评估器读取,满足条件时自动改写这个 Markdown 文件,版本号加一,下次生效。
这和 OpenClaw 的 Skill 机制有本质区别。OpenClaw 的 Skill 更像传统插件:开发者手写 Python 类或 JSON Schema,静态注册,出问题要等作者发新版。Hermes 的 Skill 是「可被反思的知识载体」,每次执行都是一次学习机会。agentskills.io 则试图定义一套跨框架的 Skill 交换标准,让同一个.skill.md能被 Hermes、OpenClaw 未来版本、LangChain 插件等读取。
这篇文章按落地顺序走:先讲清楚 Skill 的 Markdown 结构和加载链路,再给出可复制的目录骨架和config.toml配置片段,然后演示一次从人工指令到自动进化的完整验证动作,最后把常见报错逐个排掉。全程在 TaoToken 统一 Key/API 通道下跑通,避免多套凭证来回切换。
适合谁读:已经在用 Hermes 或准备接入的开发者;想让 Agent 积累程序性记忆的团队;对 agentskills.io 标准感兴趣、想写跨框架 Skill 的人。如果你只是想让模型回答几个问题,不需要 Skill 系统;但如果你有每周重复、步骤固定、希望越用越顺的任务,这套机制值得花时间配一次。
2. TaoToken 前置:统一 Key 与 API 通道怎么接
在配置 Hermes Skill 之前,先把模型调用通道理顺。Hermes 执行 Skill 时会调用模型做意图解析、步骤生成、反馈评估,这些请求都需要一个稳定的 API 入口。TaoToken 提供统一的 Key 和 API 通道,官网是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 入口是 https://taotoken.net/api 。
先拿 Key。打开 https://taotoken.net/api-keys ,登录后创建一个新 Key,复制保存。这个 Key 后面会写进 Hermes 的config.toml,也会写进环境变量供 Skill 内部调用。注意 Key 只显示一次,丢了就重新生成。
拿到 Key 后,确认你要用的模型 ID。Hermes 的 Skill 生成和反馈评估对模型能力有要求,建议用支持长上下文和结构化输出的模型。模型 ID 可以在 https://taotoken.net/models 查到,也可以在模型对话页 https://taotoken.net/chat 里先试一下,确认能正常返回再写进配置。
这里有个容易踩的坑:Base URL 和完整请求路径要分清。TaoToken 的 Base URL 是https://taotoken.net/api,但不同客户端对路径拼接方式不一样。有的客户端会自动补/v1,有的不会。Hermes 的config.toml里我建议写完整的base_url = "https://taotoken.net/api",然后在api_path里单独指定/v1/chat/completions,这样最不容易出错。
如果你用的是 Claude Code 或类似工具做 Skill 润色,接入方式略有不同。Claude Code 的配置在~/.claude/settings.json,需要写ANTHROPIC_BASE_URL和ANTHROPIC_AUTH_TOKEN。TaoToken 的 Anthropic 兼容入口在 https://taotoken.net/api ,具体路径参考接入文档 https://taotoken.net/doc 。文档里有各客户端的完整配置示例,照着改就行。
长期跑 Skill 自动进化的话,建议用 Coding Plan,入口在 https://taotoken.net/coding-plan 。因为自动进化会频繁调用模型做反馈评估,按量计费容易超预算,Coding Plan 的额度更适合这种持续调用的场景。我实测下来,一个中等复杂度的 Skill 每天触发十几次进化评估,用 Coding Plan 比按量省不少。
配置完成后,先用一个最简单的请求验证通道。在终端里执行:
curl -s https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "你的模型ID", "messages": [{"role": "user", "content": "回复 OK"}], "max_tokens": 10 }'返回里能看到choices数组和content字段就说明通道通了。如果返回 401,检查 Key 是否复制完整;如果返回 404,检查路径是不是多拼或少拼了/v1。这一步通了再往下配 Hermes,能省很多排查时间。
3. 可复制配置:Skill 目录骨架与 config.toml 片段
这一节给出可以直接复制的目录结构和配置文件。先建目录骨架,Hermes 默认从~/.hermes/skills/加载 Skill,你也可以在config.toml里改成项目内目录。
推荐的目录结构:
~/.hermes/ ├── config.toml ├── skills/ │ ├── gh-health-skill.skill.md │ ├── pdf-summarizer.skill.md │ └── _archive/ │ └── old-skill.skill.md └── logs/ └── skill-execution.logskills/放活跃 Skill,_archive/放停用的旧版本,logs/存执行日志供反馈评估器读取。这个结构的好处是归档和活跃分离,自动进化时不会误改归档文件。
然后是config.toml。这是 Hermes 的主配置,Skill 相关的段落我单独拆出来:
[model] provider = "taotoken" base_url = "https://taotoken.net/api" api_path = "/v1/chat/completions" api_key_env = "TAOTOKEN_API_KEY" model_id = "你的模型ID" max_tokens = 4096 temperature = 0.3 [skill] enabled = true skill_dir = "~/.hermes/skills" archive_dir = "~/.hermes/skills/_archive" auto_evolve = true confidence_threshold = 0.75 require_confirmation = true max_versions_kept = 10 [skill.feedback] log_path = "~/.hermes/logs/skill-execution.log" collect_explicit = true collect_implicit = true evaluate_on_error = true [skill.hub] registry = "https://agentskills.io" auto_update = false几个参数说明。auto_evolve = true打开自动进化,confidence_threshold = 0.75表示只有评估器置信度高于这个值才改写 Skill。require_confirmation = true是安全开关,自动进化前会问你 y/n,生产环境建议保持 true,个人实验可以关掉。max_versions_kept = 10控制保留的历史版本数,防止磁盘膨胀。
api_key_env指向环境变量名,不要把 Key 明文写进config.toml。在 shell 里设置:
export TAOTOKEN_API_KEY="你的Key"写进~/.bashrc或~/.zshrc让它持久化。如果你用 CC Switch 管理多套配置,可以在 CC Switch 里建一个 TaoToken 的 profile,Base URL 填https://taotoken.net/api,Key 填刚生成的,Model ID 填你选的模型。三件套对齐后,Hermes 和 CC Switch 共用同一套凭证,不用两边维护。
再给一个 Skill 文件的完整骨架,复制后改内容即可:
--- name: gh-health-skill version: 1.0.0 description: 分析 GitHub 仓库健康度并生成评分报告 trigger_keywords: ["仓库健康度", "gh health", "分析仓库"] execution_mode: sequential requires: ["curl", "jq"] env_vars: ["GITHUB_TOKEN"] --- # gh-health-skill ## 描述 输入一个 GitHub 仓库 URL,输出包含 stars、README 完整性、issue 响应时间的健康度报告。 ## 适用场景 - 需要快速评估一个开源项目是否活跃 - 批量对比多个仓库的维护状况 ## 执行流程 1. 从用户输入中正则提取 owner 和 repo。 2. 调用 GitHub API 获取仓库基本信息。 3. 尝试获取 README,统计字数并检查是否有快速开始章节。 4. 获取最近 10 个 issue,计算平均响应时间。 5. 汇总生成评分报告。 ## 参数说明 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | url | string | 无 | GitHub 仓库地址 | | issue_count | int | 10 | 分析的 issue 数量 | ## 示例输入输出 **用户**: 分析 https://github.com/pandas-dev/pandas **AI**: (调用 Skill)健康度评分 78/100,README 默认分支不标准,issue 响应偏长。这个骨架里execution_mode支持sequential、parallel、conditional三种。requires声明依赖命令,Hermes 加载时会检查,缺了会提示。env_vars声明需要的环境变量,自动进化时如果发现某个变量没设置,会在报告里警告。
配置写完后,用/skill list确认 Hermes 能扫到你的 Skill。如果列表为空,检查skill_dir路径是不是写成了相对路径,或者文件扩展名是不是.skill.md而不是.md。
4. 验证请求:从人工指令到自动进化的完整动作
配置就绪后,跑一次端到端验证。这一步的目标是看到「人工指令生成 Skill → 执行 → 反馈 → 自动改写 → 版本号变化」的完整链路。
第一步,用自然语言让 Hermes 生成初始 Skill。在 Hermes 对话里输入:
帮我创建一个 Skill,名叫 gh-health-skill。当用户给出一个 GitHub 仓库地址时, 依次做这些事:用 GitHub API 获取 stars、forks、last_commit_date; 检查 README 是否存在并统计字数;获取最近 10 个 issue 计算平均响应时间; 汇总成健康度报告,满分 100,附改进建议。Hermes 会解析意图、生成步骤序列、推断依赖,然后写出.skill.md文件。大约几秒后返回类似:
已创建 Skill gh-health-skill 版本 1.0.0,保存在 ~/.hermes/skills/gh-health-skill.skill.md打开文件确认 frontmatter 里的name、version、trigger_keywords都正确。如果requires里少了jq,手动补上,因为后面解析 JSON 要用。
第二步,执行 Skill。命令格式:
/skill run gh-health-skill url=https://github.com/pandas-dev/pandas执行日志会写到~/.hermes/logs/skill-execution.log。正常输出类似:
[INFO] 提取 owner=pandas-dev, repo=pandas [INFO] 调用 API 获取基本信息成功 (stars: 39742, forks: 16789) [INFO] 尝试获取 README from master... 404 [INFO] 尝试获取 README from main... 成功,字数 2456 [INFO] 获取最近 10 个 issues... 有效样本 6 个 [WARN] 有效样本偏少,建议增加 issue_count [INFO] 健康度评分: 78/100第三步,给反馈触发自动进化。看到报告后,输入:
这个 Skill 应该支持个人访问令牌,避免 API 限流。Hermes 的反馈评估器会读取这句话,结合执行日志,生成改进计划:
准备升级 gh-health-skill 到 1.1.0,改进项: 1. 从环境变量 GITHUB_TOKEN 读取 PAT,加入 Authorization 头 2. 未设置 token 时显示警告但继续运行 3. 增加 API 剩余请求次数检查 是否同意?(y/n)输入y后,Hermes 改写 Markdown:frontmatter 加env_vars: ["GITHUB_TOKEN"],执行流程第 2 步改成带 Header 的 curl,插入新步骤检查 rate_limit,版本号变 1.1.0。
第四步,验证进化结果。设置环境变量后重新执行:
export GITHUB_TOKEN="你的GitHub PAT" /skill run gh-health-skill url=https://github.com/pandas-dev/pandas这次日志里会多出:
[INFO] 检测到 GITHUB_TOKEN,使用认证请求 [INFO] 当前 API 剩余次数: 4980 [INFO] 本次请求已使用 token,速率限制充裕版本号从 1.0.0 变成 1.1.0,说明自动进化闭环跑通了。如果没触发进化,检查auto_evolve是否为 true,以及反馈里是否包含可识别的改进意图。评估器对模糊反馈(比如「还行」)不会触发改写,需要明确的改进方向。
回滚测试也做一下:
/skill rollback gh-health-skill --to 1.0.0回滚后版本号回到 1.0.0,文件内容恢复。确认没问题再/skill upgrade gh-health-skill升回 1.1.0。这套版本管理是内建的,不依赖 Git,对不熟悉版本控制的用户友好。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
配置和验证过程中最容易撞上四类报错,逐个拆。
401 Unauthorized。最常见的原因是 Key 没设进环境变量,或者config.toml里api_key_env写的变量名和实际 export 的不一致。排查步骤:先echo $TAOTOKEN_API_KEY确认有值;再检查config.toml里是不是写成了api_key_env = "TAOTOKEN_KEY"而环境变量是TAOTOKEN_API_KEY。还有一种情况是 Key 复制时带了空格或换行,用echo -n重新设置。如果 Key 本身过期,去 https://taotoken.net/api-keys 重新生成。
local proxy failed。这个报错通常出现在客户端配置了本地代理但代理没启动,或者 Base URL 写成了localhost但本地没有对应服务。Hermes 直连 TaoToken 时不需要本地代理,检查config.toml里base_url是不是被误改成了http://127.0.0.1:xxxx。正确值应该是https://taotoken.net/api。如果你之前配过其他工具留下的代理设置,清理掉HTTP_PROXY和HTTPS_PROXY环境变量再试。
reading choices 相关报错。典型信息是cannot read property 'choices' of undefined或reading 'choices' failed。这说明请求返回了非预期结构,通常是响应体里没有choices字段。原因可能是:模型 ID 写错导致返回错误对象;api_path多拼了/v1变成/v1/v1/chat/completions;或者请求体里messages格式不对。排查方法:用第 2 节的 curl 命令单独测一次,看原始返回。如果 curl 正常但 Hermes 报错,对比两者请求体差异,重点看model字段和messages结构。
OAuth 相关报错。如果你用 Claude Code 接入,可能会遇到OAuth token expired或invalid_grant。Claude Code 默认走 OAuth 流程,但用 TaoToken 的 Key 接入时应该走 API Key 模式。检查~/.claude/settings.json里是不是同时存在ANTHROPIC_AUTH_TOKEN和 OAuth 相关字段,两者冲突会导致认证失败。正确做法是只保留ANTHROPIC_BASE_URL和ANTHROPIC_AUTH_TOKEN,删掉 OAuth 字段。具体配置参考 https://taotoken.net/doc 里的 Claude Code 章节。
再补一个 Skill 特有的报错:skill not found。这通常是skill_dir路径问题。Hermes 不展开~,如果你在config.toml里写skill_dir = "~/.hermes/skills",某些版本会解析失败。改成绝对路径/home/你的用户名/.hermes/skills最稳。或者用$HOME变量,但要看 Hermes 版本是否支持。
还有一个confidence below threshold的提示。这不是报错,是自动进化被跳过了。说明评估器算出的置信度低于 0.75。原因可能是反馈太模糊,或者历史改进成功率低。可以临时把confidence_threshold降到 0.6 观察,但长期不建议降太低,容易「学坏」。
排查时养成看日志的习惯。~/.hermes/logs/skill-execution.log里有完整的请求和响应摘要,比控制台输出详细。遇到reading choices这类结构错误,日志里通常能看到原始响应体,直接定位问题。
6. 语义一致 CTA:把 Skill 系统跑成长期能力
Skill 系统配好之后,真正的价值在持续使用。每次执行都是一次反馈机会,评估器会把日志和用户输入汇总,满足置信度就改写 Markdown。用久了你会发现,同一个 Skill 的版本号在涨,步骤在细化,参数默认值在调优,这就是程序性记忆在积累。
如果你还没拿 Key,先去 https://taotoken.net/api-keys 生成一个,然后照着第 3 节的config.toml片段配好。接入文档在 https://taotoken.net/doc ,里面有各客户端的完整示例。想先试试模型对话确认通道,去 https://taotoken.net/chat 。长期跑自动进化建议上 Coding Plan,入口 https://taotoken.net/coding-plan ,额度更适合频繁的反馈评估调用。
最后留一个可以立刻动手的小任务:对 Hermes 说「帮我创建一个 Skill,用来每天早晨推送我关心的技术新闻,格式为简洁列表」。然后观察它在你的反馈里怎么学会筛选信源、调整摘要长度、避开广告链接。这个过程比读任何文档都直观。