尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Hermes Agent技能开发实战:从零构建陌陌回复Skill

Hermes Agent技能开发实战:从零构建陌陌回复Skill 在使用 Hermes Agent 这类 AI Agent 时真正拉开效率差距的往往不是模型本身而是你有没有把高频工作流拆成可复用的技能Skills。技能本质上是一套带元信息的指令包它告诉 Agent 在什么场景下调用、调用时需要什么输入、按什么格式输出。这篇文章就以“Hermes Agent 陌陌回复信息技能”为例走一遍从需求拆解、环境准备、Skill 目录搭建、提示词与脚本编写到安装验证和常见问题排查的完整流程。文章不会把技能写成黑魔法也不会替你决定是否要自动化发送消息而是聚焦在“如何让 Agent 生成符合语境的回复草稿”这一可落地、可扩展的工程环节。如果你平时用的是 Hermes Agent 的命令行客户端或桌面端并且已经接触过 skills、skills hub 之类的概念那这篇文章可以帮你理清一个自定义技能从零到一的关键节点。如果你只是刚安装好 Hermes Agent还不清楚登录网站与 API Key 的关系也可以从环境准备部分开始读逐步把基础链路跑通。1. 先理解 Hermes Agent 的技能机制1.1 Skill 是什么它解决什么问题简单来说Skill 是给 Agent 使用的一份“操作手册”。它不是一个独立的程序也不是一个普通的对话提示词而是一组包含以下内容的文件元信息技能名称、描述、版本、适用场景、作者。使用说明告诉 Agent 什么时候该调用这个技能什么时候不该调用。处理逻辑可以是一段提示词模板也可以是脚本或配置文件。可选资源知识库文件、参考文档、样例数据、图片素材等。没有 Skill 时你每次都要在对话框里重新描述任务“帮我看看这段陌陌聊天记录然后生成三条不同语气的回复”。有了 Skill 后你只需要说“用 momo-reply 技能处理这段对话”Agent 就会读取技能里的说明按既定流程完成输入解析、提示词组装、输出格式化。所以 Skill 解决的核心问题是“把不稳定的人工指示变成可复用、可版本管理、可分享的标准工作流”。1.2 Skill 和普通提示词、知识库的差异很多人会把 Skill 和普通提示词、知识库混在一起实际项目里它们的边界更像这样项目普通提示词知识库Skill本质一次性指令静态数据源可执行工作流是否包含代码通常不包含不包含可以包含脚本是否可主动触发每次手动输入检索时被动命中按描述被自动或手动调用是否能处理参数弱靠对话上下文不支持支持结构化输入输出典型例子“帮我写一封信”RAG 问答文档库回复生成、代码检查、测试执行从这张表能看出Skill 更像是“提示词 数据 脚本”的组合体。它比普通提示词更工程化比知识库更可操作。1.3 为什么回复类任务特别适合做成 Skill陌陌回复信息这类任务天然适合 Skill 化原因是它的输入输出非常稳定输入固定聊天对象、最近几条消息、回复目标、期望语气。输出固定若干条候选回复每条附带适用场景说明。判断规则固定哪些话不适合直说、哪些回复显得敷衍、哪些表达需要避免。当输入输出足够稳定时就可以用 Skill 把“上下文组装、提示词生成、候选过滤、格式校验”这一整套流程固化下来。这样既减少每次对话里的重复描述也让 Agent 的输出更可控。2. 环境准备安装、登录与常用命令2.1 安装方式和版本确认Hermes Agent 的安装方式在不同平台上有差异。常见项目会提供 npm 全局安装、Homebrew 安装或一键脚本具体命令要以官方文档为准。下面只演示最常见的安装思路# npm 方式安装示例实际以官方文档为准 npm install -g hermes-agent # 查看版本确认安装成功 hermes --versionMac 环境下如果遇到权限问题可以在命令前加 sudo或者用 Homebrew 安装。安装完成后先执行一次hermes --version能输出版本号说明主程序本身没有问题。如果命令找不到需要检查 npm 全局 bin 目录是否加入了系统 PATH。2.2 登录网站与 API Key 的关系有同学反馈“Hermes Agent 安装要登录网站怎么回事”这其实是正常流程不是网络问题。Hermes Agent 本身只是一个客户端壳子真正生成回复依赖大模型 API而 API 调用需要凭证。登录网站通常是为了获取或申请 API Key。确认账号对应的套餐和额度。生成授权 token让本地客户端能安全调用远程接口。登录后客户端会把凭证写入本地配置。后续使用不需要每次都登录只有在凭证失效或更换账号时才需要重新处理。2.3 修改 API Key 的两种路径“Hermes Agent 客户端如何修改 API Key”是高频问题。常见做法有两种。第一种是通过命令修改hermes config set api_key sk-你的新key第二种是直接编辑配置文件。常见路径可能是~/.hermes/config.yaml或~/.hermes/config.json里面会有一项api_keyapi_key: sk-你的新key base_url: https://api.example.com/v1 model: gpt-4o修改后重启客户端再执行一个简单问题验证是否生效。不建议在生产环境中把 API Key 硬编码在 Skill 或项目代码里应该通过环境变量或本地配置统一管理。2.4 常用命令和返回主页面Hermes Agent 在不同版本里支持的命令不完全一致但常见操作有操作示例命令说明查看帮助/help或help列出当前会话可用命令回到主页面/home或home退出当前子任务回到主菜单查看当前配置hermes config list展示 API Key、模型、目录等配置加载技能skills list查看已安装的技能列表如果“回到主页面的命令”找不到不要靠猜。先执行help看当前版本对“主页面”的定义是什么。有些版本用/exit退出子任务有些用home还有的用/back。命令名称并不重要重要的是先看到当前会话的完整命令清单。3. 先定输入输出再写技能代码3.1 需求拆解写 Skill 之前先不要急着写代码先把需求拆成四个问题输入是什么用户会提供哪些信息输出是什么Agent 应该返回什么结构的结果规则是什么哪些回复不能出现哪些风格需要优先保留失败处理输入不完整或格式错误时怎么办对“陌陌回复信息技能”来说需求可以拆成这样输入聊天对象、最近几条消息、用户期望的语气、回复目标。输出至少三条候选回复每条给出适用场景说明。规则不生成冒犯性内容不编造对方说过的话不替用户承诺事务。失败处理如果最近消息为空直接提示用户补充上下文。3.2 输入数据格式为了让 Skill 可复用推荐把输入规范化成 JSON。下面是一个示例{ sender: 对方昵称, background: 认识不久的朋友之前在聊周末活动, recent_chat: [ 对方你周末有什么安排吗, 我还不确定可能在家休息。, 对方那要不要一起去看个展 ], reply_goal: 礼貌回应同时不草率答应, tone_options: [友好, 轻松, 谨慎] }这里recent_chat存的是原始聊天片段tone_options让调用者指定想要的语气。这样设计的好处是技能只负责“根据上下文生成建议”不需要从对话历史里重新推断谁是发送人。如果输入来自 Hermes Agent 的对话用户可以直接把上面这段 JSON 粘贴给 Agent。如果是从本地文件读取可以让技能脚本先解析 JSON 文件。3.3 输出数据格式输出也要固定否则后续无法程序化处理。推荐结构如下{ candidates: [ { tone: 友好, text: 听起来不错不过我想先确认一下时间和地点。, note: 适合不想直接拒绝又需要保留余地的场景 }, { tone: 轻松, text: 可以啊我刚好也想出门透透气。, note: 适合双方都比较熟、氛围轻松的聊天 }, { tone: 谨慎, text: 我先看看这周工作安排晚点给你答复。, note: 适合不确定是否想赴约、需要缓一缓的场景 } ] }candidates是列表tone标语气text是回复内容note解释这条回复适合什么场景。输出必须是合法 JSON这样后续如果想接发送动作只需要解析text字段。3.4 先跑通提示词再固化成 Skill不要直接写完整 Skill先在普通对话里验证提示词是否有效。可以这样测试你是一个社交聊天助手。根据下面聊天上下文生成回复建议。 聊天对象对方昵称 聊天背景认识不久的朋友之前在聊周末活动 最近消息 - 对方你周末有什么安排吗 - 我还不确定可能在家休息。 - 对方那要不要一起去看个展 回复目标礼貌回应同时不草率答应 请输出三条候选回复每条注明语气和适用场景。如果这个提示词在普通对话里能生成满意结果再把它挪进 Skill 目录加上元信息和可选的脚本处理。这样能把“提示词调试”和“技能封装”分成两步避免在技能环境里反复调错。4. 创建 Skill 目录和 SKILL.md4.1 目录标准结构一个 Skill 在文件系统里通常是一个包含SKILL.md的目录。对于陌陌回复技能目录结构可以这样设计~/.hermes/skills/momo-reply/ ├── SKILL.md ├── scripts/ │ ├── generate_reply.py │ └── format_history.py └── assets/ └── examples.jsonSKILL.md技能入口包含元信息和用户手册。scripts/存放 Python 或其他语言脚本负责解析输入、组装 prompt、处理输出。assets/放参考样例或知识库文件。如果技能逻辑非常简单可以只写SKILL.md不写脚本。脚本的意义是处理复杂数据结构、调用外部 API、做格式校验。4.2 编写 SKILL.mdSKILL.md是技能的核心。一个最小可用的内容如下--- name: momo-reply description: 根据陌陌聊天上下文生成多条回复建议支持指定语气和回复目标。 version: 1.0.0 author: your-name tags: [momo, reply, social, assistant] --- # 陌陌回复信息技能 ## 何时使用 当用户提供以下信息之一时可以使用本技能 - 聊天对象昵称 - 最近几条聊天消息 - 期望语气例如友好、轻松、谨慎 - 回复目标例如婉拒、答应、继续话题 当用户只给出零散消息但没有回复目标时也可以使用但生成质量会下降。 ## 输入格式 技能接收 JSON 格式输入字段包括 sender、background、recent_chat、reply_goal、tone_options。 ## 处理步骤 1. 解析输入 JSON。 2. 拼接聊天上下文。 3. 调用 LLM 生成候选回复。 4. 输出 candidates 列表。 ## 输出格式 输出是包含 candidates 数组的 JSON每条候选建议包含 tone、text、note。这段SKILL.md的作用不是被用户阅读而是被 Agent 理解。描述字段越具体Agent 越能在合适的场景自动调用它。4.3 元信息字段说明元信息里的字段不是随便写的它们直接影响 Agent 的技能匹配效果。字段含义推荐写法name技能唯一名称使用短横线命名如 momo-replydescription技能能力说明写成“根据什么输入生成什么输出”不要写空话version技能版本语义化版本如 1.0.0author作者标识个人 ID 或团队名tags标签列表方便分类检索可填 momo、reply、socialdescription 是最容易被写坏的字段。不要写“一个回复技能”而要写“根据陌陌聊天上下文生成多条回复建议支持指定语气和回复目标”。这样 Agent 在语义匹配时更准确。5. 用 Python 写技能核心逻辑5.1 读取输入脚本的第一件事是读取标准输入。Hermes Agent 在调用技能脚本时通常会把用户的输入作为标准输入传给脚本。下面的代码演示如何解析 JSON 输入。#!/usr/bin/env python3 import json import sys def load_context(): raw sys.stdin.read().strip() if not raw: return {} try: return json.loads(raw) except json.JSONDecodeError: return {raw: raw}如果输入不是 JSON脚本要能降级处理不要把错误直接抛给用户。5.2 调用 LLM 生成草稿脚本本身不需要内置大模型逻辑它可以调用 LangChain、OpenAI SDK也可以借助 Hermes Agent 内置的模型能力。下面是一个使用 OpenAI 兼容接口的示例。import os from openai import OpenAI client OpenAI( api_keyos.getenv(HERMES_API_KEY), base_urlos.getenv(HERMES_BASE_URL), ) def build_prompt(ctx): history \n.join(f- {m} for m in ctx.get(recent_chat, [])) tone_options 、.join(ctx.get(tone_options, [友好, 轻松, 谨慎])) prompt f 你是一位社交聊天助手。根据聊天上下文生成回复建议。 聊天对象{ctx.get(sender, 对方)} 聊天背景{ctx.get(background, 普通朋友聊天)} 最近消息 {history} 回复目标{ctx.get(reply_goal, 礼貌回应)} 期望语气{tone_options} 输出 JSON格式为 {{ candidates: [ {{tone: 语气, text: 回复内容, note: 适用场景说明}} ] }} return prompt def generate_reply(ctx): prompt build_prompt(ctx) response client.chat.completions.create( modelgpt-4o-mini, messages[{role: user, content: prompt}], temperature0.7, ) content response.choices[0].message.content return json.loads(content)这里的temperature0.7是生成类任务的常见取值。如果想让回复更稳定可以调到 0.3 左右如果想让候选之间差异更大可以调到 0.9但输出质量也会波动。5.3 过滤和格式化LLM 返回的内容不一定干净。脚本要做三件事去掉代码块标记。解析 JSON解析失败时做一次纠错。过滤空文本、重复内容和明显不合规的文本。下面是一个简单过滤器def normalize_candidates(data): candidates data.get(candidates, []) result [] seen set() for item in candidates: text item.get(text, ).strip() if not text or text in seen: continue seen.add(text) result.append(item) return {candidates: result}过滤逻辑不需要复杂但一定要有。因为模型输出偶尔会带前后缀、重复回复或换行异常。5.4 将脚本接入 SKILL.md脚本写好后需要在SKILL.md里说明调用方式这样 Agent 才知道何时执行脚本。可以在“处理步骤”里补充## 脚本调用 当输入包含结构化 JSON 时执行以下命令 bash python3 ~/.hermes/skills/momo-reply/scripts/generate_reply.py脚本从标准输入读取 JSON从标准输出返回 JSON。注意这个示例的路径是固定的如果你的技能安装在其他目录需要替换为实际路径。生产环境里不建议在 SKILL.md 中写死个人路径建议使用相对路径或由 Agent 根据技能目录动态计算。 ## 6. 安装技能并验证效果 ### 6.1 复制到本地技能目录 手工安装技能只需要把目录复制到 Hermes Agent 的技能目录。以常见目录为例 bash mkdir -p ~/.hermes/skills/momo-reply cp -r ./momo-reply/* ~/.hermes/skills/momo-reply/复制完成后用skills list查看是否出现 momo-reply。如果是从网上下载别人的技能常见的安装方式有两种从 skills hub 搜索安装或从 Git 仓库克隆到技能目录。无论哪种方式安装后都要先看SKILL.md的元信息确认技能名称、版本和执行方式避免运行来源不明的脚本。6.2 在 Agent 中触发技能技能安装后有两种触发方式自动触发Agent 根据用户描述和技能 description 自动匹配。手动触发用户明确说“使用 momo-reply 技能”。手动触发更可控。可以在对话中输入使用 momo-reply 技能处理这段输入 {sender: 对方, recent_chat: [对方你好, 我你好呀], reply_goal: 礼貌开启话题}如果技能正常Agent 应该返回 JSON 结构其中candidates数组里有几条回复建议。6.3 输入输出示例下面是一个完整验证示例。输入{ sender: 小满, background: 前同事很久没联系, recent_chat: [ 小满最近怎么样, 我还可以刚换了个工作。, 小满那挺好哪天出来聊聊。 ], reply_goal: 礼貌答应但不确定具体时间, tone_options: [友好, 职业] }期望输出{ candidates: [ { tone: 友好, text: 好啊最近确实可以约个饭我看看下周哪天方便。, note: 表达了愿意见面同时保留时间选择空间 }, { tone: 职业, text: 可以呀我下周工作日基本都有空你定时间我配合。, note: 比较直接适合双方都有明确时间安排的情况 } ] }验证时不要只看是否返回 JSON还要检查三条信息是否包含candidates数组。每条是否包含tone、text、note。文本是否符合reply_goal的约束。如果输出缺少某个字段说明提示词里的格式要求还不够严格需要回到第 3 节调整提示词。7. 常见问题排查下面这张表覆盖了从安装到使用过程中最常见的几类问题。问题现象可能原因检查方式处理建议安装后命令找不到npm bin 目录没加入 PATH执行 which hermes 或检查 PATH手动将 npm 全局 bin 目录加入 PATH首次使用需要登录网站缺少 API Key 或授权凭证查看本地配置文件是否为空按官方流程注册登录获取 API Key修改 API Key 后不生效未重启进程或修改了错误配置文件执行 hermes config list 查看当前值修改后重启客户端并确认修改的是当前环境配置技能不生效目录结构不对或 SKILL.md 缺失查看技能目录是否有 SKILL.md确认技能放在正确目录且元信息完整回到主页面命令找不到版本不一致命令不同执行 help 查看命令列表使用 /home、home 或 /exit 逐项尝试生成结果不是 JSON提示词格式约束不够严格查看脚本返回原文在提示词里强调只输出 JSON并增加解析纠错中文回复比较生硬缺少语气示例或温度不合适对比不同 tone 输出在提示词里加入语气示例调整 temperature7.1 技能不生效先查目录再查描述技能不生效时优先检查技能目录里是否有SKILL.md再检查元信息里的description是否足够具体。如果 description 是“回复技能”Agent 很难在匹配阶段判定它适合陌陌回复场景。改成“根据陌陌聊天上下文生成多条回复建议支持指定语气和回复目标”后命中率会明显提高。7.2 中文回复质量差要同时调提示词和温度中文质量差通常不是模型不够强而是提示词里缺少样例。可以把 5.3 节的build_prompt里加入一个“语气示例”字段例如语气示例 - 友善这条消息看起来很热闹感觉你周末过得很充实。 - 谨慎这件事我需要和家里商量一下晚点答复你。同时把温度降到 0.5 到 0.7 之间。温度太高会让回复发散太低会让候选之间差异太小。7.3 修改 API Key 后不生效检查配置层级如果命令行hermes config set api_key改完没效果可能是项目中存在另一个配置文件覆盖了全局配置。检查顺序是项目根目录下是否有.hermes或.env。用户目录下是否有~/.hermes/config.*。系统环境变量中是否设置了HERMES_API_KEY。环境变量优先级通常高于配置文件。如果环境变量里写了一个旧的 key即使修改配置文件也不会生效。执行env | grep HERMES可以快速排查。7.4 Mac 安装权限问题在 Mac 上安装全局 npm 包时经常遇到EACCES权限错误。可以用 Node 版本管理工具安装长期版 Node然后重新设置 npm 全局目录避免直接用 sudo 覆盖系统目录。装完后执行npm config get prefix确认目录存在且可写。7.5 回到主页面命令找不到按帮助为准“回到主页面”在不同版本里叫法不同。有的版本把主页面称为 main menu有的叫 home。遇到这种情况不要盲目套用网上的命令先执行help看当前版本支持哪些命令再根据输出选择。如果帮助里没有回到主页面的命令就直接退出当前会话重新进入。8. 最佳实践和扩展方向8.1 回复质量提升想让陌陌回复技能在真实聊天中更可用重点不是堆提示词而是把上下文做得更完整。每条聊天记录要标清楚发言方例如“对方”和“我”。输入里补充聊天背景能显著提升 Agent 对语气的判断。给reply_goal提供几个固定选项比如“婉拒”“答应”“延后答复”“继续话题”而不是让用户自由输入。在assets/examples.json里保存 5 到 10 组“上下文 高质量回复”样例让 Agent 有参考。如果多个候选回复之间雷同可以在提示词里加一句“三条回复请覆盖不同策略”并检查温度是否过低。8.2 隐私与合规红线聊天记录属于敏感数据使用技能时要注意边界。不要把聊天记录直接上传到不必要的外部服务。如果 Hermes Agent 使用远程模型 API要确认该服务的数据处理约定。技能只负责“生成回复建议”不要自动把消息发送给真实好友。不要在 Skill 里硬编码他人的昵称、头像、联系方式等隐私字段。如果陌陌平台对自动回复有规则限制也要自行确认避免因自动化行为带来账号风险。这里最稳妥的做法是技能生成草稿用户确认后手动发送。人机保持在环路里既保证体验也避免越界。8.3 扩展方向陌陌回复技能只是 Skills 的一种应用。如果你已经掌握了SKILL.md的写法和脚本接入方式可以继续扩展把同样的思路用于微信、短信、邮件等回复场景只需更换输入格式和语气示例。把技能拆成“回复生成”和“发送执行”两层生成层复用执行层按平台适配。学习如何发布技能到 skills hub或从社区下载前端开发、测试、学术写作等方向的现成技能。将技能与知识库结合例如把个人聊天风格、常用口头禅写入知识库让回复更有人味。如果技能逻辑复杂增加日志和错误输出把每次调用的情况记录到本地文件方便后期分析。写技能和写业务代码一样关键不是一次写对而是让每一次迭代都能被快速验证。先把一个最小场景跑通再逐步增加过滤、纠错、参数调优和发布流程这套方法论在 Hermes Agent 的任何技能上都适用。
返回列表