From ca294d3e62eddd3280abeeff51e18508450aa3cc Mon Sep 17 00:00:00 2001 From: oppenheimor Date: Tue, 7 Jul 2026 00:30:22 +0800 Subject: [PATCH] feat(moa): add reference model toggles --- agent/moa_loop.py | 6 +- .../src/app/settings/model-settings.tsx | 21 ++++++- apps/desktop/src/app/settings/primitives.tsx | 6 +- apps/desktop/src/types/hermes.ts | 1 + hermes_cli/moa_cmd.py | 4 +- hermes_cli/moa_config.py | 31 ++++++++-- hermes_cli/web_server.py | 1 + tests/cli/test_moa_command.py | 5 +- tests/hermes_cli/test_moa_config.py | 58 ++++++++++++++++--- tests/run_agent/test_moa_loop_mode.py | 45 ++++++++++++++ web/src/lib/api.ts | 1 + web/src/pages/ModelsPage.tsx | 24 +++++++- 12 files changed, 181 insertions(+), 22 deletions(-) diff --git a/agent/moa_loop.py b/agent/moa_loop.py index c625220671dd..b987757776ee 100644 --- a/agent/moa_loop.py +++ b/agent/moa_loop.py @@ -880,6 +880,7 @@ def aggregate_moa_context( so the provider default applies — matching single-model agent behavior. Presets may still pin explicit values. """ + reference_models = [slot for slot in reference_models if slot.get("enabled", True)] reference_outputs: list[tuple[str, str, Any]] = [] ref_messages = _reference_messages(api_messages) reference_outputs = _run_references_parallel( @@ -1267,7 +1268,10 @@ class MoAChatCompletions: privacy_mode = _moa_privacy_mode(_moa_raw) self._privacy_mode = privacy_mode messages = list(api_kwargs.get("messages") or []) - reference_models = preset.get("reference_models") or [] + reference_models = [ + slot for slot in (preset.get("reference_models") or []) + if slot.get("enabled", True) + ] aggregator = preset.get("aggregator") or {} # Expose the resolved aggregator slot so session cost accounting can # price the aggregator's acting turn at its REAL model/provider. The diff --git a/apps/desktop/src/app/settings/model-settings.tsx b/apps/desktop/src/app/settings/model-settings.tsx index 52066eab35a3..85f85623f800 100644 --- a/apps/desktop/src/app/settings/model-settings.tsx +++ b/apps/desktop/src/app/settings/model-settings.tsx @@ -1078,6 +1078,21 @@ export function ModelSettings({ onMainModelChanged }: ModelSettingsProps) {
{currentMoaPreset.reference_models.map((slot, index) => ( + updateMoaPreset(prev => ({ + ...prev, + reference_models: prev.reference_models.map((s, i) => + i === index ? { ...s, enabled: checked === true } : s + ) + })) + } + /> + } below={