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.py
、messages.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 模型可以作为坚实基础。
如你所愿,它所做的,正是把“目标”转化成“自动执行的现实”那一步。
如夜话,至此。
发表评论: