cd /news/ai-agents/nvidia-object-oriented-agents-an-age… · home topics ai-agents article
[ARTICLE · art-75504] src=github.com ↗ pub= topic=ai-agents verified=true sentiment=· neutral

Nvidia Object-Oriented Agents: An agent is a Python class

NVIDIA-labs released NOOA (NVIDIA-labs OO Agents), a model-agnostic Python framework that represents AI agents as Python classes, unifying state, capabilities, prompts, and typed interfaces in a single object. The framework, available on GitHub, supports familiar Python development workflows and includes optional sub-packages for CLI, memory, and evaluation, but is research software that requires sandboxed execution due to risks from LLM-generated code.

read5 min views1 publishedJul 27, 2026
Nvidia Object-Oriented Agents: An agent is a Python class
Image: source

NVIDIA-labs OO Agents (NOOA) is a model-agnostic Python framework designed to support reliable AI agent development. Many agent frameworks represent prompts, tools, callbacks, and workflows as separate abstractions. NOOA offers an alternative object-oriented interface that brings these concepts together in a Python class. NOOA lets developers express an agent’s state, capabilities, prompts, and typed interfaces through a single Python class:

from nooa import Agent

class SupportAgent(Agent):
    """You are a support agent."""

    order_db: OrderDB

    def is_refund_eligible(self, order: Order) -> bool:
        return order.delivered and order.days_since_delivery <= 30

    async def triage(self, message: str, order: Order) -> Ticket:
        """Create a typed support ticket."""
        ...

What's happening here:

Agents are Python objects. Fields are state, methods are capabilities, docstrings are prompts, type annotations are contracts.A method with...

bodies are LLM-driven....

becomes an agentic loop; a real body stays deterministic Python.Code as action. The model acts by writing Python in a Jupyter-style REPL with access toself

, imports, and helpers — Python methods and type annotations supply the callable interfaces, reducing the need to write separate tool-schema definitions.Pythonic and agent-ready. Typed I/O with auto-retry, live-object arguments passed by reference, and model-callable context and event APIs — designed around agent-oriented Python workflows.

This design supports familiar Python testing, tracing, refactoring, and version-control workflows — just like the rest of your software. Read the paper for the design principles and evaluation results: NVIDIA OO Agents: Native Python Object-Oriented Agents.

Install directly from GitHub with uv. Add the core framework to a new (or existing) Python project:

uv init my-agent-project
cd my-agent-project

uv add "nooa @ git+https://github.com/NVIDIA-NeMo/labs-OO-Agents.git@main"

Optional sub-packages — CLI, memory, evaluation pipeline

All of these live in the same repo and are addressed with #subdirectory=…

.

uv add "nooa-cli @ git+https://github.com/NVIDIA-NeMo/labs-OO-Agents.git@main#subdirectory=packages/nooa-cli"

uv add "nooa-memory @ git+https://github.com/NVIDIA-NeMo/labs-OO-Agents.git@main#subdirectory=packages/nooa-memory"

uv add "eval_pipeline @ git+https://github.com/NVIDIA-NeMo/labs-OO-Agents.git@main#subdirectory=util/eval_pipeline"

NOOA is research software, and agents can be configured to execute LLM-generated code. We welcome contributions and fixes, but expect rough edges. LLM-generated code may take dangerous or unwanted actions, incuding sending private data to uncontrolled locations, deleting files, or modifying its environments. Ensure you run NOOA agents in a sandboxed environment isolated from your primary filesystem, such as NVIDIA OpenShell.

NOOA validates generated code (AST checks) and applies module deny-lists before execution. These are defense-in-depth guardrails, not a containment boundary. They exist to keep generated code from freezing the event loop and to catch common mistakes early — not to stop code that is actively trying to escape. A static checker over Python cannot provide that guarantee: open()

gives arbitrary file access, importlib

can load modules straight from a path, and reflection reaches the rest. The containment boundary is OS-level isolation — always run agents that execute generated code inside a sandbox such as a container, VM, or NVIDIA OpenShell. Do not rely on the in-process validators alone.

