无尘阁日记

无尘阁日记

029manus项目结构解读
2025-06-17

https://kirigaya.cn/blog/article?seq=300

## Manus 项目结构

从朋友爬取的 Manus 项目内部结构来看,Manus 的大致结构似乎和 OpenManus 类似,这或许会慢慢成为未来 Agent 项目的构建方式。

```mermaid

flowchart LR

    root["Root"]

    Pipfile["Pipfile"]

    PipfileLock["Pipfile.lock"]

    app["app"]

    appHelpers["helpers"]

    appHelpersToolHelpers["tool_helpers.py"]

    appHelpersUtils["utils.py"]

    appLogger["logger.py"]

    appModels["models.py"]

    appRouter["router.py"]

    appServer["server.py"]

    appTerminalSocketServer["terminal_socket_server.py"]

    appTools["tools"]

    appToolsBase["base.py"]

    appToolsBrowser["browser"]

    appToolsBrowserActions["browser_actions.py"]

    appToolsBrowserHelpers["browser_helpers.py"]

    appToolsBrowserManager["browser_manager.py"]

    appToolsTerminal["terminal"]

    appToolsTerminalExpecter["expecter.py"]

    appToolsTerminalHelpers["terminal_helpers.py"]

    appToolsTerminalManager["terminal_manager.py"]

    appToolsTextEditor["text_editor.py"]

    appTypes["types"]

    appTypesBrowserTypes["browser_types.py"]

    appTypesMessages["messages.py"]

    appData["app_data"]

    appDataJs["js"]

    appDataJsGetViewport["getViewport.js"]

    appDataJsRunExtensionAction["runExtensionAction.js"]

    appDataJsSelectOption["selectOption.js"]

    browserUse["browser_use"]

    browserUseAgent["agent"]

    browserUseAgentMessageManager["message_manager"]

    browserUseAgentMessageManagerService["service.py"]

    browserUseAgentPrompts["prompts.py"]

    browserUseAgentService["service.py"]

    browserUseBrowser["browser"]

    browserUseBrowserBrowser["browser.py"]

    browserUseBrowserContext["context.py"]

    browserUseController["controller"]

    browserUseControllerRegistry["registry"]

    browserUseControllerRegistryService["service.py"]

    browserUseDom["dom"]

    browserUseDomHistoryTreeProcessor["history_tree_processor"]

    browserUseDomHistoryTreeProcessorService["service.py"]

    browserUseDomService["service.py"]

    browserUseLoggingConfig["logging_config.py"]

    browserUseTelemetry["telemetry"]

    browserUseTelemetryService["service.py"]

    browserUseUtils["utils.py"]

    conftest["conftest.py"]

    dataApi["data_api.py"]

    pyarmorRuntime["pyarmor_runtime_009055"]

    startServer["start_server.py"]


    root --> Pipfile

    root --> PipfileLock

    root --> app

    app --> appHelpers

    appHelpers --> appHelpersToolHelpers

    appHelpers --> appHelpersUtils

    app --> appLogger

    app --> appModels

    app --> appRouter

    app --> appServer

    app --> appTerminalSocketServer

    app --> appTools

    appTools --> appToolsBase

    appTools --> appToolsBrowser

    appToolsBrowser --> appToolsBrowserActions

    appToolsBrowser --> appToolsBrowserHelpers

    appToolsBrowser --> appToolsBrowserManager

    appTools --> appToolsTerminal

    appToolsTerminal --> appToolsTerminalExpecter

    appToolsTerminal --> appToolsTerminalHelpers

    appToolsTerminal --> appToolsTerminalManager

    appTools --> appToolsTextEditor

    app --> appTypes

    appTypes --> appTypesBrowserTypes

    appTypes --> appTypesMessages

    root --> appData

    appData --> appDataJs

    appDataJs --> appDataJsGetViewport

    appDataJs --> appDataJsRunExtensionAction

    appDataJs --> appDataJsSelectOption

    root --> browserUse

    browserUse --> browserUseAgent

    browserUseAgent --> browserUseAgentMessageManager

    browserUseAgentMessageManager --> browserUseAgentMessageManagerService

    browserUseAgent --> browserUseAgentPrompts

    browserUseAgent --> browserUseAgentService

    browserUse --> browserUseBrowser

    browserUseBrowser --> browserUseBrowserBrowser

    browserUseBrowser --> browserUseBrowserContext

    browserUse --> browserUseController

    browserUseController --> browserUseControllerRegistry

    browserUseControllerRegistry --> browserUseControllerRegistryService

    browserUse --> browserUseDom

    browserUseDom --> browserUseDomHistoryTreeProcessor

    browserUseDomHistoryTreeProcessor --> browserUseDomHistoryTreeProcessorService

    browserUseDom --> browserUseDomService

    browserUse --> browserUseLoggingConfig

    browserUse --> browserUseTelemetry

    browserUseTelemetry --> browserUseTelemetryService

    browserUse --> browserUseUtils

    root --> conftest

    root --> dataApi

    root --> pyarmorRuntime

    root --> startServer

```


