
人工智能大模型AI AgentAgent 框架多智能体工具调用MCP 服务【免费下载链接】harness-sdkBuild an agent harness and control it end-to-end. Open-source SDK for production AI agents in Python TypeScript - any model, any cloud.项目地址https://gitcode.com/GitHub_Trending/sdkpython13/harness-sdk点击查看免费下载导读本文基于 strands-agents Python SDK当前仓库 strands-py 目录对应的开源实现v1.30.0 版本的官方变更日志展开逐条剖析该版本在模型缓存、工具序列化、会话持久化、结构化输出、MCP 集成与 Agent 取消机制等方向的关键改动。读者将了解每个改动背后的源码实现原理、适用场景与配置方式并可直接对照仓库源码验证。本仓库同时包含同版本 TypeScript SDKstrands-ts与 CLI、文档站点等配套实现本文聚焦 Python SDK 的 v1.30.0 变更。版本概览v1.30.0 变更全貌v1.30.0 发布于 2026-03-11对应 tagpython/v1.30.0共包含 15 条变更feature 与 fix 均有涉及均标记为non-breaking无破坏性变更。按影响领域归类如下领域变更条目类型Model / Prompt Cache新增anthropic缓存策略绕过模型 ID 检查featModelMistral 流式模式上报用量指标fixTool工具结果尽可能序列化为 JSONfeatTool新增公开tool_specsetterfeatStructured Outputsummary manager 使用结构化输出fixMCPMCPClient 暴露 InitializeResult 中的 server instructionsfeatSessiondirty flag 跳过不必要的 agent 状态持久化featSession优化 session manager 初始化featSession各 initialize_* 方法末尾重置_is_new_sessionfixAgent新增 CancellationToken 实现优雅取消featAgentAgent skills 以插件形式提供featAgent打破循环引用避免 MCPClient 场景下清理挂起fixHooksAfterInvocationEvent 新增 resume 标志featSteeringsteering 从 experimental 转为生产可用featTelemetry增加 LANGFUSE_BASE_URL 附加属性检查fixOpenAI Responses多轮对话 assistant 消息使用 output_textfix此外本次版本迎来了 4 位新贡献者ShotaroKataoka、jgoyani1、jackatorcflo、giulio-leone说明项目社区在持续扩展。以下按主题深入展开每一项改动。模型与提示缓存新增 anthropic 缓存策略背景缓存策略与模型 ID 检查的冲突v1.30.0 的第一条 feature 是add anthropic cache strategy to bypass model ID checkPR #1808。要理解这条改动需要先回顾 SDK 的缓存设计。在 Anthropic 模型实现 anthropic.py 中缓存策略通过模型配置中的cache_config.strategy控制取值集合为(auto, anthropic)外加一个不启用的取值返回 None 即禁用。此前版本的 SDK 在用户显式指定缓存策略时仍会做模型 ID 检查——即确认当前模型是否在已知支持提示缓存的模型清单内。随着 Anthropic 不断发布新模型这种硬编码清单会频繁落后于上游导致用户使用新模型时明明设置了缓存策略却被拒之门外。本次改动新增的anthropic策略语义正是绕过模型 ID 检查让缓存行为直接按 Anthropic API 的 cache_control 协议执行而不再依赖本地清单判断。源码层面的印证从 anthropic.py 的_resolve_tools_cache方法可以看到工具定义缓存tools cache的生效条件是if cache_config.tools_ttl is False or cache_config.strategy not in (auto, anthropic): return None即strategy为auto或anthropic时才允许生成 cache_control 载荷。而在 消息缓存点管理 的_manage_cache_points中对未知策略会打印告警并直接禁用缓存if cache_config.strategy not in (auto, anthropic): logger.warning(strategy%s | unknown cache strategy, prompt caching disabled, cache_config.strategy) return messages, None因此anthropic策略与auto的差别在于auto需要 SDK 自行推断模型是否支持缓存涉及模型 ID 检查而anthropic假定用户已确认目标模型支持 Anthropic 官方提示缓存SDK 直接发送 cache_control 指令跳过检查。对于模型清单更新不及时的新模型或自托管兼容端点应使用anthropic。配置示例from strands import Agent agent Agent( model{ provider: anthropic, model: claude-sonnet-4-5, cache_config: { strategy: anthropic, # 显式采用 anthropic 协议绕过模型 ID 检查 ttl: 5m, # 缓存存活时间如 5m、1h tools_ttl: 1h, # 工具定义缓存的 TTLFalse 可禁用工具缓存 }, }, )关于cache_config的更多字段语义ttl为字符串形式的时间跨度如5m、1h由_format_cache_control转成 Anthropic 的cache_control载荷tools_ttl未设置None时回退到已废弃的模型级cache_tools配置以保证旧配置兼容详见 anthropic.py 的_resolve_deprecated_cache_tools。相关缓存点位置优化同版本另一条相关改动是place cache point on last user message instead of assistantPR #1821。此前缓存点可能落在 assistant 消息上本次将其固定在最后一条 user 消息并清理多余缓存点。从 缓存点管理逻辑 可以看到实现方式反向扫描找到最后一个不带cachePoint的 user 消息作为唯一缓存点载体其余缓存点全部剥离剥离时会记录 warning避免每个 turn 都往 API 的共享缓存预算里叠加缓存点。两条改动共同优化了多轮对话下的提示缓存命中率。工具结果 JSON 序列化让模型更容易解析改动内容serialize tool results as JSON when possiblePR #1752工具函数的返回值在返回给模型前会尽可能序列化为 JSON。此前非字符串返回值往往被直接str()转换导致 dict、list、Pydantic 模型等结构丢失类型信息模型解析不稳定。源码印证在 decorator.py 的 _wrap_tool_result 中可以看到完整的格式化链路# Result is already in the expected format, just add toolUseId if isinstance(result, dict) and status in result and content in result: result[toolUseId] tool_use_d return ToolResultEvent(...) else: # Serialize to JSON for consistent, parseable output (except strings) if isinstance(result, str): text result elif isinstance(result, BaseModel): try: text result.model_dump_json() except PydanticSerializationError: text str(result) else: try: text json.dumps(result, ensure_asciiFalse) except (TypeError, ValueError): text str(result) return ToolResultEvent({toolUseId: ..., status: success, content: [{text: text}]}, ...)序列化优先级依次为已是标准格式dict 且含status/content原样透传仅补toolUseId字符串原样返回不再做 JSON 转义Pydantic BaseModel使用model_dump_json()输出保证 schema 字段名与结构完整其他可 JSON 序列化对象json.dumps(result, ensure_asciiFalse)输出保留非 ASCII 字符可读性序列化失败TypeError/ValueError回退到str(result)。这套JSON 优先、失败回退的策略显著提升了工具结果的结构化程度——模型拿到的 dict 型数据可以直接按字段解析而不是面对一段str(dict)的 Python 语法文本。实践建议工具返回 Pydantic 模型或 dict 时无需自行json.dumpsSDK 会代为处理避免双重编码需要返回非 JSON 友好的对象时建议在工具内部先转成 dict 或字符串确保可预测的序列化结果若工具返回的 dict 已含status与content字段即标准 ToolResult 结构将按原样透传此时请自行保证 content 结构符合预期。工具规范动态更新新增公开 tool_spec setter改动内容add public tool_spec setterPR #1822为函数式工具strands.tools.function_tool装饰器生成的FunctionTool新增公开的tool_specsetter允许在运行时动态修改工具描述与输入 schema。源码印证在 decorator.py 中tool_spec此前只有 getter本次新增了 setterproperty def tool_spec(self) - ToolSpec: Get the tool specification. return self._tool_spec tool_spec.setter def tool_spec(self, value: ToolSpec) - None: Set the tool specification. This allows runtime modification of the tools schema, enabling dynamic tool configurations based on feature flags or other runtime conditions. if value.get(name) ! self._tool_name: raise ValueError( fcannot change tool name via tool_spec (expected {self._tool_name}, got {value.get(name)}) ) for field in (description, inputSchema): if field not in value: raise ValueError(ftool_spec must contain {field}) self._tool_spec valuesetter 内置了两条校验规则工具名不可变更tool_spec[name]必须与工具注册名一致否则抛ValueError防止通过改名破坏 Agent 与工具的绑定关系必需字段校验必须包含description与inputSchema两个字段。典型场景from strands.tools import function_tool function_tool def get_discount(product_id: str) - dict: 查询商品折扣。 ... # 运行时按 feature flag 动态调整描述与 schema if feature_flags.get(new_pricing): get_discount.tool_spec { name: get_discount, description: 查询商品折扣新定价体系。, inputSchema: { type: object, properties: { product_id: {type: string}, region: {type: string, description: 可选区域编码}, }, required: [product_id], }, }这一能力特别适合灰度发布、按租户定制 schema、或在运行时根据上下文收敛工具参数集合等场景。同类tool_spec属性也存在于 structured_output_tool.py 与 mcp_agent_tool.py 等实现中但本次 setter 主要面向函数式工具开放。结构化输出修复summary manager 的兼容性summary manager using structured outputPR #1805类型 fix会话摘要管理器summary manager在使用结构化输出structured output时存在兼容问题本版本修复。摘要管理属于会话上下文管理的一部分当对话过长时SDK 会基于历史消息生成摘要以压缩上下文对应 context_compression.py 与_context_manager/methods/summarize.py的实现。修复后开启结构化输出约束的 Agent 在调用摘要生成时可以正确解析模型返回的结构化摘要结果避免摘要阶段与主 Agent 的 output schema 约束相互干扰。对于生产环境启用结构化输出例如强制模型按 JSON Schema 输出并同时依赖长会话摘要能力的用户建议升级到本版本验证摘要链路。MCP 集成暴露 server instructionsexpose server instructions from InitializeResult on MCPClientPR #1814MCPModel Context Protocol客户端在握手阶段会收到服务端返回的InitializeResult其中可包含服务端提供的instructions使用指引。本次改动让这些 instructions 通过MCPClient对象暴露给上层使 Agent 或调用方能够感知远端服务的初始化指令。从实现看SDK 的 MCP 客户端位于 mcp_client.py支持 MCP 工具注册、调用与结果处理含 elicitation/InputRequiredResult 等交互式流程。拿到 server instructions 后开发者可以将服务端指令注入系统提示让 Agent 在调用 MCP 工具前了解服务端的使用约定在日志或 UI 中展示服务端的能力说明在协议层做能力探测例如服务端是否要求特定参数格式。会话管理性能与状态持久化的三重优化dirty flag跳过不必要的持久化add dirty flag to skip unnecessary agent state persistencePR #1803会话状态持久化前先检查脏标记若 Agent 状态在本轮没有实际变化例如只读查询、无状态变更的对话则跳过写盘显著降低高频对话场景下的 I/O 开销。对于以文件或数据库为后端的会话仓库对应 storage 模块与 session 模块下的 session manager 实现这一优化能直接减少每次 turn 的状态序列化与写入。优化 session manager 初始化optimize session manager initializationPR #1829精简了 session manager 启动阶段的初始化路径减少不必要的加载或预计算加快 Agent 冷启动。_is_new_session 状态重置Setis_new_session False at the end of each initialize* methodPR #1859此前在某些initialize_*路径下新会话标记可能残留为 True导致后续会话被误判为新会话触发多余的初始化或状态分支逻辑。本次修复统一在各类初始化方法末尾将_is_new_session重置为 False保证会话语义一致性。升级后建议回归验证新会话首轮 vs 恢复会话的行为差异如欢迎提示、记忆初始化等。Agent 取消机制CancellationToken 优雅取消add CancellationToken for graceful agent execution cancellationPR #1772来自新贡献者 jgoyani1为 Agent 执行新增 CancellationToken用于在任务取消时提供优雅的协作式取消路径——即取消不是粗暴中断而是让正在执行的步骤有机会在安全点收尾。从仓库源码结构看取消/中断相关能力分散在 agent.py、_continuation.py 与 event_loop 等模块中agent.py中可见cancel()相关的任务取消处理如a cancelled task never resumes into internal.set()的注释见 agent.py事件循环层在 event_loop.py 与 _retry.py 中管理执行与重试。CancellationToken 的引入让调用方可以在不破坏 Agent 内部状态机的前提下发起取消适用于前端用户点击停止生成超时控制N 秒未完成即取消多 Agent 编排中某个子任务失败后取消其余任务。HooksAfterInvocationEvent 新增 resume 标志add resume flag to AfterInvocationEventPR #1767钩子hooks系统中的AfterInvocationEvent新增resume字段。该字段用于表达钩子请求以新输入恢复 Agent。在 agent.py 的钩子处理 中可以看到如下调用链if has_continuation or after_invocation_event.resume is not None: if after_invocation_event.resume is not None: logger.debug(resumeTrue | hook requested agent resume with new input) self._interrupt_state.resume(after_invocation_event.resume) current_messages await self._convert_prompt_to_messages(after_invocation_event.resume)即钩子可以通过设置resume触发一次带新输入的 Agent 恢复流程其语义与_interrupt_state.resume()agent.py一致适用于工具调用需要人工补充输入interrupt→ 用户提供回答 → 钩子代为恢复 Agent等场景。若 resume 输入不是合法的中断响应格式将按_interrupt_state.resume()的约定抛TypeError。Hooks 相关事件定义位于 hooks/events.py。配套修复打破 Agent 与 MCPClient 的循环引用break circular references so Agent cleanup doesnt hang with MCPClientPR #1830Agent 持有 MCPClient而 MCPClient 内部又反向引用 Agent如作为工具回调形成循环引用导致 GC 清理时挂起cleanup hang。本次修复通过打破循环引用保证 Agent 析构/清理流程能正常完成。对于重度使用 MCP 工具的生产 Agent该修复避免了下线/重建 Agent 时的资源泄漏与挂起。Agent Skills以插件形式落地add agent skills as a pluginPR #1755将 Agent skills 能力实现为插件plugin形态纳入 SDK 的插件体系。插件机制在 SDK 中位于 plugins 与 vended_plugins 目录后者提供官方预制插件集合。Skills 插件化的意义在于按需加载不启用 skills 的 Agent 无需加载相关代码与提示词组合复用与 goal、steering 等插件按需组合仓库中可见 vended_plugins/goal/plugin.py 等同类实现统一配置通过插件注册机制接入 Agent 的配置与初始化流程。启用方式遵循 SDK 通用插件配置入口具体以 strands-py 的 README 与 AGENTS.md 中的插件说明为准。Steering从 experimental 走向生产move steering from experimental to productionPR #1853steering引导/干预能力从experimental包迁移至生产包。仓库中 experimental/steering 目录下的模块现已标注为 Deprecated如__init__.py中的 Deprecated: Steering has moved to strands.vended_plugins.steering实际生产实现位于 vended_plugins/steering包含core/handler.py/core/action.py/core/context.pysteering 的核心处理器、动作与上下文handlers/llm/基于 LLM 的 steering 处理器llm_handler.py与mappers.pycontext_providers/ledger_provider.py基于账本ledger的上下文提供者。迁移建议使用 steering 的旧代码应从strands.experimental.steering.*迁移到strands.vended_plugins.steering.*命名空间experimental 侧保留__getattr__兼容转发但官方推荐直接使用生产路径。steering 常用于对 Agent 的对话方向、决策倾向做运行时引导是 v1.30.0 中少数由实验转正的能力值得重点跟进。模型与遥测修复Mistral 流式模式用量上报report usage metrics in streaming modePR #1697Mistral 模型在流式streaming模式下此前不会上报 token 用量指标本次修复补齐。涉及实现位于 models/mistral.py。升级后使用 Mistral 流式输出的项目可以在遥测中得到完整的 usage输入/输出 token数据用于成本核算与用量监控。多轮对话 assistant 消息修复use output_text for assistant messages in multi-turn conversationsPR #1851来自新贡献者 giulio-leoneOpenAI Responses API 在流式场景下assistant 消息文本应取自output_text字段对应 models/openai_responses.py 的实现此前多轮对话中可能使用了不正确的字段导致消息内容丢失或错位。修复后OpenAI Responses 模型在连续多轮对话中的历史消息保持完整、顺序正确。遥测LANGFUSE_BASE_URL 检查added LANGFUSE_BASE_URL check for additinoal attributePR #1826遥测链路对应 telemetry 模块新增对LANGFUSE_BASE_URL环境变量的检查用于为遥测 span 附加额外属性。Langfuse 是常用的 LLM 可观测性后端SDK 通过环境变量配置其上报端点本次改动确保在设置了LANGFUSE_BASE_URL的情况下相关附加属性被正确携带。使用 Langfuse 追踪 Agent 运行的用户升级后建议核对环境变量配置与上报的 span 属性。升级建议与验证清单v1.30.0 全部 15 条变更为非破坏性non-breaking可平滑升级。建议按以下清单验证缓存若使用 Anthropic 新模型将cache_config.strategy设为anthropic验证缓存生效观察日志中缓存点剥离 warning 与 API 缓存命中工具结果检查现有工具返回值在日志中的展示确认 dict/Pydantic 结果已变为 JSON 文本而非str()输出会话验证多轮对话状态持久化的 I/O 行为dirty flag 生效以及新会话/恢复会话的首轮行为差异_is_new_session修复MCP确认 Agent 创建/销毁不再挂起循环引用修复并检查 MCPClient 是否可读取 server instructionsSteering如使用旧 experimental 命名空间按迁移路径切换至vended_plugins.steering取消如已有超时/停止需求接入 CancellationToken 做一次端到端取消验证遥测核对 Mistral 流式用量上报与 Langfuse 附加属性。相关实现与测试可直接在仓库中继续探索strands-py/src核心实现、strands-py/tests单元测试、strands-py/tests_integ集成测试。对应 TypeScript 侧 SDK 位于 strands-tsCLI 位于 strands-cli文档站点源码位于 site。赞分享人工智能大模型AI AgentAgent 框架多智能体工具调用MCP 服务【免费下载链接】harness-sdkBuild an agent harness and control it end-to-end. Open-source SDK for production AI agents in Python TypeScript - any model, any cloud.项目地址https://gitcode.com/GitHub_Trending/sdkpython13/harness-sdk点击查看免费下载相关推荐如何用Akagi在30天内从麻将新手晋升为战略高手终极AI辅助指南 ️如何用Akagi在30天内从麻将新手晋升为战略高手终极AI辅助指南 ️ 你是否曾在雀魂对局中感到迷茫看着手中的牌无从下手或者明明感觉能胡牌却总是差那人工智能大模型AI AgentAgent 框架多智能体工具调用MCP 服务Hindsight × Strands Agents SDK 集成指南为 Strands Agent 赋予跨会话的持久记忆Hindsight × Strands Agents SDK 集成指南为 Strands Agent 赋予跨会话的持久记忆 本技术指南围绕 Hindsight人工智能AI AgentAgent 记忆MCP 服务Xinference 1.8.0版本模型缓存机制升级解析Xinference 1.8.0版本模型缓存机制升级解析 Xinference作为一款开源的模型推理服务框架在1.8.0版本中进行了重要的架构升级特别是对模模型推理服务大模型人工智能本地部署LLM 网关后端上一篇knowledge-catalog 语义模型未绑定 SQL 执行器解读 actions_place_order.sql_unbound.skill.golden.md 的 Skill 生成行为下一篇三步跑通 PCSX2 构建配置从源码编译到玩上 PS2 老游戏创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考