NousResearch/hermes-agent

Add native NVIDIA NIM provider support

Cluster 9106. Data as of

Nothing open on GitHub. Fix merged in #11774 on 17 Apr 2026. Check it covers your case.

The short answer

0open issues
0open PRs
3items grouped
Known?
Yes. 3 related items grouped here, 1 issue already closed.
Fix event
A fix was merged to main in PR #11774. Check it covers your case. No release data is tracked.
Tracker
The maintainers' tracker marks this resolved, deciding PR #11774. That is separate from the fix event.
Still open
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.

Open issues0

No open issues.

Open PRs0

No open pull requests.

Fixes on record

Merged to main. A stamp counts the issues a fix is linked to.

  • #11774 feat(providers): native NVIDIA NIM provider (salvage of #11703)

    merged to main

    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

    Show the diff
    • README.md
      @@ -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
      @@ -38,6 +38,7 @@
           "mimo", "xiaomi-mimo",
           "arcee-ai", "arceeai",
           "xai", "x-ai", "x.ai", "grok",
      +    "nvidia", "nim", "nvidia-nim", "nemotron",
           "qwen-portal",
       })
       
      @@ -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
      @@ -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
      @@ -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
      @@ -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
      @@ -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
      @@ -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
      @@ -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
      @@ -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 ──────────────
      @@ -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
      @@ -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",
      @@ -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`)"),
      @@ -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
      @@ -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",
      @@ -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
      @@ -255,6 +255,7 @@
           "[redacted:email]": "anthhub",
           "[redacted:email]": "shenuu",
           "[redacted:email]": "xiayh0107",
      +    "[redacted:email]": "anniesurla",
       }
       
       
    • tests/hermes_cli/test_api_key_providers.py
      @@ -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"),
      @@ -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
      @@ -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
      @@ -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
      @@ -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
      @@ -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` |

1 PR closed without merging

From the close comments: merged via another change 1

  • #11703 feat(providers): add native NVIDIA NIM provider · merged via another change → #11774, #9106
Closed issues · 1
  • Closed#9106[Feature]: Add NVIDIA NIMS gateway support
How this cluster was grouped
  • Link evidence (structural links throughout): every member is connected by structural evidence: shared changed files, or a closing/superseded reference.
  • Pairwise link density 0.67: the share of item 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.

Pick up a Lab task

Check whether a fix covers the open issues here, with your own agent. Bring back evidence for maintainers.

Open the Lab

At a glance

Merged PRs
#11774
Closed issues
1
Attempts
1 PR closed without merging
Fix link checked
17 Apr 2026. This confirmation is old and may be out of date (a revert or reopen would not have invalidated it here); re-verify.

For your agent

The same facts, typed.