mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-04-28 06:51:16 +08:00
Enhance platform toolset configuration and CLI toolset handling
- Introduced a new configuration section in `cli-config.yaml.example` for defining platform-specific toolsets, allowing for greater customization of available tools per platform. - Updated the CLI to check for user-defined toolsets in the configuration, falling back to the default `hermes-cli` toolset if none are specified. - Enhanced the `GatewayRunner` class to load platform-specific toolsets from the configuration, ensuring that the correct tools are enabled based on the platform being used.
This commit is contained in:
@@ -181,7 +181,87 @@ agent:
|
|||||||
# Control which tools the agent has access to.
|
# Control which tools the agent has access to.
|
||||||
# Use "all" to enable everything, or specify individual toolsets.
|
# Use "all" to enable everything, or specify individual toolsets.
|
||||||
|
|
||||||
# Available toolsets:
|
# =============================================================================
|
||||||
|
# Platform Toolsets (per-platform tool configuration)
|
||||||
|
# =============================================================================
|
||||||
|
# Override which toolsets are available on each platform.
|
||||||
|
# If a platform isn't listed here, its built-in default is used.
|
||||||
|
#
|
||||||
|
# You can use EITHER:
|
||||||
|
# - A preset like "hermes-cli" or "hermes-telegram" (curated tool set)
|
||||||
|
# - A list of individual toolsets to compose your own (see list below)
|
||||||
|
#
|
||||||
|
# Supported platform keys: cli, telegram, discord, whatsapp, slack
|
||||||
|
#
|
||||||
|
# Examples:
|
||||||
|
#
|
||||||
|
# # Use presets (same as defaults):
|
||||||
|
# platform_toolsets:
|
||||||
|
# cli: [hermes-cli]
|
||||||
|
# telegram: [hermes-telegram]
|
||||||
|
#
|
||||||
|
# # Custom: give Telegram only web + terminal + file + planning:
|
||||||
|
# platform_toolsets:
|
||||||
|
# telegram: [web, terminal, file, todo]
|
||||||
|
#
|
||||||
|
# # Custom: CLI without browser or image gen:
|
||||||
|
# platform_toolsets:
|
||||||
|
# cli: [web, terminal, file, skills, todo, tts, cronjob]
|
||||||
|
#
|
||||||
|
# # Restrictive: Discord gets read-only tools only:
|
||||||
|
# platform_toolsets:
|
||||||
|
# discord: [web, vision, skills, todo]
|
||||||
|
#
|
||||||
|
# If not set, defaults are:
|
||||||
|
# cli: hermes-cli (everything + cronjob management)
|
||||||
|
# telegram: hermes-telegram (terminal, file, web, vision, image, tts, browser, skills, todo, cronjob, messaging)
|
||||||
|
# discord: hermes-discord (same as telegram)
|
||||||
|
# whatsapp: hermes-whatsapp (same as telegram)
|
||||||
|
# slack: hermes-slack (same as telegram)
|
||||||
|
#
|
||||||
|
platform_toolsets:
|
||||||
|
cli: [hermes-cli]
|
||||||
|
telegram: [hermes-telegram]
|
||||||
|
discord: [hermes-discord]
|
||||||
|
whatsapp: [hermes-whatsapp]
|
||||||
|
slack: [hermes-slack]
|
||||||
|
|
||||||
|
# ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
# Available toolsets (use these names in platform_toolsets or the toolsets list)
|
||||||
|
#
|
||||||
|
# Run `hermes chat --list-toolsets` to see all toolsets and their tools.
|
||||||
|
# Run `hermes chat --list-tools` to see every individual tool with descriptions.
|
||||||
|
# ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
#
|
||||||
|
# INDIVIDUAL TOOLSETS (compose your own):
|
||||||
|
# web - web_search, web_extract
|
||||||
|
# search - web_search only (no scraping)
|
||||||
|
# terminal - terminal, process
|
||||||
|
# file - read_file, write_file, patch, search
|
||||||
|
# browser - browser_navigate, browser_snapshot, browser_click, browser_type,
|
||||||
|
# browser_scroll, browser_back, browser_press, browser_close,
|
||||||
|
# browser_get_images, browser_vision (requires BROWSERBASE_API_KEY)
|
||||||
|
# vision - vision_analyze (requires OPENROUTER_API_KEY)
|
||||||
|
# image_gen - image_generate (requires FAL_KEY)
|
||||||
|
# skills - skills_list, skill_view
|
||||||
|
# moa - mixture_of_agents (requires OPENROUTER_API_KEY)
|
||||||
|
# todo - todo (in-memory task planning, no deps)
|
||||||
|
# tts - text_to_speech (Edge TTS free, or ELEVENLABS/OPENAI key)
|
||||||
|
# cronjob - schedule_cronjob, list_cronjobs, remove_cronjob
|
||||||
|
# rl - rl_list_environments, rl_start_training, etc. (requires TINKER_API_KEY)
|
||||||
|
#
|
||||||
|
# PRESETS (curated bundles):
|
||||||
|
# hermes-cli - All of the above except rl + send_message
|
||||||
|
# hermes-telegram - terminal, file, web, vision, image_gen, tts, browser,
|
||||||
|
# skills, todo, cronjob, send_message
|
||||||
|
# hermes-discord - Same as hermes-telegram
|
||||||
|
# hermes-whatsapp - Same as hermes-telegram
|
||||||
|
# hermes-slack - Same as hermes-telegram
|
||||||
|
#
|
||||||
|
# COMPOSITE:
|
||||||
|
# debugging - terminal + web + file
|
||||||
|
# safe - web + vision + moa (no terminal access)
|
||||||
|
# all - Everything available
|
||||||
#
|
#
|
||||||
# web - Web search and content extraction (web_search, web_extract)
|
# web - Web search and content extraction (web_search, web_extract)
|
||||||
# search - Web search only, no scraping (web_search)
|
# search - Web search only, no scraping (web_search)
|
||||||
|
|||||||
8
cli.py
8
cli.py
@@ -1862,8 +1862,12 @@ def main(
|
|||||||
else:
|
else:
|
||||||
toolsets_list.append(str(t))
|
toolsets_list.append(str(t))
|
||||||
else:
|
else:
|
||||||
# Default: use hermes-cli toolset for full CLI functionality including cronjob tools
|
# Check config for CLI toolsets, fallback to hermes-cli
|
||||||
toolsets_list = ["hermes-cli"]
|
config_cli_toolsets = CLI_CONFIG.get("platform_toolsets", {}).get("cli")
|
||||||
|
if config_cli_toolsets and isinstance(config_cli_toolsets, list):
|
||||||
|
toolsets_list = config_cli_toolsets
|
||||||
|
else:
|
||||||
|
toolsets_list = ["hermes-cli"]
|
||||||
|
|
||||||
# Create CLI instance
|
# Create CLI instance
|
||||||
cli = HermesCLI(
|
cli = HermesCLI(
|
||||||
|
|||||||
@@ -818,14 +818,44 @@ class GatewayRunner:
|
|||||||
from run_agent import AIAgent
|
from run_agent import AIAgent
|
||||||
import queue
|
import queue
|
||||||
|
|
||||||
# Determine toolset based on platform
|
# Determine toolset based on platform.
|
||||||
toolset_map = {
|
# Check config.yaml for per-platform overrides, fallback to hardcoded defaults.
|
||||||
|
default_toolset_map = {
|
||||||
Platform.LOCAL: "hermes-cli",
|
Platform.LOCAL: "hermes-cli",
|
||||||
Platform.TELEGRAM: "hermes-telegram",
|
Platform.TELEGRAM: "hermes-telegram",
|
||||||
Platform.DISCORD: "hermes-discord",
|
Platform.DISCORD: "hermes-discord",
|
||||||
Platform.WHATSAPP: "hermes-whatsapp",
|
Platform.WHATSAPP: "hermes-whatsapp",
|
||||||
|
Platform.SLACK: "hermes-slack",
|
||||||
}
|
}
|
||||||
toolset = toolset_map.get(source.platform, "hermes-telegram")
|
|
||||||
|
# Try to load platform_toolsets from config
|
||||||
|
platform_toolsets_config = {}
|
||||||
|
try:
|
||||||
|
config_path = Path.home() / '.hermes' / 'config.yaml'
|
||||||
|
if config_path.exists():
|
||||||
|
import yaml
|
||||||
|
with open(config_path, 'r') as f:
|
||||||
|
user_config = yaml.safe_load(f) or {}
|
||||||
|
platform_toolsets_config = user_config.get("platform_toolsets", {})
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Map platform enum to config key
|
||||||
|
platform_config_key = {
|
||||||
|
Platform.LOCAL: "cli",
|
||||||
|
Platform.TELEGRAM: "telegram",
|
||||||
|
Platform.DISCORD: "discord",
|
||||||
|
Platform.WHATSAPP: "whatsapp",
|
||||||
|
Platform.SLACK: "slack",
|
||||||
|
}.get(source.platform, "telegram")
|
||||||
|
|
||||||
|
# Use config override if present (list of toolsets), otherwise hardcoded default
|
||||||
|
config_toolsets = platform_toolsets_config.get(platform_config_key)
|
||||||
|
if config_toolsets and isinstance(config_toolsets, list):
|
||||||
|
enabled_toolsets = config_toolsets
|
||||||
|
else:
|
||||||
|
default_toolset = default_toolset_map.get(source.platform, "hermes-telegram")
|
||||||
|
enabled_toolsets = [default_toolset]
|
||||||
|
|
||||||
# Check if tool progress notifications are enabled
|
# Check if tool progress notifications are enabled
|
||||||
tool_progress_enabled = os.getenv("HERMES_TOOL_PROGRESS", "").lower() in ("1", "true", "yes")
|
tool_progress_enabled = os.getenv("HERMES_TOOL_PROGRESS", "").lower() in ("1", "true", "yes")
|
||||||
@@ -944,7 +974,7 @@ class GatewayRunner:
|
|||||||
model=os.getenv("HERMES_MODEL", "anthropic/claude-opus-4.6"),
|
model=os.getenv("HERMES_MODEL", "anthropic/claude-opus-4.6"),
|
||||||
max_iterations=max_iterations,
|
max_iterations=max_iterations,
|
||||||
quiet_mode=True,
|
quiet_mode=True,
|
||||||
enabled_toolsets=[toolset],
|
enabled_toolsets=enabled_toolsets,
|
||||||
ephemeral_system_prompt=context_prompt,
|
ephemeral_system_prompt=context_prompt,
|
||||||
session_id=session_id,
|
session_id=session_id,
|
||||||
tool_progress_callback=progress_callback if tool_progress_enabled else None,
|
tool_progress_callback=progress_callback if tool_progress_enabled else None,
|
||||||
|
|||||||
Reference in New Issue
Block a user