diff --git a/cli-config.yaml.example b/cli-config.yaml.example index 069472380..7e308d0a2 100644 --- a/cli-config.yaml.example +++ b/cli-config.yaml.example @@ -181,7 +181,87 @@ agent: # Control which tools the agent has access to. # 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) # search - Web search only, no scraping (web_search) diff --git a/cli.py b/cli.py index 939a450f3..8d72f3a61 100755 --- a/cli.py +++ b/cli.py @@ -1862,8 +1862,12 @@ def main( else: toolsets_list.append(str(t)) else: - # Default: use hermes-cli toolset for full CLI functionality including cronjob tools - toolsets_list = ["hermes-cli"] + # Check config for CLI toolsets, fallback to 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 cli = HermesCLI( diff --git a/gateway/run.py b/gateway/run.py index 674d3493f..69d45c86f 100644 --- a/gateway/run.py +++ b/gateway/run.py @@ -818,14 +818,44 @@ class GatewayRunner: from run_agent import AIAgent import queue - # Determine toolset based on platform - toolset_map = { + # Determine toolset based on platform. + # Check config.yaml for per-platform overrides, fallback to hardcoded defaults. + default_toolset_map = { Platform.LOCAL: "hermes-cli", Platform.TELEGRAM: "hermes-telegram", Platform.DISCORD: "hermes-discord", 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 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"), max_iterations=max_iterations, quiet_mode=True, - enabled_toolsets=[toolset], + enabled_toolsets=enabled_toolsets, ephemeral_system_prompt=context_prompt, session_id=session_id, tool_progress_callback=progress_callback if tool_progress_enabled else None,