diff --git a/README.md b/README.md
index 07a1404190254..088c3b91b92b1 100644
--- a/README.md
+++ b/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.
| A real terminal interface | Full TUI with multiline editing, slash-command autocomplete, conversation history, interrupt-and-redirect, and streaming tool output. |
diff --git a/agent/model_metadata.py b/agent/model_metadata.py
index 089fd132aced2..b30af6e48e533 100644
--- a/agent/model_metadata.py
+++ b/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",
diff --git a/cli-config.yaml.example b/cli-config.yaml.example
index 8c0484abd01dd..20b54b7887ba2 100644
--- a/cli-config.yaml.example
+++ b/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)
diff --git a/hermes_cli/auth.py b/hermes_cli/auth.py
index e79a6dca6d88c..421836c23cbe8 100644
--- a/hermes_cli/auth.py
+++ b/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",
diff --git a/hermes_cli/config.py b/hermes_cli/config.py
index c7df033701498..f08e292660c40 100644
--- a/hermes_cli/config.py
+++ b/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": False,
+ "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",
diff --git a/hermes_cli/doctor.py b/hermes_cli/doctor.py
index d044ddf4cff64..28c4af1fa8aff 100644
--- a/hermes_cli/doctor.py
+++ b/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),
diff --git a/hermes_cli/dump.py b/hermes_cli/dump.py
index a5207908578ae..ae8ecc6419533 100644
--- a/hermes_cli/dump.py
+++ b/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"),
diff --git a/hermes_cli/main.py b/hermes_cli/main.py
index 53f59a210f1d2..10597db15d5e5 100644
--- a/hermes_cli/main.py
+++ b/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)"
)
diff --git a/hermes_cli/models.py b/hermes_cli/models.py
index 5b998ddc661f4..7a897cb79eacf 100644
--- a/hermes_cli/models.py
+++ b/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",
}
diff --git a/hermes_cli/providers.py b/hermes_cli/providers.py
index b2dda20be58e8..a71055cfe4373 100644
--- a/hermes_cli/providers.py
+++ b/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",
diff --git a/scripts/release.py b/scripts/release.py
index 55d9f8d1eee33..4e3b741ce54ce 100755
--- a/scripts/release.py
+++ b/scripts/release.py
@@ -255,6 +255,7 @@
"anthhub@163.com": "anthhub",
"shenuu@gmail.com": "shenuu",
"xiayh17@gmail.com": "xiayh0107",
+ "asurla@nvidia.com": "anniesurla",
}
diff --git a/tests/hermes_cli/test_api_key_providers.py b/tests/hermes_cli/test_api_key_providers.py
index 97deab89e4c21..c56edc4bb2d6e 100644
--- a/tests/hermes_cli/test_api_key_providers.py
+++ b/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")
diff --git a/tests/tools/test_local_env_blocklist.py b/tests/tools/test_local_env_blocklist.py
index b196cea781d31..0377d59b361d7 100644
--- a/tests/tools/test_local_env_blocklist.py
+++ b/tests/tools/test_local_env_blocklist.py
@@ -86,6 +86,7 @@ def test_registry_derived_vars_are_stripped(self):
"MINIMAX_API_KEY": "mm-key",
"MINIMAX_CN_API_KEY": "mmcn-key",
"DEEPSEEK_API_KEY": "deepseek-key",
+ "NVIDIA_API_KEY": "nvidia-key",
}
result_env = _run_with_env(extra_os_env=registry_vars)
diff --git a/website/docs/getting-started/quickstart.md b/website/docs/getting-started/quickstart.md
index 880c01cb2ab05..bda74b9ed458b 100644
--- a/website/docs/getting-started/quickstart.md
+++ b/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` |
diff --git a/website/docs/integrations/providers.md b/website/docs/integrations/providers.md
index e3d0ad8284a27..750ad671cda23 100644
--- a/website/docs/integrations/providers.md
+++ b/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.
diff --git a/website/docs/user-guide/features/fallback-providers.md b/website/docs/user-guide/features/fallback-providers.md
index 1e2b2a8035f96..12fde185d4624 100644
--- a/website/docs/user-guide/features/fallback-providers.md
+++ b/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` |