Herdr UI
Herdr의 TUI가 뛰어나며, 창을 통해 추가되는 기능
NVIDIA 객체 지향 에이전트: 파이썬 방식으로 AI 에이전트를 구축합니다
NVIDIA Object Oriented Agents: the Pythonic way to build AI Agents.
개발 도구Python · TypeScriptGitHub @NVIDIA-NeMo직접 설치운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
설치형 프로젝트는 배포 도메인 없이도 확인할 수 있습니다. 개인 저장소는 GitHub 로그인으로, 조직 저장소는 위의 저장소 확인 파일로 직접 확인해 주세요.
메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗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:
... bodies are LLM-driven. A method with ... becomes an agentic loop; a real body stays deterministic Python.self, imports, and helpers — Python methods and type annotations supply the callable interfaces, reducing the need to write separate tool-schema definitions.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.
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.
Windows: use WSL 2. Native Windows is not supported:
import nooaand thenooacommand stop with an error that points to WSL 2. SettingNOOA_SKIP_PLATFORM_CHECK=1skips that check. The pure-Python core (agents, PredictStrategy, in-process CodeAct, in-memory storage) andnooa connectare tested on native Windows. Other features may work but are unsupported; those that need POSIX (shell tools, the CodeAct sandbox, file-backed SQLite storage,monitor()) stop with aPosixOnlyFeatureError.
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 command, 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"
# 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/[email protected]"
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.
Install the CLI and run the guided setup:
uv add "nooa[cli]"
uv run nooa connect
Choose your provider or endpoint, API key, exact model, and an alias such as
my-model. Connect checks the configured route and saves the alias in NOOA's
user configuration. The checks send real requests and can cost money; the
wizard asks before running them and before saving. Keep keys in environment
variables or NOOA's secrets file, not in model configuration or committed code.
Use the saved alias in Python:
from nooa.unifiedllm import get_llm_client
llm = get_llm_client("my-model")
See Connect setup
for providers, editing, and diagnostic stages. For setup without inference
calls, use offline model configuration.
--no-probe alone may still fetch discovery/catalogue metadata; the offline
guide explains how to avoid that too. Agent-driven stages do not ask for
spending approval; authorize them before use.
You can also construct clients directly using LiteLLM-supported model names, with your endpoint and credentials. See manual configuration.
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():
try:
agent = FeedbackAgent()
result = await agent.analyze_feedback("Great product, but shipping was slow")
print(result)
finally:
await llm.aclose()
asyncio.run(main())
Save the model-selection and agent snippets together as first_agent.py, then
run uv run python first_agent.py in your project with approved inference
allowance. After your final call, await llm.aclose() releases client resources.
The checked-in first example
is a separate source-checkout example: it chooses its own client from environment
credentials and does not automatically use your my-model alias.
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.
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 add "nooa[cli,viewer]" # includes viewer runtime dependencies
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.
Pass Image, Audio, Video, or PDF File objects as method arguments.
CodeAct can also use show() to see media created while it runs.
NOOA assumes models are text-only until configured. Set media_inputs, such
as [image, pdf], in the model entry. Connect lets you choose formats manually
or test them with generated samples. If you enable a format the provider does
not accept, requests may fail.
from nooa import Agent, PredictStrategy, strategy
from nooa.media import Image
from nooa.unifiedllm import get_llm_client
# This alias must allow image input and use an endpoint that accepts it.
vision = get_llm_client("vision")
class PhotoReader(Agent, llm=vision):
@strategy(PredictStrategy())
async def describe(self, image: Image) -> str:
"""Describe the image briefly. Do not invent details."""
...
# In your async application, with permission to send the photo:
# result = await PhotoReader().describe(Image.from_file("photo.png"))
# await vision.aclose()
Load media with from_file, from_bytes(..., media_type=...), or from_url.
URL support depends on the provider. File supports PDFs. Formats left out of
media_inputs are replaced with text notices when sending a request.
See the media API guide
for a complete example, CodeAct show(), audio/video/PDF inputs, and limits.
typesafe/jev-1.13 with DecideStrategy; agents that only make decisions need no chat LLM. Runnable example: 16_decisions.py.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 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},
}
Apache 2.0. See LICENSE and THIRD_PARTY_NOTICES.md.