导语
过去两年,Agent 框架的复杂度一路膨胀:LangChain 给了你链(chains),LlamaIndex 给了你索引(indexes),CrewAI 给了你团队(crews)。要用它们跑通一个小任务,开发者往往得先内化一整套全新的心智模型——图怎么画、YAML 怎么配、回调链怎么接。
本周,NVIDIA Labs 把这套繁文缛节一刀砍断,开源了 NOOA(NVIDIA Object-Oriented Agents):它最核心的宣言只有一句——Agent 不是图,不是链,也不是 YAML 流水线,而是一个 Python 类。项目以 Apache 2.0 协议发布在 NVIDIA-NeMo/labs-OO-Agents,并随 NVIDIA 37 成员组成的 Open Secure AI Alliance 一同亮相。

一、一个类,就是一支 Agent 团队
NOOA 的设计可以用一张精确到"一一对应"的映射表来概括:
- Class = Agent 本身
- Method = 模型可以执行的动作
- Field = 跨步骤持久化的 Agent 状态
- Docstring = 该动作的提示词
- Type annotation = 运行时会强制执行的契约
换句话说,你不再需要单独的 tool 注册表、不再手写 JSON schema、不再维护一份游离的系统提示词、不再画图的边。一个类,就是以上全部。
最"简单到近乎粗暴"的巧思,藏在方法体里:
- 写一个方法体为
...,运行时会由一个 LLM 驱动的循环来补全它; - 写一个普通的方法体,它就老老实实跑确定性的 Python,不调用任何模型。
python
from nooa import agent, llm
@agent
class TriageBot:
"""Triages incoming bug reports for a Python web service."""
open_issues: list[str] = []
@llm
def classify(self, report: str) -> str:
"""Return exactly one of: 'crash', 'perf', 'ux', 'security'."""
...
@llm
def draft_reply(self, report: str, category: str) -> str:
"""Write a two-sentence acknowledgement for the reporter."""
...
def record(self, report: str) -> None:
# 确定性代码,绝不调用模型
self.open_issues.append(report)
这里有三件事在真正起作用:-> str 的返回类型被强制校验——模型哪怕"心情不好"想塞个 dict 进来,运行时也不会答应;docstring 就是提示词,紧贴着它管辖的签名,而不是漂在某个单独文件里;而 record 是普通 Python,所以 append 永远只发生一次,无论模型怎么折腾。
NOOA 真正的论点就藏在这最后一点:大多数 Agent 的 bug 不是模型失败,而是编排失败——本该确定性的东西,被错误地路由进了一个语言模型。NOOA 让确定性路径成为默认,模型路径变成显式的 opt-in。
二、253 行代码,跑出 SWE-bench 82.2%
让人意外的是,这种"极简"并非牺牲了能力。一个仅 253 行 的 NOOA Agent,在 SWE-bench Verified 上拿下了 82.2%(使用 GPT-5.5、xhigh effort),高于 OpenCode 的 78.6% 和 PI 的 78.2%;即便换成 Claude Opus 4.6,也有 79.8%。
关键在于"类型注解即契约"——可靠性收益很大一部分来自这里,而不是来自更复杂的编排。当输入输出都被强类型约束,模型"自由发挥"的空间被压缩,出错率自然下降。

这也是 NOOA 与 LangGraph / CrewAI 那类"图式框架"最大的区别:调试 Agent 不再需要去翻五个文件找提示词漂移,而是 pdb.set_trace()、cProfile、pytest——你从学 Python 第一天就在用的那套。Agent 终于"像普通软件一样"可测试、可追踪、可重构。
三、模型无关,且必须沙箱
NOOA 从设计上就是模型无关的:它不绑定任何单一供应商,正好呼应了本期《大模型开始像打补丁一样发布》里那个结论——当引擎可以随时换掉,框架层的"可移植性"才是护城河。
但也有一个绕不开的安全前提:NOOA 允许执行 LLM 生成的 Python 代码,所以沙箱不是可选项,而是必选项。官方明确建议配合 NVIDIA OpenShell 这类隔离环境运行,并在执行前做 AST 校验、施加模块 deny-list——这些只是"纵深防御",而非真正的 containment 边界。
四、结语
NOOA 的流行,本质上是对过去两年 Agent 框架"过度抽象"的一次反拨:开发者想要的,不是去配置一条流水线,而是写一段能顺手调用大模型的 Python。
当 Agent 回归成一个普通的 Python 类,"一个类就是一支团队"不再是一句口号,而是真的可以 pytest 的对象。对于 prototyping、做实验,或者教别人 Agent 概念而不必先学一套私有框架的怪癖——这大概正是生态此刻最需要的那块拼图。