AI development agencyenterprise AI adoptionagentic AI development

March 16, 2026 · 9 min read

NVIDIA Nemotron 3 Super: Production Agent Setup

Set up NVIDIA Nemotron 3 Super as AI coding tools for teams. Complete guide from API access to production multi-agent workflows with working code.

Hero image for NVIDIA Nemotron 3 Super: Production Agent Setup

By the end of this guide, you'll have a Nemotron 3 Super-powered coding agent running against your own codebase. You'll also have a multi-agent setup where Nano handles fast completions while Super tackles complex refactors. I've been running this configuration for the past week, and the 60.47% score on SWE-Bench Verified isn't just a benchmark number; it translates to noticeably fewer failed attempts on real pull requests.

Why Nemotron 3 Super Changes the Economics

NVIDIA released Nemotron 3 Super at GTC on March 11, 2026, and it's the first open model I'd actually recommend for production agentic coding workflows. The numbers that matter: 120 billion total parameters with only 12 billion active per forward pass, a native 1-million-token context window, and 2.2x higher throughput than comparable 120B models.

For teams evaluating AI coding tools, here's what that means practically. You can load an entire monorepo into context without chunking. The active parameter count keeps inference costs reasonable. And the open weights mean you're not locked into a single vendor's pricing whims.

The NVIDIA Nemotron Open Model License lets enterprises deploy on their own infrastructure with full data control. This matters for regulated industries where sending code to third-party APIs isn't an option.

Architecture in 60 Seconds

Three innovations make this model work for agentic tasks:

LatentMoE projects token embeddings into a compressed latent space before routing decisions. The result? The model consults 4x more experts at identical computational cost versus standard mixture-of-experts designs.

NVFP4 is NVIDIA's 4-bit floating point format, optimised for Blackwell GPUs. The model is pre-trained using this quantisation, which means you're not losing accuracy from post-training compression.

Multi-token prediction lets the model predict several tokens simultaneously from each position. During inference, this acts as built-in speculative decoding for faster generation of structured outputs like code.

Setup Option 1: Quick Start via OpenRouter

The fastest path to running code is through OpenRouter's free API tier. You'll need an API key from openrouter.ai.

terminal
export OPENROUTER_API_KEY="sk-or-v1-your-key-here"

Here's a minimal Python client that handles the chat completions format:

nemotron_client.py
import os
import httpx
 
OPENROUTER_API_KEY = os.environ["OPENROUTER_API_KEY"]
MODEL = "nvidia/nemotron-3-super-120b-a12b"
 
def complete(messages: list[dict], max_tokens: int = 4096) -> str:
    response = httpx.post(
        "https://openrouter.ai/api/v1/chat/completions",
        headers={
            "Authorization": f"Bearer {OPENROUTER_API_KEY}",
            "Content-Type": "application/json",
        },
        json={
            "model": MODEL,
            "messages": messages,
            "temperature": 1.0,  # highlight-line
            "top_p": 0.95,       # highlight-line
            "max_tokens": max_tokens,
        },
        timeout=120.0,
    )
    response.raise_for_status()
    return response.json()["choices"][0]["message"]["content"]
 
# Test it
result = complete([
    {"role": "user", "content": "Write a Python function to parse ISO 8601 timestamps."}
])
print(result)

The temperature: 1.0 and top_p: 0.95 settings come from NVIDIA's recommended defaults for agentic tasks. Lower temperatures cause the model to get stuck in repetitive patterns during multi-step reasoning.

Setup Option 2: NVIDIA NIM for Production

For production workloads, especially if your team needs LLM integration services with guaranteed latency, NIM microservices are the cleaner path. You'll need access to NVIDIA's API platform.

terminal
export NVIDIA_API_KEY="nvapi-your-key-here"

The NIM endpoint uses OpenAI-compatible formatting, which makes swapping providers trivial:

nim_client.py
import os
from openai import OpenAI
 
client = OpenAI(
    base_url="https://integrate.api.nvidia.com/v1",
    api_key=os.environ["NVIDIA_API_KEY"],
)
 
def agent_complete(system_prompt: str, user_message: str) -> str:
    response = client.chat.completions.create(
        model="nvidia/nemotron-3-super-120b-a12b",
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": user_message},
        ],
        temperature=1.0,
        top_p=0.95,
        max_tokens=32000,
    )
    return response.choices[0].message.content

NIM endpoints have a 32,000-token output limit per request. For large file rewrites, you'll need to split the task or use the streaming endpoint to detect truncation.

Build Your First Agentic Coding Workflow

A useful coding agent needs more than chat completions. It needs tool use, file access, and the ability to iterate on its own output. Here's a minimal agent loop that handles file operations:

coding_agent.py
import json
import os
from pathlib import Path
from openai import OpenAI
 
client = OpenAI(
    base_url="https://integrate.api.nvidia.com/v1",
    api_key=os.environ["NVIDIA_API_KEY"],
)
 
TOOLS = [
    {
        "type": "function",
        "function": {
            "name": "read_file",
            "description": "Read the contents of a file",
            "parameters": {
                "type": "object",
                "properties": {
                    "path": {"type": "string", "description": "File path to read"}
                },
                "required": ["path"],
            },
        },
    },
    {
        "type": "function",
        "function": {
            "name": "write_file",
            "description": "Write content to a file",
            "parameters": {
                "type": "object",
                "properties": {
                    "path": {"type": "string", "description": "File path to write"},
                    "content": {"type": "string", "description": "Content to write"},
                },
                "required": ["path", "content"],
            },
        },
    },
]
 
