Command Palette
Search for a command to run...
NVIDIA-labs OO Agents:原生 Python 面向对象智能体
NVIDIA-labs OO Agents:原生 Python 面向对象智能体
摘要
传统的智能体开发被分割为提示模板、工具模式、回调代码和工作流图。我们提出 NVIDIA 面向对象智能体(NOOA,或称 NVIDIA 双 O 智能体),这是一个与模型无关的 Python 框架,用于构建可靠的 AI 智能体。NOOA 采用了一种更简洁的方法:一个智能体就是一个 Python 对象。其方法即模型可执行的动作,字段即其状态,文档字符串即其提示,类型注解即其契约。代码体为 ... 的方法会在运行时由 LLM 驱动的智能体循环补全,而具有正常代码体的方法则保持标准的确定性 Python 逻辑。这为开发者和智能体提供了相同的接口,因此智能体的行为可以像其他软件一样被测试、追踪、重构和改进。本文做出了三项贡献。(1)我们提出了“智能体即 Python 对象”的编程模型及其背后的设计原则。在 Python 已有抽象之处,我们直接采用:智能体是类,能力是方法,类型注解是契约,异步工作使用 asyncio,工具和编排就是普通的 Python 代码。智能体特有的能力——上下文、事件、状态渲染、长期记忆和经过验证的 LLM 循环——通过简洁的 Pythonic API 暴露出来,因此开发者和智能体共享一个熟悉的编程模型。(2)我们识别出六个面向模型的设计理念,据我们所知,NOOA 是首个将它们整合在单一界面上的框架:类型化的输入/输出、基于活跃对象的引用传递、代码即动作、可编程循环工程、显式对象状态,以及用于上下文和事件的模型可调用装备 API。通过调研十四个智能体框架和装备,我们发现社区已经在其中几个理念上趋同——通常以实验性或部分功能的形式出现——我们呈现此比较以鼓励进一步采纳。(3)我们证明,当前模型能够有效使用此接口,无论是在针对性的能力测试中,还是在 SWE-bench Verified 和 Terminal-Bench 2.0 上;在 ARC-AGI-3 交互式推理基准上,该接口将一个多智能体世界模型系统压缩为一个具备单页技能的单一智能体,同时推进了该基准的得分-成本帕累托前沿。
一句话总结
NVIDIA 推出了 NOOA(NVIDIA Object-Oriented Agents),一个与模型无关的 Python 框架,将 agent 视为 Python 对象,其带有省略号(ellipsis)体的方法在运行时由 LLM 驱动的 agent 循环完成,并首次将类型化 I/O、基于活动对象的传引用、代码即动作、可编程循环工程、显式对象状态以及模型可调用的框架 API 组合到一个 Pythonic 界面中,并在 SWE-bench Verified、Terminal-Bench 2.0 和 ARC-AGI-3 交互式推理基准上展示了其有效性,在得分–成本帕累托前沿上取得了进展。
核心贡献
- 引入了一种 agent 即 Python 对象的编程模型,其中 agent 是一个 Python 类,方法作为动作,字段作为状态,文档字符串作为提示,类型注解作为契约,直接采用现有的 Python 抽象。
- 确定了六项面向模型的设计原则(类型化输入/输出、通过活动对象传引用、代码即动作、可编程循环工程、显式对象状态和模型可调用的框架 API),NOOA 是首个在单一界面上整合这些原则的框架,并调查了十四个 agent 框架,表明这些理念正在趋同。
- 证明了当前模型能有效使用该接口,在 SWE-bench Verified 和 Terminal-Bench 2.0 上取得了强劲结果,并在 ARC-AGI-3 上将多 agent 世界模型系统压缩为一个带有单页技能的单一 agent,同时推进了得分–成本帕累托前沿。
引言
AI Agent 开发工具包的激增带来了大量针对工具、记忆、工作流和状态的自定义抽象,但这些框架往往迫使开发者重新学习在普通编程语言中已有成熟对应物的概念,例如类型化接口、变量作用域和控制流。Agent 源代码被分散在提示模板、模式、配置文件以及编排逻辑中,增加了复杂性和学习曲线。作者提出了 NVIDIA Object-Oriented Agents (NOOA),一个将 agent 视为单一 Python 类的框架。通过使用 Python 的原生结构来处理动作、状态和控制流,并通过简单的 Pythonic API 暴露 agent 专属特性(如上下文构建和事件历史),NOOA 消除了对单独工作流语言或重度序列化接口的需求。这种设计将提示工程转变为一门软件工程学科,使 agentic 软件成为普通软件,人类和编程 agent 都可以阅读、测试和改进它。
方法
作者利用标准 Python 抽象来构建 NOOA 框架,将 agentic 循环重新定义为类型化方法调用,而非非结构化的文本交换。通过将确定性工作移出 agentic 循环,并允许模型编写普通的 Python 代码,该系统利用了模型现有的编程知识。
Agent 循环与策略 一个 NOOA agent 是一个 Python 对象,通过类型化方法暴露模型可调用的行为。控制流保持为普通的 Python,直到执行到达一个 agentic 方法,该方法由省略号(ellipsis)体表示。此时,框架将该方法实现为一个 agent 循环。作者通过策略来实现这些 agentic 方法,策略以装饰器形式声明,以控制执行、上下文渲染和输出验证。
提供了两种主要策略。PredictStrategy 是一种用于分类或抽取的单次方法,根据 Python 返回类型验证输出。CodeActStrategy 将其泛化为一个迭代的 Python 读取-求值-打印循环(REPL)。在这种模式下,模型可以调用 execute_python 进行计算、检查状态或调用辅助函数,重复直到调用 return_result 并返回一个类型验证过的值。
如下图所示:
框架首先渲染上下文,调用 LLM,如果选择,则执行 Python 动作,并更新事件和状态。一旦成功值被记录,就会返回给调用者。
上下文渲染与管理 CodeAct 回合的第一步是将实时 Python 执行状态渲染到模型上下文中。作者将上下文分为三个区域:静态上下文块(仅计算一次)、记录执行踪迹的事件历史,以及在每次模型调用前重新计算的动态上下文块。
如下图所示:
ContextManager 和 EventManager 填充这些区域。静态块包含系统提示等稳定信息。事件历史是仅追加的类型化事件序列。动态块包含变化的信息,例如待办事项列表。这种布局最大限度地实现了跨回合的 KV 缓存重用。
上下文管理被集成到面向对象的 API 中,允许开发者和 agent 通过 Pythonic 原语与上下文交互。
如下图所示:
一个关键特性是传引用。参数以实时 Python 对象的形式传递。模型看到的是参数的有限预览,包括其类型和长度,但会在执行环境中操作完整的对象。这使得 agent 可以处理受执行环境限制而非上下文窗口限制的数据。
执行与状态更新 当模型选择 Python 动作时,NOOA 在一个受限会话中执行代码。方法参数和实时 agent 被注入为局部变量。危险的 API 会被拒绝,输出被捕获为结构化结果。在每次响应或执行之后,框架将类型化事件追加到事件管理器中。状态更新遵循标准的 Python 作用域规则,REPL 局部变量仅在方法调用期间持续存在。
长时记忆 为了应对跨任务的迁移,作者引入了一个可选的长时记忆子系统。Agent 通过使用 remember、recall 和 search 等模型可调用的工具,通过有意的动作来编写自己的记忆。
如下图所示:
记忆通过有意的查询和一个 BeforeTurn 钩子到达模型,该钩子将关联记忆注入到一个动态上下文块中。检索根据相关性、新近度和重要性对候选项进行排序。异步反思在 agent 循环外部运行,以合并重复项、调和冲突并修剪衰减的记忆。整个存储驻留在一个 SQLite 文件中,并从中派生出向量索引。
实验
评估包括有针对性的能力测试,证实模型能够流畅地使用 NOOA 接口,而压力测试则揭示了在多步批处理、错误恢复和任务分解方面仍存在的挑战。在软件工程、终端交互、网络安全和交互式推理上的端到端基准测试表明,NOOA agent 的表现优于同类开源框架,并且通常能与专业的闭源系统相匹敌甚至超越,类型化终止防止了过早完成,内存中的对象状态减少了 token 使用。在 ARC-AGI-3 上,一个带有世界模型技能的单一 agent 相比原始模型取得了大幅度领先,展示了强大的框架效应。总体而言,这些结果表明,将 agentic 结构表达为原生软件抽象消除了接口摩擦,并带来了高效、有竞争力的 agent。
当前一代模型在接口上表现出很强的流畅性,在 4,400 条测试记录中总体通过率为 97.9%。前沿模型几乎饱和了整个测试套件,而小模型仍然超过 91%,但在需要 agentic 簿记和错误恢复的压力测试上,差距急剧扩大。大型/前沿模型通过了所有记录的 99.2%,GPT-5.5 取得了满分。在类似 agentic 工作的压力测试中,总体通过率降至 84.7%,规模差距从 3.2 个百分点扩大到 23 个百分点。
要求 agentic 行为(如批量簿记、错误恢复和迭代探索)的压力测试揭示了小模型和大模型之间扩大的能力差距。虽然两组在整体接口通过率上都很高,但小模型在压力子集上的表现大幅下降,而大模型则保持稳健,在细化、任务分解和 REPL 探索上取得了满分。大模型通过了 93.9% 的压力记录,而小模型仅通过了 70.8%,整体差距从 3.2 个百分点扩大到该子集上的 23 个百分点。情感批量处理是对两组来说最困难的压力测试,小模型仅通过 40%,大模型达到 76.7%。大模型在细化、任务分解和 REPL 探索上取得了满分,而小模型在相同测试上的通过率在 55% 到 90% 之间。错误恢复是唯一一个小模型几乎与大模型持平的压力测试,通过率分别为 95% 和 96.7%。
在 SWE-bench Verified 上,NOOA 在所有评估模型和推理努力配置下,在比较的开源框架中取得了最高的通过率。GPT-5.5 在最大推理努力下达到 82.2%,超过了之前公开排行榜上使用专用 agent 的 79.2% 的最先进水平。使用 Opus 4.6,NOOA 达到 79.8%,而 OpenCode 和 PI 的得分大约在 75–76% 之间。NOOA 在所有配置下始终优于 OpenCode 和 PI,在最低推理努力下绝对差距最大(例如,GPT-5.5 off 时 67.2% 对比 59.2–60.8%)。NOOA 的最高分(GPT-5.5 xhigh 时 82.2%)超过了之前专用 agent 的 SOTA 79.2%。
在 Terminal-Bench 2.0 上,NOOA 在所有测试的模型和推理配置下,在开源框架中取得了最高的通过率。GPT-5.5 在 xhigh 推理努力下达到 73.0%,优于 OpenCode 和 PI,使用 Opus 4.6 在标准和 high 设置下也处于领先地位。NOOA 搭配 GPT-5.5 在 high 和 xhigh 推理努力下均达到 73.0% 的通过率,在 high 努力下超过 OpenCode 12 个百分点以上。使用 Opus 4.6,NOOA 在 high 推理努力下达到 65.2%,而 OpenCode 为 43.8%,PI 为 58.4%。在最低的 GPT-5.5 推理努力下,NOOA 达到 46.1%,而 OpenCode 和 PI 分别为 34.8% 和 37.1%。
在 CyberGym L1 漏洞发现基准测试中,NOOA agent 达到了 86.8% 的解决率,成为得分最高的开源解决方案。它超越了大多数闭源 agent,只有两个专有系统得分更高。该架构的解构和简化为此验证阶段的强劲表现做出了贡献。NOOA 是排名第一的开源 agent,超过了包括 Anthropic Glasswing 和 OpenAI Daybreak 在内的大多数闭源替代方案。该 agent 的解决率显著超过了基线 OpenAI Codex agent 及其提交技能变体,证明了其架构方法的优势。
评估首先在广泛的接口套件和需要 agentic 簿记与错误恢复的压力测试上测量模型的通过率,发现虽然小模型和大模型都能很好地处理基本接口任务,但在 agentic 压力任务上性能差距急剧扩大,大模型保持稳健而小模型表现挣扎。随后,NOOA 开源框架在 SWE-bench Verified、Terminal-Bench 2.0 和 CyberGym L1 漏洞发现基准上得到验证,始终在开源框架中取得最高分,并经常超越之前最先进的专用 agent 和许多闭源系统。