NVIDIA NOOA (labs-OO-Agents)

Frameworks & SDKs 💻 Python ⚖️ Other 🟢 Actively maintained
2.0k stars

NOOA is a model-agnostic Python framework for building AI agents using an object-oriented interface. It represents agents as Python classes where fields are state, methods are capabilities, docstrings are prompts, and type annotations are contracts. It is designed for developers who want to build reliable agents with familiar Python workflows.

✨ Key features

  • Agents as Python objects with typed state and methods.
  • LLM-driven methods via '...' bodies, deterministic Python otherwise.
  • Code-as-action: model writes Python in a Jupyter-style REPL.
  • Typed I/O with auto-retry and live-object arguments.
  • Tracing of all LLM calls and method invocations by default.
  • Optional sub-packages for CLI, ACP, memory, and benchmarks.

🎯 Use cases

  • Build a support agent that triages tickets and checks refund eligibility.
  • Create agents that analyze customer feedback for sentiment and topics.
  • Develop coding agents for Agent Client Protocol hosts like Zed.
  • Run benchmark evaluations with BenchAgent and Harbor runner.

📦 Installation

🧰 Requirements: Python environment with uv or pip; API keys for hosted models (e.g., ANTHROPIC_API_KEY, OPENAI_API_KEY) or local models via Ollama/vLLM.

uv init my-agent-project
cd my-agent-project
uv add nooa

Or with pip: pip install nooa.

Optional sub-packages:

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]"

Install from source:

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

🚀 Usage

import asyncio
from nooa import Agent
from nooa.unifiedllm.registry import get_llm_client

llm = get_llm_client("claude-haiku-4-5")  # set ANTHROPIC_API_KEY

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())

⚠️ Good to know

NOOA is research software with rough edges; agents can execute LLM-generated code, so run in a sandboxed environment as the in-process validators are not a containment boundary.

❓ FAQ

How do I define an agent?

Create a Python class that inherits from Agent and set the llm class attribute. Methods with '...' bodies become LLM-driven generation methods.

What models are supported?

Any LiteLLM-supported model, including hosted ones like Claude and GPT, and local ones via Ollama or vLLM.

How do I see what the agent is doing?

Tracing is enabled by default; start the trace viewer with uv run nooa start-dev and open http://localhost:5001.

Is it safe to run agents that execute generated code?

No, you must run them in an OS-level sandbox like a container or NVIDIA OpenShell because the in-process validators are not a containment boundary.

📊 Repository

Stars★ 1,991
Forks🍴 270
Open issues🐛 77
Last commit🕒 Sep 4, 2026
Created📅 Jul 2026
Language💻 Python
License⚖️ Other

🤖 Overview, features, install steps and FAQ were generated from the project's README on Sep 4, 2026. Always check the original source before running commands.