- 人工智能
- 大模型
- AI Agent
- Agent 框架
- 多智能体
- 工具调用
- MCP 服务
【免费下载链接】harness-sdk
Build an agent harness and control it end-to-end. Open-source SDK for production AI agents in Python & TypeScript - any model, any cloud.
Strands 是一个开源的生产级 AI Agent SDK(Python 与 TypeScript 双语言实现),本次发布聚焦 Python 侧的strands-py:把 TypeScript 版已成熟的内存管理器(Memory Manager)、Agentic 上下文管理与若干 vended 插件整体移植到 Python,同时为 Agent 新增memory_manager参数、为InMemoryStorage引入基于轮次的驱逐机制,并补齐多智能体边缘条件与模型调用中间件等底层能力。读完本文,你将掌握 v1.44.0 中记忆提取/注入的配置方式、auto/agentic上下文管理预设与策略管线的工作原理,以及本次发布在源码层面新增的关键实现细节。
发布概览:本次变更的三大主线
v1.44.0(2026-06-16,版本标签python/v1.44.0)共包含 20 余项变更,全部为breaking: false的兼容性更新,按领域可以归纳为三条主线:
- 上下文(Context):新增上下文管理预设设计文档、
InMemoryStorage支持按轮次驱逐(turn-based eviction)、消息固定(pinning)文档与相关修复、Agentic 上下文管理移植到 Python。 - 记忆(Memory):把 TypeScript 的内存管理器与提取子系统整体移植到
strands-py,Agent 新增memory_manager参数(支持同步自动冲刷),引入记忆注入(memory injection)并给出默认提取触发器。 - 多智能体与人机协作(Multiagent / HIL):边缘条件调用开始传递
invocation_state;移植GoalLoopvended 插件与HumanInTheLoopvended intervention;Python 侧新增 Cedar 授权处理器、Sandbox 与 Agent 的集成,以及针对InvokeModelStage的内部中间件系统。
此外还包括大量社区与工程治理变更:合并 PR 指南、统一开发者文档、为strands-py应用 ruff format 消除格式漂移、升级 esbuild / hono 修复审计问题等。
记忆管理全量移植:MemoryManager 与提取子系统
本次发布最核心的功能交付是 PR #2740「port memory manager and extraction to Python」——把记忆管理器和提取逻辑从 TypeScript 移植到 Python,落地于 memory_manager.py 与 extraction/ 目录。
Agent 新参数:memory_manager
PR #2795 为Agent增加了memory_manager参数,接受MemoryManager实例或MemoryManagerConfig字典(自动包装),并支持可配置的同步自动冲刷(sync auto-flush)。从 agent.py 的解析逻辑看:
- 传入
None时不启用记忆; - 传入
MemoryManager实例时直接使用; - 传入字典时按
MemoryManager(**memory_manager)包装。
在Agent(...)同步入口的每次调用结束后会等待memory_manager.flush()(见 agent.py),确保后台提取在会话边界前落盘;而自行驱动事件循环的调用方应在关闭边界手动await flush()。
MemoryManager 的三块核心能力
MemoryManager本身是一个Plugin(名称strands:memory-manager),构造函数接受四个参数(见 memory_manager.py):
| 参数 | 默认值 | 说明 |
|---|---|---|
stores | 必填 | 一个或多个记忆存储后端(MemoryStore),至少一个,且名称不得重复 |
search_tool_config | True | 注册search_memory工具;MemoryToolConfig可自定义名称/描述;False禁用 |
add_tool_config | False | 默认禁用add_memory工具;True允许写入全部可写存储;MemoryAddToolConfig限定范围 |
injection | True | 记忆上下文注入;MemoryInjectionConfig可自定义检索、时机与格式化;False禁用 |
初始化时会做一系列校验(见 memory_manager.py):空 stores、重复 store 名、可写但缺少写入方法的 store、提取配置指向不可写 store、有提取器却缺少add方法等都会抛出ValueError。
(1)检索工具search_memory:默认描述为 "Search long-term memory for facts, preferences, or context from previous conversations...",支持query、max_search_results、stores三个参数;省略stores时检索全部可用存储,结果按存储归属(store_name)返回。每个存储的默认最大结果数依次取调用方传入值、store 自身的max_search_results、全局默认DEFAULT_MAX_SEARCH_RESULTS = 3。
(2)写入工具add_memory:接受entries列表与可选的stores参数。MemoryAddToolConfig.wait_for_writes控制两种行为模式(见 memory_manager.py):
True(默认):等待写入完成,成功返回{"stored": n},失败抛出聚合错误AggregateMemoryError;False:fire-and-forget 后台派发,立即返回{"accepted": n},单存储失败仅记录日志。
(3)记忆注入injection:启用后注册一个InvokeModelStage.Input阶段的中间件,把检索到的记忆折叠进每次模型调用的输入,而不触碰持久化历史(见 memory_manager.py)。默认每次调用注入最多DEFAULT_MAX_ENTRIES = 5条,渲染为带source属性的<memory><entry source="store">...</entry></memory>XML 块;查询默认是自适应策略——用户轮取最新用户消息文本,否则取最近一条助手消息文本。自定义query/format回调抛异常时会 fail-open(跳过注入,不中断模型调用)。
提取子系统:触发器、提取器与协调器
提取(extraction)把对话消息自动转化为可检索的记忆条目,由四个模块协作:
- 触发器(triggers):决定"何时提取"。内置两种(见 triggers.py):
InvocationTrigger(每次 Agent 调用后触发,保真度最高但最贵——每次轮次都可能产生一次模型调用)与IntervalTrigger(turns=n)(每 n 次调用触发一次,被跳过的轮次由水位线补上)。PR #2811 为提取触发器补上了默认值:当ExtractionConfig省略trigger时,默认使用每 5 轮一次的IntervalTrigger(turns=5)(见 resolve_extraction_config.py)。 - 提取器(extractor):决定"如何提取"。
ModelExtractor用语言模型把消息蒸馏成离散事实,返回 JSON 数组{"content": string}(见 model_extractor.py);默认使用 Agent 自身的模型,可传入更便宜的模型以降低成本。 - 过滤器(filter):默认
MemoryMessageFilter(exclude=["toolUse", "toolResult"]),提取前剔除工具调用流量(见 types.py)。 - 协调器(coordinator):后台保存消息到各存储,维护每个 store 的高水位线(high-water mark)保证每条消息至多投递一次;连续失败 10 次后进入退避(backoff),退避期间每 3 次保存请求放行一次探测(见 coordinator.py)。
flush()绕过退避,清空所有剩余缓冲并等待完成。
默认提取器的选择与 store 的写入方法相关(见 resolve_extraction_config.py):只实现add的 store 默认配ModelExtractor做客户端侧提取;实现add_messages的 store 默认不配提取器,把原始消息直接交给后端做服务端侧提取,省掉模型调用。
MemoryStore 协议
记忆存储后端遵循MemoryStore协议(见 types.py):必实现search(query, options);可选实现add(单条写入)、add_messages(批量写入,带序列号上下文便于幂等去重)、initialize(异步初始化)与get_tools(注册存储专属工具)。可写 store 至少需要add或add_messages之一作为写入水槽。本次同时移植了BedrockKnowledgeBaseStore(PR #2834),并把传入的配置类型重构为 TypedDict(PR #2824、#2827、#2832),去掉了冗余的| None。
上下文管理:预设、Agentic 模式与内存驱逐
auto/agentic双预设
PR #2756 新增上下文管理预设设计文档,PR #2808 把 Agentic 上下文管理移植到 Python。Agent的context_manager参数支持两种预设字符串、配置字典、ContextManager实例或False(见 context_manager.py):
"auto":在上下文利用率达 85%(_AUTO_SUMMARIZE_UTILIZATION = 0.85)时做汇总;工具结果超过阈值(1500 token)时截断为 750 token 预览。这是默认策略管线:Offload.truncate("tool_results", ...).when(threshold=1500)+Offload.summarize("*").when(utilization=0.85, preserve_recent=4)。"agentic":由模型驱动的上下文管理——通过注入工具让模型自主决定压缩,截断阈值提高到 8000 token,汇总仅在溢出(utilization=1)时发生。
两种模式都会在策略管线末尾追加EmergencyTruncateStrategy作为最终保险:先跑用户策略,若窗口仍然溢出则紧急截断(见 context_manager.py)。
从 agent.py 可见,agentic模式还会额外注入 token 用量中间件,用于向模型反馈调用预算。需要提醒的是:当context_manager被设置(非False)时,任何同时传入的conversation_manager会被忽略(context_manager.py);context_manager与conversation_manager均不能与有状态模型(stateful model)共用(agent.py)。
策略预设:可组合的命名积木
除了两大整体预设,策略数组还支持四个命名积木(见 presets.py),可混入自定义策略管线:
| 预设名 | 展开后的策略 |
|---|---|
proactive_summarization | 利用率达 70% 时批量汇总最旧消息,保留最近 70% |
large_tool_offloading | 超过 2500 token 的工具结果截断为 1000 token 预览 |
overflow_protection | 上下文窗口满时截断最旧消息,保留最近 4 条 |
stale_tool_cleanup | 丢弃早于最近 5 条消息的工具结果 |
文档明确指出:预设名是稳定契约,其展开阈值可能在版本间调整;需要钉死具体配置时应使用原始Offload.*策略。相关测试覆盖见 test_presets.py(含未知预设抛ValueError的断言)。
InMemoryStorage 按轮次驱逐
PR #2648 为上下文卸载器(context-offloader)的InMemoryStorage增加了基于轮次的驱逐(turn-based eviction):当会话轮次超过配置上限时自动驱逐最旧条目,避免 L1 stash 无界增长。这与策略管线中的stash机制配套——ContextManager默认用InMemoryStorage作为 L1 stash(可传stash=False禁用、传字典自定义存储或检索工具开关,见 context_manager.py),并提供一个retrieval_tool让模型从 stash 中找回被压缩的内容。
消息固定(Pinning)
PR #2749 在会话管理文档中新增了消息固定(message pinning)章节,PR #2767 移除了 pin messaging 的 barrel 导出(修复导出面)。固定消息在策略执行时受到保护:从 base.py 可见,逐块截断的 eager hook 与消息级清除都会用is_pinned(...)跳过被固定消息,保证用户"钉住"的关键内容不会被压缩策略移除。
模型调用中间件与多智能体边缘条件
InvokeModelStage 内部中间件系统
PR #2760 为InvokeModelStage新增了内部中间件系统,这也正是记忆注入得以实现的底层机制:记忆管理器通过_middleware_registry.add_middleware(InvokeModelStage.Input, ...)在模型输入阶段挂钩(见 memory_manager.py)。中间件在每次模型调用前拿到当前消息上下文,可以追加文本(如记忆条目)、修改输入,而不改动持久化会话历史。这一设计与 TypeScript 版对齐,为后续更多输入/输出阶段的钩子扩展预留了统一入口。
边缘条件传递invocation_state
PR #2642 让多智能体(multiagent)的**边缘条件(edge condition)**调用开始接收invocation_state:在图(graph)/群(swarm)执行中,决定是否沿某条边继续执行的条件回调此前只能读取静态上下文,现在可以拿到当前调用状态(轮次、消息等),据此做出动态路由决策——例如"仅在上一跳产生工具调用时继续"这类依赖执行状态的判断。
vended 插件与集成:GoalLoop、HumanInTheLoop、Sandbox 与 Cedar
本次发布将多个 vended 组件移植/新增到 Python:
- GoalLoop 插件(PR #2738):面向"目标循环"式执行的 vended 插件,配套文档一同落地,覆盖 [hooks, structured-output] 领域。
- HumanInTheLoop intervention(PR #2750):把 TypeScript 的人机协作干预移植到 Python,支持在工具执行前请求人工审批/修改(HIL 场景)。
- Cedar 授权处理器(PR #2802):Python 侧新增基于 Cedar 策略语言的工具授权处理器,与团队设计文档 0006-cedar-authorization.md 相呼应,可在工具执行前按策略决定放行或拒绝。
- Sandbox 与 Agent 集成(PR #2762、#2835):Sandbox 沙箱能力集成进
Agent,并提供配套的 vended 工具/插件。 - InterventionHandler 生命周期(PR #2800):允许干预处理器(
InterventionHandler)的生命周期覆写(lifecycle overrides)为同步或异步两种形态,兼容两种风格的事件循环。
社区与工程治理
工程侧本次也做了大量清理:合并 PR 指南并更新 pr-writer skill(#2772)、统一开发者文档目录(#2791)、为仓库各模块补CLAUDE.md(#2809)、对strands-py应用 ruff format 修复既有漂移(#2799)、抑制大文本载荷测试的冗长日志(#2773)、移除 lockfile 漂移检查以放行 Dependabot 与审计修复(#2841)、升级 hono 至 4.12.25 修复高危审计失败(#2843),并新增Syntax组件用于文档中内联语言相关标识符(#2751)。
升级与使用指引
安装/升级到最新版本后即可获得上述能力(本次为strands-agents1.44.0):
pip install --upgrade strands-agents最简记忆接入示例(与 memory_manager.py 文档字符串一致):
from strands import Agent from strands.memory import MemoryManager memory_manager = MemoryManager(stores=[my_store]) agent = Agent(model=model, memory_manager=memory_manager) agent("Remember I prefer dark mode") results = await memory_manager.search("user preferences")启用上下文管理预设:
agent = Agent(model=model, context_manager="auto") # 85% 利用率时主动汇总 + 截断 agent = Agent(model=model, context_manager="agentic") # 模型驱动压缩 + 溢出兜底由于全部变更均为非破坏性(breaking: false),存量代码无需改动即可升级;但请注意:记忆提取的默认触发器、策略预设的阈值属于"内部默认值",可能在后续版本调整,依赖精确行为时应显式配置ExtractionConfig或原始Offload.*策略。
小结
v1.44.0 是strands-py在上下文与记忆两条主线上向 TypeScript 版看齐的重要里程碑:memory_manager参数与提取/注入子系统的落地让 Python Agent 首次具备开箱即用的跨会话记忆;auto/agentic预设与策略管线让上下文压缩可声明式配置;而中间件、边缘条件与 vended 插件的补齐则夯实了多智能体与人机协作的生产可用性。若需深入源码,建议从 memory_manager.py、_context_manager/context_manager.py 及其配套测试目录strands-py/tests/strands/入手。
- 人工智能
- 大模型
- AI Agent
- Agent 框架
- 多智能体
- 工具调用
- MCP 服务
【免费下载链接】harness-sdk
Build an agent harness and control it end-to-end. Open-source SDK for production AI agents in Python & TypeScript - any model, any cloud.
相关推荐
strands-ts SDK v1.0.0-rc.5 发布解读:Monorepo 重组、上下文窗口配置与多智能体会话增强
strands ts SDK v1.0.0 rc.5 发布解读:Monorepo 重组、上下文窗口配置与多智能体会话增强 本篇技术指南以 strands ts(
人工智能大模型AI AgentAgent 框架多智能体工具调用MCP 服务Strands Python SDK v1.57.0 发布解读:双向流式音频、MCP Router、快照会话与多智能体增强
Strands Python SDK v1.57.0 发布解读:双向流式音频、MCP Router、快照会话与多智能体增强 导读 本文基于 Strands Py
人工智能大模型AI AgentAgent 框架多智能体工具调用MCP 服务Strands Python SDK v1.41.0 深度解析:MultiAgentPlugin 多智能体插件体系与缓存能力升级
Strands Python SDK v1.41.0 深度解析:MultiAgentPlugin 多智能体插件体系与缓存能力升级 导读 本文围绕 strands
人工智能大模型AI AgentAgent 框架多智能体工具调用MCP 服务
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考