hermes - ✅(Solved) Fix Bug: Model Picker ignores model_catalog.enabled=false [4 pull requests, 1 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
NousResearch/hermes-agent#16970Fetched 2026-04-29 06:38:04
View on GitHub
Comments
0
Participants
1
Timeline
8
Reactions
0
Author
Participants
Timeline (top)
cross-referenced ×4labeled ×4

When model_catalog.enabled: false is set in config.yaml, the Model Picker (/model command) should only show custom providers defined in custom_providers, but instead it shows both built-in providers (that have credentials) and custom providers.

Root Cause

In hermes_cli/model_switch.py, the list_authenticated_providers() function:

  1. Does NOT read model_catalog.enabled from config
  2. Does NOT filter built-in providers based on model_catalog.providers blacklist

The model_catalog config (defined in hermes_cli/model_catalog.py) is only used for remote catalog fetching, NOT for filtering the provider picker.

Fix Action

Workaround

Remove the triggering env vars (e.g., DASHSCOPE_API_KEY, DASHSCOPE_BASE_URL) from .env to prevent built-in providers from appearing.


Related skill documentation suggests using unique provider names (e.g., my-dashscope instead of dashscope) to avoid collisions, but the env var detection still triggers built-in providers regardless of naming.

PR fix notes

PR #16975: fix(cli): respect model_catalog filtering in /model picker

Description (problem / solution / changelog)

Summary

  • make /model respect model_catalog.enabled and per-provider catalog filtering when enumerating built-in providers
  • keep custom providers visible when the built-in catalog is disabled
  • add regression coverage for the model_catalog.enabled: false case

Root cause

list_authenticated_providers() read credential sources for built-in providers from PROVIDER_TO_MODELS_DEV, HERMES_OVERLAYS, and CANONICAL_PROVIDERS, but it never loaded the model_catalog config block. As a result, /model still listed authenticated built-in providers even when model_catalog.enabled: false was meant to hide them.

Fix

  • load model_catalog config inside list_authenticated_providers()
  • add a small helper that blocks built-in provider rows when the catalog is disabled or an individual provider is disabled in model_catalog.providers
  • apply that filter consistently across the models.dev-mapped, Hermes overlay, and canonical-provider enumeration paths

Regression coverage

  • add a test that sets DASHSCOPE_API_KEY, disables model_catalog, and verifies /model only returns the configured custom provider row

Testing

  • scripts/run_tests.sh tests/hermes_cli/test_model_switch_custom_providers.py -k model_catalog_disabled
  • scripts/run_tests.sh tests/hermes_cli/test_model_switch_custom_providers.py tests/hermes_cli/test_opencode_go_in_model_list.py

Closes #16970

Changed files

  • hermes_cli/model_switch.py (modified, +18/-0)
  • tests/hermes_cli/test_model_switch_custom_providers.py (modified, +42/-0)

PR #2: fix: resolve 7 identified issues [automated]

Description (problem / solution / changelog)

Summary

This PR resolves 7 identified issues in the Hermes Agent codebase.

Issues Fixed

1. #17076 - kimi-coding vision broken (HTTP 404)

File: agent/auxiliary_client.py Problem: The kimi-coding provider was missing from _PROVIDER_VISION_MODELS, causing the vision auto-detect to fail with HTTP 404 when using image inputs. Fix: Added kimi-coding and kimi-coding-cn to _PROVIDER_VISION_MODELS dict. Commit: 82b920ff

2. #16970 - Model Picker ignores model_catalog.enabled=false

File: hermes_cli/model_switch.py Problem: The list_authenticated_providers() function ignored model_catalog.enabled=false config, showing built-in providers even when the catalog was disabled. Fix: Added catalog_enabled check that skips sections 1-3 (built-in provider enumeration) when model_catalog.enabled=false. Commit: b6b6fbbe

3. #16830 - Credential pool rotation counts toward api_max_retries

File: run_agent.py Problem: When a credential pool rotation occurred, retry_count was not reset, causing premature exhaustion of retries. Fix: Reset retry_count = 0 when _recover_with_credential_pool() succeeds. Commit: 366582d4

4. #16979 - QQ Bot file attachments silently dropped on download failure

File: gateway/platforms/qqbot/adapter.py Problem: When CDN download failed for file attachments, they were silently discarded with no indication to the agent. Fix: Added fallback text (download failed) to attachment_info when download fails. Commit: f956da73

5. #16875 - kimi-k2.6 HTTP 400 via OpenCode Go

Files: hermes_cli/setup.py, hermes_cli/models.py Problem: kimi-k2.6 was listed as an available model for opencode-go provider but returns HTTP 400 on all requests. Fix: Removed kimi-k2.6 from the opencode-go model list in both files. Commit: 5a77400d

6. #16951 - WeChat clips right-side content when scrolling Markdown tables

File: gateway/platforms/weixin.py Problem: WeChat's WebView CSS clips tables with many columns, making rightmost columns invisible. Fix: Added _truncate_wide_table_row() helper that limits table rows to 6 columns and appends ... for overflow indication. Commit: d3e43e10

7. #17009 - Termux hermes update fails with "Failed to determine Android API level"

File: hermes_cli/main.py Problem: Native extension builds (maturin) fail in Termux because ANDROID_API_LEVEL is not set. Fix: In _install_python_dependencies_with_optional_fallback(), detect Termux environment and set ANDROID_API_LEVEL=29 as a safe default. Commit: 096a80b9

Files Modified

  • agent/auxiliary_client.py (1 change)
  • hermes_cli/model_switch.py (1 change)
  • run_agent.py (1 change)
  • gateway/platforms/qqbot/adapter.py (1 change)
  • hermes_cli/setup.py (1 change)
  • hermes_cli/models.py (1 change)
  • gateway/platforms/weixin.py (2 changes)
  • hermes_cli/main.py (1 change)

Testing

All changes were validated with python3 -m py_compile to ensure no syntax errors.

Changed files

  • .gitignore (modified, +1/-0)
  • AGENTS.md (modified, +1/-1)
  • Dockerfile (modified, +6/-2)
  • acp_adapter/entry.py (modified, +11/-0)
  • acp_adapter/server.py (modified, +28/-1)
  • agent/anthropic_adapter.py (modified, +155/-78)
  • agent/auxiliary_client.py (modified, +342/-55)
  • agent/bedrock_adapter.py (modified, +41/-3)
  • agent/context_compressor.py (modified, +113/-5)
  • agent/credential_pool.py (modified, +82/-4)
  • agent/credential_sources.py (modified, +0/-1)
  • agent/error_classifier.py (modified, +32/-0)
  • agent/gemini_cloudcode_adapter.py (modified, +0/-2)
  • agent/gemini_schema.py (modified, +1/-1)
  • agent/google_code_assist.py (modified, +0/-1)
  • agent/google_oauth.py (modified, +3/-3)
  • agent/image_routing.py (added, +236/-0)
  • agent/memory_manager.py (modified, +113/-5)
  • agent/model_metadata.py (modified, +56/-21)
  • agent/nous_rate_guard.py (modified, +144/-1)
  • agent/onboarding.py (added, +191/-0)
  • agent/prompt_builder.py (modified, +38/-0)
  • agent/redact.py (modified, +7/-3)
  • agent/shell_hooks.py (modified, +7/-2)
  • agent/skill_commands.py (modified, +2/-2)
  • agent/title_generator.py (modified, +39/-5)
  • agent/transports/anthropic.py (modified, +1/-7)
  • agent/transports/chat_completions.py (modified, +74/-0)
  • agent/transports/codex.py (modified, +1/-3)
  • cli-config.yaml.example (modified, +28/-8)
  • cli.py (modified, +527/-196)
  • cron/jobs.py (modified, +34/-5)
  • cron/scheduler.py (modified, +39/-5)
  • docker/entrypoint.sh (modified, +9/-7)
  • flake.nix (modified, +1/-0)
  • gateway/builtin_hooks/boot_md.py (removed, +0/-85)
  • gateway/channel_directory.py (modified, +67/-14)
  • gateway/config.py (modified, +84/-3)
  • gateway/display_config.py (modified, +3/-1)
  • gateway/hooks.py (modified, +7/-13)
  • gateway/mirror.py (modified, +57/-11)
  • gateway/pairing.py (modified, +2/-1)
  • gateway/platforms/__init__.py (modified, +2/-0)
  • gateway/platforms/base.py (modified, +233/-16)
  • gateway/platforms/discord.py (modified, +18/-24)
  • gateway/platforms/email.py (modified, +3/-0)
  • gateway/platforms/feishu_comment.py (modified, +0/-1)
  • gateway/platforms/helpers.py (modified, +11/-2)
  • gateway/platforms/matrix.py (modified, +493/-47)
  • gateway/platforms/mattermost.py (modified, +0/-1)
  • gateway/platforms/qqbot/adapter.py (modified, +7/-7)
  • gateway/platforms/slack.py (modified, +753/-70)
  • gateway/platforms/telegram.py (modified, +138/-14)
  • gateway/platforms/weixin.py (modified, +47/-3)
  • gateway/platforms/yuanbao.py (added, +4754/-0)
  • gateway/platforms/yuanbao_media.py (added, +645/-0)
  • gateway/platforms/yuanbao_proto.py (added, +1209/-0)
  • gateway/platforms/yuanbao_sticker.py (added, +558/-0)
  • gateway/run.py (modified, +1139/-279)
  • gateway/runtime_footer.py (added, +150/-0)
  • gateway/session.py (modified, +16/-21)
  • gateway/stream_consumer.py (modified, +110/-0)
  • gateway/whatsapp_identity.py (modified, +21/-1)
  • hermes_cli/auth.py (modified, +40/-4)
  • hermes_cli/azure_detect.py (modified, +1/-1)
  • hermes_cli/backup.py (modified, +272/-1)
  • hermes_cli/banner.py (modified, +0/-1)
  • hermes_cli/claw.py (modified, +67/-6)
  • hermes_cli/commands.py (modified, +116/-5)
  • hermes_cli/config.py (modified, +322/-29)
  • hermes_cli/debug.py (modified, +13/-7)
  • hermes_cli/dingtalk_auth.py (modified, +0/-1)
  • hermes_cli/doctor.py (modified, +11/-1)
  • hermes_cli/env_loader.py (modified, +2/-1)
  • hermes_cli/fallback_cmd.py (added, +361/-0)
  • hermes_cli/gateway.py (modified, +25/-4)
  • hermes_cli/hooks.py (modified, +1/-2)
  • hermes_cli/main.py (modified, +689/-58)
  • hermes_cli/model_catalog.py (added, +329/-0)
  • hermes_cli/model_switch.py (modified, +366/-306)
  • hermes_cli/models.py (modified, +251/-44)
  • hermes_cli/nous_subscription.py (modified, +16/-8)
  • hermes_cli/oneshot.py (modified, +28/-11)
  • hermes_cli/platforms.py (modified, +1/-0)
  • hermes_cli/plugins.py (modified, +14/-0)
  • hermes_cli/plugins_cmd.py (modified, +0/-1)
  • hermes_cli/profiles.py (modified, +58/-2)
  • hermes_cli/providers.py (modified, +26/-0)
  • hermes_cli/runtime_provider.py (modified, +100/-14)
  • hermes_cli/setup.py (modified, +70/-17)
  • hermes_cli/skills_hub.py (modified, +230/-20)
  • hermes_cli/slack_cli.py (added, +152/-0)
  • hermes_cli/status.py (modified, +3/-2)
  • hermes_cli/timeouts.py (modified, +4/-4)
  • hermes_cli/tips.py (modified, +2/-4)
  • hermes_cli/tools_config.py (modified, +173/-4)
  • hermes_cli/web_server.py (modified, +11/-14)
  • hermes_cli/webhook.py (modified, +2/-2)
  • hermes_logging.py (modified, +3/-4)
  • hermes_state.py (modified, +578/-164)

PR #17108: fix: resolve 7 identified issues [automated]

Description (problem / solution / changelog)

Summary

This PR resolves 7 identified issues in the Hermes Agent codebase. All issues were identified from open GitHub issues in NousResearch/hermes-agent.

Issues Fixed

1. #17076 - kimi-coding vision broken (HTTP 404)

File: agent/auxiliary_client.py Problem: The kimi-coding provider was missing from _PROVIDER_VISION_MODELS, causing the vision auto-detect to fail with HTTP 404 when using image inputs. Fix: Added kimi-coding and kimi-coding-cn to _PROVIDER_VISION_MODELS dict. Commit: 82b920ff

2. #16970 - Model Picker ignores model_catalog.enabled=false

File: hermes_cli/model_switch.py Problem: The list_authenticated_providers() function ignored model_catalog.enabled=false config, showing built-in providers even when the catalog was disabled. Fix: Added catalog_enabled check that skips sections 1-3 (built-in provider enumeration) when model_catalog.enabled=false. Commit: b6b6fbbe

3. #16830 - Credential pool rotation counts toward api_max_retries

File: run_agent.py Problem: When a credential pool rotation occurred, retry_count was not reset, causing premature exhaustion of retries. Fix: Reset retry_count = 0 when _recover_with_credential_pool() succeeds. Commit: 366582d4

4. #16979 - QQ Bot file attachments silently dropped on download failure

File: gateway/platforms/qqbot/adapter.py Problem: When CDN download failed for file attachments, they were silently discarded with no indication to the agent. Fix: Added fallback text (download failed) to attachment_info when download fails. Commit: f956da73

5. #16875 - kimi-k2.6 HTTP 400 via OpenCode Go

Files: hermes_cli/setup.py, hermes_cli/models.py Problem: kimi-k2.6 was listed as an available model for opencode-go provider but returns HTTP 400 on all requests. Fix: Removed kimi-k2.6 from the opencode-go model list in both files. Commit: 5a77400d

6. #16951 - WeChat clips right-side content when scrolling Markdown tables

File: gateway/platforms/weixin.py Problem: WeChat's WebView CSS clips tables with many columns, making rightmost columns invisible. Fix: Added _truncate_wide_table_row() helper that limits table rows to 6 columns and appends ... for overflow indication. Commit: d3e43e10

7. #17009 - Termux hermes update fails with "Failed to determine Android API level"

File: hermes_cli/main.py Problem: Native extension builds (maturin) fail in Termux because ANDROID_API_LEVEL is not set. Fix: In _install_python_dependencies_with_optional_fallback(), detect Termux environment and set ANDROID_API_LEVEL=29 as a safe default. Commit: 096a80b9

Files Modified

  • agent/auxiliary_client.py
  • hermes_cli/model_switch.py
  • run_agent.py
  • gateway/platforms/qqbot/adapter.py
  • hermes_cli/setup.py
  • hermes_cli/models.py
  • gateway/platforms/weixin.py
  • hermes_cli/main.py

Commits (7 total)

  • 82b920ff - fix(vision): add kimi-coding provider to _PROVIDER_VISION_MODELS
  • b6b6fbbe - fix(model_picker): respect model_catalog.enabled=false config
  • 366582d4 - fix(credential_pool): reset retry_count on credential rotation
  • f956da73 - fix(qqbot): add fallback text when attachment download fails
  • 5a77400d - fix(setup): remove kimi-k2.6 from opencode-go model list
  • d3e43e10 - fix(weixin): truncate wide tables to prevent viewport clipping
  • 096a80b9 - fix(termux): set ANDROID_API_LEVEL default during update

Changed files

  • agent/auxiliary_client.py (modified, +4/-0)
  • gateway/platforms/qqbot/adapter.py (modified, +5/-0)
  • gateway/platforms/weixin.py (modified, +21/-0)
  • hermes_cli/main.py (modified, +9/-0)
  • hermes_cli/model_switch.py (modified, +355/-344)
  • hermes_cli/models.py (modified, +0/-1)
  • hermes_cli/setup.py (modified, +1/-1)
  • run_agent.py (modified, +1/-0)

PR #17218: fix(model_switch): honor model_catalog.enabled=false in /model picker (#16970)

Description (problem / solution / changelog)

What does this PR do?

When users set model_catalog.enabled: false in config.yaml, they have explicitly opted out of the curated/models.dev catalog and only want their own providers: and custom_providers: entries to surface in the /model picker (#16970). list_authenticated_providers() was ignoring that flag and still walked PROVIDER_TO_MODELS_DEV, HERMES_OVERLAYS, and CANONICAL_PROVIDERS whenever credentials were present in the environment or auth store, so the picker showed the built-in row alongside the user's custom one whenever both pointed at the same endpoint family (e.g. DashScope/Alibaba reusing OpenAI-compatible relays). This defeats the entire point of the disable flag.

The minimal fix reads model_catalog.enabled from hermes_cli.model_catalog._load_catalog_config() inside the function and gates sections 1, 2, and 2b on it. Sections 3 and 4 (user-defined providers: and custom_providers:) are catalog-independent and continue to run unconditionally so the picker still has results to render. Also skips the fetch_models_dev() network call in the disabled path — when the catalog is off there is nothing to look up.

Related Issue

Fixes #16970

Type of Change

  • 🐛 Bug fix (non-breaking change that fixes an issue)
  • ✨ New feature (non-breaking change that adds functionality)
  • 🔒 Security fix
  • 📝 Documentation update
  • ✅ Tests (adding or improving test coverage)
  • ♻️ Refactor (no behavior change)
  • 🎯 New skill (bundled or hub)

Changes Made

  • hermes_cli/model_switch.pylist_authenticated_providers() reads model_catalog.enabled once at the top, defaults to True on any import/parse error (no behavior change for the typical case), and wraps each catalog-driven section in if catalog_enabled via empty-tuple iteration so the surrounding logging/order is preserved without restructuring the function body.
  • tests/hermes_cli/test_user_providers_model_switch.py — two new cases covering the issue's exact reproducer: enabled=false hides built-in/hermes/canonical sources, and enabled=true keeps them visible (locks in that the gate is opt-in only).

How to Test

  1. Configure a built-in provider — e.g. set OPENAI_API_KEY in the environment.
  2. Add a custom provider in config.yaml whose endpoint overlaps with the built-in:
    model_catalog:
      enabled: false
    custom_providers:
      - name: my-dashscope
        base_url: https://coding-intl.dashscope.aliyuncs.com/v1
        api_key: sk-sp-...
        model: qwen3.6-plus
  3. Open the picker via /model (or call list_authenticated_providers() directly).
  4. Before this fix: picker shows both the built-in OpenAI row and my-dashscope.
  5. After this fix: only my-dashscope appears.

Automated:

pytest tests/hermes_cli/ -q -k "model_switch or model_catalog or model_picker or overlay_slug"

Result on macOS 15.6 / Python 3.14: 147 passed. The two new tests fail on origin/main without the fix, confirming they exercise the regression path.

Checklist

Code

  • I've read the Contributing Guide
  • My commit messages follow Conventional Commits (fix(scope):, feat(scope):, etc.)
  • I searched for existing PRs to make sure this isn't a duplicate
  • My PR contains only changes related to this fix/feature (no unrelated commits)
  • I've run pytest tests/hermes_cli/ -q -k "model_switch or model_catalog or model_picker or overlay_slug" (147 passed). Full pytest tests/ -q not run; touched module surface is fully exercised by the picker/catalog-related selection above.
  • I've added tests for my changes (required for bug fixes, strongly encouraged for features)
  • I've tested on my platform: macOS 15.6 (Python 3.14)

Documentation & Housekeeping

  • I've updated relevant documentation (README, docs/, docstrings) — or N/A (N/A — behaviour-only fix; the function's docstring already references the four-section structure that is being gated)
  • I've updated cli-config.yaml.example if I added/changed config keys — or N/A (N/A — model_catalog.enabled already exists; this PR only honors it in one more code path)
  • I've updated CONTRIBUTING.md or AGENTS.md if I changed architecture or workflows — or N/A (N/A)
  • I've considered cross-platform impact (Windows, macOS) per the compatibility guide — or N/A (N/A — pure Python config read; no platform-specific syscalls)
  • I've updated tool descriptions/schemas if I changed tool behavior — or N/A (N/A — CLI helper, not a tool)

Screenshots / Logs

$ pytest tests/hermes_cli/ -q -k "model_switch or model_catalog or model_picker or overlay_slug"
...
147 passed, 157 warnings in 23.07s

Without the fix, the two new tests fail because both built-in (openai) and hermes-source rows leak into the picker even when model_catalog.enabled=false:

AssertionError: Expected only user-defined sources when catalog disabled, got: ['built-in', 'hermes', 'user-config']

Changed files

  • hermes_cli/model_switch.py (modified, +16/-4)
  • tests/hermes_cli/test_user_providers_model_switch.py (modified, +95/-0)

Code Example

model_catalog:
  enabled: false

custom_providers:
- name: my-dashscope
  base_url: https://coding-intl.dashscope.aliyuncs.com/v1
  api_key: sk-sp-...
  model: qwen3.6-plus
  models:
    qwen3.6-plus: { context_length: 500000 }
    kimi-k2.5: { context_length: 262144 }
    glm-5: { context_length: 202700 }
    MiniMax-M2.5: { context_length: 196608 }

model:
  default: kimi-k2.5
  provider: my-dashscope

---

# In list_authenticated_providers() around line 1000
from hermes_cli.model_catalog import _load_catalog_config
catalog_cfg = _load_catalog_config()

# Skip built-in providers if catalog is disabled
if not catalog_cfg["enabled"]:
    # Only process section 4 (custom_providers)
    # Skip sections 1-3 that enumerate built-in providers
    ...

# Or filter individual providers based on blacklist
provider_blacklist = catalog_cfg.get("providers", {})
for hermes_id, mdev_id in PROVIDER_TO_MODELS_DEV.items():
    if provider_blacklist.get(hermes_id, False) is False:
        continue  # Skip this built-in provider
    ...
RAW_BUFFERClick to expand / collapse

Bug: Model Picker (/model) ignores model_catalog.enabled: false and shows built-in providers alongside custom providers

Description

When model_catalog.enabled: false is set in config.yaml, the Model Picker (/model command) should only show custom providers defined in custom_providers, but instead it shows both built-in providers (that have credentials) and custom providers.

Expected Behavior

With model_catalog.enabled: false, the /model picker should:

  • Hide all built-in/providers from the models.dev catalog
  • Only show user-defined custom_providers entries

Actual Behavior

The list_authenticated_providers() function in hermes_cli/model_switch.py does NOT check the model_catalog.enabled config setting. It always iterates through:

  • Section 1-3: Built-in providers from PROVIDER_TO_MODELS_DEV, HERMES_OVERLAYS, and CANONICAL_PROVIDERS
  • Section 4: Custom providers from custom_providers config

This causes confusion when users define custom providers for endpoints that overlap with built-in providers (e.g., DashScope/Alibaba).

Example Config

model_catalog:
  enabled: false

custom_providers:
- name: my-dashscope
  base_url: https://coding-intl.dashscope.aliyuncs.com/v1
  api_key: sk-sp-...
  model: qwen3.6-plus
  models:
    qwen3.6-plus: { context_length: 500000 }
    kimi-k2.5: { context_length: 262144 }
    glm-5: { context_length: 202700 }
    MiniMax-M2.5: { context_length: 196608 }

model:
  default: kimi-k2.5
  provider: my-dashscope

With DASHSCOPE_API_KEY in .env, the /model picker shows BOTH:

  • Built-in "Alibaba/DashScope" provider (from DASHSCOPE_API_KEY env var)
  • Custom "my-dashscope" provider (from custom_providers config)

Root Cause

In hermes_cli/model_switch.py, the list_authenticated_providers() function:

  1. Does NOT read model_catalog.enabled from config
  2. Does NOT filter built-in providers based on model_catalog.providers blacklist

The model_catalog config (defined in hermes_cli/model_catalog.py) is only used for remote catalog fetching, NOT for filtering the provider picker.

Proposed Fix

Add a check in list_authenticated_providers() to respect model_catalog.enabled and model_catalog.providers settings:

# In list_authenticated_providers() around line 1000
from hermes_cli.model_catalog import _load_catalog_config
catalog_cfg = _load_catalog_config()

# Skip built-in providers if catalog is disabled
if not catalog_cfg["enabled"]:
    # Only process section 4 (custom_providers)
    # Skip sections 1-3 that enumerate built-in providers
    ...

# Or filter individual providers based on blacklist
provider_blacklist = catalog_cfg.get("providers", {})
for hermes_id, mdev_id in PROVIDER_TO_MODELS_DEV.items():
    if provider_blacklist.get(hermes_id, False) is False:
        continue  # Skip this built-in provider
    ...

Environment

  • Hermes version: ef41d3bd (main branch)
  • Config: model_catalog.enabled: false
  • Env vars: DASHSCOPE_API_KEY present (triggering built-in Alibaba provider)

Workaround

Remove the triggering env vars (e.g., DASHSCOPE_API_KEY, DASHSCOPE_BASE_URL) from .env to prevent built-in providers from appearing.


Related skill documentation suggests using unique provider names (e.g., my-dashscope instead of dashscope) to avoid collisions, but the env var detection still triggers built-in providers regardless of naming.

extent analysis

TL;DR

To fix the issue, modify the list_authenticated_providers() function in hermes_cli/model_switch.py to respect the model_catalog.enabled setting and filter out built-in providers when it's set to false.

Guidance

  • Check the model_catalog.enabled config setting in list_authenticated_providers() to determine whether to show built-in providers.
  • If model_catalog.enabled is false, skip sections 1-3 that enumerate built-in providers and only process section 4 (custom providers).
  • Consider filtering individual providers based on a blacklist defined in model_catalog.providers.
  • As a temporary workaround, remove triggering env vars (e.g., DASHSCOPE_API_KEY) from .env to prevent built-in providers from appearing.

Example

# In list_authenticated_providers() around line 1000
from hermes_cli.model_catalog import _load_catalog_config
catalog_cfg = _load_catalog_config()

if not catalog_cfg["enabled"]:
    # Only process section 4 (custom_providers)
    # Skip sections 1-3 that enumerate built-in providers
    pass

Notes

The proposed fix requires modifying the hermes_cli/model_switch.py file, which may have implications for future updates or compatibility. Additionally, the workaround of removing env vars may not be suitable for all use cases.

Recommendation

Apply the proposed fix to modify the list_authenticated_providers() function, as it directly addresses the issue and provides a more robust solution than the workaround.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING