# NousResearch/hermes-agent · Ollama Cloud provider integration and model picker fixes

## Open now

- Nothing open on GitHub.

These issues and pull requests concern adding Ollama Cloud as a built-in provider and fixing bugs where the model picker showed zero models or displayed local models instead of cloud models.

## TL;DR

- 3 member(s): 0 open issue(s), 1 closed issue(s), 0 open PR(s), 1 merged PR(s), 1 PR(s) closed without merging.
- A fix was merged to main in PR #11066. Verify it addresses your case.
- **Recommended:** read PR #11066 (and any competing PRs below) before filing. Confirm the merged change covers your symptom.

## Maintainer resolution verdict

- Internal-tracker verdict over this cluster's issue members: `resolved` · deciding PR(s): `pr-11066`. This is distinct from the fix status above. Weigh it yourself.

## How this cluster was grouped

- Link evidence (`STRUCTURAL_SPANNING`): every member is connected by structural evidence: shared changed files, or a closing/superseded reference.
- Pairwise link density `0.67`: the share of member pairs that carry a link, counting a structural link in full and a relevance-only link at 0.36. `1.00` means every pair is linked.

## Closed / duplicate issues

- #10977: \[Bug\]: Ollama Cloud shows 0 models in /model TUI picker

## Prior & competing PRs

- **#11066: fix: wire Ollama Cloud into /model TUI picker (0 models regression)**. merged to main · fix tier `verified`
  - maintainer direction: category `merged`
  - files: `hermes_cli/model_switch.py`, `hermes_cli/models.py`, `tests/hermes_cli/test_ollama_cloud_provider.py`
  - fix hunks:
  - `hermes_cli/model_switch.py`

    ```diff
    @@ -807,6 +807,10 @@ def list_authenticated_providers(
         # "nous" shares OpenRouter's curated list if not separately defined
         if "nous" not in curated:
             curated["nous"] = curated["openrouter"]
    +    # Ollama Cloud uses dynamic discovery (no static curated list)
    +    if "ollama-cloud" not in curated:
    +        from hermes_cli.models import fetch_ollama_cloud_models
    +        curated["ollama-cloud"] = fetch_ollama_cloud_models()
     
         # --- 1. Check Hermes-mapped providers ---
         for hermes_id, mdev_id in PROVIDER_TO_MODELS_DEV.items():
    ```
  - `hermes_cli/models.py`

    ```diff
    @@ -1286,6 +1286,10 @@ def provider_model_ids(provider: Optional[str], *, force_refresh: bool = False)
             live = _fetch_ai_gateway_models()
             if live:
                 return live
    +    if normalized == "ollama-cloud":
    +        live = fetch_ollama_cloud_models(force_refresh=force_refresh)
    +        if live:
    +            return live
         if normalized == "custom":
             base_url = _get_custom_base_url()
             if base_url:
    ```
  - `tests/hermes_cli/test_ollama_cloud_provider.py`

    ```diff
    @@ -114,6 +114,65 @@ def test_provider_label(self):
             assert "ollama-cloud" in _PROVIDER_LABELS
             assert _PROVIDER_LABELS["ollama-cloud"] == "Ollama Cloud"
     
    +    def test_provider_model_ids_returns_dynamic_models(self, tmp_path, monkeypatch):
    +        """provider_model_ids('ollama-cloud') should call fetch_ollama_cloud_models()."""
    +        from hermes_cli.models import provider_model_ids
    +
    +        monkeypatch.setenv("HERMES_HOME", str(tmp_path))
    +        monkeypatch.setenv("OLLAMA_API_KEY", "test-key")
    +
    +        mock_mdev = {
    +            "ollama-cloud": {
    +                "models": {
    +                    "qwen3.5:397b": {"tool_call": True},
    +                    "glm-5": {"tool_call": True},
    +                }
    +            }
    +        }
    +        with patch("hermes_cli.models.fetch_api_models", return_value=["qwen3.5:397b"]), \
    +             patch("agent.models_dev.fetch_models_dev", return_value=mock_mdev):
    +            result = provider_model_ids("ollama-cloud", force_refresh=True)
    +
    +        assert len(result) > 0
    +        assert "qwen3.5:397b" in result
    +
    +
    +# ── Model Picker (list_authenticated_providers) ──
    +
    +class TestOllamaCloudModelPicker:
    +    def test_ollama_cloud_shows_model_count(self, tmp_path, monkeypatch):
    +        """Ollama Cloud should show non-zero model count in provider picker."""
    +        from hermes_cli.model_switch import list_authenticated_providers
    +
    +        monkeypatch.setenv("HERMES_HOME", str(tmp_path))
    +        monkeypatch.setenv("OLLAMA_API_KEY", "test-key")
    +
    +        mock_mdev = {
    +            "ollama-cloud": {
    +                "models": {
    +                    "qwen3.5:397b": {"tool_call": True},
    +                    "glm-5": {"tool_call": True},
    +                }
    +            }
    +        }
    +        with patch("hermes_cli.models.fetch_api_models", return_value=["qwen3.5:397b"]), \
    +             patch("agent.models_dev.fetch_models_dev", return_value=mock_mdev):
    +            providers = list_authenticated_providers(current_provider="ollama-cloud")
    +
    +        ollama = next((p for p in providers if p["slug"] == "ollama-cloud"), None)
    +        assert ollama is not None, "ollama-cloud should appear when OLLAMA_API_KEY is set"
    +        assert ollama["total_models"] > 0, "ollama-cloud should show non-zero model count"
    +
    +    def test_ollama_cloud_not_shown_without_creds(self, monkeypatch):
    +        """Ollama Cloud should not appear without credentials."""
    +        from hermes_cli.model_switch import list_authenticated_providers
    +
    +        monkeypatch.delenv("OLLAMA_API_KEY", raising=False)
    +
    +        providers = list_authenticated_providers(current_provider="openrouter")
    +        ollama = next((p for p in providers if p["slug"] == "ollama-cloud"), None)
    +        assert ollama is None, "ollama-cloud should not appear without OLLAMA_API_KEY"
    +
     
     # ── Merged Model Discovery ──
     
    ```
- **#10964: fix: Ollama Cloud shows 0 models in /model TUI picker**. closed without merge
  - maintainer direction: category `implemented_elsewhere`; implication `superseded`; refs `5b4773fc20e844e784d1b710adaa0cfcc5e14d87`, `#11066`, `#10977`

## Fix status

- Merged to main in PR #11066 (cited above). No release data is tracked. Verify downstream.
- Fix last verified (merged) `2026-04-16`. This confirmation is old and may be out of date (a revert/reopen would not have invalidated it here); re-verify.