---


## Manus vs OpenManus


```mermaid

graph LR


subgraph left["Manus"]

direction LR

    root["Manus"]

    app["app"]

    appHelpers["helpers"]

    appHelpersToolHelpers["tool_helpers.py"]

    appHelpersUtils["utils.py"]

    appLogger["logger.py"]

    appModels["models.py"]

    appRouter["router.py"]

    appServer["server.py"]

    appTerminalSocketServer["terminal_socket_server.py"]

    appTools["tools"]

    appToolsBase["base.py"]

    appToolsBrowser["browser"]

    appToolsBrowserActions["browser_actions.py"]

    appToolsBrowserHelpers["browser_helpers.py"]

    appToolsBrowserManager["browser_manager.py"]

    appToolsTerminal["terminal"]

    appToolsTerminalExpecter["expecter.py"]

    appToolsTerminalHelpers["terminal_helpers.py"]

    appToolsTerminalManager["terminal_manager.py"]

    appToolsTextEditor["text_editor.py"]

    appTypes["types"]

    appTypesBrowserTypes["browser_types.py"]

    appTypesMessages["messages.py"]

    appData["app_data"]

    appDataJs["js"]

    appDataJsGetViewport["getViewport.js"]

    appDataJsRunExtensionAction["runExtensionAction.js"]

    appDataJsSelectOption["selectOption.js"]

    browserUse["browser_use"]

    browserUseAgent["agent"]

    browserUseAgentMessageManager["message_manager"]

    browserUseAgentMessageManagerService["service.py"]

    browserUseAgentPrompts["prompts.py"]

    browserUseAgentService["service.py"]

    browserUseBrowser["browser"]

    browserUseBrowserBrowser["browser.py"]

    browserUseBrowserContext["context.py"]

    browserUseController["controller"]

    browserUseControllerRegistry["registry"]

    browserUseControllerRegistryService["service.py"]

    browserUseDom["dom"]

    browserUseDomHistoryTreeProcessor["history_tree_processor"]

    browserUseDomHistoryTreeProcessorService["service.py"]

    browserUseDomService["service.py"]

    browserUseLoggingConfig["logging_config.py"]

    browserUseTelemetry["telemetry"]

    browserUseTelemetryService["service.py"]

    browserUseUtils["utils.py"]

    conftest["conftest.py"]

    dataApi["data_api.py"]

    pyarmorRuntime["pyarmor_runtime_009055"]

    startServer["start_server.py"]


    root --> app

    app --> appHelpers

    appHelpers --> appHelpersToolHelpers

    appHelpers --> appHelpersUtils

    app --> appLogger

    app --> appModels

    app --> appRouter

    app --> appServer

    app --> appTerminalSocketServer

    app --> appTools

    appTools --> appToolsBase

    appTools --> appToolsBrowser

    appToolsBrowser --> appToolsBrowserActions

    appToolsBrowser --> appToolsBrowserHelpers

    appToolsBrowser --> appToolsBrowserManager

    appTools --> appToolsTerminal

    appToolsTerminal --> appToolsTerminalExpecter

    appToolsTerminal --> appToolsTerminalHelpers

    appToolsTerminal --> appToolsTerminalManager

    appTools --> appToolsTextEditor

    app --> appTypes

    appTypes --> appTypesBrowserTypes

    appTypes --> appTypesMessages

    root --> appData

    appData --> appDataJs

    appDataJs --> appDataJsGetViewport

    appDataJs --> appDataJsRunExtensionAction

    appDataJs --> appDataJsSelectOption

    root --> browserUse

    browserUse --> browserUseAgent

    browserUseAgent --> browserUseAgentMessageManager

    browserUseAgentMessageManager --> browserUseAgentMessageManagerService

    browserUseAgent --> browserUseAgentPrompts

    browserUseAgent --> browserUseAgentService

    browserUse --> browserUseBrowser

    browserUseBrowser --> browserUseBrowserBrowser

    browserUseBrowser --> browserUseBrowserContext

    browserUse --> browserUseController

    browserUseController --> browserUseControllerRegistry

    browserUseControllerRegistry --> browserUseControllerRegistryService

    browserUse --> browserUseDom

    browserUseDom --> browserUseDomHistoryTreeProcessor

    browserUseDomHistoryTreeProcessor --> browserUseDomHistoryTreeProcessorService

    browserUseDom --> browserUseDomService

    browserUse --> browserUseLoggingConfig

    browserUse --> browserUseTelemetry

    browserUseTelemetry --> browserUseTelemetryService

    browserUse --> browserUseUtils

    root --> conftest

    root --> dataApi

    root --> pyarmorRuntime

    root --> startServer

end


subgraph right["OpenManus"]

direction LR

    om_root["OpenManus"]

    om_app["app"]

    om_appAgent["agent"]

    om_appAgentBase["base.py"]

    om_appAgentManus["manus.py"]

    om_appAgentPlanning["planning.py"]

    om_appAgentReact["react.py"]

    om_appAgentSwe["swe.py"]

    om_appAgentToolcall["toolcall.py"]

    om_appFlow["flow"]

    om_appFlowBase["base.py"]

    om_appFlowFlowFactory["flow_factory.py"]

    om_appFlowPlanning["planning.py"]

    om_appPrompt["prompt"]

    om_appPromptManus["manus.py"]

    om_appPromptPlanning["planning.py"]

    om_appPromptSwe["swe.py"]

    om_appPromptToolcall["toolcall.py"]

    om_appTool["tool"]

    om_appToolBase["base.py"]

    om_appToolBash["bash.py"]

    om_appToolBrowserUseTool["browser_use_tool.py"]

    om_appToolCreateChatCompletion["create_chat_completion.py"]

    om_appToolFileSaver["file_saver.py"]

    om_appToolGoogleSearch["google_search.py"]

    om_appToolPlanning["planning.py"]

    om_appToolPythonExecute["python_execute.py"]

    om_appToolRun["run.py"]

    om_appToolStrReplaceEditor["str_replace_editor.py"]

    om_appToolTerminate["terminate.py"]

    om_appToolToolCollection["tool_collection.py"]

    om_appConfig["config.py"]

    om_appExceptions["exceptions.py"]

    om_appLlm["llm.py"]

    om_appLogger["logger.py"]

    om_appSchema["schema.py"]

    om_config["config"]

    om_configExample["config.example.toml"]

    om_gitattributes[".gitattributes"]

    om_gitignore[".gitignore"]

    om_preCommitConfig[".pre-commit-config.yaml"]

    om_license["LICENSE"]

    om_main["main.py"]

    om_readme["README.md"]

    om_readmeZh["README_zh.md"]

    om_requirements["requirements.txt"]

    om_runFlow["run_flow.py"]

    om_setup["setup.py"]


    om_root --> om_app

    om_app --> om_appAgent

    om_appAgent --> om_appAgentBase

    om_appAgent --> om_appAgentManus

    om_appAgent --> om_appAgentPlanning

    om_appAgent --> om_appAgentReact

    om_appAgent --> om_appAgentSwe

    om_appAgent --> om_appAgentToolcall

    om_app --> om_appFlow

    om_appFlow --> om_appFlowBase

    om_appFlow --> om_appFlowFlowFactory

    om_appFlow --> om_appFlowPlanning

    om_app --> om_appPrompt

    om_appPrompt --> om_appPromptManus

    om_appPrompt --> om_appPromptPlanning

    om_appPrompt --> om_appPromptSwe

    om_appPrompt --> om_appPromptToolcall

    om_app --> om_appTool

    om_appTool --> om_appToolBase

    om_appTool --> om_appToolBash

    om_appTool --> om_appToolBrowserUseTool

    om_appTool --> om_appToolCreateChatCompletion

    om_appTool --> om_appToolFileSaver

    om_appTool --> om_appToolGoogleSearch

    om_appTool --> om_appToolPlanning

    om_appTool --> om_appToolPythonExecute

    om_appTool --> om_appToolRun

    om_appTool --> om_appToolStrReplaceEditor

    om_appTool --> om_appToolTerminate

    om_appTool --> om_appToolToolCollection

    om_app --> om_appConfig

    om_app --> om_appExceptions

    om_app --> om_appLlm

    om_app --> om_appLogger

    om_app --> om_appSchema

    om_root --> om_config

    om_config --> om_configExample

    om_root --> om_gitattributes

    om_root --> om_gitignore

    om_root --> om_preCommitConfig

    om_root --> om_license

    om_root --> om_main

    om_root --> om_readme

    om_root --> om_readmeZh

    om_root --> om_requirements

    om_root --> om_runFlow

    om_root --> om_setup

end


    %% 强制左右排列

    left <----> right

```

