# NousResearch/hermes-agent · Add native NVIDIA NIM provider support

## Open now

- Nothing open on GitHub.

These members propose adding native NVIDIA NIM as a supported provider or gateway. Multiple entries appear to be iterations or salvages of the same feature effort.

## 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 #11774. Verify it addresses your case.
- **Recommended:** read PR #11774 (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-11774`. 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

- #9106: \[Feature\]: Add NVIDIA NIMS gateway support

## Prior & competing PRs

- **#11774: feat(providers): native NVIDIA NIM provider (salvage of #11703)**. merged to main · fix tier `verified`
  - maintainer direction: category `merged`
  - files: `README.md`, `agent/model_metadata.py`, `cli-config.yaml.example`, `hermes_cli/auth.py`, `hermes_cli/config.py`, `hermes_cli/doctor.py`, `hermes_cli/dump.py`, `hermes_cli/main.py`, `hermes_cli/models.py`, `hermes_cli/providers.py`, `scripts/release.py`, `tests/hermes_cli/test_api_key_providers.py`, `tests/tools/test_local_env_blocklist.py`, `website/docs/getting-started/quickstart.md`, `website/docs/integrations/providers.md`, `website/docs/user-guide/features/fallback-providers.md`
  - fix hunks:
  - `README.md`

    ```diff
    @@ -13,7 +13,7 @@
     
     **The self-improving AI agent built by [Nous Research](https://nousresearch.com).** It's the only agent with a built-in learning loop — it creates skills from experience, improves them during use, nudges itself to persist knowledge, searches its own past conversations, and builds a deepening model of who you are across sessions. Run it on a $5 VPS, a GPU cluster, or serverless infrastructure that costs nearly nothing when idle. It's not tied to your laptop — talk to it from Telegram while it works on a cloud VM.
     
    -Use any model you want — [Nous Portal](https://portal.nousresearch.com), [OpenRouter](https://openrouter.ai) (200+ models), [Xiaomi MiMo](https://platform.xiaomimimo.com), [z.ai/GLM](https://z.ai), [Kimi/Moonshot](https://platform.moonshot.ai), [MiniMax](https://www.minimax.io), [Hugging Face](https://huggingface.co), OpenAI, or your own endpoint. Switch with `hermes model` — no code changes, no lock-in.
    +Use any model you want — [Nous Portal](https://portal.nousresearch.com), [OpenRouter](https://openrouter.ai) (200+ models), [NVIDIA NIM](https://build.nvidia.com) (Nemotron), [Xiaomi MiMo](https://platform.xiaomimimo.com), [z.ai/GLM](https://z.ai), [Kimi/Moonshot](https://platform.moonshot.ai), [MiniMax](https://www.minimax.io), [Hugging Face](https://huggingface.co), OpenAI, or your own endpoint. Switch with `hermes model` — no code changes, no lock-in.
     
     <table>
     <tr><td><b>A real terminal interface</b></td><td>Full TUI with multiline editing, slash-command autocomplete, conversation history, interrupt-and-redirect, and streaming tool output.</td></tr>
    ```
  - `agent/model_metadata.py`

    ```diff
    @@ -38,6 +38,7 @@
         "mimo", "xiaomi-mimo",
         "arcee-ai", "arceeai",
         "xai", "x-ai", "x.ai", "grok",
    +    "nvidia", "nim", "nvidia-nim", "nemotron",
         "qwen-portal",
     })
     
    ```

    ```diff
    @@ -158,6 +159,8 @@ def _strip_provider_prefix(model: str) -> str:
         "grok": 131072,             # catch-all (grok-beta, unknown grok-*)
         # Kimi
         "kimi": 262144,
    +    # Nemotron — NVIDIA's open-weights series (128K context across all sizes)
    +    "nemotron": 131072,
         # Arcee
         "trinity": 262144,
         # OpenRouter
    ```

    ```diff
    @@ -240,6 +243,7 @@ def _is_custom_endpoint(base_url: str) -> bool:
         "api.fireworks.ai": "fireworks",
         "opencode.ai": "opencode-go",
         "api.x.ai": "xai",
    +    "integrate.api.nvidia.com": "nvidia",
         "api.xiaomimimo.com": "xiaomi",
         "xiaomimimo.com": "xiaomi",
         "ollama.com": "ollama-cloud",
    ```
  - `cli-config.yaml.example`

    ```diff
    @@ -24,6 +24,7 @@ model:
       #   "minimax"      - MiniMax global (requires: MINIMAX_API_KEY)
       #   "minimax-cn"   - MiniMax China (requires: MINIMAX_CN_API_KEY)
       #   "huggingface"  - Hugging Face Inference (requires: HF_TOKEN)
    +  #   "nvidia"       - NVIDIA NIM / build.nvidia.com (requires: NVIDIA_API_KEY)
       #   "xiaomi"       - Xiaomi MiMo (requires: XIAOMI_API_KEY)
       #   "arcee"        - Arcee AI Trinity models (requires: ARCEEAI_API_KEY)
       #   "ollama-cloud" - Ollama Cloud (requires: OLLAMA_API_KEY — https://ollama.com/settings)
    ```
  - `hermes_cli/auth.py`

    ```diff
    @@ -233,6 +233,14 @@ class ProviderConfig:
             api_key_env_vars=("XAI_API_KEY",),
             base_url_env_var="XAI_BASE_URL",
         ),
    +    "nvidia": ProviderConfig(
    +        id="nvidia",
    +        name="NVIDIA NIM",
    +        auth_type="api_key",
    +        inference_base_url="https://integrate.api.nvidia.com/v1",
    +        api_key_env_vars=("NVIDIA_API_KEY",),
    +        base_url_env_var="NVIDIA_BASE_URL",
    +    ),
         "ai-gateway": ProviderConfig(
             id="ai-gateway",
             name="Vercel AI Gateway",
    ```
  - `hermes_cli/config.py`

    ```diff
    @@ -861,6 +861,22 @@ def _ensure_hermes_home_managed(home: Path):
             "category": "provider",
             "advanced": True,
         },
    +    "NVIDIA_API_KEY": {
    +        "description": "NVIDIA NIM API key (build.nvidia.com or local NIM endpoint)",
    +        "prompt": "NVIDIA NIM API key",
    +        "url": "https://build.nvidia.com/",
    +        "password": True,
    +        "category": "provider",
    +        "advanced": True,
    +    },
    +    "NVIDIA_BASE_URL": {
    +        "description": "NVIDIA NIM base URL override (e.g. http://localhost:8000/v1 for local NIM)",
    +        "prompt": "NVIDIA NIM base URL (leave empty for default)",
    +        "url": None,
    +        "password": [redacted:secret-assignment]
    +        "category": "provider",
    +        "advanced": True,
    +    },
         "GLM_API_KEY": {
             "description": "Z.AI / GLM API key (also recognized as ZAI_API_KEY / Z_AI_API_KEY)",
             "prompt": "Z.AI / GLM API key",
    ```
  - `hermes_cli/doctor.py`

    ```diff
    @@ -825,6 +825,7 @@ def run_doctor(args):
             ("Arcee AI",         ("ARCEEAI_API_KEY",),                            "https://api.arcee.ai/api/v1/models",  "ARCEE_BASE_URL", True),
             ("DeepSeek",         ("DEEPSEEK_API_KEY",),                           "https://api.deepseek.com/v1/models",  "DEEPSEEK_BASE_URL", True),
             ("Hugging Face",     ("HF_TOKEN",),                                   "https://router.huggingface.co/v1/models", "HF_BASE_URL", True),
    +        ("NVIDIA NIM",       ("NVIDIA_API_KEY",),                             "https://integrate.api.nvidia.com/v1/models", "NVIDIA_BASE_URL", True),
             ("Alibaba/DashScope", ("DASHSCOPE_API_KEY",),                         "https://dashscope-intl.aliyuncs.com/compatible-mode/v1/models", "DASHSCOPE_BASE_URL", True),
             # MiniMax: the /anthropic endpoint doesn't support /models, but the /v1 endpoint does.
             ("MiniMax",          ("MINIMAX_API_KEY",),                            "https://api.minimax.io/v1/models",    "MINIMAX_BASE_URL", True),
    ```
  - `hermes_cli/dump.py`

    ```diff
    @@ -296,6 +296,7 @@ def run_dump(args):
             ("DEEPSEEK_API_KEY", "deepseek"),
             ("DASHSCOPE_API_KEY", "dashscope"),
             ("HF_TOKEN", "huggingface"),
    +        ("NVIDIA_API_KEY", "nvidia"),
             ("AI_GATEWAY_API_KEY", "ai_gateway"),
             ("OPENCODE_ZEN_API_KEY", "opencode_zen"),
             ("OPENCODE_GO_API_KEY", "opencode_go"),
    ```
  - `hermes_cli/main.py`

    ```diff
    @@ -1143,7 +1143,7 @@ def _named_custom_provider_map(cfg) -> dict[str, dict[str, str]]:
             _model_flow_kimi(config, current_model)
         elif selected_provider == "bedrock":
             _model_flow_bedrock(config, current_model)
    -    elif selected_provider in ("gemini", "deepseek", "xai", "zai", "kimi-coding-cn", "minimax", "minimax-cn", "kilocode", "opencode-zen", "opencode-go", "ai-gateway", "alibaba", "huggingface", "xiaomi", "arcee", "ollama-cloud"):
    +    elif selected_provider in ("gemini", "deepseek", "xai", "zai", "kimi-coding-cn", "minimax", "minimax-cn", "kilocode", "opencode-zen", "opencode-go", "ai-gateway", "alibaba", "huggingface", "xiaomi", "arcee", "nvidia", "ollama-cloud"):
             _model_flow_api_key_provider(config, selected_provider, current_model)
     
         # ── Post-switch cleanup: clear stale OPENAI_BASE_URL ──────────────
    ```

    ```diff
    @@ -4954,7 +4954,7 @@ def main():
         )
         chat_parser.add_argument(
             "--provider",
    -        choices=["auto", "openrouter", "nous", "openai-codex", "copilot-acp", "copilot", "anthropic", "gemini", "xai", "ollama-cloud", "huggingface", "zai", "kimi-coding", "kimi-coding-cn", "minimax", "minimax-cn", "kilocode", "xiaomi", "arcee"],
    +        choices=["auto", "openrouter", "nous", "openai-codex", "copilot-acp", "copilot", "anthropic", "gemini", "xai", "ollama-cloud", "huggingface", "zai", "kimi-coding", "kimi-coding-cn", "minimax", "minimax-cn", "kilocode", "xiaomi", "arcee", "nvidia"],
             default=None,
             help="Inference provider (default: auto)"
         )
    ```
  - `hermes_cli/models.py`

    ```diff
    @@ -155,6 +155,20 @@ def _codex_curated_models() -> list[str]:
             "grok-4.20-reasoning",
             "grok-4-1-fast-reasoning",
         ],
    +    "nvidia": [
    +        # NVIDIA flagship reasoning models
    +        "nvidia/nemotron-3-super-120b-a12b",
    +        "nvidia/nemotron-3-nano-30b-a3b",
    +        "nvidia/llama-3.3-nemotron-super-49b-v1.5",
    +        # Third-party agentic models hosted on build.nvidia.com
    +        # (map to OpenRouter defaults — users get familiar picks on NIM)
    +        "qwen/qwen3.5-397b-a17b",
    +        "deepseek-ai/deepseek-v3.2",
    +        "moonshotai/kimi-k2.5",
    +        "minimaxai/minimax-m2.5",
    +        "z-ai/glm5",
    +        "openai/gpt-oss-120b",
    +    ],
         "kimi-coding": [
             "kimi-k2.5",
             "kimi-for-coding",
    ```

    ```diff
    @@ -536,6 +550,7 @@ class ProviderEntry(NamedTuple):
         ProviderEntry("anthropic",      "Anthropic",                "Anthropic (Claude models — API key or Claude Code)"),
         ProviderEntry("openai-codex",   "OpenAI Codex",             "OpenAI Codex"),
         ProviderEntry("xiaomi",         "Xiaomi MiMo",              "Xiaomi MiMo (MiMo-V2 models — pro, omni, flash)"),
    +    ProviderEntry("nvidia",         "NVIDIA NIM",               "NVIDIA NIM (Nemotron models — build.nvidia.com or local NIM)"),
         ProviderEntry("qwen-oauth",     "Qwen OAuth (Portal)",      "Qwen OAuth (reuses local Qwen CLI login)"),
         ProviderEntry("copilot",        "GitHub Copilot",           "GitHub Copilot (uses GITHUB_TOKEN or gh auth token)"),
         ProviderEntry("copilot-acp",    "GitHub Copilot ACP",       "GitHub Copilot ACP (spawns `copilot --acp --stdio`)"),
    ```

    ```diff
    @@ -618,6 +633,10 @@ class ProviderEntry(NamedTuple):
         "grok": "xai",
         "x-ai": "xai",
         "x.ai": "xai",
    +    "nim": "nvidia",
    +    "nvidia-nim": "nvidia",
    +    "build-nvidia": "nvidia",
    +    "nemotron": "nvidia",
         "ollama": "custom",  # bare "ollama" = local; use "ollama-cloud" for cloud
         "ollama_cloud": "ollama-cloud",
     }
    ```
  - `hermes_cli/providers.py`

    ```diff
    @@ -137,6 +137,11 @@ class HermesOverlay:
             base_url_override="https://api.x.ai/v1",
             base_url_env_var="XAI_BASE_URL",
         ),
    +    "nvidia": HermesOverlay(
    +        transport="openai_chat",
    +        base_url_override="https://integrate.api.nvidia.com/v1",
    +        base_url_env_var="NVIDIA_BASE_URL",
    +    ),
         "xiaomi": HermesOverlay(
             transport="openai_chat",
             base_url_env_var="XIAOMI_BASE_URL",
    ```

    ```diff
    @@ -191,6 +196,12 @@ class ProviderDef:
         "x.ai": "xai",
         "grok": "xai",
     
    +    # nvidia
    +    "nim": "nvidia",
    +    "nvidia-nim": "nvidia",
    +    "build-nvidia": "nvidia",
    +    "nemotron": "nvidia",
    +
         # kimi-for-coding (models.dev ID)
         "kimi": "kimi-for-coding",
         "kimi-coding": "kimi-for-coding",
    ```
  - `scripts/release.py`

    ```diff
    @@ -255,6 +255,7 @@
         "[redacted:email]": "anthhub",
         "[redacted:email]": "shenuu",
         "[redacted:email]": "xiayh0107",
    +    "[redacted:email]": "anniesurla",
     }
     
     
    ```
  - `tests/hermes_cli/test_api_key_providers.py`

    ```diff
    @@ -33,6 +33,7 @@ class TestProviderRegistry:
             ("huggingface", "Hugging Face", "api_key"),
             ("zai", "Z.AI / GLM", "api_key"),
             ("xai", "xAI", "api_key"),
    +        ("nvidia", "NVIDIA NIM", "api_key"),
             ("kimi-coding", "Kimi / Moonshot", "api_key"),
             ("minimax", "MiniMax", "api_key"),
             ("minimax-cn", "MiniMax (China)", "api_key"),
    ```

    ```diff
    @@ -57,6 +58,12 @@ def test_xai_env_vars(self):
             assert pconfig.base_url_env_var == "XAI_BASE_URL"
             assert pconfig.inference_base_url == "https://api.x.ai/v1"
     
    +    def test_nvidia_env_vars(self):
    +        pconfig = PROVIDER_REGISTRY["nvidia"]
    +        assert pconfig.api_key_env_vars == ("NVIDIA_API_KEY",)
    +        assert pconfig.base_url_env_var == "NVIDIA_BASE_URL"
    +        assert pconfig.inference_base_url == "https://integrate.api.nvidia.com/v1"
    +
         def test_copilot_env_vars(self):
             pconfig = PROVIDER_REGISTRY["copilot"]
             assert pconfig.api_key_env_vars == ("COPILOT_GITHUB_TOKEN", "GH_TOKEN", "GITHUB_TOKEN")
    ```
  - `tests/tools/test_local_env_blocklist.py`

    ```diff
    @@ -86,6 +86,7 @@ def test_registry_derived_vars_are_stripped(self):
                 "MINIMAX_API_KEY": "[redacted:secret-assignment]",
                 "MINIMAX_CN_API_KEY": "[redacted:secret-assignment]",
                 "DEEPSEEK_API_KEY": "[redacted:secret-assignment]",
    +            "NVIDIA_API_KEY": "[redacted:secret-assignment]",
             }
             result_env = _run_with_env(extra_os_env=registry_vars)
     
    ```
  - `website/docs/getting-started/quickstart.md`

    ```diff
    @@ -61,6 +61,7 @@ hermes setup       # Or configure everything at once
     | **OpenCode Zen** | Pay-as-you-go access to curated models | Set `OPENCODE_ZEN_API_KEY` |
     | **OpenCode Go** | $10/month subscription for open models | Set `OPENCODE_GO_API_KEY` |
     | **DeepSeek** | Direct DeepSeek API access | Set `DEEPSEEK_API_KEY` |
    +| **NVIDIA NIM** | Nemotron models via build.nvidia.com or local NIM | Set `NVIDIA_API_KEY` (optional: `NVIDIA_BASE_URL`) |
     | **GitHub Copilot** | GitHub Copilot subscription (GPT-5.x, Claude, Gemini, etc.) | OAuth via `hermes model`, or `COPILOT_GITHUB_TOKEN` / `GH_TOKEN` |
     | **GitHub Copilot ACP** | Copilot ACP agent backend (spawns local `copilot` CLI) | `hermes model` (requires `copilot` CLI + `copilot login`) |
     | **Vercel AI Gateway** | Vercel AI Gateway routing | Set `AI_GATEWAY_API_KEY` |
    ```
  - `website/docs/integrations/providers.md`

    ```diff
    @@ -295,6 +295,30 @@ When using xAI as a provider (any base URL containing `x.ai`), Hermes automatica
     
     No configuration is needed — caching activates automatically when an xAI endpoint is detected and a session ID is available. This reduces latency and cost for multi-turn conversations.
     
    +### NVIDIA NIM
    +
    +Nemotron and other open source models via [build.nvidia.com](https://build.nvidia.com) (free API key) or a local NIM endpoint.
    +
    +```bash
    +# Cloud (build.nvidia.com)
    +hermes chat --provider nvidia --model nvidia/nemotron-3-super-120b-a12b
    +# Requires: NVIDIA_API_KEY in ~/.hermes/.env
    +
    +# Local NIM endpoint — override base URL
    +NVIDIA_BASE_URL=http://localhost:8000/v1 hermes chat --provider nvidia --model nvidia/nemotron-3-super-120b-a12b
    +```
    +
    +Or set it permanently in `config.yaml`:
    +```yaml
    +model:
    +  provider: "nvidia"
    +  default: "nvidia/nemotron-3-super-120b-a12b"
    +```
    +
    +:::tip Local NIM
    +For on-prem deployments (DGX Spark, local GPU), set `NVIDIA_BASE_URL=http://localhost:8000/v1`. NIM exposes the same OpenAI-compatible chat completions API as build.nvidia.com, so switching between cloud and local is a one-line env-var change.
    +:::
    +
     ### Hugging Face Inference Providers
     
     [Hugging Face Inference Providers](https://huggingface.co/docs/inference-providers) routes to 20+ open models through a unified OpenAI-compatible endpoint (`router.huggingface.co/v1`). Requests are automatically routed to the fastest available backend (Groq, Together, SambaNova, etc.) with automatic failover.
    ```
  - `website/docs/user-guide/features/fallback-providers.md`

    ```diff
    @@ -47,6 +47,7 @@ Both `provider` and `model` are **required**. If either is missing, the fallback
     | MiniMax | `minimax` | `MINIMAX_API_KEY` |
     | MiniMax (China) | `minimax-cn` | `MINIMAX_CN_API_KEY` |
     | DeepSeek | `deepseek` | `DEEPSEEK_API_KEY` |
    +| NVIDIA NIM | `nvidia` | `NVIDIA_API_KEY` (optional: `NVIDIA_BASE_URL`) |
     | OpenCode Zen | `opencode-zen` | `OPENCODE_ZEN_API_KEY` |
     | OpenCode Go | `opencode-go` | `OPENCODE_GO_API_KEY` |
     | Kilo Code | `kilocode` | `KILOCODE_API_KEY` |
    ```
- **#11703: feat(providers): add native NVIDIA NIM provider**. closed without merge
  - maintainer direction: category `merged_via`; implication `superseded`; refs `#11774`, `#9106`

## Fix status

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