構(gòu)化輸出、多智能體鉤子與 MCP 連接管理)
人工智能大模型AI AgentAgent 框架多智能體工具調(diào)用MCP 服務(wù)【免費(fèi)下載鏈接】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.項(xiàng)目地址https://gitcode.com/GitHub_Trending/sdkpython13/harness-sdk點(diǎn)擊查看免費(fèi)下載本指南圍繞 python/v1.14.0 變更日志 展開(kāi)系統(tǒng)梳理 Strands Agents Python SDK 1.14.0 的 16 項(xiàng)變更覆蓋結(jié)構(gòu)化輸出進(jìn)入主 Agent 循環(huán)、實(shí)驗(yàn)性 AgentConfig 工具管理、多智能體鉤子與序列化、LiteLLM 推理控制、Bedrock 限流重試等核心能力。閱讀完本文你將掌握本次版本中每個(gè)新特性/修復(fù)的 API 用法、底層實(shí)現(xiàn)原理以及如何在自己的 Agent 應(yīng)用中落地這些能力。版本概覽與變更全景Strands Agents Python SDK 1.14.0 發(fā)布于 2025-10-29共包含 16 項(xiàng)變更含 6 個(gè) feature、2 個(gè) fix 與若干重構(gòu)/測(cè)試清理全部為非破壞性變更breaking: false可安全升級(jí)。按領(lǐng)域劃分領(lǐng)域變更類(lèi)型modelLiteLLM start/stop reasoning 支持#947othertool實(shí)驗(yàn)性 AgentConfig 工具管理#935feattelemetry/otelinvoke_agent span 改為 INTERNAL spanKind#1055fixmultiagent多智能體鉤子 序列化/反序列化#1070featstructured-output結(jié)構(gòu)化輸出進(jìn)入 Agent 循環(huán)#943featmodelBedrock ThrottlingException 重試修復(fù)#1096fixmcpToolProvider 管理的實(shí)驗(yàn)性 Agent 連接#895featmodel最新消息含 ToolUse 時(shí)跳過(guò)模型調(diào)用#1068feattool直接工具調(diào)用禁止 interrupt#1097、無(wú)效工具用法發(fā)送時(shí)轉(zhuǎn)換#1091other/fixmodelLiteLLM 結(jié)構(gòu)化輸出處理增強(qiáng)#1021fixmisc無(wú) tool_use 時(shí)不中斷退出#1087、MCP elicitation#1094、PR size labeler#1082—本次版本還迎來(lái)了兩位新貢獻(xiàn)者mr-lee#935與 Arindam200#1021。結(jié)構(gòu)化輸出成為 Agent 循環(huán)的一等公民v1.14.0 最核心的變化#943現(xiàn)在只需在創(chuàng)建 Agent 或調(diào)用時(shí)直接傳入structured_output_model。新 API 用法from pydantic import BaseModel from strands import Agent class WeatherReport(BaseModel): city: str temperature_c: float conditions: list[str] # 方式一構(gòu)造 Agent 時(shí)聲明默認(rèn)輸出模型 agent Agent( modelanthropic/claude-sonnet-4-5, tools[web_search], structured_output_modelWeatherReport, ) # 方式二單次調(diào)用時(shí)覆蓋默認(rèn)模型 result await agent.run( 查詢上海的天氣, structured_output_modelWeatherReport, structured_output_prompt請(qǐng)以 JSON 結(jié)構(gòu)返回天氣信息, ) weather result.structured_output # 直接拿到 WeatherReport 實(shí)例相關(guān)簽名定義見(jiàn) agent.pyrun()與run_async()均新增了structured_output_model與structured_output_prompt兩個(gè)參數(shù)后者可覆蓋 Agent 級(jí)默認(rèn)提示詞。底層實(shí)現(xiàn)真實(shí)工具而非旁路魔法與許多 SDK 把結(jié)構(gòu)化輸出做成隱藏的解析層不同Strands 將其實(shí)現(xiàn)為一個(gè)真實(shí)的 AgentTool。核心類(lèi)StructuredOutputTool位于 structured_output_tool.py構(gòu)造時(shí)接收一個(gè) PydanticBaseModel子類(lèi)通過(guò)convert_pydantic_to_tool_spec()將其轉(zhuǎn)換為工具 schema并帶緩存_TOOL_SPEC_CACHE避免重復(fù)轉(zhuǎn)換工具描述被強(qiáng)制改寫(xiě)為should only be invoked as the last and final tool before returning the completed result引導(dǎo)模型在完成任務(wù)后最后一次調(diào)用它工具名即 Pydantic 模型類(lèi)名便于模型理解輸出契約。運(yùn)行期狀態(tài)由StructuredOutputContext管理_structured_output_context.py它負(fù)責(zé)register_tool/cleanup在 Agent 循環(huán)開(kāi)始/結(jié)束時(shí)向 ToolRegistry 注冊(cè)或移除結(jié)構(gòu)化輸出工具set_forced_mode(tool_choice)當(dāng)需要強(qiáng)制模型輸出時(shí)可注入 tool_choice 強(qiáng)制調(diào)用store_result/get_result/extract_result按 tool_use_id 暫存并取回解析結(jié)果供循環(huán)結(jié)束后寫(xiě)入AgentResult.structured_output。schema 轉(zhuǎn)換邏輯位于 structured_output_utils.py支持嵌套 Pydantic 模型、$defs引用展開(kāi)等復(fù)雜結(jié)構(gòu)。同時(shí)LiteLLM 模型提供器也增強(qiáng)了結(jié)構(gòu)化輸出處理#1021 中實(shí)現(xiàn)了structured_output()當(dāng)?shù)讓幽P椭С謗esponse_schema時(shí)走原生結(jié)構(gòu)化生成路徑supports_response_schema判斷否則自動(dòng)回退到工具調(diào)用路徑_structured_output_using_tool保證跨模型行為一致。實(shí)驗(yàn)性 AgentConfig從 JSON 聲明式創(chuàng)建 Agent由新貢獻(xiàn)者 mr-lee 提交的 AgentConfig。支持的配置字段配置文件是一個(gè) JSON 對(duì)象通過(guò)內(nèi)置的 JSON Schema 校驗(yàn)AGENT_CONFIG_SCHEMA使用預(yù)編譯的jsonschema.Draft7Validator提升性能字段類(lèi)型說(shuō)明namestring | nullAgent 名稱默認(rèn)nullmodelstring | null模型 ID不指定時(shí)使用默認(rèn)模型promptstring | null系統(tǒng)提示詞為 Agent 提供高層上下文toolsarraystring工具列表文件路徑、Python 模塊名或文件中tool注解的函數(shù)注意additionalProperties: False未知字段會(huì)被拒絕。使用方式from strands.experimental.agent_config import config_to_agent # 從文件創(chuàng)建支持 file:// 前綴 agent config_to_agent(/path/to/config.json) # 從字典創(chuàng)建 config { model: anthropic.claude-3-5-sonnet-20241022-v2:0, tools: [calculator, path/to/my_tool.py], } agent config_to_agent(config) # 配置聲明式的工具加載不覆蓋所有場(chǎng)景 # 需要構(gòu)造參數(shù)的復(fù)雜工具仍需代碼實(shí)例化后手動(dòng)注冊(cè) agent.tool_registry.process_tools([ToolWithConfigArg(HttpsConnection(localhost))])config_to_agent()支持傳入**kwargs透?jìng)鹘o Agent 構(gòu)造器文件不存在拋FileNotFoundError非法 JSON 拋json.JSONDecodeError校驗(yàn)失敗或工具加載失敗拋ValueError。從源碼結(jié)構(gòu)看該能力被設(shè)計(jì)為實(shí)驗(yàn)性入口strands/experimental命名空間正式化之前 API 可能調(diào)整。多智能體鉤子與狀態(tài)序列化#1070 為多智能體編排器補(bǔ)齊了兩項(xiàng)能力完整的生命周期鉤子以及可序列化的編排器狀態(tài)。多智能體生命周期鉤子鉤子事件定義在 hooks/events.py核心事件包括MultiAgentInitializedEvent編排器初始化完成攜帶source: MultiAgentBaseBeforeMultiAgentInvocationEvent編排器整體調(diào)用前觸發(fā)AfterMultiAgentInvocationEvent編排器整體調(diào)用后觸發(fā)BeforeNodeCallEvent/AfterNodeCallEvent單個(gè)節(jié)點(diǎn)Agent 或子編排器調(diào)用前后觸發(fā)。測(cè)試用例 test_multi_agent_hooks.py 驗(yàn)證了 Swarm 與 Graph 兩種編排器的完整鉤子生命周期Swarm 依次觸發(fā) initialized → before node → after node → before invocation → after invocation 等事件Graph 則在節(jié)點(diǎn)級(jí)事件之上疊加編排級(jí)事件。from strands.hooks import ( BeforeMultiAgentInvocationEvent, AfterMultiAgentInvocationEvent, ) from strands import Swarm def on_before(event: BeforeMultiAgentInvocationEvent) - None: print(fswarm about to run: {event.source}) swarm Swarm(agents[agent_a, agent_b]) swarm.add_hook(on_before, BeforeMultiAgentInvocationEvent)需要留意的是舊的strands.experimental.hooks.multiagent模塊已標(biāo)記 Deprecated見(jiàn) experimental/hooks/multiagent/events.py并提示使用strands.hooks新代碼應(yīng)直接導(dǎo)入新命名空間。編排器狀態(tài)序列化同一 PR 在 multiagent/base.py 為MultiAgentBase新增了serialize_state()與deserialize_state(payload)兩個(gè)接口snapshot orchestrator.serialize_state() # 返回 JSON 可序列化的狀態(tài)字典 orchestrator.deserialize_state(snapshot) # 從會(huì)話字典恢復(fù)編排器狀態(tài)從源碼結(jié)構(gòu)看基類(lèi)以raise NotImplementedError占位由具體編排器Graph、Swarm子類(lèi)實(shí)現(xiàn)用于支持會(huì)話持久化與斷點(diǎn)恢復(fù)場(chǎng)景。NodeResultbase.py也提供了to_dict()/from_dict()統(tǒng)一了 Agent 結(jié)果與嵌套 MultiAgentResult 的 JSON 往返表示。MCPToolProvider 管理的 Agent 連接與 elicitation實(shí)驗(yàn)性 Agent 托管連接#895此前 MCP 客戶端需要開(kāi)發(fā)者手動(dòng)創(chuàng)建并注冊(cè)工具v1.14.0 引入的實(shí)驗(yàn)性能力#895允許 Agent 通過(guò)ToolProvider接口托管 MCP 連接生命周期。ToolProvider是定義在 tools/tool_provider.py 的抽象基類(lèi)聲明了三個(gè)抽象方法class ToolProvider(ABC): abstractmethod async def load_tools(self, **kwargs) - Sequence[AgentTool]: ... abstractmethod def add_consumer(self, consumer_id, **kwargs) - None: ... abstractmethod def remove_consumer(self, consumer_id, **kwargs) - None: ...MCPClientmcp_client.py正是ToolProvider的一個(gè)實(shí)現(xiàn)它通過(guò)load_tools()暴露 MCP 工具并利用 consumer 計(jì)數(shù)管理連接引用。而Agent的tools參數(shù)agent.py接受ToolProvider實(shí)例實(shí)現(xiàn)Agent 用則連、不用則釋放的托管式連接。from strands.tools.mcp import MCPClient client MCPClient( server_namegithub, commanduvx, args[mcp-server-github], ) # 傳入 Agent 后由 Agent 托管加載與釋放 agent Agent(modelanthropic/claude-sonnet-4-5, tools[client])集成測(cè)試 test_mcp_client.py 覆蓋了連接復(fù)用test_can_reuse_mcp_client、超時(shí)下連接穩(wěn)定性test_mcp_client_connection_stability_with_client_timeout、內(nèi)嵌資源test_mcp_client_embedded_resources_with_agent等關(guān)鍵場(chǎng)景。MCP elicitation#1094同一迭代周期還加入了 MCP elicitation#1094支持——即模型在調(diào)用 MCP 工具前可先通過(guò)引出流程獲取所需參數(shù)。這通常表現(xiàn)為在工具調(diào)用前插入一輪詢問(wèn)式交互用于補(bǔ)充上下文不足的參數(shù)。該能力與 ToolProvider 連接管理配合共同完善 MCP 工具鏈的交互閉環(huán)。LiteLLM 推理reasoning控制與流式處理#947通過(guò)LiteLLMConfig透?jìng)鲄?shù)from strands.models.litellm import LiteLLMModel model LiteLLMModel( model_idopenai/o1-mini, # 或 anthropic/claude-sonnet-4-5 等任意 LiteLLM 支持的模型 params{ max_tokens: 4096, # 推理控制參數(shù)在此透?jìng)魅?reasoning_effort / budget_tokens 等 }, streamTrue, )值得指出的是LiteLLM 提供器對(duì)流式輸出的處理已經(jīng)相當(dāng)完善_process_choice_contentlitellm.py會(huì)從響應(yīng)塊中識(shí)別reasoning_content并將其作為獨(dú)立的reasoning_content數(shù)據(jù)流事件輸出對(duì)于 Gemini 推理模型還會(huì)提取reasoningContent.reasoningText生成 thinking 塊并將 thought signature 嵌入工具調(diào)用 ID 中_THOUGHT_SIGNATURE_SEPARATOR機(jī)制見(jiàn) litellm.py。這意味著升級(jí)到 1.14.0 后推理模型的思考過(guò)程與最終回答可以在流式事件中分別消費(fèi)。Agent 循環(huán)的穩(wěn)健性修復(fù)本版本有一組針對(duì) Agent 主循環(huán)的健壯性修復(fù)值得單獨(dú)說(shuō)明跳過(guò)冗余模型調(diào)用#1068當(dāng)最新一條消息已包含 ToolUse時(shí)Agent 循環(huán)會(huì)直接執(zhí)行工具而跳過(guò)模型調(diào)用避免重復(fù)把工具調(diào)用序列回傳給模型造成浪費(fèi)。這在高頻工具調(diào)用場(chǎng)景下能顯著減少 token 消耗與延遲。無(wú) tool_use 時(shí)不中斷退出#1087修復(fù)了一個(gè)邊界情況當(dāng)循環(huán)中沒(méi)有任何tool_use需要執(zhí)行時(shí)例如模型回復(fù)純文本或空調(diào)用不再提前 bail out中斷退出而是讓循環(huán)按正常路徑收斂到最終結(jié)果避免因沒(méi)有工具結(jié)果而異常終止。無(wú)效工具用法延遲轉(zhuǎn)換#1091工具用法的規(guī)范化transform時(shí)機(jī)從檢測(cè)到無(wú)效用法時(shí)立即處理改為發(fā)送給模型時(shí)再轉(zhuǎn)換。這樣中間狀態(tài)保持原始語(yǔ)義只在與模型交互的邊界上做一次統(tǒng)一轉(zhuǎn)換減少狀態(tài)漂移。直接工具調(diào)用禁止 interrupt#1097當(dāng)通過(guò)Agent.run_tools()等入口直接調(diào)用工具不經(jīng)模型決策時(shí)interrupt 不再被允許——因?yàn)榇藭r(shí)沒(méi)有模型上下文可恢復(fù)中斷語(yǔ)義不成立。這屬于行為約束而非新功能。OpenTelemetryinvoke_agent span 語(yǔ)義修正#1055 修正了 Agent 調(diào)用鏈路的 OpenTelemetry span 語(yǔ)義invoke_agentspan 的span_kind從默認(rèn)值改為SpanKind.INTERNAL。對(duì)應(yīng)實(shí)現(xiàn)位于 tracer.pyspan self._start_span( finvoke_agent {agent_name}, attributesattributes, span_kindtrace_api.SpanKind.INTERNAL, # 內(nèi)部調(diào)用而非 CLIENT/SERVER )該 span 攜帶gen_ai.agent.name、gen_ai.request.model、gen_ai.agent.tools等屬性tracer.py。語(yǔ)義修正后Agent 編排過(guò)程在 trace 中被正確歸類(lèi)為應(yīng)用內(nèi)部操作避免與外部模型/服務(wù)調(diào)用SpanKind.CLIENT見(jiàn) tracer.py混淆從而讓依賴 span kind 的采樣器、可視化與成本分析工具能更準(zhǔn)確地識(shí)別 Agent 調(diào)用。Bedrock 限流Throttling重試修復(fù)#1096 修復(fù)了 Bedrock 模型提供器對(duì)限流異常的識(shí)別此前僅匹配部分大小寫(xiě)變體導(dǎo)致某些 Throttling 響應(yīng)被當(dāng)作普通錯(cuò)誤處理而非可重試的限流。修復(fù)后的邏輯位于 bedrock.pyexcept ClientError as e: error_message str(e) if ( e.response[Error][Code] ThrottlingException or e.response[Error][Code] throttlingException ): raise ModelThrottledException(error_message) from eModelThrottledException會(huì)被上層重試機(jī)制識(shí)別并觸發(fā)退避重試而其他異常如上下文溢出會(huì)映射為ContextWindowOverflowException則走各自路徑。同一文件中還包含工具結(jié)果回合分離_separate_tool_result_turns針對(duì) Bedrock ValidationException與 guardrail 內(nèi)容脫敏等配套處理bedrock.py共同保證生產(chǎn)環(huán)境下的 Bedrock 調(diào)用穩(wěn)定性。其他值得注意的工程改動(dòng)interrupt docstring 格式修復(fù)#1074修正interrupt相關(guān)文檔字符串的排版純文檔性質(zhì)集成測(cè)試清理#1045interrupts 集成測(cè)試移除asyncio標(biāo)記PR size labeler#1082倉(cāng)庫(kù) CI 新增 PR 規(guī)模自動(dòng)打標(biāo)幫助維護(hù)者按變更規(guī)模分級(jí)評(píng)審。升級(jí)建議與注意事項(xiàng)結(jié)構(gòu)化輸出如果你在使用Agent.structured_output()方法建議遷移到run(..., structured_output_model...)參數(shù)形式舊方法已標(biāo)記 deprecatedagent.py多智能體鉤子若你依賴strands.experimental.hooks.multiagent請(qǐng)遷移至strands.hooks舊模塊會(huì)觸發(fā) DeprecationWarningAgentConfig屬于實(shí)驗(yàn)性 APIstrands.experimental工具加載僅支持聲明式文件路徑/模塊名/tool 函數(shù)需要構(gòu)造參數(shù)的復(fù)雜工具需在創(chuàng)建后手動(dòng)注冊(cè)推理模型LiteLLM 提供器的推理控制與思考流事件需要streamTrue才能完整觀測(cè)MCP 托管連接MCPClient作為T(mén)oolProvider傳入 Agent 時(shí)連接生命周期由 Agent 托管注意 consumer 計(jì)數(shù)語(yǔ)義同一客戶端可被多個(gè) Agent 共享見(jiàn)test_can_reuse_mcp_client。本版本整體聚焦于讓結(jié)構(gòu)化輸出、多智能體編排與 MCP 工具鏈真正可生產(chǎn)化同時(shí)通過(guò)一系列循環(huán)穩(wěn)健性修復(fù)與可觀測(cè)性修正降低了長(zhǎng)時(shí)運(yùn)行 Agent 的失敗率。建議結(jié)合 tests_integ/mcp 與 tests/strands/hooks 下的集成/單元測(cè)試進(jìn)一步理解各特性的邊界條件與預(yù)期行為。贊分享人工智能大模型AI AgentAgent 框架多智能體工具調(diào)用MCP 服務(wù)【免費(fèi)下載鏈接】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.項(xiàng)目地址https://gitcode.com/GitHub_Trending/sdkpython13/harness-sdk點(diǎn)擊查看免費(fèi)下載相關(guān)推薦從 harness-sdk TypeScript SDK v0.5.0 看多智能體組件、結(jié)構(gòu)化輸出與 MCP 客戶端重構(gòu)從 harness sdk TypeScript SDK v0.5.0 看多智能體組件、結(jié)構(gòu)化輸出與 MCP 客戶端重構(gòu) 本文基于 harness sdk 倉(cāng)庫(kù)人工智能大模型AI AgentAgent 框架多智能體工具調(diào)用MCP 服務(wù)MCP Python SDK 結(jié)構(gòu)化輸出完全指南返回類(lèi)型注解即輸出 SchemaMCP Python SDK 結(jié)構(gòu)化輸出完全指南返回類(lèi)型注解即輸出 Schema 導(dǎo)讀 本指南聚焦 Model Context ProtocolMCPPy人工智能MCP 服務(wù)MCP ClientsMCP Ruby SDK輸入輸出模式詳解處理結(jié)構(gòu)化數(shù)據(jù)的最佳實(shí)踐MCP Ruby SDK輸入輸出模式詳解處理結(jié)構(gòu)化數(shù)據(jù)的最佳實(shí)踐 MCP Ruby SDK是Model Context Protocol的官方Ruby開(kāi)發(fā)工具M(jìn)CP 服務(wù)MCP Clients人工智能工具調(diào)用創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考