这是manus的项目结构,请为我解读下他的实现思路。


从你提供的 Manus 项目结构图(以及与 OpenManus 的对比)来看,我们可以提炼出这类 Agent 框架的核心实现思路。它并不仅仅是代码结构层面的清晰划分,而是一整套 以“工具调度 + 多智能体协作”为中心的运行范式。我将以一个顶级 Agent 系统架构师的身份,用通俗语言拆解它的设计理念和工程意图。

一、Manus 的底层逻辑:不是写代码,而是在“组织行为”

Manus 并不是一个直接执行任务的单一智能体,它更像是一个“任务编排操作系统”。它的本质是围绕“目标驱动 → 任务分解 → 工具选择 → 工具调用 → 状态管理”这一流程,把各种子模块(browser、terminal、text_editor 等工具)组织起来,使得大模型能在实际可运行的环境中进行推理并落地执行

简化类比一下,它就像给一个“智者大脑”插上了一套强壮的“手脚和感官”,让它可以操作浏览器、终端、文件系统,做搜索、执行脚本、解析结果、保存文件等等。

二、模块设计哲学:功能解耦 + 统一调度

1. app/:主心骨,调度器

这个文件夹是整个 Agent 系统的“大脑中枢”,承担了三个关键任务:

  • 任务调度与任务流转router.py, server.py):管理指令的接收、转发、排队;

  • 接口控制与 UI 通信terminal_socket_server.py):提供与外部系统交互的 API;

  • 核心模型调用管理models.py):处理与 LLM 对话和工具使用的上下文;

