手写Agent循环别再造轮子!AWS开源Strands Agents开箱即用

文章目录

    • 前言
    • [1. 先说说"手写循环"这条不归路](#1. 先说说"手写循环"这条不归路)
      • [1.1 第一版:model.generate() + 工具调用](#1.1 第一版:model.generate() + 工具调用)
      • [1.2 然后噩梦开始](#1.2 然后噩梦开始)
    • [2. Strands 是干嘛的](#2. Strands 是干嘛的)
      • [2.1 分层设计:底座和组装分开](#2.1 分层设计:底座和组装分开)
    • [3. 快速上手](#3. 快速上手)
      • [3.1 最简 SDK 用法(Python)](#3.1 最简 SDK 用法(Python))
      • [3.2 最简 SDK 用法(TypeScript)](#3.2 最简 SDK 用法(TypeScript))
      • [3.3 用 Harness 直接拿生产级 Agent(Python)](#3.3 用 Harness 直接拿生产级 Agent(Python))
      • [3.4 用 Harness 直接拿生产级 Agent(TypeScript)](#3.4 用 Harness 直接拿生产级 Agent(TypeScript))
      • [3.5 不想写代码?也行](#3.5 不想写代码?也行)
    • [4. 核心特性拆解](#4. 核心特性拆解)
      • [4.1 分层但不锁死](#4.1 分层但不锁死)
      • [4.2 默认自带的生产级能力](#4.2 默认自带的生产级能力)
      • [4.3 模型切换像换皮肤](#4.3 模型切换像换皮肤)
      • [4.4 内置工具可以精细调整](#4.4 内置工具可以精细调整)
      • [4.5 子 Agent 委派:甩锅也要讲科学](#4.5 子 Agent 委派:甩锅也要讲科学)
      • [4.6 MCP 与 Web 访问原生支持](#4.6 MCP 与 Web 访问原生支持)
      • [4.7 Skills 与拦截机制](#4.7 Skills 与拦截机制)
    • [5. 项目剖析](#5. 项目剖析)
      • [5.1 create_harness() 参数清单就是一份"生产级清单"](#5.1 create_harness() 参数清单就是一份"生产级清单")
      • [5.2 上下文管理:摘要 + 外部化存储](#5.2 上下文管理:摘要 + 外部化存储)
      • [5.3 programmatic_tool_caller:让 Agent 自己写编排](#5.3 programmatic_tool_caller:让 Agent 自己写编排)
    • [6. 和手写循环的对比](#6. 和手写循环的对比)
    • [7. 总结与展望](#7. 总结与展望)
      • [7.1 核心要点回顾](#7.1 核心要点回顾)
      • [7.2 适合谁](#7.2 适合谁)
      • [7.3 一句话评价](#7.3 一句话评价)

P.S. 无意间发现了一个巨牛的人工智能教程,非常通俗易懂,对AI感兴趣的朋友强烈推荐去看看, 传送门https://blog.csdn.net/qq_34419312

前言

如果你是个写代码的,大概率经历过这么一幕:领导说"做个 AI Agent",你心想这还不简单,调个模型不就完事了吗。结果一周后你蹲在工位上,对着自己那 2000 行的"Agent 循环"陷入沉思------这玩意儿怎么长得跟九连环似的,越解越乱,越乱越不敢删。

今天聊的这个开源项目叫 Strands Agents,AWS 团队搞的,仓库名 harness-sdk。一句话版本:它把你手写 Agent 循环时迟早会长出来的那些基础设施提前做好,然后你一行代码就能拿到一个生产级 Agent。

1. 先说说"手写循环"这条不归路

1.1 第一版:model.generate() + 工具调用

刚写完第一版的时候,你觉得自己是个天才:模型会调工具了,未来已来,财富自由指日可待。

1.2 然后噩梦开始

对话变长 → 你手动截断历史,截着截着把关键信息截没了;

工具结果太大 → 你手写摘要逻辑往 prompt 里塞,写得比毕业论文摘要还认真;

要换模型供应商 → 你重写调用层和参数映射,一个供应商一套参数,你成功转型成"人肉参数翻译机";

要断点续聊 → 你实现会话存储,存了三天发现恢复逻辑有 bug,当场想格式化硬盘;

要记住用户偏好 → 你实现一套"记忆"存储,结果记忆没实现,你先失忆了。

每一步都是在重新发明基础设施,而且团队里每个人发明的还不一样,互相不兼容。这就像四个人各自造了一个轮子,结果造出来四个形状------有人造了方的,有人造了六边形的,只有一个人造了圆的,但这个人上周离职了,代码还注释得稀烂。

2. Strands 是干嘛的

2.1 分层设计:底座和组装分开

底层是 Strands SDK:模型驱动的 Agent 循环、工具系统、多模型支持,开箱即用;

上层是 Strands Harness:一次 create_harness() 调用,拿到一个配好了上下文管理、会话持久化、长期记忆、技能系统的"全副武装"Agent。

关键点来了:Harness 返回的仍然是普通的 strands.Agent,它帮你配的每一样东西你都能打开、修改、替换。翻译成人话:它给你做好了一桌菜,但你随时可以掀桌子自己炒。

3. 快速上手

3.1 最简 SDK 用法(Python)

复制代码
pip install strands-agents strands-agents-tools
from strands import Agent
from strands_tools import calculator
agent = Agent(tools=[calculator])
agent("What is the square root of 1764")

3.2 最简 SDK 用法(TypeScript)

复制代码
npm install @strands-agents/sdk
import { Agent } from '@strands-agents/sdk'
const agent = new Agent()
const result = await agent.invoke('What is the square root of 1764?')
console.log(result)

3.3 用 Harness 直接拿生产级 Agent(Python)

复制代码
pip install strands-harness
from strands_harness import create_harness
agent = create_harness()
agent("Find the slowest test in this repo and explain why it's slow")

3.4 用 Harness 直接拿生产级 Agent(TypeScript)

复制代码
npm install @strands-agents/harness
import { createHarness } from '@strands-agents/harness'
const agent = await createHarness()
await agent.invoke("Find the slowest test in this repo and explain why it's slow")

3.5 不想写代码?也行

直接装个 CLI:npm install -g @strands-agents/cli,得到一个 strands 终端命令,直接在终端里跟 Agent 对话。写代码的都懂:能少写一行是一行,能少写一个文件是一个,能在终端里解决的问题绝不打开浏览器。

4. 核心特性拆解

4.1 分层但不锁死

大多数 Agent 框架分两种:要么给你一堆原语让你自己拼,拼到怀疑人生;要么给你一个高度集成的黑盒,进去容易出来难。Strands 想两个都要:Harness 给你经过验证的默认配置,底层 SDK 随便你折腾,不用"逃离框架"这种代价高昂的重构。

4.2 默认自带的生产级能力

默认模型跑在 Amazon Bedrock 上的 Claude Opus;工具带 shell、文件读写、web_fetch、programmatic_tool_caller;上下文自动摘要旧轮次,大工具结果挪到外部存储只留引用;会话落盘到 ./.agent/sessions 可按 session id 恢复;长期记忆把用户偏好提炼成 Markdown 自动折回上下文;能缓存的地方全走缓存。

这一段翻译一下:别人家 Agent 要做的体检、挂水、办住院手续,它出厂之前全办好了。你拿到手的不是一个 Agent,是一个"拎包入住"。

4.3 模型切换像换皮肤

一个 provider/model 字符串的事,写法统一:

复制代码
create_harness(model="anthropic/claude-opus-5")
create_harness(model="openai/gpt-5.6-sol")
create_harness(model="bedrock/global.anthropic.claude-opus-5")  # 默认值

reasoning effort 也统一成一套等级(off/minimal/low/medium/high/xhigh/max),由 SDK 负责映射到各家供应商的参数。重点:如果某家供应商根本不提供你要的等级,SDK 直接抛错,绝不静默降级。这点很良心------有些框架你开了高强度推理,它假装开了,其实偷偷给你降档,跟奶茶店你点"三分糖"它永远给你做"全糖"一样离谱。等等,全糖是超预期,降档是反向超预期,这个属于"假预期"。

4.4 内置工具可以精细调整

传列表是"精确钉死",传字典是"在默认集合上增删改":

复制代码
create_harness(builtin_tools=["read"])                     # 只留 read
create_harness(builtin_tools={"subagent": False})          # 去掉子 Agent 委派
create_harness(builtin_tools={"web_fetch": {"model": "openai/gpt-5-mini"}})  # 给 web_fetch 单独配模型

4.5 子 Agent 委派:甩锅也要讲科学

内置 subagent 工具:模型自己判断什么时候该把活儿甩出去。子 Agent 继承主 Agent 的模型、工具、技能、拦截策略,能收窄父 Agent 授予的工具集,但不能扩大------这是一条安全边界。委派深度默认有上限,防止无限递归。

这个设计比某些公司里的甩锅文化先进多了:人家甩锅还带防火墙,你甩锅只带嘴。另一种是 Agent.as_tool(),把专用 Agent 包装成工具,适合固定角色,比如一个"只负责审查代码"的 reviewer,每次调用都是全新会话。两种可以共存:一个处理通用的探索型甩锅,一个处理专家型甩锅。

4.6 MCP 与 Web 访问原生支持

指向标准的 mcpServers 配置(JSON 文件或内联字典),Harness 自动连接每个 MCP 服务器、发现工具并加入工具列表。web_fetch 默认开启,web_search 视模型供应商是否原生支持自动开关,也可以显式接 Exa 做第三方搜索后端。

4.7 Skills 与拦截机制

把 Agent Skills 放进 ./.agent/skills 目录,Harness 自动加载;interventions 参数支持 "ask"、"smart" 或自定义策略字符串(甚至 .cedar 策略文件),在工具调用前设一道审批/校验闸门。

给 Agent 加审批闸门,像极了给公司加流程------是好事,但加多了,Agent 迟早学会写周报了。

5. 项目剖析

5.1 create_harness() 参数清单就是一份"生产级清单"

复制代码
create_harness(
    model="bedrock/global.anthropic.claude-opus-5",  # 模型供应商与型号
    effort="auto",                          # 推理强度
    instructions=None,                      # 附加到系统提示词的领域指令
    tools=None,                             # 自定义工具
    mcp_servers=None,                       # MCP 服务器配置
    plugins=None,                           # 自定义插件
    builtin_tools=None,                     # 内置工具集的增删改
    background_tasks=None,                  # 后台任务策略
    builtin_plugins=["todos", "environment"],  # 内置功能插件
    caching="auto",                         # 上下文缓存
    context_manager="auto",                 # 上下文管理策略
    session=True,                           # 会话持久化
    skills=True,                            # 技能加载
    memory=True,                            # 长期记忆
    interventions=None,                     # 工具调用拦截策略
    **agent_kwargs,
)

这份清单的思路很清楚:凡是"手写 Agent 循环最终都会长成"的能力------生命周期控制、上下文压缩、会话恢复、跨对话记忆、审批闸门------都被提前实现并给了经过验证的默认值,而不是留给每个使用者各自摸索。你摸索出来的东西大概率还没它默认的好,还带着你自己的 bug。

5.2 上下文管理:摘要 + 外部化存储

长任务里最容易失控的是上下文窗口。Harness 的默认策略是双管齐下:自动摘要较早的对话轮次,同时把体积大的工具结果(比如一次搜索返回的大量文件内容)挪到外部存储,只在上下文里留一个简短引用。

这个设计意味着任务跑多少轮,上下文都不会线性膨胀------真正需要引用旧结果时,Agent 按引用拉回来就行。相当于你写代码写到后面,不用把前面所有代码都背在脑子里,需要的时候翻一下。这玩意儿比有些同事的记性靠谱多了。

5.3 programmatic_tool_caller:让 Agent 自己写编排

这是一个沙箱,让 Agent 自己写代码来串联、循环、并行调用其他工具,而不是每次工具调用都走一遍"生成参数 → 执行 → 看结果 → 决定下一步"的完整推理循环。

对于"读取 50 个文件统计某个模式出现次数"这种批量、机械的操作,这种编排方式比逐个调用高效得多,也省了不必要的模型推理开销。说白了:能批量干的活就别一步一步来,跟人一样,能写个脚本循环就别手动复制粘贴五十遍。

6. 和手写循环的对比

从零手写 Agent 循环:上手慢,基础设施全靠重新发明,发明完还带专利纠纷(跟同事的实现不兼容);

只用底层 SDK:中等,循环和工具原语已就位,但上下文/会话/记忆得自己接入;

用 Strands Harness:快,一次调用拿到全套默认配置,返回值仍是原生 Agent,可逐项覆盖。

一句话总结这份对比:别人从零造轮子,你用 Harness 直接上高速,还自带导航。

7. 总结与展望

7.1 核心要点回顾

分层架构:底层 SDK 提供可完全自定义的 Agent 循环与工具原语,上层 Harness 提供一次调用即用的生产级默认配置,两层之间没有断层;

默认能力覆盖手写循环的常见痛点:上下文管理、会话持久化、长期记忆、缓存优化开箱即用;

多模型可移植性是一等公民:统一的 provider/model 语法和 reasoning effort 等级,切换供应商不用重写业务逻辑;

两种子 Agent 委派模式服务不同意图:内置 subagent 面向模型自主委派,Agent.as_tool() 面向工程师预设的专家角色;

AWS 团队主导:8,300+ Stars、1,200+ Forks、837 个 open issue。这个 issue 数量侧面说明它正在被真实使用,不是僵尸项目。

7.2 适合谁

打算自己写 Agent 循环、但还没写到会话/记忆/上下文压缩这一步的团队:可以直接跳过"重新发明基础设施"这个环节,省下来的时间够你多陪陪家人,或者多睡两个好觉;

需要在多个模型供应商之间保持灵活性的团队:统一的切换语法降低了供应商锁定风险,不用再当人肉参数翻译机;

想快速搭一个能处理长任务、多步骤操作的编码/运维 Agent 的开发者:默认工具集(shell、文件操作、编排沙箱)覆盖了大多数场景;

Python 与 TypeScript 混合栈的团队:两套 SDK API 设计一致,不用维护两套心智模型,省下的脑细胞干点别的。

7.3 一句话评价

Strands Agents 没有把"写一个 Agent"包装成一个封闭的黑盒,而是先老老实实把手写循环最终都会补的那些基础设施做好,再让你决定要不要拿它当起点。

总的来说,如果你正准备手写 Agent 循环,建议先看看 Strands------你写循环的样子,像极了上一家公司那个造了方轮子然后离职的前同事。少造一个轮子,世界就多一分和平,代码就少一分 bug。

P.S. 无意间发现了一个巨牛的人工智能教程,非常通俗易懂,对AI感兴趣的朋友强烈推荐去看看,传送门https://blog.csdn.net/qq_34419312

相关推荐
DeviceHub1 小时前
2026年硅电容市场观察:AI算力与汽车电子驱动下的选型与替代建议
人工智能·汽车
陈希瑞1 小时前
VoiceStudio 多场景语音应用落地指南
人工智能·语音识别
xhy_07071 小时前
AI 编程工具怎么选?Cursor、Copilot、Claude Code、Trae、WES Code 理解代码库的三条技术路线
人工智能·机器学习·copilot·知识图谱·ai编程·wes code
裕晟资质规划1 小时前
涉密场所物理隔离与技术防护体系:标准矩阵、审查校验点与常见缺陷分析
大数据·前端·网络·人工智能·经验分享
waoooqwe2 小时前
第三方问卷样本回收平台可靠吗:风险从哪来,怎么判断
大数据·人工智能
努力的骆驼2 小时前
【ANSYS】转子动力学分析指南(Rotordynamic Analysis Guide)第三章
人工智能·有限元·ansys·转子动力学
a努力。2 小时前
长期记忆如何让AI真正“记住你”
人工智能
深蓝学院2 小时前
任少卿时隔十年再出手:MM-Future让自动驾驶“走一步想十步”
人工智能·机器学习·自动驾驶