☰
一文带你吃透 Manus:AI 全能“超级助手”的 Multiple Agent 与虚拟机配置实战
2026/9/29 22:34:39 网站建设 项目流程

1. 为什么我想在本地复现 Manus 的 Multiple Agent 能力

Manus 最吸引我的地方,不是它能聊天,而是它把「一个模型回答问题」变成了「一组智能体分工干活」。官方描述里它跑在独立虚拟机中,用 Multiple Agent 架构把任务拆成规划、执行、校验几个角色,再配合浏览器、代码执行器、文件系统这些工具链完成端到端交付。对开发者来说,这套思路其实可以拆解成可复现的配置:一个统一的大模型调用入口、一份描述智能体角色的 config.toml、一份描述运行时环境的 settings.json,以及一个能把子任务分发下去并回收结果的调度逻辑。

我关心的核心问题是:如果我不想依赖某个封闭平台,能不能用本地或云端的通用模型接口,把「多智能体协作 + 虚拟机式隔离运行」这套骨架搭起来?答案是能,而且门槛比想象中低。关键难点不在模型本身,而在于三件事——统一 Key 管理、角色配置的语义清晰度、以及任务分发后的结果校验。这篇就围绕这三点,给出可以直接抄的配置骨架和一次真实的多智能体任务分发验证。

适合读这篇的人:想理解 Multiple Agent 协作机制的开发者、想给现有 Agent 框架换一个统一模型通道的人、以及想用配置文件而不是硬编码来管理智能体角色的人。下面所有配置都以「可跑通」为目标,不追求花哨。

2. TaoToken 前置:把模型调用收敛成一个统一通道

Multiple Agent 架构里最容易被忽视的坑,是每个智能体各自持有不同的 Key 和 endpoint。规划智能体用一个模型、执行智能体用另一个、校验智能体又换一个,结果就是配置散落、额度难管、报错难查。我的做法是先把模型调用收敛到一个统一入口,让所有智能体都通过同一个 API 通道拿结果,这样 config.toml 里只需要维护角色和提示词,不用关心底层是哪家模型。

TaoToken 在这里扮演的就是这个统一通道的角色。它提供 OpenAI 兼容的接口形态,意味着你现有的 SDK 调用方式基本不用改,只需要把 base_url 和 api_key 换掉。对多智能体场景来说,这一点很实用:规划、执行、校验三个角色可以指向同一个 base_url,用不同的 model 参数区分能力档位,也可以全部走同一个模型,靠提示词区分职责。

接入前你需要准备两样东西:一个可用的 API Key,以及确认你要用的模型名称。Key 在控制台的 API Keys 页面创建,建议按项目或按智能体角色分别建 Key,方便后续排查是哪个角色在消耗额度。创建入口在这里:

API Keys 管理:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite

如果你还不确定该选哪个模型来跑多智能体,可以先用模型对话页面做一次快速对比,看看同一个任务在不同模型下的拆解质量:

模型对话体验:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite

接入文档里有完整的请求示例和参数说明,配置前建议扫一眼,尤其是 stream 和 max_tokens 这两个参数在多智能体场景下的影响:

接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite

这里要强调一个原则:统一通道不等于所有角色用同一个模型。规划角色需要强推理,可以用能力更强的模型;执行角色需要稳定输出结构化结果,可以用响应更快的模型;校验角色需要严格比对,可以用温度更低的配置。这些差异全部通过 config.toml 里的参数体现,而不是散落在代码里。

3. 可复制配置:config.toml 与 settings.json 骨架

下面这份 config.toml 描述的是「有哪些智能体、各自用什么模型、负责什么」。我把它设计成角色驱动,每个[[agents]]块就是一个智能体。注意 api_base 统一指向 TaoToken 的 API 地址,api_key 从环境变量读取,避免明文写进配置文件。

# config.toml - Multiple Agent 角色配置骨架 [global] api_base = "https://taotoken.net/api" api_key_env = "TAOTOKEN_API_KEY" request_timeout = 120 max_retries = 3 # 规划智能体:负责任务拆解与子任务分发 [[agents]] name = "planner" role = "task_decomposition" model = "gpt-4o" temperature = 0.3 system_prompt = """ 你是一个任务规划智能体。收到用户目标后,将其拆解为 3-6 个可独立执行的子任务。 每个子任务必须包含:任务描述、预期输出格式、依赖关系。 只输出 JSON 数组,不要输出解释文字。 """ # 执行智能体:负责具体子任务的落地 [[agents]] name = "executor" role = "task_execution" model = "gpt-4o-mini" temperature = 0.2 system_prompt = """ 你是一个任务执行智能体。你会收到一个明确的子任务和上下文。 请直接产出该子任务要求的结果,不要复述任务本身。 如果子任务需要代码,输出可运行的代码块。 """ # 校验智能体:负责结果一致性检查 [[agents]] name = "verifier" role = "result_validation" model = "gpt-4o" temperature = 0.0 system_prompt = """ 你是一个结果校验智能体。你会收到原始子任务和执行结果。 请检查:结果是否完整、格式是否符合要求、是否存在明显错误。 输出 JSON:{"pass": true/false, "reason": "..."} """ [orchestration] max_parallel = 3 retry_on_verify_fail = true log_level = "info"

settings.json 描述的是运行时环境,也就是「虚拟机式隔离」在配置层面的映射。这里我用 sandbox 字段模拟隔离边界,用 workspace 限定文件读写范围,用 allowed_tools 控制每个智能体能调用的工具。这样即使某个执行智能体行为异常,也不会越界访问整个文件系统。

{ "runtime": { "sandbox": { "enabled": true, "workspace": "./agent_workspace", "read_only_paths": ["./config.toml", "./settings.json"], "max_file_size_mb": 20 }, "allowed_tools": { "planner": ["read_file", "list_dir"], "executor": ["read_file", "write_file", "run_python", "http_request"], "verifier": ["read_file"] }, "resource_limits": { "max_execution_seconds": 300, "max_tokens_per_task": 8000 } }, "logging": { "trace_dir": "./logs/traces", "save_intermediate": true } }

这两份配置的关系是:config.toml 决定「谁来做」,settings.json 决定「在什么边界内做」。实际跑的时候,调度器先读 config.toml 拿到智能体列表,再读 settings.json 初始化沙箱和工具权限,然后把用户目标交给 planner,拿到子任务列表后按依赖关系分发给 executor,最后交给 verifier 校验。

环境变量这样设置,避免 Key 进版本库:

export TAOTOKEN_API_KEY="你的_API_Key"

如果你打算长期跑编码类或 Agent 类任务,Coding Plan 在额度管理上会更省心,适合把多智能体调度作为日常工具的场景:

Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite

4. 验证请求:一次多智能体任务分发的完整动作

配置写好后,最关键的一步是验证「任务能不能被正确拆解、分发、回收」。我设计了一个最小验证任务:让系统分析一个本地目录下的 Python 文件,统计函数数量并生成一份简短报告。这个任务足够简单,但包含了读文件、执行代码、生成结构化输出三个环节,能覆盖 planner、executor、verifier 三个角色。

先写一个最小调度脚本,用 OpenAI 兼容的调用方式对接 TaoToken:

import os import json import tomllib from openai import OpenAI # 读取配置 with open("config.toml", "rb") as f: config = tomllib.load(f) client = OpenAI( base_url=config["global"]["api_base"], api_key=os.environ[config["global"]["api_key_env"]] ) def call_agent(agent_conf, user_content): resp = client.chat.completions.create( model=agent_conf["model"], temperature=agent_conf["temperature"], messages=[ {"role": "system", "content": agent_conf["system_prompt"]}, {"role": "user", "content": user_content} ] ) return resp.choices[0].message.content # 第一步:规划 planner = next(a for a in config["agents"] if a["name"] == "planner") goal = "分析 ./agent_workspace/sample.py,统计函数数量,生成一份 markdown 报告" plan_raw = call_agent(planner, goal) print("=== Planner 输出 ===") print(plan_raw) # 解析子任务 subtasks = json.loads(plan_raw) print(f"\n共拆解出 {len(subtasks)} 个子任务") for i, t in enumerate(subtasks, 1): print(f"{i}. {t.get('task', t)}")

跑这一步,你应该能看到 planner 把目标拆成类似「读取文件内容」「统计 def 数量」「生成 markdown 报告」这样的子任务列表。如果 planner 输出不是合法 JSON,说明 system_prompt 需要再收紧,或者在调用后加一层 JSON 提取逻辑。

