Skip to main content

NVIDIA-labs Object Oriented Agents

A Pythonic way to build AI agents.

NVIDIA Paper Blog License

Docs  ·  Quick Start  ·  Notebook Tutorials  ·  Examples  ·  Paper  ·  Blog


NVIDIA-labs Object Oriented 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

# The agent is a Python object.
class SupportAgent(Agent):
    """You are a support agent."""

    # State lives on the object. Fields are typed.
    order_db: OrderDB

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

    # Agentic method: the runtime hands this to an LLM.
    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.
  • ... bodies are LLM-driven. A method with ... becomes an agentic loop; a real body stays deterministic Python.
  • Generation commits one result. Deterministic generators are supported, but generated streams need a separate stream contract and are rejected clearly.
  • Code as action. The model acts by writing Python in a Jupyter-style REPL with access to self, 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.

Want to see how the pieces compose? Take the 10-minute tour, from one thinking method through tools, typed contracts, deterministic orchestration, and object composition.

Installation

Add the core framework to a new (or existing) Python project with uv:

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

uv add nooa

Or with pip: pip install nooa.

Optional sub-packages — CLI, ACP, memory, benchmarks, evaluation pipeline

The CLI, ACP, memory, and benchmark packages are separate distributions. Install them by name, or pull them in as extras of the core package:

uv add nooa-cli                 # or: uv add "nooa[cli]"
uv add nooa-acp                 # or: uv add "nooa[acp]"
uv add nooa-memory              # or: uv add "nooa[memory]"
uv add nooa-bench               # or: uv add "nooa[bench]"

uv add "nooa[cli,memory]"       # several at once
Package Extra What it adds
nooa-cli nooa[cli] the nooa command, trace viewer, eval runner
nooa-acp nooa[acp] coding agent for Agent Client Protocol hosts such as Zed — setup
nooa-memory nooa[memory] long-term memory subsystem (MemoryManager)
nooa-bench nooa[bench] BenchAgent and the Harbor benchmark runner

eval_pipeline is not published to PyPI — install it from the repo:

uv add "eval_pipeline @ git+https://github.com/NVIDIA-NeMo/labs-OO-Agents.git@main#subdirectory=util/eval_pipeline"
Installing from source — track main or pin a tag
# latest development state
uv add "nooa @ git+https://github.com/NVIDIA-NeMo/labs-OO-Agents.git@main"

# pinned to a release tag
uv add "nooa @ git+https://github.com/NVIDIA-NeMo/labs-OO-Agents.git@v0.0.7"

Quick Start

⚠️ Before Starting: safety note

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, including 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.

1. Choose a model

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)

2. Your first agent

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.

Prefer a guided notebook path? Start with the notebook tutorials, which walk through the same ideas in Colab-friendly steps, with more notebooks planned.

Ready to run something specific? Use the examples catalog to find quickstarts for structured output, tools, strategies, tracing, context blocks, MCP, and more.

3. See what your agent is doing

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.

Learn more

  • Documentation — human-oriented reading paths, core concepts, architecture, and safety guidance.
  • Framework tour — a concise conceptual showcase of NOOA's core ideas and Python-first design.
  • Notebook tutorials — the primary hands-on path for your first agent, strategy selection, CodeAct's live-object workflow, and composing subagents. More notebooks are planned.
  • Examples catalog — runnable quickstarts, advanced mechanics, and complete benchmark systems, indexed by capability and setup requirements.
  • Paper — design principles, harness details, capability tests, and SWE-bench Verified / Terminal-Bench 2.0 results.
  • Blog post — Six Agent Harness Capabilities for Higher Model Performance.
  • AGENTS.md — conventions used inside this repo (helpful when reading the source).

Contributing

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.

Citation

If you use NVIDIA-labs Object Oriented 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},
}

License

Apache 2.0. See LICENSE and THIRD_PARTY_NOTICES.md.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nooa-0.0.10.tar.gz (3.5 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

nooa-0.0.10-py3-none-any.whl (1.1 MB view details)

Uploaded Python 3

File details

Details for the file nooa-0.0.10.tar.gz.

File metadata

  • Download URL: nooa-0.0.10.tar.gz
  • Upload date:
  • Size: 3.5 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.4 {"installer":{"name":"uv","version":"0.11.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for nooa-0.0.10.tar.gz
Algorithm Hash digest
SHA256 91d44a48610b116561d2ddc42ed80a7c4011c7324a67236300d2fe78182d3c78
MD5 14d8a58b2bdf3c462e6ec6195ba24abf
BLAKE2b-256 2790f07e44b57d10e3687caba9b18a1b2064e7c9602f85fdeb9c9b0a4843aeba

See more details on using hashes here.

File details

Details for the file nooa-0.0.10-py3-none-any.whl.

File metadata

  • Download URL: nooa-0.0.10-py3-none-any.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.4 {"installer":{"name":"uv","version":"0.11.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for nooa-0.0.10-py3-none-any.whl
Algorithm Hash digest
SHA256 8a74d3e62bb4a216d6fcb1ba912b5d9e49ecc0bf8c2d685f808594a816cbe4ca
MD5 43f8e4568589ce56a024d72cd67b04af
BLAKE2b-256 0284ec56e26a39873862f046146bf677b1d259e7e923180f508747baa1076ed9

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.0.10 This release

2 files

0.0.9

2 files

0.0.8

2 files

0.0.7

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page