hermes - 💡(How to fix) Fix [i18n] Thai Translation: Features Part 2c - Plugins, Routing, RL, Skills, Skins [1 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
NousResearch/hermes-agent#15004Fetched 2026-04-25 06:25:16
View on GitHub
Comments
0
Participants
1
Timeline
2
Reactions
0
Author
Participants
Timeline (top)
labeled ×2

Error Message

~/.hermes/skins/mytheme.yaml

Complete skin template - all keys shown. Delete any you don't need;

missing values automatically inherit from the 'default' skin.

name: mytheme description: My custom theme

colors: banner_border: "#CD7F32" banner_title: "#FFD700" banner_accent: "#FFBF00" banner_dim: "#B8860B" banner_text: "#FFF8DC" ui_accent: "#FFBF00" ui_label: "#4dd0e1" ui_ok: "#4caf50" ui_error: "#ef5350" ui_warn: "#ffa726" prompt: "#FFF8DC" input_rule: "#CD7F32" response_border: "#FFD700" session_label: "#DAA520" session_border: "#8B8682" status_bar_bg: "#1a1a2e" voice_status_bg: "#1a1a2e" completion_menu_bg: "#1a1a2e" completion_menu_current_bg: "#333355" completion_menu_meta_bg: "#1a1a2e" completion_menu_meta_current_bg: "#333355"

spinner: waiting_faces: - "(⚔)" - "(⛨)" - "(▲)" thinking_faces: - "(⚔)" - "(⌁)" - "(<>)" thinking_verbs: - "processing" - "analyzing" - "computing" - "evaluating" wings: - ["⟪⚡", "⚡⟫"] - ["⟪●", "●⟫"]

branding: agent_name: "My Agent" welcome: "Welcome to My Agent! Type your message or /help for commands." goodbye: "See you later! ⚡" response_label: " ⚡ My Agent " prompt_symbol: "⚡ ❯ " help_header: "(⚡) Available Commands"

tool_prefix: "┊"

Per-tool emoji overrides (optional)

tool_emojis: terminal: "⚔" web_search: "🔮" read_file: "📄"

Custom ASCII art banners (optional, Rich markup supported)

banner_logo: |

[bold #FFD700] MY AGENT [/]

banner_hero: |

[#FFD700] Custom art here [/]

Fix Action

Fix / Workaround

ActionUse forKey params
createสร้าง Skill ใหม่ตั้งแต่ต้นname, content (full SKILL.md), optional category
patchแก้ไขแบบเจาะจง (แนะนำ)name, old_string, new_string
editเขียนใหม่โครงสร้างหลัก (Major structural rewrites)name, content (full SKILL.md replacement)
deleteลบ Skill ทั้งหมดname
write_fileเพิ่ม/อัปเดตไฟล์สนับสนุนname, file_path, file_content
remove_fileลบไฟล์สนับสนุนname, file_path

:::tip การกระทำ patch เป็นที่แนะนำสำหรับการอัปเดต - มันใช้โทเคนอย่างมีประสิทธิภาพกว่า edit เพราะมีเพียงข้อความที่เปลี่ยนแปลงเท่านั้นที่ปรากฏใน tool call :::

Code Example

~/.hermes/plugins/my-plugin/
├── plugin.yaml      # manifest
├── __init__.py      # register() - wires schemas to handlers
├── schemas.py       # tool schemas (what the LLM sees)
└── tools.py         # tool handlers (what runs when called)

---

name: hello-world
version: "1.0"
description: A minimal example plugin

---

"""Minimal Hermes plugin - registers a tool and a hook."""


def register(ctx):
    # --- Tool: hello_world ---
    schema = {
        "name": "hello_world",
        "description": "Returns a friendly greeting for the given name.",
        "parameters": {
            "type": "object",
            "properties": {
                "name": {
                    "type": "string",
                    "description": "Name to greet",
                }
            },
            "required": ["name"],
        },
    }

    def handle_hello(params):
        name = params.get("name", "World")
        return f"Hello, {name}! 👋  (from the hello-world plugin)"

    ctx.register_tool("hello_world", schema, handle_hello)

    # --- Hook: log every tool call ---
    def on_tool_call(tool_name, params, result):
        print(f"[hello-world] tool called: {tool_name}")

    ctx.register_hook("post_tool_call", on_tool_call)

---

plugins:
  enabled:
    - my-tool-plugin
    - disk-cleanup
  disabled:       # optional deny-list - always wins if a name appears in both
    - noisy-plugin

---

hermes plugins                    # interactive toggle (space to check/uncheck)
hermes plugins enable <name>      # add to allow-list
hermes plugins disable <name>     # remove from allow-list + add to disabled

---

hermes plugins                               # unified interactive UI
hermes plugins list                          # table: enabled / disabled / not enabled
hermes plugins install user/repo             # install from Git, then prompt Enable? [y/N]
hermes plugins install user/repo --enable    # install AND enable (no prompt)
hermes plugins install user/repo --no-enable # install but leave disabled (no prompt)
hermes plugins update my-plugin              # pull latest
hermes plugins remove my-plugin              # uninstall
hermes plugins enable my-plugin              # add to allow-list
hermes plugins disable my-plugin             # remove from allow-list + add to disabled

---

Plugins
  ↑↓ navigate  SPACE toggle  ENTER configure/confirm  ESC done

  General Plugins
[] my-tool-plugin - Custom search tool
   [ ] webhook-notifier - Event hooks
   [ ] disk-cleanup - Auto-cleanup of ephemeral files [bundled]

  Provider Plugins
     Memory Provider          ▸ honcho
     Context Engine           ▸ compressor

---

memory:
  provider: "honcho"      # empty string = built-in only

context:
  engine: "compressor"    # default built-in compressor

---

ctx.inject_message("New data arrived from the webhook", role="user")

---

provider_routing:
  sort: "price"           # วิธีการจัดอันดับผู้ให้บริการ
  only: []                # Whitelist: ใช้เฉพาะผู้ให้บริการเหล่านี้เท่านั้น
  ignore: []              # Blacklist: ห้ามใช้ผู้ให้บริการเหล่านี้เด็ดขาด
  order: []               # ลำดับความสำคัญที่กำหนดอย่างชัดเจน
  require_parameters: false  # ใช้เฉพาะผู้ให้บริการที่รองรับพารามิเตอร์ทั้งหมด
  data_collection: null   # ควบคุมการเก็บข้อมูล ("allow" หรือ "deny")

---

provider_routing:
  sort: "price"

---

provider_routing:
  only:
    - "Anthropic"
    - "Google"

---

provider_routing:
  ignore:
    - "Together"
    - "DeepInfra"

---

provider_routing:
  order:
    - "Anthropic"
    - "Google"
    - "AWS Bedrock"

---

provider_routing:
  require_parameters: true

---

provider_routing:
  data_collection: "deny"

---

provider_routing:
  sort: "price"

---

provider_routing:
  sort: "latency"

---

provider_routing:
  sort: "throughput"

---

provider_routing:
  only:
    - "Anthropic"

---

provider_routing:
  ignore:
    - "Together"
    - "Lepton"
  data_collection: "deny"

---

provider_routing:
  order:
    - "Anthropic"
    - "Google"
  require_parameters: true

---

providers_allowed  ← from provider_routing.only
providers_ignored  ← from provider_routing.ignore
providers_order    ← from provider_routing.order
provider_sort      ← from provider_routing.sort
provider_require_parameters ← from provider_routing.require_parameters
provider_data_collection    ← from provider_routing.data_collection

---

provider_routing:
  sort: "price"
  ignore: ["Together"]
  require_parameters: true
  data_collection: "deny"

---

# Set up API keys
hermes config set TINKER_API_KEY your-tinker-key
hermes config set WANDB_API_KEY your-wandb-key

---

List the available RL environments

---

Select the GSM8K environment and show me the configuration

---

Start the training run

---

Check the status of training run abc12345

---

Stop the training run
# or
Get the final results for run abc12345

---

Test the selected environment with inference

---

flowchart LR
    api["Atropos API<br/>run-api<br/>port 8000"]
    env["Environment<br/>BaseEnv implementation"]
    infer["OpenAI / sglang<br/>inference API<br/>port 8001"]
    trainer["Tinker Trainer<br/>LoRA training + FastAPI"]

    env <--> api
    env --> infer
    api -->|"batches: tokens, scores, logprobs"| trainer
    trainer -->|"serves inference"| infer

---

logs/
├── api_{run_id}.log        # Atropos API server logs
├── trainer_{run_id}.log    # Tinker trainer logs
├── env_{run_id}.log        # Environment process logs
└── inference_tests/        # Inference test results
    ├── test_{env}_{model}.jsonl
    └── test_{env}_{model}.log

---

# In the CLI or any messaging platform:
/gif-search funny cats
/axolotl help me fine-tune Llama 3 on my dataset
/github-pr-workflow create a PR for the auth refactor
/plan design a rollout for migrating our auth provider

# แค่ชื่อ skill ก็เพียงพอแล้ว ระบบจะโหลดและให้ agent ถามว่าคุณต้องการอะไร:
/excalidraw

---

hermes chat --toolsets skills -q "What skills do you have?"
hermes chat --toolsets skills -q "Show me the axolotl skill"

---

Level 0: skills_list()[{name, description, category}, ...]   (~3k tokens)
Level 1: skill_view(name)Full content + metadata       (varies)
Level 2: skill_view(name, path)Specific reference file       (varies)

---

---
name: my-skill
description: Brief description of what this skill does
version: 1.0.0
platforms: [macos, linux]     # Optional - restrict to specific OS platforms
metadata:
  hermes:
    tags: [python, automation]
    category: devops
    fallback_for_toolsets: [web]    # Optional - conditional activation (see below)
    requires_toolsets: [terminal]   # Optional - conditional activation (see below)
    config:                          # Optional - config.yaml settings
      - key: my.setting
        description: "What this controls"
        default: "value"
        prompt: "Prompt for setup"
---

# Skill Title

## When to Use
Trigger conditions for this skill.

## Procedure
1. Step one
2. Step two

## Pitfalls
- Known failure modes and fixes

## Verification
How to confirm it worked.

---

platforms: [macos]            # สำหรับ macOS เท่านั้น (เช่น iMessage, Apple Reminders, FindMy)
platforms: [macos, linux]     # สำหรับ macOS และ Linux

---

metadata:
  hermes:
    fallback_for_toolsets: [web]      # แสดงเฉพาะเมื่อ toolsets เหล่านี้ไม่พร้อมใช้งาน
    requires_toolsets: [terminal]     # แสดงเฉพาะเมื่อ toolsets เหล่านี้พร้อมใช้งาน
    fallback_for_tools: [web_search]  # แสดงเฉพาะเมื่อเครื่องมือเหล่านี้ไม่พร้อมใช้งาน
    requires_tools: [terminal]        # แสดงเฉพาะเมื่อเครื่องมือเหล่านี้พร้อมใช้งาน

---

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

---

metadata:
  hermes:
    config:
      - key: myplugin.path
        description: Path to the plugin data directory
        default: "~/myplugin-data"
        prompt: Plugin data directory path

---

~/.hermes/skills/                  # Single source of truth
├── mlops/                         # Category directory
│   ├── axolotl/
│   │   ├── SKILL.md               # Main instructions (required)
│   │   ├── references/            # Additional docs
│   │   ├── templates/             # Output formats
│   │   ├── scripts/               # Helper scripts callable from the skill
│   │   └── assets/                # Supplementary files
│   └── vllm/
│       └── SKILL.md
├── devops/
│   └── deploy-k8s/                # Agent-created skill
│       ├── SKILL.md
│       └── references/
├── .hub/                          # Skills Hub state
│   ├── lock.json
│   ├── quarantine/
│   └── audit.log
└── .bundled_manifest              # Tracks seeded bundled skills

---

skills:
  external_dirs:
    - ~/.agents/skills
    - /home/shared/team-skills
    - ${SKILLS_REPO}/skills

---

~/.hermes/skills/               # Local (primary, read-write)
├── devops/deploy-k8s/
│   └── SKILL.md
└── mlops/axolotl/
    └── SKILL.md

~/.agents/skills/               # External (read-only, shared)
├── my-custom-workflow/
│   └── SKILL.md
└── team-conventions/
    └── SKILL.md

---

hermes skills browse                              # Browse all hub skills (official first)
hermes skills browse --source official            # Browse only official optional skills
hermes skills search kubernetes                   # Search all sources
hermes skills search react --source skills-sh     # Search the skills.sh directory
hermes skills search https://mintlify.com/docs --source well-known
hermes skills inspect openai/skills/k8s           # Preview before installing
hermes skills install openai/skills/k8s           # Install with security scan
hermes skills install official/security/1password
hermes skills install skills-sh/vercel-labs/json-render/json-render-react --force
hermes skills install well-known:https://mintlify.com/docs/.well-known/skills/mintlify
hermes skills list --source hub                   # List hub-installed skills
hermes skills check                               # Check installed hub skills for upstream updates
hermes skills update                              # Reinstall hub skills with upstream changes when needed
hermes skills audit                               # Re-scan all hub skills for security
hermes skills uninstall k8s                       # Remove a hub skill
hermes skills reset google-workspace              # Un-stick a bundled skill from "user-modified" (see below)
hermes skills reset google-workspace --restore    # Also restore the bundled version, deleting your local edits
hermes skills publish skills/my-skill --to github --repo owner/repo
hermes skills snapshot export setup.json          # Export skill config
hermes skills tap add myorg/skills-repo           # Add a custom GitHub source

---

hermes skills browse --source official
hermes skills install official/security/1password

---

hermes skills search react --source skills-sh
hermes skills inspect skills-sh/vercel-labs/json-render/json-render-react
hermes skills install skills-sh/vercel-labs/json-render/json-render-react --force

---

hermes skills search https://mintlify.com/docs --source well-known
hermes skills inspect well-known:https://mintlify.com/docs/.well-known/skills/mintlify
hermes skills install well-known:https://mintlify.com/docs/.well-known/skills/mintlify

---

hermes skills install openai/skills/k8s
hermes skills tap add myorg/skills-repo

---

hermes skills install skills-sh/anthropics/skills/pdf --force

---

hermes skills check          # รายงานว่า Skills hub ที่ติดตั้งตัวใดมีการเปลี่ยนแปลง upstream
hermes skills update         # ติดตั้งใหม่เฉพาะ Skills ที่มีการอัปเดต
hermes skills update react   # อัปเดต Skills hub ที่ติดตั้งเฉพาะตัว

---

# ปลอดภัย: ล้างรายการ manifest สำหรับ Skill นี้ สำเนาปัจจุบันของคุณยังคงอยู่
# แต่การ sync ครั้งต่อไปจะตั้งค่า baseline ใหม่โดยอิงจากมัน เพื่อให้การอัปเดตในอนาคตทำงานได้ตามปกติ
hermes skills reset google-workspace

# กู้คืนเต็มรูปแบบ: ลบสำเนา local ของคุณด้วย และคัดลอกเวอร์ชัน bundled ปัจจุบัน
# ใช้สิ่งนี้เมื่อคุณต้องการให้ได้ Skill upstream ที่สมบูรณ์แบบกลับมา
hermes skills reset google-workspace --restore

# ไม่โต้ตอบ (เช่น ใน scripts หรือ TUI mode) - ข้ามการยืนยัน --restore
hermes skills reset google-workspace --restore --yes

---

/skills reset google-workspace
/skills reset google-workspace --restore

---

/skills browse
/skills search react --source skills-sh
/skills search https://mintlify.com/docs --source well-known
/skills inspect skills-sh/vercel-labs/json-render/json-render-react
/skills install openai/skills/skill-creator --force
/skills check
/skills update
/skills reset google-workspace
/skills list

---

/skin                # show the current skin and list available skins
/skin ares           # switch to a built-in skin
/skin mytheme        # switch to a custom skin from ~/.hermes/skins/mytheme.yaml

---

display:
  skin: default

---

# ~/.hermes/skins/mytheme.yaml
# Complete skin template - all keys shown. Delete any you don't need;
# missing values automatically inherit from the 'default' skin.

name: mytheme
description: My custom theme

colors:
  banner_border: "#CD7F32"
  banner_title: "#FFD700"
  banner_accent: "#FFBF00"
  banner_dim: "#B8860B"
  banner_text: "#FFF8DC"
  ui_accent: "#FFBF00"
  ui_label: "#4dd0e1"
  ui_ok: "#4caf50"
  ui_error: "#ef5350"
  ui_warn: "#ffa726"
  prompt: "#FFF8DC"
  input_rule: "#CD7F32"
  response_border: "#FFD700"
  session_label: "#DAA520"
  session_border: "#8B8682"
  status_bar_bg: "#1a1a2e"
  voice_status_bg: "#1a1a2e"
  completion_menu_bg: "#1a1a2e"
  completion_menu_current_bg: "#333355"
  completion_menu_meta_bg: "#1a1a2e"
  completion_menu_meta_current_bg: "#333355"

spinner:
  waiting_faces:
    - "(⚔)"
    - "(⛨)"
    - "(▲)"
  thinking_faces:
    - "(⚔)"
    - "(⌁)"
    - "(<>)"
  thinking_verbs:
    - "processing"
    - "analyzing"
    - "computing"
    - "evaluating"
  wings:
    - ["⟪⚡", "⚡⟫"]
    - ["⟪●", "●⟫"]

branding:
  agent_name: "My Agent"
  welcome: "Welcome to My Agent! Type your message or /help for commands."
  goodbye: "See you later! ⚡"
  response_label: " ⚡ My Agent "
  prompt_symbol: "⚡ ❯ "
  help_header: "(⚡) Available Commands"

tool_prefix: "┊"

# Per-tool emoji overrides (optional)
tool_emojis:
  terminal: "⚔"
  web_search: "🔮"
  read_file: "📄"

# Custom ASCII art banners (optional, Rich markup supported)
# banner_logo: |
#   [bold #FFD700] MY AGENT [/]
# banner_hero: |
#   [#FFD700]  Custom art here  [/]

---

name: cyberpunk
description: Neon terminal theme

colors:
  banner_border: "#FF00FF"
  banner_title: "#00FFFF"
  banner_accent: "#FF1493"

spinner:
  thinking_verbs: ["jacking in", "decrypting", "uploading"]
  wings:
    - ["⟨⚡", "⚡⟩"]

branding:
  agent_name: "Cyber Agent"
  response_label: " ⚡ Cyber "

tool_prefix: "▏"

---

npx -y hermes-mod

---

git clone https://github.com/cocktailpeanut/hermes-mod.git
cd hermes-mod/app
npm install
npm start
RAW_BUFFERClick to expand / collapse

📄 user-guide/features/plugins.md


sidebar_position: 11 sidebar_label: "Plugins" title: "Plugins" description: "Extend Hermes with custom tools, hooks, and integrations via the plugin system"

Plugins

Hermes มีระบบ plugin สำหรับการเพิ่ม custom tools, hooks, และ integrations โดยที่ไม่ต้องแก้ไข core code

Build a Hermes Plugin - step-by-step guide พร้อมตัวอย่างที่ใช้งานได้จริง

Quick overview

ให้ drop directory เข้าไปใน ~/.hermes/plugins/ โดยมีไฟล์ plugin.yaml และ Python code:

~/.hermes/plugins/my-plugin/
├── plugin.yaml      # manifest
├── __init__.py      # register() - wires schemas to handlers
├── schemas.py       # tool schemas (what the LLM sees)
└── tools.py         # tool handlers (what runs when called)

เมื่อเริ่ม Hermes, tools ของคุณจะปรากฏอยู่เคียงข้าง built-in tools และ model สามารถเรียกใช้ได้ทันที

Minimal working example

นี่คือ plugin ที่สมบูรณ์แบบที่เพิ่ม tool ชื่อ hello_world และ log ทุกครั้งที่มีการเรียกใช้ tool ผ่าน hook

~/.hermes/plugins/hello-world/plugin.yaml

name: hello-world
version: "1.0"
description: A minimal example plugin

~/.hermes/plugins/hello-world/__init__.py

"""Minimal Hermes plugin - registers a tool and a hook."""


def register(ctx):
    # --- Tool: hello_world ---
    schema = {
        "name": "hello_world",
        "description": "Returns a friendly greeting for the given name.",
        "parameters": {
            "type": "object",
            "properties": {
                "name": {
                    "type": "string",
                    "description": "Name to greet",
                }
            },
            "required": ["name"],
        },
    }

    def handle_hello(params):
        name = params.get("name", "World")
        return f"Hello, {name}! 👋  (from the hello-world plugin)"

    ctx.register_tool("hello_world", schema, handle_hello)

    # --- Hook: log every tool call ---
    def on_tool_call(tool_name, params, result):
        print(f"[hello-world] tool called: {tool_name}")

    ctx.register_hook("post_tool_call", on_tool_call)

ให้ drop ทั้งสองไฟล์เข้าไปใน ~/.hermes/plugins/hello-world/, restart Hermes, และ model จะสามารถเรียกใช้ hello_world ได้ทันที hook จะพิมพ์ log line หลังจากการเรียกใช้ tool ทุกครั้ง

Project-local plugins ที่อยู่ใน ./.hermes/plugins/ จะถูกปิดใช้งานโดยค่าเริ่มต้น คุณต้องเปิดใช้งานเฉพาะสำหรับ repository ที่เชื่อถือได้ โดยการตั้งค่า HERMES_ENABLE_PROJECT_PLUGINS=true ก่อนเริ่ม Hermes

What plugins can do

CapabilityHow
Add toolsctx.register_tool(name, schema, handler)
Add hooksctx.register_hook("post_tool_call", callback)
Add slash commandsctx.register_command(name, handler, description) - adds /name in CLI and gateway sessions
Add CLI commandsctx.register_cli_command(name, help, setup_fn, handler_fn) - adds hermes <plugin> <subcommand>
Inject messagesctx.inject_message(content, role="user") - see Injecting Messages
Ship data filesPath(__file__).parent / "data" / "file.yaml"
Bundle skillsctx.register_skill(name, path) - namespaced as plugin:skill, loaded via skill_view("plugin:skill")
Gate on env varsrequires_env: [API_KEY] in plugin.yaml - prompted during hermes plugins install
Distribute via pip[project.entry-points."hermes_agent.plugins"]

Plugin discovery

SourcePathUse case
Bundled<repo>/plugins/มาพร้อมกับ Hermes - see Built-in Plugins
User~/.hermes/plugins/Plugins ส่วนตัว
Project.hermes/plugins/Plugins เฉพาะโปรเจกต์ (ต้องตั้งค่า HERMES_ENABLE_PROJECT_PLUGINS=true)
piphermes_agent.plugins entry_pointsPackages ที่แจกจ่าย

แหล่งที่มาที่ใหม่กว่าจะเขียนทับแหล่งที่มาที่เก่ากว่าในกรณีที่ชื่อชนกัน ดังนั้น user plugin ที่มีชื่อเดียวกับ bundled plugin จะเข้ามาแทนที่

Plugins are opt-in

ทุก plugin - ไม่ว่าจะติดตั้งโดยผู้ใช้, bundled, หรือ pip - จะถูกปิดใช้งานโดยค่าเริ่มต้น การค้นพบ (Discovery) จะหา plugin เหล่านั้นเจอ (ดังนั้นจึงแสดงใน hermes plugins และ /plugins) แต่จะไม่มีอะไรทำงานจนกว่าคุณจะเพิ่มชื่อ plugin นั้นใน plugins.enabled ใน ~/.hermes/config.yaml สิ่งนี้ป้องกันไม่ให้ส่วนใดๆ ที่มี hooks หรือ tools ทำงานได้โดยที่คุณไม่ได้ยินยอมอย่างชัดเจน

plugins:
  enabled:
    - my-tool-plugin
    - disk-cleanup
  disabled:       # optional deny-list - always wins if a name appears in both
    - noisy-plugin

สามวิธีในการเปลี่ยนสถานะ:

hermes plugins                    # interactive toggle (space to check/uncheck)
hermes plugins enable <name>      # add to allow-list
hermes plugins disable <name>     # remove from allow-list + add to disabled

หลังจากรัน hermes plugins install owner/repo, คุณจะได้รับคำถามว่า Enable 'name' now? [y/N] - ค่าเริ่มต้นคือไม่ (no) คุณสามารถข้ามคำถามนี้สำหรับการติดตั้งแบบ script ด้วย --enable หรือ --no-enable

Migration for existing users

เมื่อคุณอัปเกรดเป็นเวอร์ชันของ Hermes ที่มี opt-in plugins (config schema v21+) user plugins ใดๆ ที่ติดตั้งอยู่ภายใต้ ~/.hermes/plugins/ ซึ่งไม่ได้อยู่ใน plugins.disabled จะถูก grandfathered ไปยัง plugins.enabled โดยอัตโนมัติ การตั้งค่าเดิมของคุณยังคงใช้งานได้ Plugins ที่ bundled จะไม่ถูก grandfathered - แม้แต่ผู้ใช้เดิมก็ต้อง opt in อย่างชัดเจน

Available hooks

Plugins สามารถลงทะเบียน callbacks สำหรับ event lifecycle เหล่านี้ ดูรายละเอียดทั้งหมด, callback signatures, และตัวอย่างได้ที่ Event Hooks page

HookFires when
pre_tool_callก่อนที่ tool ใดๆ จะทำงาน
post_tool_callหลังที่ tool ใดๆ ส่งผลลัพธ์กลับมา
pre_llm_callครั้งเดียวต่อ turn, ก่อน loop ของ LLM - สามารถ return {"context": "..."} เพื่อ inject context into the user message
post_llm_callครั้งเดียวต่อ turn, หลัง loop ของ LLM (เฉพาะ turn ที่สำเร็จเท่านั้น)
on_session_startเมื่อสร้าง session ใหม่ (เฉพาะ turn แรก)
on_session_endเมื่อสิ้นสุดการเรียกใช้ run_conversation ทุกครั้ง + CLI exit handler

Plugin types

Hermes มี plugin สามประเภท:

TypeWhat it doesSelectionLocation
General pluginsเพิ่ม tools, hooks, slash commands, CLI commandsMulti-select (enable/disable)~/.hermes/plugins/
Memory providersแทนที่หรือเสริม built-in memorySingle-select (one active)plugins/memory/
Context enginesแทนที่ built-in context compressorSingle-select (one active)plugins/context_engine/

Memory providers และ context engines คือ provider plugins - สามารถเปิดใช้งานได้เพียงประเภทละหนึ่งเท่านั้น General plugins สามารถเปิดใช้งานได้ทุกรูปแบบ

Managing plugins

hermes plugins                               # unified interactive UI
hermes plugins list                          # table: enabled / disabled / not enabled
hermes plugins install user/repo             # install from Git, then prompt Enable? [y/N]
hermes plugins install user/repo --enable    # install AND enable (no prompt)
hermes plugins install user/repo --no-enable # install but leave disabled (no prompt)
hermes plugins update my-plugin              # pull latest
hermes plugins remove my-plugin              # uninstall
hermes plugins enable my-plugin              # add to allow-list
hermes plugins disable my-plugin             # remove from allow-list + add to disabled

Interactive UI

การรัน hermes plugins โดยไม่มี argument จะเปิดหน้าจอ interactive แบบ composite:

Plugins
  ↑↓ navigate  SPACE toggle  ENTER configure/confirm  ESC done

  General Plugins
 → [✓] my-tool-plugin - Custom search tool
   [ ] webhook-notifier - Event hooks
   [ ] disk-cleanup - Auto-cleanup of ephemeral files [bundled]

  Provider Plugins
     Memory Provider          ▸ honcho
     Context Engine           ▸ compressor
  • General Plugins section - ใช้ checkboxes, toggle ด้วย SPACE. ถูกเลือก = อยู่ใน plugins.enabled, ไม่ถูกเลือก = อยู่ใน plugins.disabled (ปิดอย่างชัดเจน).
  • Provider Plugins section - แสดงการเลือกปัจจุบัน กด ENTER เพื่อเข้าสู่ radio picker ที่คุณเลือก provider ที่ใช้งานอยู่.
  • Plugins ที่ bundled จะปรากฏในรายการเดียวกันพร้อม tag [bundled].

การเลือก provider plugin จะถูกบันทึกไว้ใน config.yaml:

memory:
  provider: "honcho"      # empty string = built-in only

context:
  engine: "compressor"    # default built-in compressor

Enabled vs. disabled vs. neither

Plugins จะอยู่ในหนึ่งในสามสถานะ:

StateMeaningIn plugins.enabled?In plugins.disabled?
enabledโหลดใน session ถัดไปYesNo
disabledปิดอย่างชัดเจน - จะไม่โหลดแม้ว่าจะอยู่ใน enabled ด้วย(irrelevant)Yes
not enabledค้นพบแต่ไม่เคย opt inNoNo

ค่าเริ่มต้นสำหรับ plugin ที่ติดตั้งหรือ bundled ใหม่คือ not enabled คำสั่ง hermes plugins list แสดงทั้งสามสถานะที่แตกต่างกัน เพื่อให้คุณทราบว่าอะไรถูกปิดอย่างชัดเจนเทียบกับอะไรที่แค่รอการเปิดใช้งาน

ใน session ที่กำลังทำงานอยู่, /plugins จะแสดงว่า plugin ใดกำลังถูกโหลดอยู่

Injecting Messages

Plugins สามารถ inject messages เข้าไปใน conversation ที่กำลังทำงานอยู่โดยใช้ ctx.inject_message():

ctx.inject_message("New data arrived from the webhook", role="user")

Signature: ctx.inject_message(content: str, role: str = "user") -> bool

วิธีการทำงาน:

  • หาก agent idle (รอ input จากผู้ใช้), ข้อความจะถูกจัดคิวเป็น input ถัดไปและเริ่ม turn ใหม่
  • หาก agent mid-turn (กำลังทำงานอยู่), ข้อความจะขัดจังหวะการทำงานปัจจุบัน - เหมือนกับผู้ใช้พิมพ์ข้อความใหม่และกด Enter
  • สำหรับ role ที่ไม่ใช่ "user", content จะถูก prefix ด้วย [role] (เช่น [system] ...).
  • คืนค่า True หากข้อความถูกจัดคิวสำเร็จ, False หากไม่มี CLI reference (เช่น ใน gateway mode).

สิ่งนี้ช่วยให้ plugins เช่น remote control viewers, messaging bridges, หรือ webhook receivers สามารถป้อนข้อความเข้าสู่ conversation จากแหล่งภายนอกได้

:::note inject_message ใช้ได้เฉพาะใน CLI mode เท่านั้น ใน gateway mode จะไม่มี CLI reference และ method จะคืนค่า False. :::

ดู full guide สำหรับ handler contracts, schema format, hook behavior, error handling, และ common mistakes.


📄 user-guide/features/provider-routing.md


title: Provider Routing description: Configure OpenRouter provider preferences to optimize for cost, speed, or quality. sidebar_label: Provider Routing sidebar_position: 7

Provider Routing

เมื่อใช้ OpenRouter เป็น LLM provider, Hermes Agent รองรับ provider routing ซึ่งเป็นการควบคุมระดับละเอียดว่า AI provider พื้นฐานใดที่จะจัดการ request ของคุณ และจะจัดลำดับความสำคัญอย่างไร

OpenRouter จะกำหนดเส้นทาง request ไปยังผู้ให้บริการหลายราย (เช่น Anthropic, Google, AWS Bedrock, Together AI) Provider routing ช่วยให้คุณสามารถปรับให้เหมาะสมเพื่อลดต้นทุน, เพิ่มความเร็ว, คุณภาพ, หรือบังคับใช้ข้อกำหนดของผู้ให้บริการเฉพาะรายได้

Configuration

เพิ่มส่วน provider_routing ในไฟล์ ~/.hermes/config.yaml ของคุณ:

provider_routing:
  sort: "price"           # วิธีการจัดอันดับผู้ให้บริการ
  only: []                # Whitelist: ใช้เฉพาะผู้ให้บริการเหล่านี้เท่านั้น
  ignore: []              # Blacklist: ห้ามใช้ผู้ให้บริการเหล่านี้เด็ดขาด
  order: []               # ลำดับความสำคัญที่กำหนดอย่างชัดเจน
  require_parameters: false  # ใช้เฉพาะผู้ให้บริการที่รองรับพารามิเตอร์ทั้งหมด
  data_collection: null   # ควบคุมการเก็บข้อมูล ("allow" หรือ "deny")

:::info Provider routing จะใช้ได้เมื่อใช้ OpenRouter เท่านั้น จะไม่มีผลกับการเชื่อมต่อผู้ให้บริการโดยตรง (เช่น การเชื่อมต่อโดยตรงกับ Anthropic API) :::

Options

sort

ควบคุมวิธีการจัดอันดับผู้ให้บริการที่มีอยู่ของ OpenRouter สำหรับ request ของคุณ

ValueDescription
"price"ผู้ให้บริการที่ราคาถูกที่สุดก่อน
"throughput"ผู้ให้บริการที่ให้โทเคนต่อวินาทีเร็วที่สุดก่อน
"latency"ผู้ให้บริการที่มีเวลาถึงโทเคนแรก (time-to-first-token) ต่ำที่สุดก่อน
provider_routing:
  sort: "price"

only

Whitelist ของชื่อผู้ให้บริการ เมื่อตั้งค่าแล้ว จะใช้ เฉพาะ ผู้ให้บริการเหล่านี้เท่านั้น ผู้ให้บริการอื่นทั้งหมดจะถูกยกเว้น

provider_routing:
  only:
    - "Anthropic"
    - "Google"

ignore

Blacklist ของชื่อผู้ให้บริการ ผู้ให้บริการเหล่านี้จะ ไม่มีวัน ถูกใช้ แม้ว่าพวกเขาจะเสนอทางเลือกที่ถูกที่สุดหรือเร็วที่สุดก็ตาม

provider_routing:
  ignore:
    - "Together"
    - "DeepInfra"

order

ลำดับความสำคัญที่กำหนดอย่างชัดเจน ผู้ให้บริการที่ระบุไว้ก่อนจะถูกให้ความสำคัญก่อน ผู้ให้บริการที่ไม่ได้ระบุจะถูกใช้เป็นตัวสำรอง (fallbacks)

provider_routing:
  order:
    - "Anthropic"
    - "Google"
    - "AWS Bedrock"

require_parameters

เมื่อตั้งค่าเป็น true, OpenRouter จะกำหนดเส้นทางไปยังผู้ให้บริการที่รองรับพารามิเตอร์ ทั้งหมด ใน request ของคุณ (เช่น temperature, top_p, tools, ฯลฯ) สิ่งนี้ช่วยป้องกันการที่พารามิเตอร์หายไปโดยไม่มีการแจ้งเตือน

provider_routing:
  require_parameters: true

data_collection

ควบคุมว่าผู้ให้บริการสามารถใช้ prompt ของคุณเพื่อการฝึกฝนได้หรือไม่ ตัวเลือกคือ "allow" หรือ "deny"

provider_routing:
  data_collection: "deny"

Practical Examples

Optimize for Cost

กำหนดเส้นทางไปยังผู้ให้บริการที่ราคาถูกที่สุดที่มีอยู่ เหมาะสำหรับการใช้งานปริมาณสูงและการพัฒนา:

provider_routing:
  sort: "price"

Optimize for Speed

จัดลำดับความสำคัญของผู้ให้บริการที่มี latency ต่ำสำหรับการใช้งานแบบโต้ตอบ:

provider_routing:
  sort: "latency"

Optimize for Throughput

ดีที่สุดสำหรับการสร้างเนื้อหาแบบยาวที่โทเคนต่อวินาทีมีความสำคัญ:

provider_routing:
  sort: "throughput"

Lock to Specific Providers

รับรองว่า request ทั้งหมดจะผ่านผู้ให้บริการเฉพาะรายเพื่อความสม่ำเสมอ:

provider_routing:
  only:
    - "Anthropic"

Avoid Specific Providers

ยกเว้นผู้ให้บริการที่คุณไม่ต้องการใช้ (เช่น เพื่อความเป็นส่วนตัวของข้อมูล):

provider_routing:
  ignore:
    - "Together"
    - "Lepton"
  data_collection: "deny"

Preferred Order with Fallbacks

ลองใช้ผู้ให้บริการที่คุณต้องการก่อน จากนั้นสำรองไปยังผู้ให้บริการอื่นหากไม่พร้อมใช้งาน:

provider_routing:
  order:
    - "Anthropic"
    - "Google"
  require_parameters: true

How It Works

Provider routing preferences จะถูกส่งไปยัง OpenRouter API ผ่าน field extra_body.provider ในทุก API call สิ่งนี้ใช้ได้กับทั้ง:

  • CLI mode - กำหนดค่าใน ~/.hermes/config.yaml และโหลดเมื่อเริ่มต้น
  • Gateway mode - ไฟล์ config เดียวกัน โหลดเมื่อ gateway เริ่มทำงาน

การตั้งค่า routing จะถูกอ่านจาก config.yaml และส่งเป็น parameters เมื่อสร้าง AIAgent:

providers_allowed  ← from provider_routing.only
providers_ignored  ← from provider_routing.ignore
providers_order    ← from provider_routing.order
provider_sort      ← from provider_routing.sort
provider_require_parameters ← from provider_routing.require_parameters
provider_data_collection    ← from provider_routing.data_collection

:::tip คุณสามารถรวมตัวเลือกหลายอย่างเข้าด้วยกันได้ ตัวอย่างเช่น จัดเรียงตามราคา แต่ยกเว้นผู้ให้บริการบางรายและกำหนดให้ต้องรองรับพารามิเตอร์:

provider_routing:
  sort: "price"
  ignore: ["Together"]
  require_parameters: true
  data_collection: "deny"

:::

Default Behavior

เมื่อไม่ได้กำหนดส่วน provider_routing (ค่าเริ่มต้น) OpenRouter จะใช้ logic การกำหนดเส้นทางเริ่มต้นของตัวเอง ซึ่งโดยทั่วไปจะสร้างสมดุลระหว่างต้นทุนและความพร้อมใช้งานโดยอัตโนมัติ

:::tip Provider Routing vs. Fallback Models Provider routing ควบคุมว่า sub-providers ภายใน OpenRouter ใดที่จะจัดการ request ของคุณ สำหรับการ failover อัตโนมัติไปยังผู้ให้บริการที่แตกต่างกันโดยสิ้นเชิงเมื่อโมเดลหลักของคุณล้มเหลว โปรดดูที่ Fallback Providers :::


📄 user-guide/features/rl-training.md


sidebar_position: 13 title: "RL Training" description: "Reinforcement learning on agent behaviors with Tinker-Atropos - environment discovery, training, and evaluation"

การฝึกอบรม RL

Hermes Agent มี pipeline การฝึกอบรม RL (Reinforcement Learning) แบบรวมอยู่ในตัว ซึ่งสร้างบน Tinker-Atropos สิ่งนี้ช่วยให้สามารถฝึกโมเดลภาษา (language models) สำหรับงานเฉพาะสภาพแวดล้อม (environment-specific tasks) โดยใช้ GRPO (Group Relative Policy Optimization) ด้วย LoRA adapters ซึ่งถูกจัดการทั้งหมดผ่าน tool interface ของ agent

ภาพรวม (Overview)

ระบบการฝึกอบรม RL ประกอบด้วยสามส่วนประกอบ:

  1. Atropos - API server สำหรับ trajectory ที่ทำหน้าที่ประสานงานปฏิสัมพันธ์ของสภาพแวดล้อม จัดการ rollout groups และคำนวณ advantages
  2. Tinker - บริการฝึกอบรม (training service) ที่จัดการ model weights, LoRA training, sampling/inference, และ optimizer steps
  3. Environments - Python classes ที่กำหนด tasks, scoring, และ reward functions (เช่น ปัญหาคณิตศาสตร์ GSM8K)

agent สามารถค้นพบ environments, กำหนดค่า training parameters, เริ่มการรัน training, และตรวจสอบ metrics ทั้งหมดผ่านชุดเครื่องมือ rl_*

ข้อกำหนด (Requirements)

การฝึกอบรม RL ต้องใช้:

  • Python >= 3.11 (ข้อกำหนดของแพ็กเกจ Tinker)
  • TINKER_API_KEY - API key สำหรับบริการฝึกอบรม Tinker
  • WANDB_API_KEY - API key สำหรับการติดตาม metrics ของ Weights & Biases
  • โมดูลย่อย tinker-atropos (ที่ tinker-atropos/ เทียบกับ root ของ Hermes)
# Set up API keys
hermes config set TINKER_API_KEY your-tinker-key
hermes config set WANDB_API_KEY your-wandb-key

เมื่อมีทั้งสอง keys และมี Python >= 3.11 จะเปิดใช้งานชุดเครื่องมือ rl โดยอัตโนมัติ

เครื่องมือที่มี (Available Tools)

ToolDescription
rl_list_environmentsค้นพบ RL environments ที่มีอยู่
rl_select_environmentเลือก environment และโหลด config ของมัน
rl_get_current_configดู fields ที่สามารถกำหนดค่าและ fields ที่ถูกล็อกไว้
rl_edit_configแก้ไข training parameters ที่สามารถกำหนดค่าได้
rl_start_trainingเริ่มการรัน training (จะสร้าง 3 processes)
rl_check_statusตรวจสอบความคืบหน้าของการฝึกอบรมและ metrics ของ WandB
rl_stop_trainingหยุดงานฝึกอบรมที่กำลังทำงานอยู่
rl_get_resultsรับ metrics สุดท้ายและ path ของ model weights
rl_list_runsแสดงรายการ runs ทั้งหมดที่กำลังทำงานและเสร็จสมบูรณ์แล้ว
rl_test_inferenceทดสอบ inference อย่างรวดเร็วโดยใช้ OpenRouter

Workflow

1. ค้นพบ Environments

List the available RL environments

agent จะเรียกใช้ rl_list_environments() ซึ่งจะสแกน tinker-atropos/tinker_atropos/environments/ โดยใช้ AST parsing เพื่อค้นหา Python classes ที่สืบทอดมาจาก BaseEnv แต่ละ environment จะกำหนด:

  • Dataset loading - แหล่งที่มาของข้อมูล training (เช่น HuggingFace datasets)
  • Prompt construction - วิธีการจัดรูปแบบ items สำหรับ model
  • Scoring/verification - วิธีการประเมิน model outputs และกำหนด rewards

2. เลือกและกำหนดค่า (Select and Configure)

Select the GSM8K environment and show me the configuration

agent จะเรียกใช้ rl_select_environment("gsm8k_tinker") จากนั้นเรียกใช้ rl_get_current_config() เพื่อดูพารามิเตอร์ทั้งหมด

Configuration fields แบ่งออกเป็นสองประเภท:

Configurable fields (สามารถแก้ไขได้):

  • group_size - จำนวน completions ต่อ item (ค่าเริ่มต้น: 16)
  • batch_size - ขนาด batch สำหรับการฝึกอบรม (ค่าเริ่มต้น: 128)
  • wandb_name - ชื่อ run ของ WandB (ตั้งค่าอัตโนมัติเป็น {env}-{timestamp})
  • พารามิเตอร์เฉพาะ environment อื่นๆ

Locked fields (การตั้งค่าโครงสร้างพื้นฐาน ไม่สามารถเปลี่ยนแปลงได้):

  • tokenizer_name - Tokenizer ของ model (เช่น Qwen/Qwen3-8B)
  • rollout_server_url - URL ของ Atropos API (http://localhost:8000)
  • max_token_length - ความยาว token สูงสุด (8192)
  • max_num_workers - จำนวน workers แบบขนานสูงสุด (2048)
  • total_steps - จำนวน steps การฝึกอบรมทั้งหมด (2500)
  • lora_rank - rank ของ LoRA adapter (32)
  • learning_rate - อัตราการเรียนรู้ (4e-5)
  • max_token_trainer_length - Max tokens สำหรับ trainer (9000)

3. เริ่มการฝึกอบรม (Start Training)

Start the training run

agent จะเรียกใช้ rl_start_training() ซึ่ง:

  1. สร้างไฟล์ config YAML โดยรวมการตั้งค่าที่ถูกล็อกไว้เข้ากับการกำหนดค่าที่สามารถแก้ไขได้
  2. สร้าง run ID ที่ไม่ซ้ำกัน
  3. สร้างสาม processes:
    • Atropos API server (run-api) - การประสานงาน trajectory
    • Tinker trainer (launch_training.py) - LoRA training + FastAPI inference server บน port 8001
    • Environment (environment.py serve) - environment ที่เลือกซึ่งเชื่อมต่อกับ Atropos

processes เหล่านี้จะเริ่มด้วยการหน่วงเวลาแบบ staggered (5s สำหรับ API, 30s สำหรับ trainer, 90s สำหรับ environment) เพื่อให้แน่ใจว่าลำดับการเริ่มต้นถูกต้อง

4. ตรวจสอบความคืบหน้า (Monitor Progress)

Check the status of training run abc12345

agent จะเรียกใช้ rl_check_status(run_id) ซึ่งจะรายงาน:

  • สถานะของ process (running/exited สำหรับทั้ง 3 processes)
  • เวลาที่ใช้ในการรัน
  • WandB metrics (step, reward mean, percent correct, eval accuracy)
  • ตำแหน่งไฟล์ log สำหรับการ debug

:::note Rate Limiting การตรวจสอบสถานะถูกจำกัดอัตรา (rate-limited) ให้ทำได้ครั้งละครั้งทุก 30 นาที ต่อ run ID สิ่งนี้ป้องกันการ polling ที่มากเกินไปในระหว่างงานฝึกอบรมที่ใช้เวลานานหลายชั่วโมง :::

5. หยุดหรือรับผลลัพธ์ (Stop or Get Results)

Stop the training run
# or
Get the final results for run abc12345

rl_stop_training() จะยุติทั้งสาม processes ในลำดับย้อนกลับ (environment → trainer → API) ส่วน rl_get_results() จะดึง metrics สุดท้ายของ WandB และประวัติการฝึกอบรม

การทดสอบ Inference (Inference Testing)

ก่อนที่จะเริ่มการรัน training เต็มรูปแบบ คุณสามารถทดสอบได้ว่า environment ทำงานได้อย่างถูกต้องหรือไม่โดยใช้ rl_test_inference สิ่งนี้จะรันขั้นตอน inference และ scoring สองสามขั้นตอนโดยใช้ OpenRouter - ไม่จำเป็นต้องใช้ Tinker API เพียงแค่ต้องการ OPENROUTER_API_KEY

Test the selected environment with inference

Default configuration:

  • 3 steps × 16 completions = 48 rollouts ต่อ model
  • ทดสอบ 3 models ที่ขนาดต่างกันเพื่อความทนทาน:
    • qwen/qwen3-8b (ขนาดเล็ก)
    • z-ai/glm-4.7-flash (ขนาดกลาง)
    • minimax/minimax-m2.7 (ขนาดใหญ่)
  • รวม: ~144 rollouts

สิ่งนี้จะตรวจสอบ:

  • Environment โหลดได้อย่างถูกต้อง
  • Prompt construction ทำงานได้
  • การ parse response ของ inference มีความทนทานในทุกขนาดของ model
  • Verifier/scoring logic สร้าง rewards ที่ถูกต้อง

การรวม API ของ Tinker (Tinker API Integration)

trainer ใช้ Tinker API สำหรับการดำเนินการ model training:

  • ServiceClient - สร้าง clients สำหรับการฝึกอบรมและการ sampling
  • Training client - จัดการ forward-backward passes ด้วย importance sampling loss, optimizer steps (Adam), และ weight checkpointing
  • Sampling client - ให้บริการ inference โดยใช้ weights ที่ได้รับการฝึกอบรมล่าสุด

training loop:

  1. ดึง batch ของ rollouts จาก Atropos (prompt + completions + scores)
  2. แปลงเป็น Tinker Datum objects พร้อม padded logprobs และ advantages
  3. รัน forward-backward pass ด้วย importance sampling loss
  4. ทำ optimizer step (Adam: lr=4e-5, β1=0.9, β2=0.95)
  5. บันทึก weights และสร้าง sampling client ใหม่สำหรับการ inference ในขั้นตอนถัดไป
  6. บันทึก metrics ไปยัง WandB

แผนภาพสถาปัตยกรรม (Architecture Diagram)

flowchart LR
    api["Atropos API<br/>run-api<br/>port 8000"]
    env["Environment<br/>BaseEnv implementation"]
    infer["OpenAI / sglang<br/>inference API<br/>port 8001"]
    trainer["Tinker Trainer<br/>LoRA training + FastAPI"]

    env <--> api
    env --> infer
    api -->|"batches: tokens, scores, logprobs"| trainer
    trainer -->|"serves inference"| infer

การสร้าง Environments แบบกำหนดเอง (Creating Custom Environments)

ในการสร้าง RL environment ใหม่:

  1. สร้างไฟล์ Python ใน tinker-atropos/tinker_atropos/environments/
  2. กำหนด class ที่สืบทอดมาจาก BaseEnv
  3. Implement methods ที่จำเป็น:
    • load_dataset() - โหลด training data ของคุณ
    • get_next_item() - ให้ item ถัดไปแก่ model
    • score_answer() - ให้คะแนน model outputs และกำหนด rewards
    • collect_trajectories() - รวบรวมและส่งคืน trajectories
  4. ทางเลือกคือการกำหนด custom config class ที่สืบทอดมาจาก BaseEnvConfig

ศึกษาจาก gsm8k_tinker.py ที่มีอยู่เป็น template agent สามารถช่วยคุณสร้าง environments ใหม่ได้ - มันสามารถอ่านไฟล์ environment ที่มีอยู่ ตรวจสอบ HuggingFace datasets และเขียนโค้ด environment ใหม่ได้

Metrics ของ WandB

การรัน training จะบันทึกไปยัง Weights & Biases ด้วย metrics หลักเหล่านี้:

MetricDescription
train/lossTraining loss (importance sampling)
train/learning_rateอัตราการเรียนรู้ปัจจุบัน
reward/meanค่าเฉลี่ย reward ทั่วกลุ่ม
logprobs/meanค่าเฉลี่ย logprobs อ้างอิง
logprobs/mean_trainingค่าเฉลี่ย logprobs สำหรับการฝึกอบรม
logprobs/diffLogprob drift (reference - training)
advantages/meanค่า advantage เฉลี่ย
advantages/stdส่วนเบี่ยงเบนมาตรฐานของ advantage

Log Files

การรัน training แต่ละครั้งจะสร้างไฟล์ log ใน ~/.hermes/logs/rl_training/:

logs/
├── api_{run_id}.log        # Atropos API server logs
├── trainer_{run_id}.log    # Tinker trainer logs
├── env_{run_id}.log        # Environment process logs
└── inference_tests/        # Inference test results
    ├── test_{env}_{model}.jsonl
    └── test_{env}_{model}.log

ไฟล์เหล่านี้มีค่าอย่างยิ่งสำหรับการ debug เมื่อการฝึกอบรมล้มเหลวหรือให้ผลลัพธ์ที่ไม่คาดคิด


📄 user-guide/features/skills.md


sidebar_position: 2 title: "Skills System" description: "On-demand knowledge documents - progressive disclosure, agent-managed skills, and the Skills Hub"

Skills System

Skills คือเอกสารความรู้แบบ on-demand ที่ agent สามารถโหลดเมื่อจำเป็นได้ พวกเขาปฏิบัติตามรูปแบบ progressive disclosure เพื่อลดการใช้โทเคน และเข้ากันได้กับมาตรฐาน open standard ของ agentskills.io

Skills ทั้งหมดจะอยู่ใน ~/.hermes/skills/ ซึ่งเป็นไดเรกทอรีหลักและแหล่งข้อมูลหลัก (source of truth) เมื่อติดตั้งใหม่ Skills ที่มาพร้อมกับระบบจะถูกคัดลอกมาจาก repo Skills ที่ติดตั้งผ่าน Hub และ Skills ที่ agent สร้างขึ้นก็จะถูกเก็บไว้ที่นี่ด้วย agent สามารถแก้ไขหรือลบ Skills ใดก็ได้

คุณยังสามารถชี้ Hermes ไปยัง external skill directories ได้ด้วย ซึ่งเป็นโฟลเดอร์เพิ่มเติมที่ระบบจะสแกนควบคู่ไปกับโฟลเดอร์ภายในเครื่อง ดูรายละเอียดได้ที่ External Skill Directories ด้านล่าง

ดูเพิ่มเติม:

Using Skills

Skills ที่ติดตั้งทุกตัวจะพร้อมใช้งานโดยอัตโนมัติในรูปแบบ slash command:

# In the CLI or any messaging platform:
/gif-search funny cats
/axolotl help me fine-tune Llama 3 on my dataset
/github-pr-workflow create a PR for the auth refactor
/plan design a rollout for migrating our auth provider

# แค่ชื่อ skill ก็เพียงพอแล้ว ระบบจะโหลดและให้ agent ถามว่าคุณต้องการอะไร:
/excalidraw

Skill plan ที่มาพร้อมกับระบบเป็นตัวอย่างที่ดีของ slash command ที่มีพฤติกรรมแบบ custom-behavior การรัน /plan [request] จะบอกให้ Hermes ตรวจสอบ context หากจำเป็น เขียนแผนการดำเนินการในรูปแบบ markdown แทนการดำเนินการงาน และบันทึกผลลัพธ์ไว้ภายใต้ .hermes/plans/ ซึ่งเป็น relative path จาก active workspace/backend working directory

คุณยังสามารถโต้ตอบกับ Skills ผ่านการสนทนาแบบธรรมชาติได้:

hermes chat --toolsets skills -q "What skills do you have?"
hermes chat --toolsets skills -q "Show me the axolotl skill"

Progressive Disclosure

Skills ใช้รูปแบบการโหลดที่ประหยัดโทเคน:

Level 0: skills_list()           → [{name, description, category}, ...]   (~3k tokens)
Level 1: skill_view(name)        → Full content + metadata       (varies)
Level 2: skill_view(name, path)  → Specific reference file       (varies)

agent จะโหลดเนื้อหา skill ทั้งหมดก็ต่อเมื่อมันต้องการใช้จริงเท่านั้น

SKILL.md Format

---
name: my-skill
description: Brief description of what this skill does
version: 1.0.0
platforms: [macos, linux]     # Optional - restrict to specific OS platforms
metadata:
  hermes:
    tags: [python, automation]
    category: devops
    fallback_for_toolsets: [web]    # Optional - conditional activation (see below)
    requires_toolsets: [terminal]   # Optional - conditional activation (see below)
    config:                          # Optional - config.yaml settings
      - key: my.setting
        description: "What this controls"
        default: "value"
        prompt: "Prompt for setup"
---

# Skill Title

## When to Use
Trigger conditions for this skill.

## Procedure
1. Step one
2. Step two

## Pitfalls
- Known failure modes and fixes

## Verification
How to confirm it worked.

Platform-Specific Skills

Skills สามารถจำกัดตัวเองให้ทำงานบนระบบปฏิบัติการที่เฉพาะเจาะจงได้โดยใช้ฟิลด์ platforms:

ValueMatches
macosmacOS (Darwin)
linuxLinux
windowsWindows
platforms: [macos]            # สำหรับ macOS เท่านั้น (เช่น iMessage, Apple Reminders, FindMy)
platforms: [macos, linux]     # สำหรับ macOS และ Linux

เมื่อตั้งค่าแล้ว Skill จะถูกซ่อนโดยอัตโนมัติจาก system prompt, skills_list(), และ slash commands บนแพลตฟอร์มที่ไม่รองรับ หากละเว้น Skill จะโหลดบนทุกแพลตฟอร์ม

Conditional Activation (Fallback Skills)

Skills สามารถแสดงหรือซ่อนตัวเองโดยอัตโนมัติโดยอิงตามเครื่องมือที่พร้อมใช้งานใน session ปัจจุบัน สิ่งนี้มีประโยชน์ที่สุดสำหรับ fallback skills - ทางเลือกฟรีหรือทางเลือกในเครื่องที่ควรปรากฏก็ต่อเมื่อเครื่องมือระดับพรีเมียมไม่พร้อมใช้งาน

metadata:
  hermes:
    fallback_for_toolsets: [web]      # แสดงเฉพาะเมื่อ toolsets เหล่านี้ไม่พร้อมใช้งาน
    requires_toolsets: [terminal]     # แสดงเฉพาะเมื่อ toolsets เหล่านี้พร้อมใช้งาน
    fallback_for_tools: [web_search]  # แสดงเฉพาะเมื่อเครื่องมือเหล่านี้ไม่พร้อมใช้งาน
    requires_tools: [terminal]        # แสดงเฉพาะเมื่อเครื่องมือเหล่านี้พร้อมใช้งาน
FieldBehavior
fallback_for_toolsetsSkill จะถูก ซ่อน เมื่อ toolsets ที่ระบุพร้อมใช้งาน จะแสดงเมื่อขาดหายไป
fallback_for_toolsเช่นกัน แต่ตรวจสอบเครื่องมือแต่ละตัวแทน toolsets
requires_toolsetsSkill จะถูก ซ่อน เมื่อ toolsets ที่ระบุไม่พร้อมใช้งาน จะแสดงเมื่อพร้อมใช้งาน
requires_toolsเช่นกัน แต่ตรวจสอบเครื่องมือแต่ละตัว

ตัวอย่าง: Skill duckduckgo-search ที่มาพร้อมกับระบบใช้ fallback_for_toolsets: [web] เมื่อคุณตั้งค่า FIRECRAWL_API_KEY ตัว web toolset จะพร้อมใช้งานและ agent จะใช้ web_search - Skill DuckDuckGo จะยังคงซ่อนอยู่ หาก API key หายไป web toolset จะไม่พร้อมใช้งาน และ Skill DuckDuckGo จะปรากฏขึ้นโดยอัตโนมัติในฐานะ fallback

Skills ที่ไม่มี conditional fields ใดๆ จะทำงานเหมือนเดิมเสมอ - พวกมันจะแสดงอยู่ตลอดเวลา

Secure Setup on Load

Skills สามารถประกาศ environment variables ที่จำเป็นได้โดยที่มันไม่หายไปจากการค้นพบ:

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 จะขออย่างปลอดภัยเฉพาะเมื่อ Skill ถูกโหลดใน local CLI เท่านั้น คุณสามารถข้ามการตั้งค่าและยังคงใช้ Skill ได้ พื้นผิวการส่งข้อความ (Messaging surfaces) จะไม่ขอ secret ใน chat - พวกมันจะบอกให้คุณใช้ hermes setup หรือ ~/.hermes/.env ในเครื่องแทน

เมื่อตั้งค่าแล้ว env vars ที่ประกาศจะถูก ส่งผ่านโดยอัตโนมัติ ไปยัง execute_code และ terminal sandboxes - script ของ Skill สามารถใช้ $TENOR_API_KEY ได้โดยตรง สำหรับ env vars ที่ไม่ใช่ของ Skill ให้ใช้ config option terminal.env_passthrough ดูรายละเอียดได้ที่ Environment Variable Passthrough

Skill Config Settings

Skills ยังสามารถประกาศ config settings ที่ไม่ใช่ secret (เช่น paths, preferences) ซึ่งถูกเก็บไว้ใน config.yaml:

metadata:
  hermes:
    config:
      - key: myplugin.path
        description: Path to the plugin data directory
        default: "~/myplugin-data"
        prompt: Plugin data directory path

Settings จะถูกเก็บไว้ภายใต้ skills.config ใน config.yaml ของคุณ hermes config migrate จะแจ้งให้ทราบถึง settings ที่ยังไม่ได้ตั้งค่า และ hermes config show จะแสดงค่าเหล่านั้น เมื่อ Skill โหลด ค่า config ที่ถูก resolve จะถูกฉีดเข้าไปใน context เพื่อให้ agent ทราบค่าที่ตั้งค่าไว้โดยอัตโนมัติ

ดูรายละเอียดได้ที่ Skill Settings และ Creating Skills - Config Settings

Skill Directory Structure

~/.hermes/skills/                  # Single source of truth
├── mlops/                         # Category directory
│   ├── axolotl/
│   │   ├── SKILL.md               # Main instructions (required)
│   │   ├── references/            # Additional docs
│   │   ├── templates/             # Output formats
│   │   ├── scripts/               # Helper scripts callable from the skill
│   │   └── assets/                # Supplementary files
│   └── vllm/
│       └── SKILL.md
├── devops/
│   └── deploy-k8s/                # Agent-created skill
│       ├── SKILL.md
│       └── references/
├── .hub/                          # Skills Hub state
│   ├── lock.json
│   ├── quarantine/
│   └── audit.log
└── .bundled_manifest              # Tracks seeded bundled skills

External Skill Directories

หากคุณดูแล Skills นอกเหนือจาก Hermes - ตัวอย่างเช่น ไดเรกทอรี ~/.agents/skills/ ที่ใช้ร่วมกันโดยเครื่องมือ AI หลายตัว - คุณสามารถบอกให้ Hermes สแกนไดเรกทอรีเหล่านั้นได้ด้วย

เพิ่ม external_dirs ภายใต้ส่วน skills ใน ~/.hermes/config.yaml:

skills:
  external_dirs:
    - ~/.agents/skills
    - /home/shared/team-skills
    - ${SKILLS_REPO}/skills

Paths รองรับการขยาย ~ และการแทนที่ environment variable ${VAR}

How it works

  • Read-only: External dirs ถูกสแกนเพื่อค้นหา Skill เท่านั้น เมื่อ agent สร้างหรือแก้ไข Skill มันจะเขียนไปยัง ~/.hermes/skills/ เสมอ
  • Local precedence: หากชื่อ Skill เดียวกันมีอยู่ในทั้ง local dir และ external dir เวอร์ชัน local จะมีลำดับความสำคัญกว่า
  • Full integration: External skills จะปรากฏใน system prompt index, skills_list, skill_view, และเป็น slash commands ในรูปแบบ /skill-name - ไม่มีอะไรแตกต่างจาก local skills
  • Non-existent paths are silently skipped: หากไดเรกทอรีที่กำหนดค่าไม่มีอยู่ Hermes จะเพิกเฉยโดยไม่มีข้อผิดพลาด มีประโยชน์สำหรับไดเรกทอรีที่แชร์แบบทางเลือกซึ่งอาจไม่มีอยู่ในทุกเครื่อง

Example

~/.hermes/skills/               # Local (primary, read-write)
├── devops/deploy-k8s/
│   └── SKILL.md
└── mlops/axolotl/
    └── SKILL.md

~/.agents/skills/               # External (read-only, shared)
├── my-custom-workflow/
│   └── SKILL.md
└── team-conventions/
    └── SKILL.md

Skills ทั้งสี่ตัวจะปรากฏใน skill index ของคุณ หากคุณสร้าง Skill ใหม่ชื่อ my-custom-workflow ในเครื่อง local มันจะบดบังเวอร์ชันภายนอก (shadows)

Agent-Managed Skills (skill_manage tool)

agent สามารถสร้าง อัปเดต และลบ Skills ของตัวเองผ่าน tool skill_manage นี่คือ procedural memory ของ agent - เมื่อมันค้นพบ workflow ที่ไม่ธรรมดา มันจะบันทึกแนวทางนั้นเป็น Skill เพื่อนำกลับมาใช้ใหม่ในอนาคต

When the Agent Creates Skills

  • หลังจากทำงานที่ซับซ้อนเสร็จสมบูรณ์ (5+ tool calls)
  • เมื่อมันเจอข้อผิดพลาดหรือทางตันและค้นพบเส้นทางที่ใช้งานได้
  • เมื่อผู้ใช้แก้ไขแนวทางของมัน
  • เมื่อมันค้นพบ workflow ที่ไม่ธรรมดา

Actions

ActionUse forKey params
createสร้าง Skill ใหม่ตั้งแต่ต้นname, content (full SKILL.md), optional category
patchแก้ไขแบบเจาะจง (แนะนำ)name, old_string, new_string
editเขียนใหม่โครงสร้างหลัก (Major structural rewrites)name, content (full SKILL.md replacement)
deleteลบ Skill ทั้งหมดname
write_fileเพิ่ม/อัปเดตไฟล์สนับสนุนname, file_path, file_content
remove_fileลบไฟล์สนับสนุนname, file_path

:::tip การกระทำ patch เป็นที่แนะนำสำหรับการอัปเดต - มันใช้โทเคนอย่างมีประสิทธิภาพกว่า edit เพราะมีเพียงข้อความที่เปลี่ยนแปลงเท่านั้นที่ปรากฏใน tool call :::

Skills Hub

เรียกดู ค้นหา ติดตั้ง และจัดการ Skills จาก online registries, skills.sh, endpoint ของ Skill ที่เป็นที่รู้จักโดยตรง, และ official optional skills

Common commands

hermes skills browse                              # Browse all hub skills (official first)
hermes skills browse --source official            # Browse only official optional skills
hermes skills search kubernetes                   # Search all sources
hermes skills search react --source skills-sh     # Search the skills.sh directory
hermes skills search https://mintlify.com/docs --source well-known
hermes skills inspect openai/skills/k8s           # Preview before installing
hermes skills install openai/skills/k8s           # Install with security scan
hermes skills install official/security/1password
hermes skills install skills-sh/vercel-labs/json-render/json-render-react --force
hermes skills install well-known:https://mintlify.com/docs/.well-known/skills/mintlify
hermes skills list --source hub                   # List hub-installed skills
hermes skills check                               # Check installed hub skills for upstream updates
hermes skills update                              # Reinstall hub skills with upstream changes when needed
hermes skills audit                               # Re-scan all hub skills for security
hermes skills uninstall k8s                       # Remove a hub skill
hermes skills reset google-workspace              # Un-stick a bundled skill from "user-modified" (see below)
hermes skills reset google-workspace --restore    # Also restore the bundled version, deleting your local edits
hermes skills publish skills/my-skill --to github --repo owner/repo
hermes skills snapshot export setup.json          # Export skill config
hermes skills tap add myorg/skills-repo           # Add a custom GitHub source

Supported hub sources

SourceExampleNotes
officialofficial/security/1passwordOptional skills ที่มาพร้อมกับ Hermes
skills-shskills-sh/vercel-labs/agent-skills/vercel-react-best-practicesค้นหาได้ผ่าน hermes skills search <query> --source skills-sh. Hermes จะ resolve skills แบบ alias เมื่อ slug ของ skills.sh แตกต่างจากโฟลเดอร์ repo
well-knownwell-known:https://mintlify.com/docs/.well-known/skills/mintlifySkills ที่ให้บริการโดยตรงจาก /.well-known/skills/index.json บนเว็บไซต์ ไม่ใช่ hub ส่วนกลางเดียว - เป็น convention การค้นหาบนเว็บ
githubopenai/skills/k8sการติดตั้ง repo/path ของ GitHub โดยตรง และ custom taps
clawhub, lobehub, claude-marketplaceSource-specific identifiersการรวมระบบของชุมชนหรือ marketplace

Integrated hubs and registries

ปัจจุบัน Hermes ทำงานร่วมกับระบบนิเวศ Skills และแหล่งค้นหาเหล่านี้:

1. Official optional skills (official)

เหล่านี้ถูกดูแลรักษาใน repository ของ Hermes เองและติดตั้งด้วยความเชื่อถือในตัว (builtin trust)

hermes skills browse --source official
hermes skills install official/security/1password

2. skills.sh (skills-sh)

นี่คือ directory Skills สาธารณะของ Vercel Hermes สามารถค้นหา ตรวจสอบหน้า detail ของ Skill, resolve alias-style slugs, และติดตั้งจาก source repo พื้นฐานได้

hermes skills search react --source skills-sh
hermes skills inspect skills-sh/vercel-labs/json-render/json-render-react
hermes skills install skills-sh/vercel-labs/json-render/json-render-react --force

3. Well-known skill endpoints (well-known)

นี่คือการค้นหาตาม URL จากเว็บไซต์ที่เผยแพร่ /.well-known/skills/index.json มันไม่ใช่ hub ส่วนกลางเดียว - แต่มันเป็น convention การค้นหาบนเว็บ

hermes skills search https://mintlify.com/docs --source well-known
hermes skills inspect well-known:https://mintlify.com/docs/.well-known/skills/mintlify
hermes skills install well-known:https://mintlify.com/docs/.well-known/skills/mintlify

4. Direct GitHub skills (github)

Hermes สามารถติดตั้งโดยตรงจาก GitHub repositories และ GitHub-based taps สิ่งนี้มีประโยชน์เมื่อคุณทราบ repo/path อยู่แล้ว หรือต้องการเพิ่ม custom source repo ของคุณเอง

Default taps (สามารถเรียกดูได้โดยไม่ต้องตั้งค่าใดๆ):

hermes skills install openai/skills/k8s
hermes skills tap add myorg/skills-repo

5. ClawHub (clawhub)

ตลาด Skills ของบุคคลที่สามที่รวมเป็น community source

6. Claude marketplace-style repos (claude-marketplace)

Hermes รองรับ marketplace repos ที่เผยแพร่ manifest ของ plugin/marketplace ที่เข้ากันได้กับ Claude

Known integrated sources ได้แก่:

Hermes source id: claude-marketplace

7. LobeHub (lobehub)

Hermes สามารถค้นหาและแปลง agent entries จาก catalog สาธารณะของ LobeHub ให้เป็น Hermes skills ที่ติดตั้งได้

Security scanning and --force

Skills ที่ติดตั้งผ่าน Hub ทั้งหมดจะผ่าน security scanner ที่ตรวจสอบการรั่วไหลของข้อมูล (data exfiltration), prompt injection, destructive commands, supply-chain signals, และภัยคุกคามอื่นๆ

hermes skills inspect ... ตอนนี้ยังแสดง metadata ของ upstream เมื่อมีให้:

  • repo URL
  • skills.sh detail page URL
  • install command
  • weekly installs
  • upstream security audit statuses
  • well-known index/endpoint URLs

ใช้ --force เมื่อคุณได้ตรวจสอบ third-party skill แล้ว และต้องการยกเลิกการบล็อก policy ที่ไม่เป็นอันตราย:

hermes skills install skills-sh/anthropics/skills/pdf --force

พฤติกรรมที่สำคัญ:

  • --force สามารถยกเลิก policy blocks สำหรับการค้นพบแบบ caution/warn-style ได้
  • --force ไม่ สามารถยกเลิกผลการสแกนแบบ dangerous ได้
  • Official optional skills (official/...) ถือเป็น builtin trust และจะไม่แสดง third-party warning panel

Trust levels

LevelSourcePolicy
builtinมาพร้อมกับ Hermesเชื่อถือได้เสมอ
officialoptional-skills/ ใน repoเชื่อถือได้ในตัว, ไม่มี warning ของ third-party
trustedTrusted registries/repos เช่น openai/skills, anthropics/skillsนโยบายที่ผ่อนปรนกว่าแหล่งชุมชน
communityอื่นๆ ทั้งหมด (skills.sh, well-known endpoints, custom GitHub repos, most marketplaces)การค้นพบที่ไม่เป็นอันตรายสามารถถูกยกเลิกด้วย --force; ผลการตัดสินแบบ dangerous ยังคงถูกบล็อก

Update lifecycle

Hub ติดตาม provenance เพียงพอแล้วเพื่อตรวจสอบสำเนา upstream ของ Skills ที่ติดตั้ง:

hermes skills check          # รายงานว่า Skills hub ที่ติดตั้งตัวใดมีการเปลี่ยนแปลง upstream
hermes skills update         # ติดตั้งใหม่เฉพาะ Skills ที่มีการอัปเดต
hermes skills update react   # อัปเดต Skills hub ที่ติดตั้งเฉพาะตัว

สิ่งนี้ใช้ source identifier ที่จัดเก็บไว้บวกกับค่า hash ของ bundle upstream ปัจจุบันเพื่อตรวจจับการเปลี่ยนแปลง (drift)

:::tip GitHub rate limits การดำเนินการ Skills hub ใช้ GitHub API ซึ่งมี rate limit ที่ 60 requests/hour สำหรับผู้ใช้ที่ไม่ได้ authenticate หากคุณเห็นข้อผิดพลาด rate-limit ระหว่างการติดตั้งหรือค้นหา ให้ตั้งค่า GITHUB_TOKEN ในไฟล์ .env ของคุณเพื่อเพิ่ม limit เป็น 5,000 requests/hour ข้อความผิดพลาดจะรวมคำแนะนำที่สามารถดำเนินการได้เมื่อเกิดเหตุการณ์นี้ :::

Bundled skill updates (hermes skills reset)

Hermes มาพร้อมกับชุด Skills ที่ถูก bundled ใน skills/ ภายใน repo เมื่อติดตั้งและทุกครั้งที่รัน hermes update จะมีการ sync pass คัดลอกสิ่งเหล่านั้นไปยัง ~/.hermes/skills/ และบันทึก manifest ที่ ~/.hermes/skills/.bundled_manifest โดยแมปชื่อ Skill แต่ละตัวกับ content hash ณ เวลาที่ sync (the origin hash)

ในการ sync แต่ละครั้ง Hermes จะคำนวณ hash ของสำเนา local ของคุณใหม่และเปรียบเทียบกับ origin hash:

  • Unchanged → ปลอดภัยที่จะดึงการเปลี่ยนแปลง upstream, คัดลอกเวอร์ชัน bundled ใหม่เข้าไป, บันทึก origin hash ใหม่
  • Changed → ถือเป็น user-modified และจะถูกข้ามไปตลอดกาล ดังนั้นการแก้ไขของคุณจะไม่ถูกเขียนทับ

การป้องกันนี้ดี แต่มีจุดที่ต้องระวังคือ หากคุณแก้ไข bundled skill และต่อมาต้องการยกเลิกการเปลี่ยนแปลงของคุณและกลับไปใช้เวอร์ชัน bundled โดยการคัดลอก-วางจาก ~/.hermes/hermes-agent/skills/ manifest ยังคงเก็บ origin hash เก่า จากเวลาที่ sync สำเร็จครั้งล่าสุด เนื้อหาที่คุณคัดลอก-วางใหม่ (current bundled hash) จะไม่ตรงกับ origin hash ที่ล้าสมัยนั้น ดังนั้น sync จึงยังคงแจ้งว่าเป็น user-modified

hermes skills reset คือทางออก:

# ปลอดภัย: ล้างรายการ manifest สำหรับ Skill นี้ สำเนาปัจจุบันของคุณยังคงอยู่
# แต่การ sync ครั้งต่อไปจะตั้งค่า baseline ใหม่โดยอิงจากมัน เพื่อให้การอัปเดตในอนาคตทำงานได้ตามปกติ
hermes skills reset google-workspace

# กู้คืนเต็มรูปแบบ: ลบสำเนา local ของคุณด้วย และคัดลอกเวอร์ชัน bundled ปัจจุบัน
# ใช้สิ่งนี้เมื่อคุณต้องการให้ได้ Skill upstream ที่สมบูรณ์แบบกลับมา
hermes skills reset google-workspace --restore

# ไม่โต้ตอบ (เช่น ใน scripts หรือ TUI mode) - ข้ามการยืนยัน --restore
hermes skills reset google-workspace --restore --yes

คำสั่งเดียวกันนี้ใช้ได้ใน chat ในรูปแบบ slash command:

/skills reset google-workspace
/skills reset google-workspace --restore

:::note Profiles แต่ละ profile มี .bundled_manifest ของตัวเองภายใต้ HERMES_HOME ของตัวเอง ดังนั้น hermes -p coder skills reset <name> จะส่งผลกระทบเฉพาะ profile นั้นเท่านั้น :::

Slash commands (inside chat)

คำสั่งทั้งหมดนี้ใช้ได้กับ /skills:

/skills browse
/skills search react --source skills-sh
/skills search https://mintlify.com/docs --source well-known
/skills inspect skills-sh/vercel-labs/json-render/json-render-react
/skills install openai/skills/skill-creator --force
/skills check
/skills update
/skills reset google-workspace
/skills list

Official optional skills ยังคงใช้ identifiers เช่น official/security/1password และ official/migration/openclaw-migration


📄 user-guide/features/skins.md


sidebar_position: 10 title: "Skins & Themes" description: "Customize the Hermes CLI with built-in and user-defined skins"

Skins & Themes

Skins ควบคุม การนำเสนอทางภาพ ของ Hermes CLI: สีของแบนเนอร์, หน้าและคำกริยาของ spinner, ป้ายกำกับ response-box, ข้อความ branding, และ tool activity prefix

สไตล์การสนทนา (Conversational style) และสไตล์ภาพ (Visual style) เป็นแนวคิดที่แยกจากกัน:

  • Personality เปลี่ยนโทนและถ้อยคำของ agent
  • Skin เปลี่ยนรูปลักษณ์ของ CLI

Change skins

/skin                # show the current skin and list available skins
/skin ares           # switch to a built-in skin
/skin mytheme        # switch to a custom skin from ~/.hermes/skins/mytheme.yaml

หรือตั้งค่า skin เริ่มต้นใน ~/.hermes/config.yaml:

display:
  skin: default

Built-in skins

SkinDescriptionAgent brandingVisual character
defaultClassic Hermes - gold and kawaiiHermes Agentขอบสีทองอบอุ่น, ข้อความสี cornsilk, หน้า kawaii ใน spinner. แบนเนอร์ caduceus ที่คุ้นเคย. ดูสะอาดตาและน่าใช้งาน.
aresธีมเทพสงคราม - crimson และ bronzeAres Agentขอบสี crimson เข้มพร้อมเน้นสี bronze. คำกริยา spinner ที่ดูดุดัน ("forging", "marching", "tempering steel"). แบนเนอร์ ASCII art รูปดาบ-โล่แบบกำหนดเอง.
monoโทนสีขาวดำ (Monochrome) - grayscale สะอาดตาHermes Agentสีเทาทั้งหมด - ไม่มีสี. ขอบเป็น #555555, ข้อความเป็น #c9d1d9. เหมาะสำหรับ terminal setup แบบมินิมอล หรือการบันทึกหน้าจอ.
slateสีน้ำเงินเย็น - เน้นสำหรับนักพัฒนาHermes Agentขอบสีน้ำเงินราชวงศ์ (#4169e1), ข้อความสีน้ำเงินอ่อน. ดูสงบและเป็นมืออาชีพ. ไม่มี spinner แบบกำหนดเอง - ใช้หน้า default.
daylightธีมสว่างสำหรับ terminal สว่างด้วยข้อความสีเข้มและเน้นสีน้ำเงินเย็นHermes Agentออกแบบมาสำหรับ terminal สีขาวหรือสีสว่าง. ข้อความ slate สีเข้มพร้อมขอบสีน้ำเงิน, พื้นผิวสถานะสีอ่อน, และเมนู completion ที่ยังอ่านง่ายในโปรไฟล์ terminal สว่าง.
warm-lightmodeข้อความสีน้ำตาล/ทองอบอุ่นสำหรับพื้นหลัง terminal สีสว่างHermes Agentโทนสี parchment อบอุ่นสำหรับ terminal สว่าง. ข้อความสีน้ำตาลเข้มพร้อมเน้นสี saddle-brown, พื้นผิวสถานะสีครีม. ทางเลือกที่ดูเป็นธรรมชาติแทนธีม daylight ที่เย็นกว่า.
poseidonธีมเทพแห่งมหาสมุทร - deep blue และ seafoamPoseidon Agentการไล่ระดับสีจากน้ำเงินเข้มถึง seafoam. spinner ธีมมหาสมุทร ("charting currents", "sounding the depth"). แบนเนอร์ ASCII art รูปตรีศูล.
sisyphusธีมซิซิฟัส - grayscale แบบเคร่งขรึมพร้อมความคงทนSisyphus Agentสีเทาอ่อนพร้อมความเปรียบต่างที่ชัดเจน. spinner ธีมก้อนหิน ("pushing uphill", "resetting the boulder", "enduring the loop"). แบนเนอร์ ASCII art รูปก้อนหินและเนินเขา.
charizardธีมภูเขาไฟ - burnt orange และ emberCharizard Agentการไล่ระดับสีจาก burnt orange อบอุ่นถึง ember. spinner ธีมไฟ ("banking into the draft", "measuring burn"). แบนเนอร์ ASCII art รูปเงาดราก้อน.

Complete list of configurable keys

Colors (colors:)

ควบคุมค่าสีทั้งหมดทั่วทั้ง CLI. ค่าที่ใช้คือ hex color strings.

KeyDescriptionDefault (default skin)
banner_borderขอบแผงรอบแบนเนอร์เริ่มต้น#CD7F32 (bronze)
banner_titleสีข้อความชื่อเรื่องในแบนเนอร์#FFD700 (gold)
banner_accentส่วนหัวของส่วนในแบนเนอร์ (Available Tools, etc.)#FFBF00 (amber)
banner_dimข้อความที่ลดความสำคัญในแบนเนอร์ (ตัวคั่น, ป้ายกำกับรอง)#B8860B (dark goldenrod)
banner_textข้อความเนื้อหาในแบนเนอร์ (ชื่อเครื่องมือ, ชื่อทักษะ)#FFF8DC (cornsilk)
ui_accentสีเน้น UI ทั่วไป (ไฮไลต์, องค์ประกอบที่ใช้งานอยู่)#FFBF00
ui_labelป้ายกำกับและแท็ก UI#4dd0e1 (teal)
ui_okตัวบ่งชี้ความสำเร็จ (เครื่องหมายถูก, การเสร็จสมบูรณ์)#4caf50 (green)
ui_errorตัวบ่งชี้ข้อผิดพลาด (ความล้มเหลว, ถูกบล็อก)#ef5350 (red)
ui_warnตัวบ่งชี้คำเตือน (ข้อควรระวัง, prompt การอนุมัติ)#ffa726 (orange)
promptสีข้อความ prompt แบบโต้ตอบ#FFF8DC
input_ruleเส้นแนวนอนเหนือพื้นที่ input#CD7F32
response_borderขอบรอบกล่อง response ของ agent (ANSI escape)#FFD700
session_labelสีป้ายกำกับ session#DAA520
session_borderสีขอบ dim ของ Session ID#8B8682
status_bar_bgพื้นหลังสำหรับสถานะ TUI / แถบการใช้งาน#1a1a2e
voice_status_bgพื้นหลังสำหรับป้ายสถานะโหมดเสียง#1a1a2e
completion_menu_bgพื้นหลังสำหรับรายการเมนู completion#1a1a2e
completion_menu_current_bgพื้นหลังสำหรับแถว completion ที่ใช้งานอยู่#333355
completion_menu_meta_bgพื้นหลังสำหรับคอลัมน์ meta ของ completion#1a1a2e
completion_menu_meta_current_bgพื้นหลังสำหรับคอลัมน์ meta ของ completion ที่ใช้งานอยู่#333355

Spinner (spinner:)

ควบคุม spinner แบบเคลื่อนไหวที่แสดงขณะรอการตอบกลับ API

KeyTypeDescriptionExample
waiting_faceslist of stringsหน้าที่หมุนขณะรอการตอบกลับ API["(⚔)", "(⛨)", "(▲)"]
thinking_faceslist of stringsหน้าที่หมุนระหว่างการให้เหตุผลของ model["(⚔)", "(⌁)", "(<>)"]
thinking_verbslist of stringsคำกริยาที่แสดงในข้อความ spinner["forging", "plotting", "hammering plans"]
wingslist of [left, right] pairsวงเล็บตกแต่งรอบ spinner[["⟪⚔", "⚔⟫"], ["⟪▲", "▲⟫"]]

เมื่อค่า spinner ว่างเปล่า (เช่น ใน default และ mono) จะใช้ค่า default ที่กำหนดไว้ใน display.py

Branding (branding:)

ข้อความ string ที่ใช้ทั่วทั้ง interface ของ CLI

KeyDescriptionDefault
agent_nameชื่อที่แสดงในแบนเนอร์ title และ status displayHermes Agent
welcomeข้อความต้อนรับที่แสดงเมื่อเริ่ม CLIWelcome to Hermes Agent! Type your message or /help for commands.
goodbyeข้อความที่แสดงเมื่อออกจากระบบGoodbye! ⚕
response_labelป้ายกำกับบนส่วนหัวของ response box⚕ Hermes
prompt_symbolสัญลักษณ์ก่อน prompt input ของผู้ใช้
help_headerข้อความส่วนหัวสำหรับ output ของคำสั่ง /help(^_^)? Available Commands

Other top-level keys

KeyTypeDescriptionDefault
tool_prefixstringอักขระที่นำหน้า tool output lines ใน CLI
tool_emojisdictการกำหนดค่า emoji สำหรับแต่ละ tool สำหรับ spinner และ progress ({tool_name: emoji}){}
banner_logostringASCII art logo แบบ rich-markup (แทนที่แบนเนอร์ HERMES_AGENT default)""
banner_herostringRich-markup hero art (แทนที่งานศิลปะ caduceus default)""

Custom skins

สร้างไฟล์ YAML ภายใต้ ~/.hermes/skins/. สกินของผู้ใช้จะสืบทอดค่าที่ขาดหายไปจาก skin default ที่สร้างไว้ล่วงหน้า ดังนั้นคุณจึงจำเป็นต้องระบุเฉพาะ keys ที่ต้องการเปลี่ยนแปลงเท่านั้น

Full custom skin YAML template

# ~/.hermes/skins/mytheme.yaml
# Complete skin template - all keys shown. Delete any you don't need;
# missing values automatically inherit from the 'default' skin.

name: mytheme
description: My custom theme

colors:
  banner_border: "#CD7F32"
  banner_title: "#FFD700"
  banner_accent: "#FFBF00"
  banner_dim: "#B8860B"
  banner_text: "#FFF8DC"
  ui_accent: "#FFBF00"
  ui_label: "#4dd0e1"
  ui_ok: "#4caf50"
  ui_error: "#ef5350"
  ui_warn: "#ffa726"
  prompt: "#FFF8DC"
  input_rule: "#CD7F32"
  response_border: "#FFD700"
  session_label: "#DAA520"
  session_border: "#8B8682"
  status_bar_bg: "#1a1a2e"
  voice_status_bg: "#1a1a2e"
  completion_menu_bg: "#1a1a2e"
  completion_menu_current_bg: "#333355"
  completion_menu_meta_bg: "#1a1a2e"
  completion_menu_meta_current_bg: "#333355"

spinner:
  waiting_faces:
    - "(⚔)"
    - "(⛨)"
    - "(▲)"
  thinking_faces:
    - "(⚔)"
    - "(⌁)"
    - "(<>)"
  thinking_verbs:
    - "processing"
    - "analyzing"
    - "computing"
    - "evaluating"
  wings:
    - ["⟪⚡", "⚡⟫"]
    - ["⟪●", "●⟫"]

branding:
  agent_name: "My Agent"
  welcome: "Welcome to My Agent! Type your message or /help for commands."
  goodbye: "See you later! ⚡"
  response_label: " ⚡ My Agent "
  prompt_symbol: "⚡ ❯ "
  help_header: "(⚡) Available Commands"

tool_prefix: "┊"

# Per-tool emoji overrides (optional)
tool_emojis:
  terminal: "⚔"
  web_search: "🔮"
  read_file: "📄"

# Custom ASCII art banners (optional, Rich markup supported)
# banner_logo: |
#   [bold #FFD700] MY AGENT [/]
# banner_hero: |
#   [#FFD700]  Custom art here  [/]

Minimal custom skin example

เนื่องจากทุกอย่างสืบทอดจาก default สกินแบบมินิมอลจึงจำเป็นต้องเปลี่ยนเฉพาะสิ่งที่แตกต่างเท่านั้น:

name: cyberpunk
description: Neon terminal theme

colors:
  banner_border: "#FF00FF"
  banner_title: "#00FFFF"
  banner_accent: "#FF1493"

spinner:
  thinking_verbs: ["jacking in", "decrypting", "uploading"]
  wings:
    - ["⟨⚡", "⚡⟩"]

branding:
  agent_name: "Cyber Agent"
  response_label: " ⚡ Cyber "

tool_prefix: "▏"

Hermes Mod - Visual Skin Editor

Hermes Mod คือ web UI ที่สร้างโดยชุมชนสำหรับการสร้างและจัดการ skins ด้วยภาพแทนการเขียน YAML ด้วยมือ คุณจะได้รับ editor แบบ point-and-click พร้อม live preview

Hermes Mod skin editor

สิ่งที่ทำได้:

  • แสดงรายการ built-in และ custom skins ทั้งหมด
  • เปิด skin ใดก็ได้ใน visual editor พร้อมด้วยฟิลด์ skin ของ Hermes ทั้งหมด (colors, spinner, branding, tool prefix, tool emojis)
  • สร้างข้อความ art banner_logo จาก text prompt
  • แปลงรูปภาพที่อัปโหลด (PNG, JPG, GIF, WEBP) เป็น ASCII art banner_hero ด้วยสไตล์การเรนเดอร์หลายแบบ (braille, ASCII ramp, blocks, dots)
  • บันทึกโดยตรงไปยัง ~/.hermes/skins/
  • เปิดใช้งาน skin โดยการอัปเดต ~/.hermes/config.yaml
  • แสดง YAML ที่สร้างขึ้นและ live preview

Install

Option 1 - Pinokio (1-click):

ค้นหาได้ที่ pinokio.computer และติดตั้งด้วยการคลิกเพียงครั้งเดียว

Option 2 - npx (เร็วที่สุดจาก terminal):

npx -y hermes-mod

Option 3 - Manual:

git clone https://github.com/cocktailpeanut/hermes-mod.git
cd hermes-mod/app
npm install
npm start

Usage

  1. เริ่มแอป (ผ่าน Pinokio หรือ terminal).
  2. เปิด Skin Studio.
  3. เลือก built-in หรือ custom skin ที่ต้องการแก้ไข.
  4. สร้าง logo จากข้อความและ/หรืออัปโหลดรูปภาพสำหรับ hero art. เลือกสไตล์การเรนเดอร์และความกว้าง.
  5. แก้ไข colors, spinner, branding, และฟิลด์อื่น ๆ.
  6. คลิก Save เพื่อเขียน skin YAML ไปยัง ~/.hermes/skins/.
  7. คลิก Activate เพื่อตั้งค่าให้เป็น skin ปัจจุบัน (อัปเดต display.skin ใน config.yaml).

Hermes Mod เคารพ environment variable HERMES_HOME ดังนั้นจึงใช้งานได้กับ profiles ด้วย

Operational notes

  • Built-in skins โหลดจาก hermes_cli/skin_engine.py.
  • Skins ที่ไม่รู้จักจะ fallback ไปที่ default โดยอัตโนมัติ.
  • /skin จะอัปเดตธีม CLI ที่ใช้งานอยู่ทันทีสำหรับ session ปัจจุบัน.
  • User skins ใน ~/.hermes/skins/ จะมีลำดับความสำคัญสูงกว่า built-in skins ที่มีชื่อเดียวกัน.
  • การเปลี่ยน skin ผ่าน /skin จะมีผลเฉพาะ session นั้น ๆ เท่านั้น หากต้องการให้ skin เป็นค่า default ถาวร ให้ตั้งค่าใน config.yaml.
  • ฟิลด์ banner_logo และ banner_hero รองรับ Rich console markup (เช่น [bold #FF0000]text[/]) สำหรับ ASCII art สี.

extent analysis

TL;DR

To resolve the issue, identify the root cause by checking the error message and the code, then apply the necessary fix, such as updating dependencies, modifying code, or adjusting configurations.

Guidance

  1. Check the error message: Look for any error messages or warnings that may indicate the cause of the issue.
  2. Review the code: Examine the code and configurations to identify any potential problems or inconsistencies.
  3. Update dependencies: Ensure that all dependencies are up-to-date, as outdated dependencies can cause issues.
  4. Modify code: Make any necessary changes to the code to fix the issue.
  5. Adjust configurations: Update configurations as needed to resolve the issue.

Example

No specific code example is provided as the issue description is not included.

Notes

Without the issue description, it's challenging to provide a specific solution. However, following the guidance above should help in identifying and resolving the issue.

Recommendation

Apply the necessary fix based on the root cause of the issue. If the issue is due to an outdated dependency, update the dependency. If the issue is due to a code problem, modify the code accordingly.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

hermes - 💡(How to fix) Fix [i18n] Thai Translation: Features Part 2c - Plugins, Routing, RL, Skills, Skins [1 participants]