Manus火了万元的“邀请码”最后也引起口诛笔伐不过这多少也说明了大家对AGI的向往与期待。所谓外行看热闹内行看门道Manus本质上是一个运行在云端支持多用户使用的Agent as a Service应用与Deepseek不一样的是其技术复杂性更多体现在工程上而非底层算法。本文将尝试构建一个基于容器沙盒隔离的多用户Agent系统的后台原型以帮助理解相关的原理。内容目录Manus原理乱猜设计一个多用户的Agent后台准备Docker Image准备Docker Container管理接口构建ToolPython代码执行器Docker版构建Tool浏览器自动化Docker版组装Prompts与ReAct Agent测试与改进我们分两篇介绍以上内容配套代码获取请参考文末说明。01 Manus原理乱猜从为数不多的演示视频看Manus背后的一些技术的要点有一个自主的多Agent/多Tools系统。由一个任务调度的Agent与多个负责任务执行的Agent或嵌套多Agent系统组成不同的Agent可以根据需要使用擅长不同任务的LLM。编程任务Agent与Web浏览Agent是核心Agent之一。为什么因为这两种Agent最具“通用”能力。借助虚拟环境比如Docker容器做用户隔离。为什么一个是减少用户间的影响一个是系统安全。你敢让用户指示AI写出的代码随便在本机环境运行吗目前擅长的任务流程还是以线性任务为主。纯推测。因为非线形任务对LLM推理要求极高或者借助Workflow来实现但Workflow又缺乏通用型。简单的说每个登录用户会有一个自己的“manus”Agent每个manus有自己的电脑虚拟机与工作空间来完成任务。比如运行代码、浏览网络、创建文件等。大致的工作流程当然这里的细节我们在实际工程中可根据自己的实际情况参考。02 设计一个多用户Agent后台参考这些要点我们实现一个简化版的支持多用户的Agent系统。【基本能力】有简单的自我规划并结合上下文的步骤推理能力至少有编码Agent与Web Agent两种子任务能力这两种Agent工作在动态的容器中以确保安全可多用户同时使用用户的容器与工作空间要隔离【系统架构】系统架构与大致流程设计这个系统中包含的组件有一个预建的Docker镜像用来启动用户虚拟环境一个容器管理器组件用来管理多个用户虚拟环境一个ReAct范式Agent模拟任务步骤推理与调度四个任务执行的Tool也可以是Agent用于CodeGenerator: 生成Python代码WebpageCrawler: 采集指定网址的内容CodeExecutor: 虚拟环境中执行代码脚本Browser: 执行网络自动浏览一个Web Agent给Browser调用的自动化浏览Agent在虚拟环境中一个共享工作区存放任务过程中输入输出文件【工作流程】下面以一个简单的任务结合实际运行的效果图说明系统工作流程。1. 通过Docker Build创建一个用来启动用户虚拟环境的镜像Docker Image。你需要能在本地的Docker镜像库中看到它2. 用户输入任务这里用输入用户ID来模拟不同用户此时系统会创建一个用户ID对应的ReActAgent启动一个用户ID对应的虚拟环境Docker容器注意这里的容器名3. ReActAgent进入任务推理循环根据上图中的输入任务自动完成如下步骤首先调用WebpageCrawler采集网页内容保存到用户工作区下的一个文件。调用CodeGenerator生成对该文件分析的python代码。调用CodeExecutor连接到Docker容器在容器中执行该代码。获得代码执行结果并反馈用户。以上步骤如果失败由ReActAgent推理进行再次尝试直到成功或到达最大迭代次数。比如这里执行发现版本问题会自动使用pip install做更新4. 返回任务执行结果。如果没有新任务则销毁agent并停止容器。下面我们介绍核心组件的实现过程你可以使用配套源码进行实验。03 准备Docker Image由于需要借助AI编程来完成不同用户的任务提供虚拟环境用于代码执行是必要的。需要注意的是我们为了调试方便没有把整个Agent系统都放到虚拟环境下只把两种类型的任务执行放在容器中完成Python代码执行与Web浏览自动化。【Image内容】启动Docker容器首先需要准备好必要的镜像Build Image。这个镜像预置如下内容基本的Python代码执行环境常见的Python第三方库。比如数据分析pandas需要在虚拟环境下使用的工具。比如我们需要Chromium用来web浏览必要的脚本包括shell或者预建的python代码。比如我们这里把用于自动网络浏览的Web Agent代码build到这个虚拟镜像中agent_browser.py用来给Browser这个Tool直接调用为什么因为对于复杂且需要在虚拟环境下的工作任务你不可能每次现场编程来完成既不稳定也不高效尽量把最常见的第三方库直接build进去否则会在执行任务时现场安装影响性能。【构建过程】1. 安装并启动好Docker后台。2. 准备好DockerfileDockerfile是构建Image镜像的配置文件。除了常见的拉取基础镜像安装必要的操作系统与Python包以外这里有一些特殊的增加说明如下playwright installplaywright是一个自动化Web测试工具用来实现在Docker中控制浏览器。这一步是在镜像中安装对应的chromium浏览器。start.sh启动脚本启动脚本是每一个容器在启动后执行的动作ENTRYPOINT指令设置。start.sh内容为#!/bin/bash Xvfb :99 -screen 0 1024x768x16 sleep 1 exec $这个脚本作用是启动一个虚拟显示服务器用来在没有显示器docker容器的情况下运行图形应用也就是Chromium浏览器用来实现浏览自动化。agent_browser.py这是一个预购建的Web Agent代码用来执行自动化web浏览任务参考文章Web Agent技术揭秘如何让DeepSeek接管与控制你的浏览器3. 最后使用docker build命令生成镜像。你可以使用我们代码中的build.sh来构建等待出现提示现在你的Docker镜像就已经准备完毕。如果后期有需要可以修改Dockerfile后重新build即可。04 Docker Container管理接口为了方便对容器管理比如启动、停止、执行代码等我们来准备简单的Container管理组件与接口。【Docker API封装】对Docker的Container API做封装。大致接口如下详细请参考源码包......class DockerContainer:管理Docker容器的简单类def __init__(self,image: str python-data-analysis:3.11,container_name: str llamaindex-executor,base_work_dir: str /Users/pingcy/workspace,auto_remove: bool True):...def start(self):启动Docker容器...def set_work_dir(self, work_dir: str) - None:设置当前工作目录Args:work_dir: 新的工作目录...def stop(self):停止Docker容器...def execute(self, code: str, language: str python, work_dir: Optional[str] None) - Dict[str, str]:在Docker容器中执行代码Args:code: 要执行的代码language: 代码语言支持 python, sh, bashwork_dir: 执行代码的工作目录如果不提供则使用当前工作目录Returns:Dict包含output和error字段...【多用户下的Container管理接口】现在可以在此基础上提供Container管理的方便函数给Agent使用。这里有两个要点支持多用户。需保留用户与容器的对应关系。确保每个用户只有一个容器单体。获取/启动容器的函数... # 全局变量 - Docker容器映射表按用户ID组织 _docker_containers: Dict[str, DockerContainer] {} BASE_WORK_DIR /Users/ #用来获取特定用户的容器单体实例 def get_docker_container( user_id: str default, image: str python_code_executor:3.11, container_name: Optional[str] None, ) - DockerContainer: 获取或创建特定用户的Docker容器 Args: user_id: 用户ID用于区分不同用户 image: Docker镜像名称 container_name: 容器名称如不提供则根据用户ID生成 Returns: DockerContainer: 用户专属的容器实例 global _docker_containers # 如果不提供容器名称则根据用户ID生成 if container_name is None: container_name fllamaindex-executor-{user_id} # 为用户创建专属容器 if user_id not in _docker_containers or _docker_containers[user_id] is None: _docker_containers[user_id] DockerContainer( imageimage, container_namecontainer_name, base_work_diros.path.join(BASE_WORK_DIR, user_id) ) _docker_containers[user_id].start() # 确保用户基本工作目录存在 user_work_dir os.path.join(BASE_WORK_DIR, user_id) os.makedirs(user_work_dir, exist_okTrue) return _docker_containers[user_id]停止容器的函数... # 关闭特定用户的Docker容器 def close_docker_container(user_id: str default): global _docker_containers ... # 关闭所有Docker容器 def close_all_docker_containers(): global _docker_containers ...【测试】使用如下代码来测试能否动态启动一个容器并在容器中执行一段代码def test_docker_container(): #启动一个容器 container get_docker_container(user_idtest_user) #执行的代码 code import sys print(Testing Docker container...) print(fPython version: {sys.version}) try: #在容器中执行代码 result container.execute(code, python) print(Execution result:) print(fOutput: {result[output]}) print(fError: {result[error]}) finally: #关闭容器 close_docker_container(test_user)你应该可以看到如下的输出现在我们已经完成了基本的准备工作我们将在下篇中介绍如何构建Tools与Agent部分欢迎继续关注。
实现自己的“Manus”:构建基于容器的多用户Agent应用【上】
发布时间:2026/6/6 15:43:11
Manus火了万元的“邀请码”最后也引起口诛笔伐不过这多少也说明了大家对AGI的向往与期待。所谓外行看热闹内行看门道Manus本质上是一个运行在云端支持多用户使用的Agent as a Service应用与Deepseek不一样的是其技术复杂性更多体现在工程上而非底层算法。本文将尝试构建一个基于容器沙盒隔离的多用户Agent系统的后台原型以帮助理解相关的原理。内容目录Manus原理乱猜设计一个多用户的Agent后台准备Docker Image准备Docker Container管理接口构建ToolPython代码执行器Docker版构建Tool浏览器自动化Docker版组装Prompts与ReAct Agent测试与改进我们分两篇介绍以上内容配套代码获取请参考文末说明。01 Manus原理乱猜从为数不多的演示视频看Manus背后的一些技术的要点有一个自主的多Agent/多Tools系统。由一个任务调度的Agent与多个负责任务执行的Agent或嵌套多Agent系统组成不同的Agent可以根据需要使用擅长不同任务的LLM。编程任务Agent与Web浏览Agent是核心Agent之一。为什么因为这两种Agent最具“通用”能力。借助虚拟环境比如Docker容器做用户隔离。为什么一个是减少用户间的影响一个是系统安全。你敢让用户指示AI写出的代码随便在本机环境运行吗目前擅长的任务流程还是以线性任务为主。纯推测。因为非线形任务对LLM推理要求极高或者借助Workflow来实现但Workflow又缺乏通用型。简单的说每个登录用户会有一个自己的“manus”Agent每个manus有自己的电脑虚拟机与工作空间来完成任务。比如运行代码、浏览网络、创建文件等。大致的工作流程当然这里的细节我们在实际工程中可根据自己的实际情况参考。02 设计一个多用户Agent后台参考这些要点我们实现一个简化版的支持多用户的Agent系统。【基本能力】有简单的自我规划并结合上下文的步骤推理能力至少有编码Agent与Web Agent两种子任务能力这两种Agent工作在动态的容器中以确保安全可多用户同时使用用户的容器与工作空间要隔离【系统架构】系统架构与大致流程设计这个系统中包含的组件有一个预建的Docker镜像用来启动用户虚拟环境一个容器管理器组件用来管理多个用户虚拟环境一个ReAct范式Agent模拟任务步骤推理与调度四个任务执行的Tool也可以是Agent用于CodeGenerator: 生成Python代码WebpageCrawler: 采集指定网址的内容CodeExecutor: 虚拟环境中执行代码脚本Browser: 执行网络自动浏览一个Web Agent给Browser调用的自动化浏览Agent在虚拟环境中一个共享工作区存放任务过程中输入输出文件【工作流程】下面以一个简单的任务结合实际运行的效果图说明系统工作流程。1. 通过Docker Build创建一个用来启动用户虚拟环境的镜像Docker Image。你需要能在本地的Docker镜像库中看到它2. 用户输入任务这里用输入用户ID来模拟不同用户此时系统会创建一个用户ID对应的ReActAgent启动一个用户ID对应的虚拟环境Docker容器注意这里的容器名3. ReActAgent进入任务推理循环根据上图中的输入任务自动完成如下步骤首先调用WebpageCrawler采集网页内容保存到用户工作区下的一个文件。调用CodeGenerator生成对该文件分析的python代码。调用CodeExecutor连接到Docker容器在容器中执行该代码。获得代码执行结果并反馈用户。以上步骤如果失败由ReActAgent推理进行再次尝试直到成功或到达最大迭代次数。比如这里执行发现版本问题会自动使用pip install做更新4. 返回任务执行结果。如果没有新任务则销毁agent并停止容器。下面我们介绍核心组件的实现过程你可以使用配套源码进行实验。03 准备Docker Image由于需要借助AI编程来完成不同用户的任务提供虚拟环境用于代码执行是必要的。需要注意的是我们为了调试方便没有把整个Agent系统都放到虚拟环境下只把两种类型的任务执行放在容器中完成Python代码执行与Web浏览自动化。【Image内容】启动Docker容器首先需要准备好必要的镜像Build Image。这个镜像预置如下内容基本的Python代码执行环境常见的Python第三方库。比如数据分析pandas需要在虚拟环境下使用的工具。比如我们需要Chromium用来web浏览必要的脚本包括shell或者预建的python代码。比如我们这里把用于自动网络浏览的Web Agent代码build到这个虚拟镜像中agent_browser.py用来给Browser这个Tool直接调用为什么因为对于复杂且需要在虚拟环境下的工作任务你不可能每次现场编程来完成既不稳定也不高效尽量把最常见的第三方库直接build进去否则会在执行任务时现场安装影响性能。【构建过程】1. 安装并启动好Docker后台。2. 准备好DockerfileDockerfile是构建Image镜像的配置文件。除了常见的拉取基础镜像安装必要的操作系统与Python包以外这里有一些特殊的增加说明如下playwright installplaywright是一个自动化Web测试工具用来实现在Docker中控制浏览器。这一步是在镜像中安装对应的chromium浏览器。start.sh启动脚本启动脚本是每一个容器在启动后执行的动作ENTRYPOINT指令设置。start.sh内容为#!/bin/bash Xvfb :99 -screen 0 1024x768x16 sleep 1 exec $这个脚本作用是启动一个虚拟显示服务器用来在没有显示器docker容器的情况下运行图形应用也就是Chromium浏览器用来实现浏览自动化。agent_browser.py这是一个预购建的Web Agent代码用来执行自动化web浏览任务参考文章Web Agent技术揭秘如何让DeepSeek接管与控制你的浏览器3. 最后使用docker build命令生成镜像。你可以使用我们代码中的build.sh来构建等待出现提示现在你的Docker镜像就已经准备完毕。如果后期有需要可以修改Dockerfile后重新build即可。04 Docker Container管理接口为了方便对容器管理比如启动、停止、执行代码等我们来准备简单的Container管理组件与接口。【Docker API封装】对Docker的Container API做封装。大致接口如下详细请参考源码包......class DockerContainer:管理Docker容器的简单类def __init__(self,image: str python-data-analysis:3.11,container_name: str llamaindex-executor,base_work_dir: str /Users/pingcy/workspace,auto_remove: bool True):...def start(self):启动Docker容器...def set_work_dir(self, work_dir: str) - None:设置当前工作目录Args:work_dir: 新的工作目录...def stop(self):停止Docker容器...def execute(self, code: str, language: str python, work_dir: Optional[str] None) - Dict[str, str]:在Docker容器中执行代码Args:code: 要执行的代码language: 代码语言支持 python, sh, bashwork_dir: 执行代码的工作目录如果不提供则使用当前工作目录Returns:Dict包含output和error字段...【多用户下的Container管理接口】现在可以在此基础上提供Container管理的方便函数给Agent使用。这里有两个要点支持多用户。需保留用户与容器的对应关系。确保每个用户只有一个容器单体。获取/启动容器的函数... # 全局变量 - Docker容器映射表按用户ID组织 _docker_containers: Dict[str, DockerContainer] {} BASE_WORK_DIR /Users/ #用来获取特定用户的容器单体实例 def get_docker_container( user_id: str default, image: str python_code_executor:3.11, container_name: Optional[str] None, ) - DockerContainer: 获取或创建特定用户的Docker容器 Args: user_id: 用户ID用于区分不同用户 image: Docker镜像名称 container_name: 容器名称如不提供则根据用户ID生成 Returns: DockerContainer: 用户专属的容器实例 global _docker_containers # 如果不提供容器名称则根据用户ID生成 if container_name is None: container_name fllamaindex-executor-{user_id} # 为用户创建专属容器 if user_id not in _docker_containers or _docker_containers[user_id] is None: _docker_containers[user_id] DockerContainer( imageimage, container_namecontainer_name, base_work_diros.path.join(BASE_WORK_DIR, user_id) ) _docker_containers[user_id].start() # 确保用户基本工作目录存在 user_work_dir os.path.join(BASE_WORK_DIR, user_id) os.makedirs(user_work_dir, exist_okTrue) return _docker_containers[user_id]停止容器的函数... # 关闭特定用户的Docker容器 def close_docker_container(user_id: str default): global _docker_containers ... # 关闭所有Docker容器 def close_all_docker_containers(): global _docker_containers ...【测试】使用如下代码来测试能否动态启动一个容器并在容器中执行一段代码def test_docker_container(): #启动一个容器 container get_docker_container(user_idtest_user) #执行的代码 code import sys print(Testing Docker container...) print(fPython version: {sys.version}) try: #在容器中执行代码 result container.execute(code, python) print(Execution result:) print(fOutput: {result[output]}) print(fError: {result[error]}) finally: #关闭容器 close_docker_container(test_user)你应该可以看到如下的输出现在我们已经完成了基本的准备工作我们将在下篇中介绍如何构建Tools与Agent部分欢迎继续关注。