mistral.rs 代码执行审批回调实战:为 Agent 的 Python 代码执行实现 Human-in-the-Loop 控制
发布时间:2026/9/16 18:02:38 作者:尧图编辑部 阅读量:1,286

mistral.rs 代码执行审批回调实战为 Agent 的 Python 代码执行实现 Human-in-the-Loop 控制【免费下载链接】mistral.rsFast, flexible LLM inference项目地址: https://gitcode.com/GitHub_Trending/mi/mistral.rs本文基于仓库中的官方示例文档 code-execution-approval 展开讲解如何在 mistral.rs 的 Rust API 中为模型的 Python 代码执行请求挂载审批回调模型每生成一段待执行代码前你的回调都会收到完整的代码与上下文并可以选择批准、按会话记住批准、或拒绝并附带说明。读完后你将掌握AgentToolApprovalCallback的完整接线方式、三种审批决策的语义差异以及引擎侧审批循环的底层实现。功能定位与运行方式mistral.rs 支持让模型自主生成并执行 Python 代码代码执行工具链。为了让这类Agent 行为在用户可见可控的前提下运行RequestBuilder提供了AgentPermissionAuto/Ask/Deny与审批回调机制。本示例演示的就是Ask模式模型每次调用execute_python类工具时推理循环会暂停并回调你提供的闭包由你读取代码内容后做出决策。示例源码位于 mistralrs/examples/advanced/code_execution_approval/main.rs文档页由 docs/scripts/render_examples.py 从该源文件自动生成因此两者内容完全一致。运行命令需启用code-executionfeature并本机有可用 Python 解释器cargo run --release --features code-execution --example code_execution_approval -p mistralrs完整示例代码逐段解析模型构建器开启代码执行能力let model ModelBuilder::new(google/gemma-4-E4B-it) .with_auto_isq(IsqBits::Four) .with_logging() .with_code_execution(CodeExecutionConfig::default()) .build() .await?;with_code_execution(CodeExecutionConfig::default())在模型层面注册代码执行工具execute_python、会话重置、文件读取/列举等。CodeExecutionConfig定义在 mistralrs-code-exec/src/lib.rs默认值包括python_path默认python3Windows 下为python构建时会执行--version校验解释器可用性timeout_secs单次执行超时默认 60 秒常量DEFAULT_CODE_EXEC_TIMEOUT_SECSworking_directory为None时每个会话使用独立临时目录sandbox_policyNone表示不启用 OS 级沙箱NullSandboxpermission默认CodeExecutionPermission::Auto。with_auto_isq(IsqBits::Four)对模型做 4 比特智能量化降低显存/内存占用属于演示环境的可选配置。with_logging()开启日志输出便于观察多轮工具调用过程。审批回调拿到什么、返回什么let approval_callback: AgentToolApprovalCallback Arc::new(|approval| { println!(\nAgent action approval required); println!(approval_id: {}, approval.approval_id); println!(session_id: {}, approval.session_id); println!(tool: {}, approval.tool.label); println!(\nCode:); println!( {}, approval .arguments .get(code) .and_then(|value| value.as_str()) .unwrap_or(no code) ); // ... 读取 stdin 并返回决策 });回调签名为Arcdyn Fn(AgentToolApproval) - AgentToolApprovalDecision Send Sync static定义在 mistralrs-core/src/agent_approval.rsAgentToolApproval携带approval_id形如appr_uuid用于在 UI/日志中关联审批请求、session_id、round当前工具轮次、toolAgentToolMetadata含来源与label代码执行工具的 label 为Python code以及arguments模型生成的完整参数 JSON示例中取其中的code字段打印。回调内直接调用io::stdin().read_line阻塞读取用户输入是安全的从 mistralrs-core/src/engine/agentic_loop.rs 看同步回调通过tokio::task::spawn_blocking执行不会阻塞 async 运行时。回调中的输入解析支持y/yes、a/always、n/no空输入视为拒绝非法输入会循环提示。请求构建器把权限、回调与工具轮次上限接上let messages TextMessages::new().add_message( TextMessageRole::User, Use Python to calculate the first 20 Fibonacci numbers., ); let request RequestBuilder::from(messages) .with_code_execution() .with_agent_permission(AgentPermission::Ask) .with_agent_approval_callback(approval_callback) .with_max_tool_rounds(4); let response model.send_chat_request(request).await?; println!({}, response.choices[0].message.content.as_ref().unwrap());各方法的作用均在 mistralrs/src/messages.rswith_code_execution()请求级开关只有开启后代码执行工具才会对本请求生效with_agent_permission(AgentPermission::Ask)设为询问模式触发审批流程with_agent_approval_callback(callback)挂载同步审批回调内部包装为AgentToolApprovalHandler::Sync。若审批需要在异步上下文中完成如调用外部 API、展示 Web 弹窗可改用with_agent_approval_async_callback它接受返回 Future 的闭包包装为AgentToolApprovalHandler::Asyncwith_max_tool_rounds(4)限制整个 agentic 循环最多 4 轮工具调用防止模型反复执行代码不收敛。若未显式设置引擎默认上限为 256DEFAULT_MAX_TOOL_ROUNDS见 mistralrs-core/src/engine/agentic_loop.rs。最后通过send_chat_request发起请求响应choices[0].message.content即模型对 Fibonacci 问题的最终文本回答。三种审批决策及其语义AgentToolApprovalDecision提供四个构造器mistralrs-core/src/agent_approval.rs构造器approveremember_for_sessionmessage效果approve()truefalseNone本次执行通过下次仍需询问approve_for_session()truetrueNone本次通过且同一会话内后续所有 Agent 动作自动批准deny(None)falsefalseNone拒绝无附加说明deny_with_message(...)falsefalseSome(msg)拒绝并把说明文本反馈给模型示例中always选项对应approve_for_session()。引擎会将其落入会话存储在 mistralrs-core/src/engine/agentic_loop.rs 的approve_agent_tool中决策若带remember_for_session会调用session_store.approve_agent_actions(session_id)此后同一session_id的后续请求在Ask模式下直接返回approve()不再触发回调。这也解释了为什么回调参数中带有session_id——审批记忆是按会话隔离的。另外with_remember_for_session(bool)允许在approve()/deny基础上灵活开关记住标志。引擎侧审批流程拒绝是如何反馈给模型的审批判定发生在 agentic 循环的工具分发阶段approve_agent_toolmistralrs-core/src/engine/agentic_loop.rs流程为AgentPermission::Auto直接批准不经过任何回调AgentPermission::Deny直接拒绝消息形如Python code was denied by policy.label来自工具元数据AgentPermission::Ask先查会话存储中该session_id是否已记住批准是则直接通过否则要求存在审批 handler缺失时以Agent action requires approval, but no approval handler is configured.拒绝生成approval_id、组装AgentToolApproval工具元数据 参数 JSON后调用 handler。若 handler 还配置了agent_approval_notifier会先向外推送一次AgentToolApprovalRequest供服务端/WebUI 通知外部界面。拒绝不会中断对话denied_tool_result同文件 #L705-L758会把助手消息、工具调用记录与一条{status: denied, exception: 消息}形式的 tool 消息追加进对话历史并继续下一轮推理。示例中deny_with_message(The user denied this action.)的说明文本模型就是这样看到的——它会据此调整策略或改用其他方法完成任务。权限模型AgentPermission 与 CodeExecutionPermission两个枚举都定义在 mistralrs-mcp/src/tools.rs取值均为auto默认/ask/denykebab-case 序列化并提供strictest取严语义只要任一方为Deny结果即Deny任一方为Ask即Ask。二者关系AgentPermission是请求级的通用 Agent 行为开关覆盖代码执行、shell、文件访问、Web 搜索等所有工具轮CodeExecutionPermission是代码执行专属的权限可通过CodeExecutionConfig.permission设置也可用请求级with_code_execution_permission覆盖该方法同时会把它转换为agent_permission见 mistralrs/src/messages.rs。在代码执行工具的实际执行路径上mistralrs-code-exec/src/lib.rs 的denied_by_permission会取模型级权限与请求级权限的strictest组合来判定Ask且未配置回调时返回Code execution requires approval, but no approval handler is configured.。也就是说权限配置与审批回调是双保险即使回调放行权限为Deny的动作依然会被拦截。配套工具链与会话生命周期with_code_execution启用后CodeExecutionManager::get_tool_callbacksmistralrs-code-exec/src/lib.rs会向引擎注册一整套工具execute_python真正执行代码支持code与outputs命名输出文件/图像参数返回多模态结果文本、图像、视频帧、文件reset_python_session清空当前 Python 会话的变量与导入read_file/list_files由引擎直接分发的文件工具以及surface_outputs、shell 相关工具需另行启用。会话管理上每个session_id对应一个持久PythonSession变量跨轮保留后台 reaper 每 300 秒清理一次空闲超过 3600 秒的会话REAP_INTERVAL/SESSION_TTL。如果需要在多次请求间保持代码执行状态与审批记忆可通过with_session_id显式指定会话 ID。小结与延伸阅读本示例展示了 mistral.rs 中实现人在回路代码执行的最小闭环ModelBuilder::with_code_execution注册能力 →with_agent_permission(AgentPermission::Ask)打开询问模式 →with_agent_approval_callback决定批准/拒绝/会话级记忆 →with_max_tool_rounds兜底限制轮次。与 Python 代码执行相关的源码入口示例源码mistralrs/examples/advanced/code_execution_approval/main.rs审批类型定义mistralrs-core/src/agent_approval.rsagentic 循环与审批判定mistralrs-core/src/engine/agentic_loop.rs权限枚举mistralrs-mcp/src/tools.rs代码执行管理器mistralrs-code-exec/src/lib.rsPython 侧对应示例服务端场景examples/python/code_execution_approval.py沙箱测试mistralrs-code-exec/tests/sandboxed_session.rs【免费下载链接】mistral.rsFast, flexible LLM inference项目地址: https://gitcode.com/GitHub_Trending/mi/mistral.rs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考