进阶 📋 6 个步骤 第 257 / 470 篇

NVIDIA NOOA 开源 Agent 框架:一个 Python 类就是一个 Agent

2026 年 8 月 9 日 NVIDIA Labs 开源 NOOA(Apache 2.0):Agent 就是一个 Python 类——方法即动作、字段即状态、docstring 即提示词,SWE-bench Verified 82.2%,pip install nooa 即可用,通过 LiteLLM 兼容任意模型。本文拆解类式 Agent 哲学、LLM 补全方法体与确定性方法的取舍、像管软件一样测试与版本控制,并讲透「AST 静态检查不是沙箱」必须容器/VM 运行的安全红线。

2026.08.10· 20 分钟阅读· 约 1894 字· 🟦 NVIDIA NOOA

主流 Agent 框架通常由「提示词模板 + 回调图」组成,学起来绕、调起来更绕。NVIDIA 在 2026 年 8 月 9 日开源的 NOOA(Apache 2.0)给出一个极简答案:Agent 就是一个 Python 类——方法就是动作,字段就是状态,docstring 就是提示词。它开源即登顶关注榜,SWE-bench Verified 82.2%。本教程带你把第一个 NOOA Agent 跑起来,并讲清它「像管软件一样管 Agent」的设计哲学。

🧩 本教程适合:会写基础 Python(类与方法)的开发者,想体验「最干净」的 Agent 写法,或想给团队引入一个轻量、可版本控制的 Agent 框架。不需要 GPU,NOOA 通过 LiteLLM 兼容任意大模型 API。

先搞懂:NOOA 的「类即 Agent」是什么哲学?

NOOA 的核心创新是结构性的:Agent 不是一堆提示词模板和回调图,而是一个普通的 Python 类。在这个类里:

类元素在 NOOA 中的角色
docstring(类文档)Agent 的系统提示词——告诉模型它是什么、该怎么做
方法(methods)Agent 可以执行的动作;方法体是 ... 的由 LLM 在运行时补全
字段(fields)Agent 的状态——记忆、中间结果、配置都放这里
普通方法体确定性 Python 代码——不走模型,逻辑绝对可控

和传统框架比:传统框架把提示词、状态、动作、回调分散在多个文件里;NOOA 把它们收进一个类,像普通软件一样可测试、可追踪、可版本控制。但注意:NOOA 目前是 v0.0.8 alpha,适合学习与原型,生产使用前请评估稳定性。

Step 1:安装环境

1 Python 3.12/3.13 + pip 一行安装

NOOA 支持 Python 3.12-3.13,安装极简:

# 1. 确认 Python 版本(3.12 或 3.13)
python --version

# 2. 安装 NOOA(v0.0.8 alpha)
pip install nooa

# 3. 确认安装成功
python -c "import nooa; print(nooa.__version__)"
💡 模型无关:NOOA 通过 LiteLLM 接入模型,OpenAI / Anthropic / 通义 / DeepSeek 等任意 OpenAI 兼容 API 都能用。没配置密钥前,可以先在代码里指定模型名,跑通后再补 Key。

Step 2:配置模型连接(LiteLLM)

2 用环境变量指定模型与密钥
# 方式一:环境变量(推荐,密钥不进代码)
export OPENAI_API_KEY="sk-xxxx"
export NOOA_MODEL="openai/gpt-4o-mini"   # 或 anthropic/claude-…、deepseek/deepseek-chat

# 方式二:在 Python 里显式指定
from nooa import Agent

class MyAgent(Agent):
    """我是示例 Agent,负责…"""
    pass

# 构造时传模型
agent = MyAgent(model="openai/gpt-4o-mini", api_key="sk-xxxx")
🔑 密钥管理习惯:永远不要把 API Key 写死在类文件里。用环境变量或 .env,并把 .env 加进 .gitignore——Agent 代码会进版本库,密钥不该跟着进。

Step 3:写第一个「类式 Agent」

3 方法、字段、docstring 三件套

写一个能「总结文本并统计字数」的 Agent,你会直观看到三件套的用法:

from nooa import Agent

class SummarizerAgent(Agent):
    """你是文本总结助手。
    用户给你一段长文本,你负责:
    1. 用 3 句话概括核心内容
    2. 指出文中最关键的 1 个数字或结论
    输出保持简洁、中文回答。"""

    def summarize(self, text: str) -> str:
        """对 text 做 3 句话总结。"""
        ...   # 方法体为 ...,由 LLM 运行时补全

    def count_words(self, text: str) -> int:
        # 普通方法体 = 确定性 Python,不走模型
        return len(text.split())

