スキルを作る
目次
Hermes Agent に新しいことをさせたいときは、スキルにするのがいちばんの近道です。ツールより作るのが簡単で、エージェント側のコードには手を入れずに済み、ほかの人と分け合うこともできます。
スキルにするか、ツールにするか
次のような場合は スキル にします。
- やりたいことを、手順の説明とシェルのコマンド、それに既存のツールの組み合わせで書き表せる
- 外部の CLI や API を包むだけで、エージェントは
terminalやweb_extractから呼べる - Python での作り込みや、エージェント本体に API キーの管理を組み込む必要がない
- 例: arXiv の検索、git の作業手順、Docker の管理、PDF の処理、CLI ツールを使ったメール送信
次のような場合は ツール にします。
- API キー、認証の流れ、複数の部品にまたがる設定まで含めて、ひととおり組み込む必要がある
- 毎回きっちり同じ順に動かないと困る、独自の処理がある
- バイナリのデータ、ストリーミング、リアルタイムのイベントを扱う
- 例: ブラウザの自動操作、音声合成、画像の解析
スキルのディレクトリ構成
同梱のスキルは skills/ の下にカテゴリ別に置かれています。公式の任意スキルも、optional-skills/ に同じ構成で入っています。
skills/
├── research/
│ └── arxiv/
│ ├── SKILL.md # Required: main instructions
│ └── scripts/ # Optional: helper scripts
│ └── search_arxiv.py
├── productivity/
│ └── ocr-and-documents/
│ ├── SKILL.md
│ ├── scripts/
│ └── references/
└── ...SKILL.md の書式
---
name: my-skill
description: Brief description (shown in skill search results)
version: 1.0.0
author: Your Name
license: MIT
platforms: [macos, linux] # Optional — restrict to specific OS platforms
# Valid: macos, linux, windows
# Omit to load on all platforms (default)
metadata:
hermes:
tags: [Category, Subcategory, Keywords]
related_skills: [other-skill-name]
requires_toolsets: [web] # Optional — only show when these toolsets are active
requires_tools: [web_search] # Optional — only show when these tools are available
fallback_for_toolsets: [browser] # Optional — hide when these toolsets are active
fallback_for_tools: [browser_navigate] # Optional — hide when these tools exist
config: # Optional — config.yaml settings the skill needs
- key: my.setting
description: "What this setting controls"
default: "sensible-default"
prompt: "Display prompt for setup"
blueprint: # Optional — marks this skill a runnable automation
schedule: "0 9 * * *" # cron expr / "every 2h" / ISO timestamp
deliver: origin # optional (default origin)
prompt: "Task instruction for each run" # optional
no_agent: false # optional
required_environment_variables: # Optional — env vars the skill needs
- name: MY_API_KEY
prompt: "Enter your API key"
help: "Get one at https://example.com"
required_for: "API access"
---
# Skill Title
Brief intro.
## When to Use
Trigger conditions — when should the agent load this skill?
## Quick Reference
Table of common commands or API calls.
## Procedure
Step-by-step instructions the agent follows.
## Pitfalls
Known failure modes and how to handle them.
## Verification
How the agent confirms it worked.プラットフォームを限定したスキル
platforms の項目を使うと、スキルを特定の OS だけに限定できます。
platforms: [macos] # macOS only (e.g., iMessage, Apple Reminders)
platforms: [macos, linux] # macOS and Linux
platforms: [windows] # Windows only指定しておくと、合わない環境ではシステムプロンプトからも skills_list() からもスラッシュコマンドからも自動的に外れます。書かなかった場合や空の場合は、どの環境でも読み込まれます(従来どおりの動きです)。
条件によって出し分ける
スキルは、特定のツールやツールセットに依存することを宣言できます。これによって、そのセッションのシステムプロンプトにスキルを載せるかどうかが決まります。
metadata:
hermes:
requires_toolsets: [web] # Hide if the web toolset is NOT active
requires_tools: [web_search] # Hide if web_search tool is NOT available
fallback_for_toolsets: [browser] # Hide if the browser toolset IS active
fallback_for_tools: [browser_navigate] # Hide if browser_navigate IS available| 項目 | 動き |
|---|---|
requires_toolsets |
挙げたツールセットのどれかが使えないとき、スキルは隠れます |
requires_tools |
挙げたツールのどれかが使えないとき、スキルは隠れます |
fallback_for_toolsets |
挙げたツールセットのどれかが使えるとき、スキルは隠れます |
fallback_for_tools |
挙げたツールのどれかが使えるとき、スキルは隠れます |
**fallback_for_* の使いどころ:** 本命のツールが使えないときの代わりになるスキルを作れます。たとえば fallback_for_tools: [web_search] を付けた duckduckgo-search スキルは、API キーが要るウェブ検索ツールが設定されていないときにだけ出てきます。
**requires_* の使いどころ:** あるツールが揃っているときにだけ意味を持つスキルを作れます。たとえば requires_toolsets: [web] を付けたウェブ収集の手順スキルは、ウェブ系のツールを切っているときにプロンプトを無駄に埋めません。
必要な環境変数
スキルは、自分に必要な環境変数を宣言できます。skill_view でスキルが読み込まれると、宣言された変数は、隔離された実行環境(terminal、execute_code)へ渡すものとして自動で登録されます。
required_environment_variables:
- name: TENOR_API_KEY
prompt: "Tenor API key" # Shown when prompting user
help: "Get your key at https://tenor.com" # Help text or URL
required_for: "GIF search functionality" # What needs this varそれぞれの項目で書けるのは次のとおりです。
name(必須) — 環境変数の名前prompt(任意) — 値を尋ねるときに出す文言help(任意) — 値の入手先を示す説明や URLrequired_for(任意) — どの機能にこの変数が要るのかの説明
利用者は config.yaml で、渡す変数を自分で指定することもできます。
terminal:
env_passthrough:
- MY_CUSTOM_VAR
- ANOTHER_VARmacOS 専用スキルの例は skills/apple/ にあります。
読み込み時に安全に設定する
スキルに API キーやトークンが要るときは required_environment_variables を使います。値が入っていなくても、スキルが見つからなくなるわけではありません。手元の CLI でスキルを読み込むときに、Hermes が安全な形で値を尋ねます。
required_environment_variables:
- name: TENOR_API_KEY
prompt: Tenor API key
help: Get a key from https://developers.google.com/tenor
required_for: full functionality設定を飛ばしたままスキルを読み込むこともできます。Hermes が秘密の値そのものをモデルに見せることはありません。ゲートウェイやメッセージ経由のセッションでは、値をその場で集めるのではなく、手元で設定するための案内が出ます。
古い書き方の prerequisites.env_vars も、そのまま使えるように残してあります。
設定項目(config.yaml)
スキルは、秘密ではない設定項目を宣言できます。値は config.yaml の skills.config の下に保存されます。.env に置く環境変数(秘密)とは違って、こちらはパスや好みなど、見られて困らない値のためのものです。
metadata:
hermes:
config:
- key: myplugin.path
description: Path to the plugin data directory
default: "~/myplugin-data"
prompt: Plugin data directory path
- key: myplugin.domain
description: Domain the plugin operates on
default: ""
prompt: Plugin domain (e.g., AI/ML research)それぞれの項目で書けるのは次のとおりです。
key(必須) — 設定のドット区切りのパス(例:myplugin.path)description(必須) — その設定が何を左右するのかの説明default(任意) — 利用者が設定しなかったときの既定値prompt(任意) —hermes config migrateのときに出す文言。書かなければdescriptionが使われます
動きの流れ:
- 保存: 値は
config.yamlのskills.config.<key>の下に書かれます。
skills:
config:
myplugin:
path: ~/my-data- 見つけ方:
hermes config migrateが有効なスキルをすべて調べ、まだ設定されていない項目を見つけて利用者に尋ねます。設定はhermes config showの "Skill Settings" にも出てきます。
- 実行時の差し込み: スキルが読み込まれると、設定値が解決されてスキルのメッセージに付け足されます。
[Skill config (from ~/.hermes/config.yaml):
myplugin.path = /home/user/my-data
] エージェントは config.yaml を自分で読まなくても、設定された値を見られます。
- 手で設定する: 値を直接書き込むこともできます。
hermes config set skills.config.myplugin.path ~/my-data認証情報のファイル(OAuth のトークンなど)
OAuth やファイル形式の認証情報を使うスキルは、遠隔の隔離環境へ持ち込む必要のあるファイルを宣言できます。これは環境変数ではなくファイルとして保存された認証情報のためのもので、たいていはセットアップ用のスクリプトが作る OAuth のトークンファイルです。
required_credential_files:
- path: google_token.json
description: Google OAuth2 token (created by setup script)
- path: google_client_secret.json
description: Google OAuth2 client credentialsそれぞれの項目で書けるのは次のとおりです。
path(必須) —~/.hermes/からの相対パスdescription(任意) — そのファイルが何で、どう作られるのかの説明
読み込み時に、Hermes はこれらのファイルがあるかどうかを確かめます。無ければ setup_needed になります。あるファイルは自動的に次のように扱われます。
- Docker のコンテナには読み取り専用でマウントされます
- Modal の隔離環境には同期されます(作成時と、コマンドを実行するたび。そのため途中で OAuth をやり直しても効きます)
- ローカルのバックエンドでは、特別なことをしなくてもそのまま使えます
両方を使った例の全体は skills/productivity/google-workspace/SKILL.md にあります。
スキルを書くときの指針
外部の依存を持ち込まない
Python の標準ライブラリ、curl、それに Hermes に元からあるツール(web_extract、terminal、read_file)で済ませてください。どうしても依存が要るなら、入れ方をスキルの中に書いておきます。
よく使うものを先に書く
いちばんよく通る手順を先頭に置きます。例外的な使い方や凝った使い方は下のほうにまとめます。こうしておくと、ふだんの作業でのトークンの消費が抑えられます。
補助スクリプトを添える
XML や JSON の解析、込み入った処理は、scripts/ に補助スクリプトとして入れておきます。毎回 LLM にその場で書かせるのは避けてください。
メディアはファイルとして届ける([[as_document]])
高解像度の画面写真や図など、プレビュー用に圧縮されると困る画像をスキルが作るときは、返答のどこか(多くは最終行)に [[as_document]] という文字列をそのまま書きます。ゲートウェイはこの指定を取り除き、その返答から取り出したメディアを、画像として並べる代わりにダウンロードできる添付ファイルとして届けます。細かい決まりは スキルの出力とメディアの届け方 を参照してください。
SKILL.md から同梱スクリプトを指す
スキルが読み込まれると、有効化のメッセージにスキルのディレクトリの絶対パスが [Skill directory: /abs/path] として載ります。さらに、SKILL.md の本文にある次の 2 つの記号は、どこに書いてあっても置き換えられます。
| 記号 | 置き換わるもの |
|---|---|
${HERMES_SKILL_DIR} |
スキルのディレクトリの絶対パス |
${HERMES_SESSION_ID} |
動いているセッションの ID(セッションが無ければそのまま残ります) |
そのため、SKILL.md からエージェントに同梱スクリプトを直接動かさせるには、こう書けます。
To analyse the input, run:
node ${HERMES_SKILL_DIR}/scripts/analyse.js <input>エージェントは置き換わったあとの絶対パスを見て、そのまま動かせるコマンドとして terminal ツールを呼びます。パスを組み立て直す必要も、skill_view をもう一度呼ぶ必要もありません。置き換えをやめたいときは、config.yaml で skills.template_vars: false にします。
本文に埋め込むシェルの断片(既定では無効)
SKILL.md の本文には、` !cmd ` という書き方でシェルの断片を埋め込むこともできます。有効にしておくと、エージェントがメッセージを読む前に、その断片の標準出力が本文へ差し込まれます。そのため、スキルがその場の情報を持ち込めます。
Current date: !`date -u +%Y-%m-%d`
Git branch: !`git -C ${HERMES_SKILL_DIR} rev-parse --abbrev-ref HEAD`これは既定では無効です。SKILL.md に書かれた断片は、確認を挟まずにそのまま手元の環境で動きます。信用できる配布元のスキルにだけ有効にしてください。
# config.yaml
skills:
inline_shell: true
inline_shell_timeout: 10 # seconds per snippet断片はスキルのディレクトリを作業ディレクトリとして動き、出力は 4000 文字までに切られます。時間切れや異常終了で失敗したときは、スキル全体が壊れるのではなく、[inline-shell error: ...] という短い印が出ます。
試してみる
スキルを動かして、エージェントが指示どおりに動くか確かめます。
hermes chat --toolsets skills -q "Use the X skill to do Y"スキルはどこに置くか
同梱のスキル(skills/ にあるもの)は、Hermes を入れれば必ず付いてきます。ですから、多くの利用者にとって広く役に立つものであるべきです。
- 文書の扱い、ウェブでの調べもの、よくある開発の手順、システムの管理
- 幅広い人がふだんから使うもの
公式ではあっても、誰にでも要るわけではないもの(有料サービスとの連携、重い依存が要るものなど)は optional-skills/ に置きます。リポジトリには同梱され、hermes skills browse から「official」の表示付きで見つけられ、信用された状態で入ります。
用途が限られたもの、有志が作ったもの、ごく狭い分野のものは、Skills Hub のほうが向いています。登録先にアップロードして、hermes skills install で分け合えます。
ブループリント: 自動実行もできるスキル
ブループリント とは、ふつうのスキルの先頭にスケジュールを書き足したものです。metadata.hermes.blueprint のかたまりを足せば、そのスキルは、人に渡せて自動で動く仕組みになります。
metadata:
hermes:
tags: [blueprint, email]
blueprint:
schedule: "0 8 * * *" # presence of `blueprint:` marks it runnable
deliver: telegram # optional (default: origin)
prompt: "Summarize my unread email and today's calendar." # optional
no_agent: false # optionalブループリントはスキルそのものなので、スキルの仕組みをそのまま通ります。検索、中身の確認、インストール、安全性の検査、出どころの記録、tap、まとめられた索引、それに共有のための hermes skills publish まで、何ひとつ変わりません。新しく覚えることはありません。
ブループリントを入れると。 blueprint: のかたまりを持つスキルを入れると、Hermes はそれを候補として提案される定期実行に登録します。実際に動かすかどうかは自分で決めます。入れただけで定期実行が黙って作られることはありません。/suggestions で内容を見て受け入れます。
hermes skills install owner/morning-brief
# → Blueprint: 'morning-brief' is an automation (schedule 0 8 * * *).
# Added to your suggestions — run /suggestions to schedule or dismiss it.
# then, in a session:
/suggestions # lists pending suggestions, numbered
/suggestions accept 1 # creates the cron job
/suggestions dismiss 1 # never offer it againブループリントは、まとめられた定期実行の提案の出どころの 1 つです。同じ場所に、選りすぐりの入門用の自動処理や、のちのち使い方の傾向や連携から生まれる提案も並びます。下の 提案される定期実行 を参照してください。
作った自動処理を分け合う。 定期実行(hermes cron create --skill <name> ...)から読み込まれているブループリントは、SKILL.md に書き出して、ほかのスキルと同じように公開できます。自分向けに調整した自動処理が、ほかの人にとってはコマンド 1 つで入るものになります。
ブループリントの仕組みは、新しい種類のものも、新しい保管場所も、新しい受け渡しの経路も増やしません。ブループリントはスキルであり、スケジュールは定期実行であり、共有は今までどおりの publish・tap・索引の道筋です。
提案される定期実行
Hermes は、定期実行を自分で組み立てさせる代わりに、自動処理を*提案*して、ひと押しで受け入れられるようにできます。どこから来た提案でも、出てくる場所は /suggestions コマンドの 1 か所です。
| 出どころ | きっかけ |
|---|---|
catalog |
選りすぐりの入門用の自動処理(/suggestions catalog)。日々のまとめ、大事なメールの見張り、週の振り返り、始業時の声かけ |
blueprint |
blueprint: のかたまりを持つスキルを入れたとき |
usage |
裏で動く見直しが、定期実行にすると良さそうな繰り返しの頼みごとに気づいたとき |
integration |
アカウント(Gmail、GitHub など)をつないだときに、思い当たる自動処理が示されます |
/suggestions # list pending
/suggestions accept N # schedule suggestion N (creates the cron job)
/suggestions dismiss N # dismiss it — latched, never re-offered
/suggestions catalog # add the curated starter automations提案を受け入れると、cronjob ツールが使うのと同じ cron.jobs.create_job が呼ばれます。定期実行の仕組みが二重になることはありません。提案から勝手に定期実行が作られることはありません。受け入れるのはいつも自分の操作です。断った提案は決まった鍵で覚えられ、同じものが二度と出てくることはありません。待機中の一覧には上限があるので、うるさく積み上がることもありません。
catalog にある 大事なメールの見張り は、集めて、選り分けて、必要なものだけ見せるという型のお手本です。受信箱の内容を軽い判定用モデル(config.yaml の auxiliary.monitor)で採点し、急ぎと判断されたものだけを届けて、それ以外のときは黙っています。
スキルを公開する
Skills Hub へ
hermes skills publish skills/my-skill --to github --repo owner/repo自分のリポジトリへ
自分のリポジトリを tap として登録します。
hermes skills tap add owner/repoこれで、ほかの人がそのリポジトリから探して入れられるようになります。
安全性の検査
Hub から入れたスキルは、すべて次の点を調べる検査を通ります。
- データを外へ持ち出そうとする書き方
- プロンプトへの割り込みを狙った書き方
- 壊してしまうコマンド
- シェルへの割り込みを狙った書き方
信用の段階は次のとおりです。
builtin— Hermes に同梱されているもの(いつでも信用されます)official— リポジトリのoptional-skills/にあるもの(信用済みとして扱われ、第三者向けの警告は出ません)trusted— openai/skills、anthropics/skills、huggingface/skills から来たものcommunity— 危険とまでは言えない指摘なら--forceで押し切れます。dangerousと判定されたものは止められたままです
Hermes は今では、外部から見つける仕組みをいくつも使って、第三者のスキルを取り込めます。
- GitHub の識別子を直接指定する(たとえば
openai/skills/k8s) skills.shの識別子を指定する(たとえばskills-sh/vercel-labs/json-render/json-render-react)/.well-known/skills/index.jsonで配られる well-known のエンドポイント
GitHub 専用の入れ方に頼らずにスキルを見つけてもらいたいなら、リポジトリやマーケットプレイスでの公開に加えて、well-known のエンドポイントから配ることも考えてみてください。