def execute_tool(name: str, arguments: dict) -> str:
    if name == "read_file":
        path = Path(arguments["path"])
        if not path.exists():
            return f"Error: {path} does not exist"
        return path.read_text()
    elif name == "write_file":
        path = Path(arguments["path"])
        path.parent.mkdir(parents=True, exist_ok=True)
        path.write_text(arguments["content"])
        return f"Successfully wrote {len(arguments['content'])} bytes to {path}"
    return f"Unknown tool: {name}"
 
def run_agent(task: str, max_iterations: int = 10) -> str:
    messages = [
        {
            "role": "system",
            "content": "You are a coding agent. Use tools to read and modify files. "
                       "Think step by step. After completing the task, respond with DONE.",
        },
        {"role": "user", "content": task},
    ]
 
    for i in range(max_iterations):
        response = client.chat.completions.create(
            model="nvidia/nemotron-3-super-120b-a12b",
            messages=messages,
            tools=TOOLS,
            tool_choice="auto",
            temperature=1.0,
            top_p=0.95,
            max_tokens=8000,
        )
 
        assistant_message = response.choices[0].message
        messages.append(assistant_message.model_dump())
 
        if assistant_message.tool_calls:
            for tool_call in assistant_message.tool_calls:
                result = execute_tool(
                    tool_call.function.name,
                    json.loads(tool_call.function.arguments),
                )
                messages.append({
                    "role": "tool",
                    "tool_call_id": tool_call.id,
                    "content": result,
                })
        elif "DONE" in (assistant_message.content or ""):
            return assistant_message.content
 
    return "Max iterations reached"
 
# Example: refactor a module
result = run_agent(
    "Read src/utils.py, identify any functions longer than 20 lines, "
    "and refactor them into smaller functions. Write the changes back."
)
print(result)

This pattern handles the core agent loop: send a task, let the model call tools, execute those tools, feed results back, and repeat until completion. The DONE sentinel gives the model a clear way to signal task completion.

Multi-Agent Coordination: Nano for Speed, Super for Complexity

Nemotron 3 Nano (31.6B total, 3.6B active) runs at higher throughput than Super. For a production system, you want Nano handling routine completions while Super tackles complex reasoning. Here's a router that makes that decision:

agent_router.py
import os
from openai import OpenAI
 
client = OpenAI(
    base_url="https://integrate.api.nvidia.com/v1",
    api_key=os.environ["NVIDIA_API_KEY"],
)
 
NANO_MODEL = "nvidia/nemotron-3-nano-31b-a3b"
SUPER_MODEL = "nvidia/nemotron-3-super-120b-a12b"
 
COMPLEXITY_KEYWORDS = [
    "refactor", "architecture", "debug", "investigate",
    "optimise", "security", "migration", "redesign",
]
 
def route_to_model(task: str) -> str:
    """Route based on task complexity signals."""
    task_lower = task.lower()
    if any(keyword in task_lower for keyword in COMPLEXITY_KEYWORDS):
        return SUPER_MODEL
    if len(task) > 2000:  # Long context suggests complexity
        return SUPER_MODEL
    return NANO_MODEL
 
def smart_complete(task: str, system_prompt: str = "You are a helpful coding assistant.") -> str:
    model = route_to_model(task)
    print(f"Routing to: {model}")  # highlight-line
 
    response = client.chat.completions.create(
        model=model,
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": task},
        ],
        temperature=1.0 if "super" in model else 0.7,
        max_tokens=8000,
    )
    return response.choices[0].message.content

In practice, I route about 70% of requests to Nano. The cost savings add up quickly when you're running thousands of completions per day, which is something to consider when planning enterprise AI adoption budgets.

Production Deployment Patterns

A few lessons from running this in production:

Use streaming for long outputs. The 32K token limit bites when you're generating large files. Stream responses and implement client-side truncation detection:

streaming.py
def stream_complete(messages: list[dict]) -> str:
    chunks = []
    with client.chat.completions.create(
        model="nvidia/nemotron-3-super-120b-a12b",
        messages=messages,
        stream=True,
        max_tokens=32000,
    ) as stream:
        for chunk in stream:
            if chunk.choices[0].delta.content:
                chunks.append(chunk.choices[0].delta.content)
 
    full_response = "".join(chunks)
    if not full_response.rstrip().endswith(("}", ")", "]", '"""', "'''")):
        print("Warning: Response may be truncated")  # highlight-line
    return full_response

Implement retry with exponential backoff. API endpoints have rate limits, and transient failures happen. A simple retry wrapper saves debugging time:

retry.py
import time
from functools import wraps
 
def with_retry(max_attempts: int = 3, base_delay: float = 1.0):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            for attempt in range(max_attempts):
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    if attempt == max_attempts - 1:
                        raise
                    delay = base_delay * (2 ** attempt)
                    print(f"Attempt {attempt + 1} failed: {e}. Retrying in {delay}s")
                    time.sleep(delay)
        return wrapper
    return decorator

Cache aggressively. Identical prompts return identical results at temperature 0. For deterministic tasks like code formatting or static analysis, cache by prompt hash.

What's Running Now

I've had this setup running against a 200K-line TypeScript monorepo for the past week. The agent successfully completed 47 of 52 refactoring tasks I threw at it, with most failures coming from tasks that required understanding external API behaviour not present in the codebase. The 1M context window means I can include the entire src/ directory without truncation, and the latent MoE architecture keeps response times under 8 seconds for most completions.

If you're evaluating AI-assisted development tools for your team, start with the OpenRouter setup. It's free to experiment with, and you can move to NIM once you've validated the workflow. The model weights are open, so you're not betting on a single vendor's roadmap.

Sources

FAQ