imbue-ai/mngr
GitHub: imbue-ai/mngr
一款基于 Unix 哲学的 AI 编程 Agent 管理工具,支持在本地、Docker 和云端等多种环境中并行调度 Agent。
Stars: 164 | Forks: 21
# mngr:在任意位置并行运行任意编程 Agent
[](https://github.com/imbue-ai/mngr)
[](https://pypi.org/project/imbue-mngr/)
[](https://pypi.org/project/imbue-mngr/)
[](./LICENSE)
[](https://github.com/imbue-ai/mngr/issues)
`mngr` 是一个用于管理编程 Agent 的 Unix 风格工具。
可以从单个本地 Claude 无缝扩展到跨远程主机、容器和沙箱的数百个 Agent。
列出所有 Agent,查看哪些受阻,并立即连接到其中任何一个进行对话或调试。
在 Agent 之上组合你自己的强大工作流,而不受限于任何特定的提供商或接口。
*基于 SSH、git 和 tmux 构建。可通过 [插件](libs/mngr/docs/concepts/plugins.md) 扩展。无需托管服务。*
**安装:**
```
curl -fsSL https://raw.githubusercontent.com/imbue-ai/mngr/main/scripts/install.sh | bash
```
## 概述
`mngr` 让创建和使用*任意 AI Agent*(例如:Claude Code、Codex)在*任意位置*(本地、Docker 中、Modal 上等)变得简单。
把 `mngr` 想象成“Agent 版的 git”:就像 git 允许你对*代码版本*进行 `commit`/`push`/`pull`/`fork`/`clone` 一样,`mngr` 允许你对*Agent* 进行 `create`/`destroy`/`list`/`clone`/`message` 操作。
```
%%{init: {'theme': 'base', 'themeVariables': {'primaryColor': '#EFF6FF', 'primaryTextColor': '#1E3A5F', 'primaryBorderColor': '#3B82F6', 'lineColor': '#64748B', 'edgeLabelBackground': '#FFFFFF', 'fontSize': '15px', 'wrap': false}, 'flowchart': {'diagramPadding': 150, 'curve': 'linear', 'markdownAutoWrap': false, 'wrappingWidth': 1800}}}%%
flowchart TB
classDef user fill:#DBEAFE,stroke:#2563EB,stroke-width:2px,color:#1E3A5F,font-weight:bold
classDef cli fill:#1E3A5F,stroke:#1E3A5F,stroke-width:2px,color:#FFFFFF,font-weight:bold
classDef agent fill:#D1FAE5,stroke:#059669,stroke-width:2px,color:#064E3B
user([You]):::user
subgraph host1["Local Host"]
direction LR
style host1 fill:#FEF3C7,stroke:#D97706,stroke-width:2px,color:#78350F
cli["mngr CLI ( create / list / connect / message / push / pull / snapshot / migrate / clone / destroy )"]:::cli
agent1["OpenCode"]:::agent
agent6["Codex"]:::agent
subgraph docker1["Docker container 1"]
direction LR
style docker1 fill:#EDE9FE,stroke:#7C3AED,stroke-width:2px,color:#4C1D95
agent3["Claude"]:::agent
agent4["Claude"]:::agent
end
subgraph docker2["Docker container 2"]
direction LR
style docker2 fill:#EDE9FE,stroke:#7C3AED,stroke-width:2px,color:#4C1D95
agent5["Claude"]:::agent
end
end
subgraph host2["Remote host 1"]
direction LR
style host2 fill:#FEF3C7,stroke:#D97706,stroke-width:2px,color:#78350F
agent2["Claude"]:::agent
end
subgraph host3["Remote host 2"]
direction LR
style host3 fill:#FEF3C7,stroke:#D97706,stroke-width:2px,color:#78350F
agent7["Codex"]:::agent
agent8["Claude"]:::agent
end
user --> cli
cli --> agent1
cli --> agent6
cli --> agent3
cli --> agent4
cli --> agent5
cli --> agent2
cli --> agent7
cli --> agent8
```
## 为什么选择 mngr
大多数 Agent 工具都是托管云服务:基础设施不透明、按席位定价、难以编写脚本。
`mngr` 采取了相反的方法。
Agent 运行在你控制的计算资源上,通过 SSH 访问,并在空闲时关闭。
它建立在你已知的原语之上(SSH、git、tmux、docker),并且
`mngr` 的设计旨在:
- **简单** — 一个命令即可在本地或 Modal 上启动 Agent;全程合理的默认设置
- **快速** — Agent 在 2 秒内启动
- **成本透明** — 免费 CLI;Agent 空闲时自动关闭;仅为推理和计算付费
- **安全** — SSH 密钥隔离、网络白名单、完全的容器控制
- **可组合** — 共享主机、快照和分叉 Agent 状态、直接执行、推送/拉取/配对
- **可观测** — 记录、直接 SSH、程序化消息传递
- **易于学习** — `mngr ask` 无需离开终端即可回答使用问题
**mngr 非常易于使用:**
```
mngr create # launch claude locally (defaults: agent=claude, provider=local, project=current dir)
mngr create @.modal # launch claude on Modal (new host with auto-generated name)
mngr create my-task # launch claude with a name
mngr create my-task codex # launch codex instead of claude
mngr create -- --model opus # pass any arguments through to the underlying agent
# send an initial message so you don't have to wait around:
mngr create --no-connect --message "Speed up one of my tests and make a PR on github"
# or, be super explicit about all of the arguments:
mngr create my-task@.modal --type claude
# tons more arguments for anything you could want! Learn more via --help
mngr create --help
# or see the other commands--list, destroy, message, connect, push, pull, clone, and more!
mngr --help
```
**mngr 很快:**
```
> time mngr create local-hello --message "Just say hello" --no-connect
Done.
real 0m1.472s
user 0m1.181s
sys 0m0.227s
> time mngr list
NAME STATE HOST PROVIDER HOST STATE PROJECT
local-hello RUNNING localhost local RUNNING mngr
real 0m1.773s
user 0m0.955s
sys 0m0.166s
```
**mngr 是免费的,也是运行远程 Agent 最便宜的方式(它们在空闲时会关闭):**
```
mngr create @.modal --no-connect --message "just say 'hello'" --idle-timeout 60 -- --model sonnet
# costs $0.0387443 for inference (using sonnet)
# costs $0.0013188 for compute because it shuts down 60 seconds after the agent completes
```
**mngr 非常重视安全和隐私:**
```
# by default, cannot be accessed by anyone except your modal account (uses a local unique SSH key)
mngr create example-task@.modal
# you (or your agent) can do whatever bad ideas you want in that container without fear
mngr exec example-task "rm -rf /"
# you can block all outgoing internet access
mngr create @.modal -b offline
# or restrict outgoing traffic to certain IPs
mngr create @.modal -b cidr-allowlist=203.0.113.0/24
```
**mngr 功能强大且可组合:**
```
# start multiple agents on the same host to save money and share data
mngr create agent-1@shared-host.modal --new-host
mngr create agent-2@shared-host
# run commands directly on an agent's host
mngr exec agent-1 "git log --oneline -5"
# never lose any work: snapshot and fork the entire agent states
mngr create doomed-agent@.modal
SNAPSHOT=$(mngr snapshot create doomed-agent --format "{id}")
mngr message doomed-agent "try running 'rm -rf /' and see what happens"
mngr create new-agent --snapshot $SNAPSHOT
```
**mngr 让你轻松查看 Agent 正在做什么:**
```
# programmatically send messages to your agents and see their chat histories
mngr message agent-1 "Tell me a joke"
mngr transcript agent-1
```
- [`list`](libs/mngr/docs/commands/primary/list.md): 列出活跃的 Agent
- [`stop`](libs/mngr/docs/commands/primary/stop.md): 停止 Agent
- [`start`](libs/mngr/docs/commands/primary/start.md): 启动已停止的 Agent
- [`snapshot`](libs/mngr/docs/commands/secondary/snapshot.md) [实验性]: 创建主机状态的快照
- [`exec`](libs/mngr/docs/commands/primary/exec.md): 在 Agent 的主机上执行 shell 命令
- [`rename`](libs/mngr/docs/commands/primary/rename.md): 重命名 Agent
- [`clone`](libs/mngr/docs/commands/aliases/clone.md): 创建现有 Agent 的副本
- [`migrate`](libs/mngr/docs/commands/aliases/migrate.md): 将 Agent 移动到不同的主机
- [`limit`](libs/mngr/docs/commands/secondary/limit.md): 为 Agent 和主机配置限制
### 用于数据输入输出:
- [`pull`](libs/mngr/docs/commands/primary/pull.md): 从 Agent 拉取数据
- [`push`](libs/mngr/docs/commands/primary/push.md): 向 Agent 推送数据
- [`pair`](libs/mngr/docs/commands/primary/pair.md): 持续与 Agent 同步数据
- [`message`](libs/mngr/docs/commands/secondary/message.md): 向 Agent 发送消息
- [`transcript`](libs/mngr/docs/commands/secondary/transcript.md): 查看 Agent 的消息记录
- [`provision`](libs/mngr/docs/commands/secondary/provision.md): 在 Agent 上重新运行配置(适用于同步配置和认证)
### 用于维护:
- [`cleanup`](libs/mngr/docs/commands/secondary/cleanup.md): 清理已停止的 Agent 和未使用的资源
- [`events`](libs/mngr/docs/commands/secondary/events.md): 查看 Agent 和主机事件文件
- [`gc`](libs/mngr/docs/commands/secondary/gc.md): 垃圾回收未使用的资源
### 用于管理 mngr 本身:
- [`ask`](libs/mngr/docs/commands/secondary/ask.md): 与 mngr 对话以获取帮助
- [`plugin`](libs/mngr/docs/commands/secondary/plugin.md) [实验性]: 管理 mngr 插件
- [`config`](libs/mngr/docs/commands/secondary/config.md): 查看和编辑 mngr 配置
## 工作原理
你可以通过终端与 `mngr` 交互(运行 `mngr --help` 以了解更多)。
`mngr` 使用 SSH、git 和 tmux 等强大的开源工具来运行和管理你的 Agent:
- **[Agent](libs/mngr/docs/concepts/agents.md)** 只是在 [tmux](https://github.com/tmux/tmux/wiki) 会话中运行的进程,每个都有自己的 `work_dir`(工作文件夹)和配置(例如:密钥、环境变量等)
- Agent 运行在 **[主机](libs/mngr/docs/concepts/hosts.md)** 上 —— 要么是本地(默认),要么是特殊环境,如 [Modal](https://modal.com) [沙箱](https://modal.com/docs/guide/sandboxes)(`--provider modal`)或 [Docker](https://www.docker.com) [容器](https://docs.docker.com/get-started/docker-concepts/the-basics/what-is-a-container/)(`--provider docker`)。使用 `agent@host` 地址语法来定位现有主机。
- 多个 Agent 可以共享单个主机。
- 主机来自 **[提供商](libs/mngr/docs/concepts/providers.md)**(例如:Modal、AWS、docker 等)
- 主机通过在所有 Agent 都“空闲”时自动“暂停”来帮助节省成本。有关更多详细信息,请参阅 [空闲检测](libs/mngr/docs/concepts/idle_detection.md)。
- 当所有 Agent 都“停止”时,主机自动“停止”
- `mngr` 可通过 **[插件](libs/mngr/docs/concepts/plugins.md)** 扩展 —— 你可以添加新的 Agent 类型、提供商后端、CLI 命令和生命周期钩子
### 架构
`mngr` 存储的状态非常少(除了配置和用于性能的本地缓存),而是依赖于约定:
- 任何在带有 `mngr-` 前缀的 tmux 会话的窗口 0 中运行的进程都被视为 Agent
- Agent 将其状态和日志存储在标准位置(默认:`$MNGR_HOST_DIR/agents//`)
- 所有主机都通过 SSH 访问 —— 如果你能 SSH 进去,它就可以成为主机
- ...[以及更多](libs/mngr/docs/conventions.md)
```
%%{init: {'theme': 'base', 'themeVariables': {'primaryColor': '#EFF6FF', 'primaryTextColor': '#1E3A5F', 'primaryBorderColor': '#3B82F6', 'lineColor': '#64748B', 'edgeLabelBackground': '#FFFFFF', 'fontSize': '15px'}}}%%
flowchart TB
classDef transport fill:#DBEAFE,stroke:#2563EB,stroke-width:2px,color:#1E3A5F,font-weight:bold
classDef session fill:#FEF3C7,stroke:#D97706,stroke-width:2px,color:#78350F
classDef agent fill:#D1FAE5,stroke:#059669,stroke-width:2px,color:#064E3B
classDef storage fill:#EDE9FE,stroke:#7C3AED,stroke-width:2px,color:#4C1D95
ssh["SSH (any SSH-accessible machine)"]:::transport
subgraph HOST["Host"]
subgraph TMUX["tmux session: mngr-name"]
w0["window 0 → agent process"]:::agent
w1["window 1+ (optional)"]:::session
end
dir["$MNGR_HOST_DIR/agents/id/ · status · logs · config"]:::storage
end
ssh --> HOST
w0 -->|writes| dir
```
有关 `mngr` 架构和设计原则的深入概述,请参阅 [`architecture.md`](libs/mngr/docs/architecture.md)。
## 安全
**最佳实践:**
1. 在处理 Agent 时使用具有良好隔离性的提供商(如 Docker 或 Modal),尤其是那些不受信任的 Agent。
2. 遵循“最小权限原则”:只为每个 Agent 暴露最少量的 API 令牌和密钥,并尽可能限制它们的访问(例如对网络的访问)。
3. 避免在 Agent 的文件系统中存储敏感数据(如有必要,请加密)。
有关更多详细信息,请参阅我们的 [安全模型](libs/mngr/docs/security_model.md)。
标签:Agent编排, AI智能体管理, AI编程助手, Claude, Codex, Coding Agent, CVE检测, DNS解析, Docker, Modal, PE 加载器, Python, SSH, Tmux, Unix风格, 内存分配, 分布式系统, 命令行界面, 响应大小分析, 安全可观测性, 安全防御评估, 容器化部署, 工作流编排, 并行执行, 开发效率, 开源项目, 插件化架构, 无后门, 沙箱环境, 版本控制, 网络可观测性, 请求拦截, 调试插件, 远程主机管理, 逆向工具