Choose from supported hosted or local LiteLLM-supported model:

from nooa.unifiedllm.registry import get_llm_client

llm = get_llm_client("claude-haiku-4-5")                                            # Anthropic (after `export ANTHROPIC_API_KEY=...`)
llm = get_llm_client("gpt-5-mini")                                                  # OpenAI    (after `export OPENAI_API_KEY=...`)
llm = get_llm_client("ollama_chat/qwen3:1.7b", api_base="http://localhost:11434")   # Ollama    (no key)
llm = get_llm_client("hosted_vllm/Qwen/Qwen3-1.7B", api_base="http://localhost:8000/v1")  # vLLM (no key)
  • Agents are Python objects*. Methods with

...

bodies are generation methods— implemented at runtime by an LLM-driven strategy. The signature defines the contract; the docstring is the prompt.

import asyncio

from nooa import Agent

class FeedbackAgent(Agent, llm=llm):
    """You are an agent specializing in analyzing customer feedback."""

    async def analyze_feedback(self, text: str) -> str:
        """Analyze customer feedback for sentiment and key topics in one sentence."""
        ...

async def main():
    agent = FeedbackAgent()
    result = await agent.analyze_feedback("Great product, but shipping was slow")
    print(result)

asyncio.run(main())

Run the same code from your own project with python

. You can run the checked-in example:

uv run python examples/quickstart/01_first_generation_method.py

Rename analyze_feedback

to analyze_feedback_briefly

and the output changes — your method name, parameters, and docstring are the prompt.

Ready for more? See examples/ for the full progressive tutorial — structured output, tools, strategies, tracing, context blocks, MCP, and more.

Every LLM call, code execution, and method invocation is traced by default — orchestrators, generation methods, and helpers, with parent-child spans preserved. If you installed the CLI and viewer dependencies, start the trace viewer and open the run in your browser:

uv run nooa start-dev        # trace viewer on http://localhost:5001

If the viewer isn't running, tracing is silently disabled — no configuration needed either way.

— the full progressive tutorial: structured output, tools viaexamples/README.mdself

, strategies, progressive disclosure withdoc()

, tracing, dynamic prompts, context blocks, summarization, skills, MCP, sandbox, and more.— design principles, harness details, capability tests, and SWE-bench Verified / Terminal-Bench 2.0 results.Paper— conventions used inside this repo (helpful when reading the source).AGENTS.md

For a local editable install, clone the repo and sync the development environment with uv

:

git clone https://github.com/NVIDIA-NeMo/labs-OO-Agents.git
cd labs-OO-Agents
uv sync --group dev

This installs the core framework, workspace packages, development tools, the nooa

CLI, and the trace viewer runtime in the repo's .venv

. Run CLI commands through uv

:

uv run nooa --help
uv run nooa start-dev       # trace viewer on http://localhost:5001

Enable pre-commit hooks and run the test/lint suite:

uv run pre-commit install
uv run pytest                # run tests
uv run ruff check            # lint
uv run pyright               # type check

See CONTRIBUTING.md for the full workflow.

If you use NVIDIA-labs OO Agents in your research, please cite:

@techreport{nvidia_oo_agents_2026,
  title  = {NVIDIA-labs OO Agents: Native Python Object-Oriented Agents},
  author = {Furgale, Paul and Klingler, Severin and Nolan, James and Staats, Matt and
            Di Lorenzo, Gaia and Martinez Abad, Elisa and Schueler, Christian and
            Dinu, Razvan and Devoto, Alessio and Berard, Pascal and Kaplun, Gal and Sarafian, Elad and
            Roveri, Riccardo and Derczynski, Leon and Silveira Cabral, Ricardo},
  year   = {2026},
}

Apache 2.0. See LICENSE and THIRD_PARTY_NOTICES.md.

── more in #ai-agents 4 stories · sorted by recency
── more on @nvidia-labs 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
Live at https://your-agent.zahid.host
Get free account → Pricing
from €0/mo · no card required
LIVE [news/nvidia-object-orient…] indexed:0 read:5min 2026-07-27 ·