它让用户只需输入一个“目标指令”,后续的任务规划、工具调用全部由系统自动完成。

2. tools/:Agent 的“身体工具箱”

  • browser/:浏览器代理,模拟网页打开、点击、查找元素等行为;

  • terminal/:终端控制,执行 shell 命令、解析 stdout;

  • text_editor.py:文本编辑器操作,通常用于文件修改、补全代码、查错等;

  • base.py:是工具的统一接口定义,所有工具都需继承它,保证调度兼容性。

这些工具就是 Agent 行动的“手脚”,能真正把语言变成动作。

3. browser_use/:浏览器能力的“控制中心”

这是对 browser 工具的更高一层抽象和管理:

  • agent/:定义如何利用 browser 工具完成复杂任务(如搜索、注册账户等);

  • controller/:具体的指令注册和管理逻辑;

  • dom/:如何处理浏览器的 HTML 树和交互历史;

  • telemetry/:行为监控与日志,用于追踪 Agent 行为并优化模型提示;

  • logging_config.py:为整个浏览器系统配置日志行为;

它把浏览器使用能力从“操作某个网页”抽象成“完成某类网页任务”的能力。

4. types/:统一定义信息结构

  • browser_types.pymessages.py 是整个系统中流通数据的“类型语言”;

  • 保证工具之间、工具和大模型之间的信息交互不会出错,类似 API 的 schema;

