diff --git a/hermes_cli/moa_config.py b/hermes_cli/moa_config.py index e3fc77f74..39594ee39 100644 --- a/hermes_cli/moa_config.py +++ b/hermes_cli/moa_config.py @@ -75,18 +75,16 @@ def _coerce_fanout(value: Any) -> str: def _clean_reasoning_effort(value: Any) -> str | None: """Return a canonical per-slot reasoning effort, or None when unset/invalid.""" + from hermes_constants import parse_reasoning_effort + if value is None or value is True: return None - if value is False: - return "none" - text = str(value or "").strip().lower() - if not text: + parsed = parse_reasoning_effort(value) + if parsed is None: return None - if text in {"none", "false", "disabled"}: + if parsed.get("enabled") is False: return "none" - if text in {"minimal", "low", "medium", "high", "xhigh", "max"}: - return text - return None + return parsed.get("effort") def _clean_slot(slot: Any) -> dict[str, Any] | None: diff --git a/scripts/release.py b/scripts/release.py index 5ccb8dcea..a558f3a2a 100755 --- a/scripts/release.py +++ b/scripts/release.py @@ -45,6 +45,7 @@ ACP_REGISTRY_MANIFEST = REPO_ROOT / "acp_registry" / "agent.json" # Auto-extracted from noreply emails + manual overrides AUTHOR_MAP = { + "kar.iskakov@gmail.com": "karfly", # PR #64012 salvage (gateway: surface extended reasoning efforts) "agungsubastian1963@gmail.com": "aguung", # PR #64461 salvage (gateway: multiplex secret_scope for authz/Slack/webhooks) "jtstothard@gmail.com": "jtstothard", # PR #63256 salvage (gateway: multiplex secondary adapter config validation) "doogie@spark.local": "SAMBAS123", # PR #64986 salvage (gateway: multiplex primary bot token scope) diff --git a/tests/hermes_cli/test_moa_config.py b/tests/hermes_cli/test_moa_config.py index 69b07e89f..c78631f5e 100644 --- a/tests/hermes_cli/test_moa_config.py +++ b/tests/hermes_cli/test_moa_config.py @@ -106,6 +106,7 @@ def test_normalize_moa_config_preserves_slot_reasoning_effort(): {"provider": "openai-codex", "model": "gpt-5.6-sol", "reasoning_effort": "LOW"}, {"provider": "openai-codex", "model": "gpt-5.6-sol", "reasoning_effort": False}, {"provider": "openai-codex", "model": "gpt-5.6-sol", "reasoning_effort": "nonsense"}, + {"provider": "openai-codex", "model": "gpt-5.6-sol", "reasoning_effort": "ultra"}, ], "aggregator": {"provider": "openai-codex", "model": "gpt-5.6-sol", "reasoning_effort": "xhigh"}, } @@ -117,6 +118,7 @@ def test_normalize_moa_config_preserves_slot_reasoning_effort(): assert preset["reference_models"][0]["reasoning_effort"] == "low" assert preset["reference_models"][1]["reasoning_effort"] == "none" assert "reasoning_effort" not in preset["reference_models"][2] + assert preset["reference_models"][3]["reasoning_effort"] == "ultra" assert preset["aggregator"]["reasoning_effort"] == "xhigh" diff --git a/website/docs/user-guide/features/mixture-of-agents.md b/website/docs/user-guide/features/mixture-of-agents.md index b6affbe9c..151a066dd 100644 --- a/website/docs/user-guide/features/mixture-of-agents.md +++ b/website/docs/user-guide/features/mixture-of-agents.md @@ -138,7 +138,7 @@ Reference and aggregator slots may also set `reasoning_effort`. Use this when you want the same model to contribute at different depths, or when the aggregator should think harder than the advisory references. Valid values match Hermes' normal reasoning controls: `none`, `minimal`, `low`, `medium`, `high`, -`xhigh`, and `max`. +`xhigh`, `max`, and `ultra`. ```yaml moa: