主流 Agent 框架通常由「提示词模板 + 回调图」组成,学起来绕、调起来更绕。NVIDIA 在 2026 年 8 月 9 日开源的 NOOA(Apache 2.0)给出一个极简答案:Agent 就是一个 Python 类——方法就是动作,字段就是状态,docstring 就是提示词。它开源即登顶关注榜,SWE-bench Verified 82.2%。本教程带你把第一个 NOOA Agent 跑起来,并讲清它「像管软件一样管 Agent」的设计哲学。
先搞懂:NOOA 的「类即 Agent」是什么哲学?
NOOA 的核心创新是结构性的:Agent 不是一堆提示词模板和回调图,而是一个普通的 Python 类。在这个类里:
| 类元素 | 在 NOOA 中的角色 |
|---|---|
| docstring(类文档) | Agent 的系统提示词——告诉模型它是什么、该怎么做 |
| 方法(methods) | Agent 可以执行的动作;方法体是 ... 的由 LLM 在运行时补全 |
| 字段(fields) | Agent 的状态——记忆、中间结果、配置都放这里 |
| 普通方法体 | 确定性 Python 代码——不走模型,逻辑绝对可控 |
和传统框架比:传统框架把提示词、状态、动作、回调分散在多个文件里;NOOA 把它们收进一个类,像普通软件一样可测试、可追踪、可版本控制。但注意:NOOA 目前是 v0.0.8 alpha,适合学习与原型,生产使用前请评估稳定性。
Step 1:安装环境
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__)"
Step 2:配置模型连接(LiteLLM)
# 方式一:环境变量(推荐,密钥不进代码)
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")
Step 3:写第一个「类式 Agent」
写一个能「总结文本并统计字数」的 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 会用工具(把动作加进类)
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:像管软件一样测试与版本控制
因为 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 文档
Step 6:安全红线——AST 检查不是沙箱
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 |