Object-Oriented Agents
v0.0.9 open-sourceNVIDIA Object Oriented Agents: the Pythonic way to build AI Agents.
from nooa import Agent
from nooa.unifiedllm import get_llm_client
def pick_llm():
return get_llm_client("ollama_chat/qwen3:1.7b", api_base="http://localhost:11434")
class AdaptiveAgent(Agent):
@strategy(llm=pick_llm)
async def analyze(self, text: str) -> str:
"""Analyze the text."""
... Summary
Object-Oriented Agents (NOOA) is an open-source, Apache 2.0-licensed Python framework for building AI agents, distributed as a library you install with `pip install nooa` or `uv add nooa` and import into your own code. Rather than treating prompts, tools, callbacks, and workflows as separate abstractions, as many agent frameworks do, it lets a developer express an agent's state, capabilities, prompts, and typed interfaces as a single Python class, which makes it a fit for application developers building agentic systems rather than for security teams directly, though an included cybergym example shows it used to build a cybersecurity-oriented agent. Recent hardening work has removed an eval()-based code execution path in its CodeAct constructor, confined shell-tool file operations to the working directory, and added auth and CORS restrictions to its local trace viewer, work that suggests active, ongoing maintenance.
NVIDIA Object Oriented Agents: the Pythonic way to build AI Agents.
What Object-Oriented Agents answers
Is it safe to let an agent run shell commands on its own machine?
shell-tool file operations are confined to the current working directory rather than the whole filesystem
Can I inspect what an agent did after a run without exposing that data?
the local trace viewer requires an auth token and restricts cross-origin requests, rather than being open by default
Do I need to build or clone the source to try it?
it installs from PyPI as a published package, with no separate build step
Examples
Command line
No option matches that search.
| option | found in | since | description |
|---|
No option matches that search.
Values are placeholders taken from each option’s declared default. Nothing is executed here — the output shown is a recording of a run that already happened.
Release history
- v0.0.9
OO-Agents v0.0.9 adds plugin-based CLI extension, a portable journal exporter, callable LLM routing in @strategy, shared interactive sessions, and a CyberGym portfolio agent.
└──▷ GET THIS VERSION$ git clone --branch v0.0.9 https://github.com/NVIDIA-NeMo/labs-OO-Agents.git # already have the repo? check out this version: $ git checkout v0.0.9
- ›Enables external packages to add
nooasubcommands via Python entry points, allowing third-party plugins to extend the CLI without forking. - ›Adds a portable journal file exporter for tracing, giving teams an offline-portable trace format independent of a remote viewer.
- ›Allows a callable to be passed to @strategy(llm=...), enabling dynamic LLM selection per strategy invocation instead of a static reference.
- ›Adds LLM routing metadata to generation observability, surfacing which backend was selected in trace output.
- ›Adds a shared interactive session foundation, enabling multiple agents to collaborate within a single interactive context.
+1 moreshow less
- ›Adds a portfolio-based NOOA agent to the CyberGym benchmark environment.
└──▷ BREAKING ON UPGRADE- !The
nemo_flow_*namespace is renamed tonemo_relay_*; any code or config referencingnemo_flow_names will break on upgrade.
- ›Enables external packages to add
- v0.0.9
OO Agents v0.0.9 adds entry-point CLI extensibility, a callable @strategy(llm=...), a portable journal exporter, shared interactive sessions, and a CyberGym portfolio agent.
└──▷ GET THIS VERSION$ git clone --branch v0.0.9 https://github.com/NVIDIA-NeMo/labs-OO-Agents.git # already have the repo? check out this version: $ git checkout v0.0.9
└──▷ USE ITDynamically select an LLM per-call (e.g. based on task complexity) instead of binding one model at class definition time.from nooa import Agent from nooa.unifiedllm import get_llm_client def pick_llm(): return get_llm_client("ollama_chat/qwen3:1.7b", api_base="http://localhost:11434") class AdaptiveAgent(Agent): @strategy(llm=pick_llm) async def analyze(self, text: str) -> str: """Analyze the text.""" ...- ›Allows a callable to be passed to @strategy(llm=...) so LLM selection can be decided at runtime rather than at class-definition time.
- ›Adds a portable journal file exporter for tracing, enabling offline and cross-environment trace storage.
- ›Lets external packages register new
nooasubcommands via Python entry points, making thenooaCLI extensible without modifying core. - ›Adds a portfolio-based NOOA agent to the CyberGym benchmark environment.
- ›Adds LLM routing metadata to generation observability, surfacing which backend handled each LLM call in traces.
└──▷ BREAKING ON UPGRADE- !All
nemo_flow_*symbols are renamed tonemo_relay_*; any code importing or referencingnemo_flow_*names will break.
- v0.0.7
v0.0.7 adds a CyberGym agent example, viewer ingest resource limits, and playground custom-model endpoint constraints.
└──▷ GET THIS VERSION$ git clone --branch v0.0.7 https://github.com/NVIDIA-NeMo/labs-OO-Agents.git # already have the repo? check out this version: $ git checkout v0.0.7
- ›Constrains playground custom-model
endpointandapi_key_envto server-declared pairs, preventing arbitrary endpoint injection. - ›Adds resource limits on the Viewer ingest API to cap payload sizes and prevent abuse.
- ›Adds a
nooaCyberGym agent example demonstrating object-oriented agent patterns for cyber exercise environments. - ›Requires an auth token and restricts CORS on the viewer API, hardening the exposed surface.
- ›Constrains
ShellToolsfile operations to the current working directory, limiting lateral file access.
+1 moreshow less
- ›Replaces eval() in the
CodeActconstructor-string coercion path with an AST decoder, removing arbitrary code execution risk in that call site.
- ›Constrains playground custom-model
- v0.0.7
NOOA v0.0.7 adds auth-gated viewer API, secret redaction in telemetry, resource limits on viewer ingest, and a NOOA CyberGym agent example.
└──▷ GET THIS VERSION$ git clone --branch v0.0.7 https://github.com/NVIDIA-NeMo/labs-OO-Agents.git # already have the repo? check out this version: $ git checkout v0.0.7
- ›Adds authentication token requirement and CORS restrictions to the viewer API, preventing unauthenticated access to trace data.
- ›Constrains playground custom-model
endpointandapi_key_envfields to server-declared pairs, blocking arbitrary endpoint injection. - ›Enforces resource limits on viewer ingest to bound memory and CPU consumption under high trace volume.
- ›Confines
ShellToolsfile operations within the current working directory, reducing the blast radius of LLM-generated shell actions. - ›Adds an NOOA CyberGym agent example demonstrating how to build a cyber-domain agent with the OO Agents framework.