# 使用
agent = SummarizerAgent(model="openai/gpt-4o-mini")
summary = agent.summarize("很长的一段文章……")
print(summary)
print("字数:", agent.count_words("hello world"))  # 输出 2

关键区分:方法体是 ...(Ellipsis)的方法,由 LLM 在运行时补全逻辑;方法体是正常代码的方法,就是普通 Python 函数。前者灵活但不可控,后者可控但不智能——按需选择,别把所有方法都交给模型。

Step 4:让 Agent 会用工具(把动作加进类)

4 给 Agent 加「手」

Agent 的实用价值在工具调用。NOOA 里,每个方法天然就是一个可调用工具,模型可以按需调用:

class ResearchAgent(Agent):
    """你是调研助手,会用工具查资料并汇总。"""

    def web_search(self, query: str) -> str:
        """调用搜索接口,返回 query 的前 5 条结果摘要。"""
        ...   # 这里填入你的搜索 API 实现,或留空由模型规划

    def write_report(self, findings: str) -> str:
        """把 findings 整理成结构化调研报告。"""
        ...

    def save_markdown(self, content: str, path: str) -> str:
        # 确定性动作:写文件,不经过模型
        with open(path, "w", encoding="utf-8") as f:
            f.write(content)
        return f"已保存到 {path}"

# 模型会自己编排:查资料 → 写报告 → 保存
result = ResearchAgent().run("调研一下 2026 年开源 Agent 框架的格局")
💡 字段即状态:把中间结果、记忆、配置放进类字段(如 self.findings = []),Agent 就能跨步骤携带上下文,这也是它与「无状态函数链」的最大区别。想深入理解状态管理,可对照 LangChain 的 Memory 教程(本站有《LangChain 记忆机制》)。

Step 5:像管软件一样测试与版本控制

5 可测试、可追踪、可 diff

因为 Agent 就是类,普通软件工程手段全部适用——这正是 NOOA 想强调的「Agent 工程化」:

# 1. 单元测试:直接对方法断言
def test_count_words():
    a = SummarizerAgent()
    assert a.count_words("a b c") == 3

# 2. 追踪执行:开启 trace,看模型每一步在做什么
agent = SummarizerAgent(trace=True)
agent.summarize("…")

# 3. 版本控制:整个 Agent 就是一份 diff
git add agent.py
git commit -m "feat: 新增调研 Agent,含搜索与报告动作"

# 4. 契约清晰:方法签名即 Agent 与调用方的接口
#    类型注解 + docstring 就是你的 API 文档
🚀 实践建议:给每个 Agent 写一个最小测试集(输入固定样例、断言关键输出),模型升级或提示词调整后跑一遍,能拦住大量「看似正常其实变差」的回归问题——这与本站《Agent 评测 Evals》教程的思路一致。

Step 6:安全红线——AST 检查不是沙箱

6 必须跑在容器 / VM 里

NOOA 官方 README 有句重要警告:AST checks are NOT containment——AST 静态检查并不能拦住一心想逃逸的代码。也就是说,NOOA 自带的代码安全检查只是「过滤明显危险操作」,不能替代真正的隔离:

正确姿势(三选一):
1. Docker 容器:docker run --rm -v $PWD:/app python:3.13
   (在容器内 pip install nooa 并运行 Agent)
2. 虚拟机:VM 内运行,与宿主机完全隔离
3. NVIDIA OpenShell:NVIDIA 提供的受控执行环境

务必执行的最小防护清单:
· 不给 Agent 容器挂载敏感目录(如 ~/.ssh、~/.aws)
· 网络按需放行,必要时只允许白名单域名
· 文件写入限制在专用工作目录
· 超时与资源限额:防止长任务烧穿 Token 预算

为什么这么严格?Agent 由大模型驱动,模型可能被提示注入诱导去执行危险代码(如删文件、外传数据)。静态检查只能防「明面作恶」,防不了「绕弯作恶」。想系统掌握沙箱与隔离方案,必读本站《AI Agent 安全沙箱 E2B·Modal》。

常见问题速查

你遇到的现象大概率原因 & 解决
pip install nooa 报版本不支持确认 Python 是 3.12 或 3.13(3.11 及以下不兼容)
方法调用一直报错方法体留 ... 的方法必须有 LLM 补全能力,检查模型与 Key 配置
模型答非所问类 docstring 就是提示词,写清楚「你是谁、要做什么、输出格式」
不确定该交给模型还是写死规则明确、需要准确 → 普通 Python;需要理解、生成、判断 → 留 ...
担心 Agent 乱执行代码始终容器/VM 运行,配合权限最小化,参考 Step 6
← 返回教程中心