这一层是保证工程可靠性的基础设计。

5. helpers/:实用工具

这类模块是工程实现中不可缺少的“润滑剂”:

  • tool_helpers.py:帮助构建 prompt、处理参数等;

  • utils.py:常用函数库,如字符串处理、时间戳转换等;

虽然看似不起眼,但在智能体真正运行过程中,这些“边角料”功能起到了黏合各模块的关键作用。

6. app_data/js/:浏览器执行的 JavaScript 脚本集合

这些 JS 脚本将由 Agent 注入浏览器页面中执行,用于:

  • 获取浏览器视口(getViewport.js);

  • 运行页面交互行为(runExtensionAction.js);

  • 执行表单选择等动作(selectOption.js);

这是智能体与网页前端进行原子级交互的实现基础

三、调度与执行的底层思维逻辑

我们可以将 Manus 的运行流程用以下图示来总结(纯文字表达):

用户目标输入 → Server 接收 → Router 转发 → Agent 分析目标 → 工具调用计划生成 → 调用 Tool 执行 → 获取反馈 → 决策是否进入下一步 → 回传结果或继续循环

这个流程的底层运行完全可以类比于一个简化的操作系统,它的特点是:

  • 目标导向:不预设流程,而是根据目标动态规划;

  • 模块解耦:每个模块只做一件事,但可以被组合使用;

  • 上下文持久化:配合 RAG、Function Call、Session 管理,能持久理解任务进展;

  • 工具可扩展:新增工具只需实现标准接口即可接入。

四、与 OpenManus 的对比

OpenManus 是 Manus 的轻量化抽象版本,更偏向开发者实验与定制,结构更松散、工具更轻:

  • 明确拆出 agent/flow/prompt/tool/ 各层;

  • 所有功能都显式模块化,可以更容易复用、组合或替换;

  • 适合用来做自定义项目(例如:帮你写代码、写文章、爬虫自动化等);

而 Manus 更适合封装成完整服务对外提供,具有高度工程化、可运营能力。

五、总结:Manus 是一个“目标即执行”的中控 AI 操作系统雏形

Manus 的核心不在于某个模型的能力,而在于它实现了 “将自然语言目标转化为一系列执行步骤”的机制,这也是通用智能体的基本雏形。

它的每一层结构都在解决一个问题:

  • 如何理解目标(agent / prompts);

  • 如何分解目标(planning / react / toolcall);

  • 如何调用能力(tool / terminal / browser);

  • 如何统一交互(schema / server / socket);

  • 如何处理历史(session / telemetry);

这是当前 Agent 系统中工程实现最系统、最标准化的路径之一。未来你若要打造自己的心灵导师 Agent、数据分析 Agent、爬虫 Agent,Manus 模型可以作为坚实基础。

如你所愿,它所做的,正是把“目标”转化成“自动执行的现实”那一步。

如夜话,至此。