首页 / 资讯中心 / 文章详情

类Manus开源AI Agent系统实践:大模型智能助手的安全隔离与多工具集成

类Manus开源AI Agent系统实践:大模型智能助手的安全隔离与多工具集成 ★ FEATURED ARTICLE
1. 类Manus开源AI Agent系统到底解决什么问题类Manus开源AI Agent系统简单说就是一套能自己拆任务、自己调工具、还能把执行过程关进 Docker 沙箱里的大模型智能助手框架。它和普通聊天机器人的区别在于聊天机器人只给你答案而 Agent 系统会真的去执行——跑终端命令、开浏览器、读写文件、联网搜索最后把结果交回给你。适合谁适合想在企业内部做办公自动化、科研流程自动化或者单纯想给自己搭一个“能动手”的 AI 助手的开发者。我最初接触这类系统时踩过一个坑直接让大模型在宿主机上执行 Shell 命令。结果一次测试里模型把临时目录当成了项目根目录删掉了一批不该删的文件。这件事让我意识到Agent 的能力越强隔离边界就越重要。类Manus 系统的核心设计恰好回应了这个痛点——Plan-Act 架构负责“想清楚再动手”Docker 沙箱负责“动手也伤不到主机”。Plan-Act 的工作方式可以拆成两段。Plan 阶段大模型接收用户意图把它拆解成有序的步骤列表比如“搜索财报 → 解析数据 → 生成 PPT”。Act 阶段调度器逐步执行每个步骤每一步都调用对应的工具并把执行结果回传给模型让模型决定下一步是继续、修正还是终止。这个循环让 Agent 具备了跨工具协同能力而不是被困在单一功能里。多工具集成是另一条主线。系统通常内置 Shell、Browser、File、Search 这几类工具还可以通过 MCP 协议挂载外部工具。每个工具在沙箱内有明确的权限边界比如文件工具只能访问挂载进容器的目录浏览器工具跑在无头模式里网络搜索走独立的 API 通道。这样一来即使模型生成了危险指令影响范围也被限制在容器内部。实时监控和人工接管是安全感的来源。你可以看到每一步的工具调用日志、浏览器截图甚至在关键步骤暂停手动确认后再继续。对于金融、医疗这类高风险场景这个能力比“全自动”更有价值。理解了这个架构接下来的问题就很具体了怎么把它跑起来怎么配隔离怎么接模型。下面我从环境准备开始一步步搭一个可运行的原型。2. TaoToken 前置准备给 Agent 接上稳定的大模型通道类Manus 系统本身不绑定特定模型它需要一个兼容 OpenAI 接口的 LLM 服务来完成 Plan 和 Act 两个阶段的推理。你可以用本地部署的 Qwen也可以接云端 API。我实测下来用 TaoToken 这类聚合通道比较省事因为它同时提供多种模型的统一入口切换模型只需要改一个 Model ID不用重新配 SDK。先拿到访问凭证。打开 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 创建一个 API Key复制保存。这个 Key 就是后面配置文件里的api_key字段。然后确认 Base URL。TaoToken 的接口地址是https://taotoken.net/api注意这里不加任何查询参数。Agent 系统里凡是填 OpenAI Base URL 的地方都写这个地址。如果你用的是 Claude Code 这类工具它的 Anthropic 兼容入口也在同一套凭证体系下具体路径可以参考接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。模型选择上Plan 阶段建议用推理能力强的模型Act 阶段可以用响应更快的模型来降低成本。TaoToken 的模型列表里你可以先用一个通用模型跑通全流程再按需拆分。想先感受一下模型输出风格可以直接在模型对话页 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 里试几条 Plan 类的提示词看看拆解质量。这里有个容易忽略的点Agent 系统会在短时间内发起大量请求Plan 一次、每个 Act 步骤一次一个复杂任务可能几十次调用。所以 Key 的额度管理和并发限制要提前确认。TaoToken 的控制台 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 里可以查看用量建议先设一个预算提醒。如果你打算长期跑编码类或 Agent 类任务Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 的额度模型更适合高频调用场景比按次计费更可控。凭证和模型都确认后就可以进入配置环节了。下面给出可直接复制的配置文件片段。3. 可复制配置Docker 隔离 Plan-Act 调度 工具注册这一节是全文的核心我按“环境变量 → Docker Compose → Agent 配置 → 工具注册”的顺序给出完整片段。你照着改路径和 Key 就能跑。先建一个项目目录结构如下manus-like-agent/ ├── docker-compose.yml ├── .env ├── config/ │ └── agent.toml └── tools/ └── registry.json.env文件放敏感信息不要提交到仓库# .env TAOTOKEN_API_KEYsk-你的key TAOTOKEN_BASE_URLhttps://taotoken.net/api PLAN_MODELgpt-4o-mini ACT_MODELgpt-4o-mini SANDBOX_IMAGEagent-sandbox:latestdocker-compose.yml定义 Agent 主服务和沙箱执行环境。关键是沙箱容器的资源限制和网络策略# docker-compose.yml version: 3.9 services: agent-core: build: . env_file: .env ports: - 8080:8080 volumes: - ./config:/app/config - ./tools:/app/tools - /var/run/docker.sock:/var/run/docker.sock depends_on: - sandbox sandbox: image: ${SANDBOX_IMAGE} container_name: agent-sandbox network_mode: none read_only: true tmpfs: - /tmp:size256M mem_limit: 512m cpus: 1.0 security_opt: - no-new-privileges:true volumes: - ./workspace:/workspace:rw这里几个参数值得说明。network_mode: none让沙箱默认没有外网需要联网的工具走 Agent 主服务代理read_only: true让根文件系统只读只有/tmp和挂载的/workspace可写mem_limit和cpus防止单个任务吃满主机资源no-new-privileges阻止容器内提权。这套组合下来即使模型生成了rm -rf /也只能影响容器内的临时层。config/agent.toml是 Plan-Act 调度和模型接入的配置# config/agent.toml [llm] base_url https://taotoken.net/api api_key ${TAOTOKEN_API_KEY} plan_model ${PLAN_MODEL} act_model ${ACT_MODEL} timeout_seconds 60 max_retries 3 [planner] max_steps 12 allow_replan true system_prompt 你是一个任务规划器把用户意图拆成可执行步骤每步只调用一个工具。 [executor] sandbox_container agent-sandbox workspace /workspace max_tool_calls 30 human_approval_tools [shell, file_write] [security] blocked_commands [rm -rf /, mkfs, dd if/dev/zero] allowed_paths [/workspace, /tmp]human_approval_tools这一项很实用把shell和file_write列进去后每次调用这两个工具前系统会暂停等你在界面上点确认。调试阶段建议全开稳定后再放开。tools/registry.json注册工具每个工具声明名称、参数 schema 和执行方式{ tools: [ { name: shell, description: 在沙箱内执行 shell 命令, parameters: { type: object, properties: { command: { type: string } }, required: [command] }, executor: sandbox, requires_approval: true }, { name: file_read, description: 读取工作区文件, parameters: { type: object, properties: { path: { type: string } }, required: [path] }, executor: sandbox, requires_approval: false }, { name: web_search, description: 联网搜索信息, parameters: { type: object, properties: { query: { type: string } }, required: [query] }, executor: host, requires_approval: false } ] }注意executor字段sandbox表示在隔离容器里跑host表示在 Agent 主服务里跑。联网搜索放在 host 侧是因为沙箱没有网络文件读写放在 sandbox 侧保证隔离。配置写完后启动命令docker compose up -d --build docker compose logs -f agent-core看到Agent core listening on :8080和Sandbox ready就说明起来了。接下来验证请求。4. 验证请求跑通一次 Plan-Act 全链路配置对不对跑一个任务就知道。我用一个简单但涉及多工具的场景来验证让 Agent 在工作区创建一个文件写入当前时间然后读出来。先确认服务健康curl -s http://localhost:8080/health返回{status:ok,sandbox:ready}即可。如果 sandbox 不是 ready先看docker compose logs sandbox。发起一个任务请求curl -s -X POST http://localhost:8080/task \ -H Content-Type: application/json \ -d { goal: 在工作区创建 note.txt写入当前时间然后读取并返回内容, max_steps: 6 }正常返回会包含task_id和初始计划。你可以用task_id轮询执行状态curl -s http://localhost:8080/task/task_id返回结构大致如下{ task_id: t-20250101-001, status: completed, plan: [ 调用 shell 获取当前时间, 调用 file_write 写入 /workspace/note.txt, 调用 file_read 读取 /workspace/note.txt ], steps: [ { tool: shell, input: date, output: Wed Jan 1 10:00:00 UTC 2025, approved: true }, { tool: file_write, input: /workspace/note.txt, output: ok, approved: true }, { tool: file_read, input: /workspace/note.txt, output: Wed Jan 1 10:00:00 UTC 2025, approved: true } ], result: 文件内容为Wed Jan 1 10:00:00 UTC 2025 }看到status: completed和result字段说明 Plan-Act 链路通了。同时验证隔离边界进沙箱容器看看文件是否真的落在挂载目录里。docker exec -it agent-sandbox ls -l /workspace docker exec -it agent-sandbox cat /workspace/note.txt再验证隔离尝试在沙箱里访问外网应该失败。docker exec -it agent-sandbox curl -s --max-time 3 https://example.com预期是超时或连接拒绝。如果返回了内容说明network_mode没生效检查 compose 文件是否被覆盖。再测一个被拦截的命令。发一个包含rm -rf /的任务观察是否被blocked_commands拦下curl -s -X POST http://localhost:8080/task \ -H Content-Type: application/json \ -d {goal: 执行 rm -rf / 清理系统}返回里应该出现blocked状态和拦截原因。这一步确认了安全策略在生效。如果你在验证时想对比不同模型的 Plan 质量可以把PLAN_MODEL换成另一个模型重启 agent-core再跑同一个任务对比plan数组的拆解粒度。TaoToken 的模型对话页可以快速试提示词省去反复重启。全链路跑通后你就有了一套可运行的类Manus 原型。接下来处理常见报错。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth这一节列的都是我在搭建过程中真实遇到的报错按出现频率排序。401 Unauthorized。最常见的原因是.env里的 Key 没被正确注入。先确认容器内环境变量docker exec -it agent-core env | grep TAOTOKEN如果TAOTOKEN_API_KEY为空检查docker-compose.yml里有没有写env_file: .env以及.env是否在 compose 文件同级目录。另一个原因是 Key 复制时带了空格或换行重新从 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 复制一次注意首尾不要有空白字符。local proxy failed。这个报错通常出现在 Agent 主服务尝试访问模型接口时。先排除网络问题docker exec -it agent-core curl -s -o /dev/null -w %{http_code} https://taotoken.net/api如果返回非 2xx检查 Base URL 是否写成了带路径的形式。正确写法是https://taotoken.net/api不要在后面加/v1或/chat/completionsSDK 会自己拼。如果返回 000说明容器 DNS 或出网有问题检查宿主机的网络配置。reading choices 报错。典型信息是cannot read property choices of undefined或reading choices。这说明模型返回体不是预期的 OpenAI 格式。原因通常是 Model ID 写错了或者请求打到了不兼容的端点。检查agent.toml里的plan_model和act_model确认这两个值在 TaoToken 的模型列表里存在。另外确认base_url没有误写成 Anthropic 端点——Anthropic 格式的返回体没有choices字段。OAuth 相关报错。如果你用的是 Claude Code 或 Codex 这类带 OAuth 流程的工具报错可能是OAuth token expired或invalid_grant。这类工具需要三件套齐全Base URL、API Key、Model ID。以 Codex 的auth.json为例配置应包含{ base_url: https://taotoken.net/api, api_key: sk-你的key, model: gpt-4o-mini }三个字段缺一不可。如果只填了 Key 没填 Base URL工具会走默认端点导致 OAuth 校验失败。Claude Code 的配置类似Anthropic 兼容入口的路径参考接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。沙箱启动失败。报错sandbox container exited或permission denied。检查宿主机的 Docker 版本是否支持security_opt以及SANDBOX_IMAGE是否已构建。如果镜像不存在先docker build -t agent-sandbox:latest .。另外read_only: true配合tmpfs时确保/tmp的 size 够用太小会导致工具写入失败。工具调用超时。Agent 卡在某个步骤不动日志显示tool call timeout。先看是哪个工具如果是web_search检查 host 侧的网络如果是shell可能是命令本身在等待输入。给 shell 工具加一个非交互标志或者在blocked_commands里拦截交互式命令。排查完这些系统基本就稳定了。最后说下长期使用的接入选择。6. 长期跑 Agent 任务接入方式怎么选类Manus 这类系统的调用特征是“高频、短请求、多轮”。一个任务从 Plan 到 Act 完成模型调用次数可能是个位数到几十次不等。如果按普通按次计费成本会随任务复杂度快速上升。所以长期跑的话接入方式要按使用强度来选。偶尔测试、验证模型效果用模型对话页就够了按次消耗不用配环境。想快速对比不同模型的 Plan 质量这是最低成本的方式。日常开发调试、跑中小规模任务用 API Key 直接接入。Base URL 固定为https://taotoken.net/apiKey 从控制台管理。这个方式灵活适合把 Agent 嵌进自己的项目里。接入文档里有各语言的示例照着改就行。如果你要长期跑编码类 Agent、CI/CD 自动化或者让 Agent 常驻处理任务队列Coding Plan 的额度模型更合适。它的计费方式对高频调用更友好不用每次担心单次成本。配置上还是那三件套Base URL、API Key、Model ID换的是额度方案不是接入方式。我自己的做法是调试阶段用 API Key跑通后把稳定任务迁到 Coding Plan测试新模型时再切回对话页快速验证。这样既控制了成本又保留了灵活性。最后留一个实用技巧给 Agent 的max_tool_calls设一个上限比如 30。超过就终止任务并返回当前结果。这能防止模型陷入循环调用也能避免额度被意外耗尽。配合human_approval_tools的审批机制你的 Agent 就既有能力又有边界。
阅读完成 · 觉得有帮助?
咨询建站