第二步,把子任务分发给 executor:

executor = next(a for a in config["agents"] if a["name"] == "executor") results = [] for task in subtasks: task_desc = task.get("task", str(task)) result = call_agent(executor, f"子任务:{task_desc}\n上下文:工作目录为 ./agent_workspace") results.append({"task": task_desc, "result": result}) print(f"[完成] {task_desc}") # 第三步:校验 verifier = next(a for a in config["agents"] if a["name"] == "verifier") verify_input = json.dumps(results, ensure_ascii=False) verify_raw = call_agent(verifier, f"原始目标:{goal}\n执行结果:{verify_input}") print("\n=== Verifier 输出 ===") print(verify_raw)

成功的结果长这样:planner 输出合法 JSON 数组,executor 对每个子任务返回具体内容,verifier 返回{"pass": true, "reason": "..."}。如果 verifier 返回pass: false,调度器应该根据retry_on_verify_fail决定是否重跑对应子任务。这一步跑通,说明你的 Multiple Agent 骨架已经能完成「拆解—执行—校验」的闭环。

5. 本篇常见错排查

报错一:401 Unauthorized 或 invalid api key。最常见的原因是环境变量没生效。先确认echo $TAOTOKEN_API_KEY有输出,再确认 config.toml 里的api_key_env拼写和实际环境变量名一致。如果你在 IDE 里跑,注意 IDE 可能没有继承 shell 的环境变量,需要在运行配置里单独设置。

报错二:planner 输出不是合法 JSON。多智能体里最影响稳定性的就是这一步。解决办法有两个:一是把 system_prompt 里的输出格式约束写得更死,明确「只输出 JSON,不要 markdown 代码块」;二是在解析前加一层清洗,用正则把 ```json 包裹去掉再 parse。我试过在 prompt 里加一句「如果无法拆解,返回空数组」,能减少模型自由发挥。

报错三:executor 拿不到文件内容。检查 settings.json 里的workspace路径和实际文件路径是否一致。沙箱开启后,executor 只能访问 workspace 内的文件,如果 sample.py 放在 workspace 外面,读取会失败。另外allowed_tools里 executor 必须有read_file,否则工具调用会被拦截。

报错四:verifier 一直返回 pass: false。先看 reason 字段说了什么。常见原因是 executor 的输出格式和 planner 要求的预期格式不一致。这时候不要急着改 verifier,而是回到 planner 的 system_prompt,把「预期输出格式」写得更具体,比如明确要求 markdown 还是 JSON。

报错五:并发任务互相覆盖文件。如果 max_parallel 大于 1,多个 executor 同时写同一个文件会冲突。解决办法是给每个子任务分配独立的输出文件名,或者在 settings.json 里把max_parallel先设为 1 验证逻辑,跑通后再逐步提高。

报错六:请求超时。多智能体链路长,单次请求超时容易在 executor 环节断掉。把request_timeout调到 120 秒以上,同时确认max_tokens_per_task没有设得过小导致输出被截断。截断的输出往往不是合法 JSON,会引发连锁报错。

6. 把配置沉淀成可复用的智能体工作台

跑通一次验证只是起点。真正让 Multiple Agent 有价值的是把 config.toml 和 settings.json 沉淀成团队可复用的工作台:新任务来了,改的是 planner 的拆解策略和 executor 的工具权限,而不是重写调用代码。我的建议是先把三个角色的提示词各自迭代几轮,记录哪些任务拆解得好、哪些校验规则误报多,这些经验最终都会变成配置文件里的几行参数。

如果你后续要把这套骨架接到编码场景或长期运行的 Agent 任务上,统一 Key 和额度管理会比单次调用更重要,可以顺着 Coding Plan 的额度方案往下走:

Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite

配置和 Key 都就绪后,从 API Keys 页面建一个专用 Key 给这套多智能体系统,和日常对话用的 Key 分开,排查问题时能省不少事:

API Keys:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite

最后留一个实用习惯:每次调整 config.toml 后,先用一个固定的小任务跑一遍 planner→executor→verifier 全链路,确认没有回归,再上真实任务。这个「冒烟测试」任务越简单越好,比如「统计 workspace 下文件数量」,它的作用是验证链路通不通,而不是验证模型聪不聪明。链路稳定之后,你再把复杂任务丢进去,排障成本会低很多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询