ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Microsoft Agent Framework 如何为 Agent 启用 CodeAct 代码执行沙箱?

Microsoft Agent Framework 如何为 Agent 启用 CodeAct 代码执行沙箱? Microsoft Agent Framework 如何为 Agent 启用 CodeAct 代码执行沙箱【免费下载链接】agent-frameworkA framework for building, orchestrating and deploying AI agents and multi-agent workflows with support for Python and .NET.项目地址: https://gitcode.com/GitHub_Trending/age/agent-framework如果你的 Agent 需要执行模型生成的代码做数据转换、串联多次工具调用而不是每步都回到模型侧发起一轮 function callMicrosoft Agent Framework 提供 CodeAct 能力模型只看到一个execute_code工具生成的代码在受控沙箱中运行并通过call_tool(...)桥接宿主侧注册的工具。本文以 Python 为例走通从安装到运行的完整路径在 Agent 上启用 CodeAct 沙箱、注册沙箱内可用的工具并用官方示例验证沙箱代码确实执行了。框架提供两个沙箱后端操作路径相同后端不同后端包特点来自文档Hyperlightagent-framework-hyperlightWASM 隔离的加固沙箱沙箱工具通过call_tool(...)调用WASM 后端目前仅发布linux/x86_64与win32/AMD64Python3.14其他平台execute_code会在创建沙箱时失败Montybetaagent-framework-monty基于 Rust 的纯 Python 解释器跨平台无需 hypervisor/WASM 后端只解释 Python 子集os/网络/subprocess 访问默认被阻止沙箱工具可写为await compute(...)类型化异步调用也可用call_tool(...)设计背景可参考 CodeAct 集成决策 ADR 与 Python 实现说明。准备条件以官方 code_act 示例 的 Prerequisites 为准需要Microsoft Foundry 项目端点环境变量FOUNDRY_PROJECT_ENDPOINT已部署的模型环境变量FOUNDRY_MODELAzure CLI 已认证az login示例使用AzureCliCredential作为凭据示例代码通过load_dotenv()加载环境变量所以将上述变量写入项目目录的.env文件即可。安装按需安装对应后端的包示例同时安装了 Foundry 客户端包因为示例的Agent使用FoundryChatClientpip install agent-framework-hyperlight agent-framework-foundry --pre # Hyperlight 示例 pip install agent-framework-monty agent-framework-foundry --pre # Monty 示例两个 CodeAct 包都是独立可选包不属于agent-framework-core的强制依赖不需要 CodeAct 时可以完全不装。若已通过agent-framework[all]安装也可以不单独安装Monty 包为 beta已包含在agent-framework[all]中。核心代码创建 Provider 并挂到 Agent 上CodeAct 的接入方式是ContextProvider每次运行时provider 把 CodeAct 指令和execute_code工具注入模型可见面。关键规则是沙箱工具只注册在 provider 上不注册在 Agent 的tools上——模型因此看不到这些工具只能从沙箱内部调用它们。以下完整示例来自 code_act.pyHyperlight 后端Monty 版本见 monty_code_act.py仅 import 和 provider 类型不同import asyncio import os from typing import Annotated, Any, Literal from agent_framework import Agent, function_middleware, tool from agent_framework.foundry import FoundryChatClient from agent_framework.hyperlight import HyperlightCodeActProvider from azure.identity import AzureCliCredential from dotenv import load_dotenv load_dotenv() # 这两个工具只注册给 CodeAct provider不注册给 Agent tool(approval_modenever_require) def compute( operation: Annotated[ Literal[add, subtract, multiply, divide], Math operation: add, subtract, multiply, or divide., ], a: Annotated[float, First numeric operand.], b: Annotated[float, Second numeric operand.], ) - float: Perform a math operation for sandboxed code. operations { add: a b, subtract: a - b, multiply: a * b, divide: a / b if b else float(inf), } return operations[operation] tool(approval_modenever_require) async def fetch_data( table: Annotated[str, Name of the simulated table to query.], ) - list[dict[str, Any]]: Fetch records from a named table. # 示例中的模拟数据表 users / products ... async def main() - None: # 1. 创建 provider把沙箱工具注册在它上面 codeact HyperlightCodeActProvider( tools[compute, fetch_data], approval_modenever_require, ) # 2. 创建 Agent把 provider 挂到 context_providers agent Agent( clientFoundryChatClient( project_endpointos.environ[FOUNDRY_PROJECT_ENDPOINT], modelos.environ[FOUNDRY_MODEL], credentialAzureCliCredential(), ), nameHyperlightCodeActProviderAgent, instructionsYou are a helpful assistant., context_providers[codeact], ) # 3. 发起一次应当触发 execute_code 的请求 query ( Fetch all users, find admins, multiply 7*(3*2), and print the users, admins, and multiplication result. Use execute_code and call_tool(...) inside the sandbox. ) result await agent.run(query) print(result.text) if __name__ __main__: asyncio.run(main())各步骤的作用与判断点HyperlightCodeActProvider(tools[...], approval_modenever_require)tools是沙箱内可用工具的唯一来源provider 不会从 Agent 的tools配置推断工具集。approval_mode是execute_code的默认审批模式取值always_require/never_require。审批规则来自设计文档provider 默认为never_require时若注册的每个沙箱工具也都是never_require则execute_code免审批只要有一个沙箱工具是always_requireexecute_code就整体要求审批即使本次生成的代码未必调用该工具。Agent(..., context_providers[codeact])provider 在每次 run 前快照工具注册表和 capability 配置、构建 CodeAct 指令、通过SessionContext.extend_tools(...)注入execute_code。注册表后续用add_tools(...)/remove_tool(...)等 CRUD 方法修改时只影响之后的 run不影响进行中的 run。agent.run(query)模型在沙箱内生成代码并执行。示例中还有一个function_middleware的log_function_calls用于把execute_code的代码块和 stdout 打印出来方便观察沙箱行为属于示例的观察辅助代码不是启用 CodeAct 的必要部分。运行示例并验证在示例目录下运行README 给出的运行方式python code_act.py # Hyperlight python monty_code_act.py # Monty判断成功与否的依据示例源码注释中给出的 shape only 文档示例输出仅作形态参考▶ execute_code ──────────────────────────────────────────────────────────── users call_tool(fetch_data, tableusers) admins [user for user in users if user[role] admin] result call_tool(compute, operationmultiply, a7, b6) print(Users:, users) print(Admins:, admins) print(7 * 6 , result) ──────────────────────────────────────────────────────────── stdout: Users: [...] Admins: [...] 7 * 6 42.0 Agent: ...这是文档示例实际代码块由模型生成内容会不同。你可以核对的要点是出现了execute_code调用、沙箱内代码通过call_tool(fetch_data, ...)与call_tool(compute, ...)调用了注册工具、stdout:段有print的输出、最后 Agent 给出了汇总文本。Monty 版本示例中沙箱代码则写成users await fetch_data(tableusers)、result await compute(operationmultiply, a7, b6)这种类型化异步调用形式。配置沙箱能力文件挂载与出站网络如果生成的代码需要读宿主机文件或访问外部 HTTP在 provider 上显式配置这本身就是对这些能力的授权初始设计没有单独的network_mode之类的开关from agent_framework_hyperlight import HyperlightCodeActProvider, FileMount codeact HyperlightCodeActProvider( tools[compute], file_mounts[ /host/data, # 简写沙箱内同路径 (/host/models, /sandbox/models), # 显式 宿主 → 沙箱 映射 FileMount(/host/config, /sandbox/config),# named tuple 形式 ], allowed_domains[ api.github.com, # 该目标允许所有后端支持的方法 (internal.api.example.com, GET), # 仅 GET ], )规则来自 Hyperlight 包 README 与 实现文档workspace_root与file_mounts都不设置时沙箱没有文件系统面设置了任一才暴露/input只读//output可写能力面。allowed_domains为空时出站网络关闭添加条目即只允许对应目标出站。写入/output的文件会作为 inline data 附件返回Hyperlight 默认限制每次调用 20 个文件、单文件 5 MiB、累计原始数据 20 MiB超限会以结构化执行错误返回不带部分附件。确有需要时可用max_output_files、max_output_file_bytes、max_output_total_bytes传正整数调高但这会增加宿主内存与模型上下文开销。Monty 后端的对应配置在 Monty 包 READMEworkspace_root以read-write模式挂载到/inputfile_mounts的FileMount额外支持moderead-only/read-write/overlay与write_bytes_limit另可用resource_limits透传 Monty 的ResourceLimitsmax_duration_secs、max_memory、gc_interval、max_recursion_depth、max_suspensions。Monty 默认拒绝 OS 级访问文件系统、网络、subprocess抛出PermissionError文件系统访问必须通过挂载授权生成的代码在执行前会用 ty 按工具签名做类型检查参数类型错误会在任何宿主工具执行前就报出清晰错误。替代接入方式独立工具与手动静态装配provider 方式适合需要逐 run 快照与 CRUD 管理的场景。配置固定时文档给出两条替代路径二者都跳过 provider 的每 run 生命周期独立工具HyperlightExecuteCodeTool/MontyExecuteCodeTool适合把沙箱工具和 direct-only 工具混在同一个 Agent 上from agent_framework import Agent, tool from agent_framework_hyperlight import HyperlightExecuteCodeTool tool def send_email(to: str, subject: str, body: str) - str: Send an email (direct-only, not available inside the sandbox). return fEmail sent to {to} execute_code HyperlightExecuteCodeTool( tools[compute], approval_modenever_require, ) agent Agent( clientclient, nameMixedToolsAgent, instructionsYou are a helpful assistant., tools[send_email, execute_code], )手动静态装配实现文档 的 Manual static wiring 一节一次性构建指令并直接传给 Agentexecute_code HyperlightExecuteCodeTool( tools[fetch_docs, query_data], workspace_root./workdir, allowed_domains[(api.github.com, GET)], approval_modenever_require, ) codeact_instructions execute_code.build_instructions(tools_visible_to_modelFalse) agent Agent( clientclient, nameassistant, instructionsfYou are a helpful assistant.\n\n{codeact_instructions}, tools[send_email, execute_code], )注意示例中的fetch_docs、query_data、client是占位的自定义工具/客户端变量替换为你自己的工具函数与聊天客户端。工具可见性由配置位置决定而不是靠改 Agent 工具列表只配在 provider 上是 CodeAct-only 工具只配在 Agenttools上是 direct-only 工具两处都配则两种方式都可用。排查与限制Hyperlight 平台不支持WASM 后端只发布了linux/x86_64和win32/AMD64Python3.14。在execute_code创建沙箱时报运行时错误时先确认平台跨平台需求可改用 Monty 后端beta。Monty 的 Python 子集限制Monty 解释的是 Python 子集OS 级访问文件系统、网络、subprocess默认拒绝并报PermissionError需要文件访问时用workspace_root/file_mounts显式挂载。执行状态不跨调用保留每次execute_code都从干净的执行状态开始内存变量不会在一次调用之间保留跨调用的持久化机制是配置好的工作区文件与挂载目录以及可写/output区这是框架支持的唯一持久化路径。沙箱失败语义超时、内存不足、后端崩溃等都作为execute_code的失败以结构化错误内容返回部分输出只在后端能明确报告时才会带回不要依赖部分输出恢复作为可移植契约。输出超限/output附件超过默认限制20 文件 / 5 MiB / 文件 / 20 MiB 累计时Hyperlight 返回结构化执行错误且不带部分附件。嵌套输出路径在无安全目录相对打开能力的平台上会 fail closed文档建议把附件文件直接写在/output下以获得可移植行为。result_parser不作用于沙箱路径注册给沙箱的工具通过 Hyperlight FFI 直接把原生 Python 值dict、list、基础类型传回 guestFunctionTool上配置的result_parser只面向 LLM 侧不在沙箱路径执行需要格式化就在工具函数内自己做。下一步需要 .NET 侧等价能力时.NET 用AIContextProvider接入同一设计具体见 .NET 实现文档。需要调整沙箱内工具集、挂载或出站白名单时用 provider 的 CRUD 方法add_tools/remove_tool/add_file_mounts/add_allowed_domains等改动只影响后续 run。完整的可运行示例与逐行注释在 code_act 示例目录两个后端的包级文档分别是 agent-framework-hyperlight 和 agent-framework-monty。【免费下载链接】agent-frameworkA framework for building, orchestrating and deploying AI agents and multi-agent workflows with support for Python and .NET.项目地址: https://gitcode.com/GitHub_Trending/age/agent-framework创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表