Describe the bug
Custom-named providers such as custom:zenmux are not recognized as multi-model aggregators in two places:
1. hermes_cli/providers.py — is_aggregator()
The function only returns True for providers registered in PROVIDER_REGISTRY that have is_aggregator=True. Custom-named providers like custom:zenmux fall through to get_provider() which returns None for unknown slugs, so is_aggregator() returns False.
This breaks model-alias resolution for vendor-prefixed model IDs (e.g. google/gemini-3.1-flash-lite) when the current provider is custom:zenmux.
2. hermes_cli/doctor.py — vendor-prefix validation
hermes doctor raises a false-positive warning:
model.default 'z-ai/glm-5.1' is vendor-prefixed but model.provider is 'custom:zenmux'.
Either set model.provider to 'openrouter', or drop the vendor prefix.
This is incorrect — custom:zenmux is an aggregator that accepts vendor-prefixed model slugs, just like openrouter or bare custom.
Expected behavior
is_aggregator("custom:zenmux") should return True
hermes doctor should not warn about vendor-prefixed models when model.provider is custom:<name>
Fix
hermes_cli/providers.py:
def is_aggregator(provider: str) -> bool:
if provider and provider.startswith("custom:"):
return True
pdef = get_provider(provider)
return pdef.is_aggregator if pdef else False
hermes_cli/doctor.py — add not provider_for_policy.startswith("custom:") to the vendor-prefix check condition.
Describe the bug
Custom-named providers such as
custom:zenmuxare not recognized as multi-model aggregators in two places:1.
hermes_cli/providers.py—is_aggregator()The function only returns
Truefor providers registered inPROVIDER_REGISTRYthat haveis_aggregator=True. Custom-named providers likecustom:zenmuxfall through toget_provider()which returnsNonefor unknown slugs, sois_aggregator()returnsFalse.This breaks model-alias resolution for vendor-prefixed model IDs (e.g.
google/gemini-3.1-flash-lite) when the current provider iscustom:zenmux.2.
hermes_cli/doctor.py— vendor-prefix validationhermes doctorraises a false-positive warning:This is incorrect —
custom:zenmuxis an aggregator that accepts vendor-prefixed model slugs, just likeopenrouteror barecustom.Expected behavior
is_aggregator("custom:zenmux")should returnTruehermes doctorshould not warn about vendor-prefixed models whenmodel.provideriscustom:<name>Fix
hermes_cli/providers.py:hermes_cli/doctor.py— addnot provider_for_policy.startswith("custom:")to the vendor-prefix check condition.