multiarena
v0.1.4
Published
Terminal-native multi-model content generation — N models collaborate to produce the best document, analysis, script, or strategy
Downloads
575
Maintainers
Readme
multiarena
终端原生多模型 AI 协作工具。一键提问,多个大模型同时回答;多模型接力审议,产出经过多重打磨的文档。
模式系统
multiarena 有两个顶层模式,各自包含总览和模型私聊两种视图:
广播模式 (Broadcast) 团队模式 (Team)
├── 总览:多模型并排面板 ├── 总览:审议入口 / 审议结果
└── 定向:单个模型全宽详情 └── 定向:与单个模型私聊输入栏前缀
前缀告诉你当前处于哪个模式和视图:
| 前缀 | 所处位置 |
|------|---------|
| [all] | 广播总览 — 消息发给所有模型 |
| [模型名] | 广播定向 — 只跟该模型对话 |
| [team] | 团队总览 — 输入任务启动审议 |
| [team:模型名] | 团队定向 — 审议后与该模型私聊 |
模式切换规则
Shift+Tab (仅在总览时) Shift+Tab (仅在总览时)
广播总览 ←────────────────────→ 团队总览
↑ ↓ Tab ↑ ↓ Tab
广播定向 团队定向
↑ ↑
└── Esc ───────────────────────┘── EscTab — 在当前模式内循环切换目标。从总览进入第一个模型,再按切到下一个,循环回总览。Tab 永远不会切换模式(不会在广播 ↔ 团队之间跳)。
Shift+Tab — 在广播和团队之间切换。只在总览时生效,且切换后总是落在目标模式的总览。如果你在私聊中,需要先按 Esc 回总览,再按 Shift+Tab。
Esc — 返回当前模式的总览。无论你在私聊、对比视图、还是审议进行中,Esc 都会带你回到当前模式的总览。Esc 永远不会切换模式。
d — 对比模式。输入栏为空时,按 d 将当前模型与另一个模型的回答并排展示,再按 d 退出。在总览中按 d 会将第一个模型作为主视图、第二个作为对比。
广播模式(启动默认)
消息同时发给所有非静音模型,分栏并排查看回答。
广播总览
┌─ claude ──────────────────────┐ ┌─ gpt ─────────────────────────┐
│ │ │ │
│ 可以使用 ls 列出当前目录文件: │ │ 你可以用 ls 或 dir 命令查看目 │
│ $ ls -la │ │ 录内容: │
│ total 48 │ │ $ ls │
│ drwxr-xr-x 12 user staff │ │ src/ test/ package.json │
│ │ │ │
│ 3 lines · 1K/200K · done │ │ 3 lines · 1K/128K · done │
└───────────────────────────────┘ └───────────────────────────────┘
────────────────────────────────────────────────────────────────────
claude ● gpt ● — Tab:model d:compare m:mute r:reset q:quit ↑↓:scroll
[all] > ▊提交消息后,所有非静音模型同时接收并回答。每个面板底部显示行数、token 用量和状态。
广播定向(Tab 进入)
按 Tab 进入某个模型的私聊视图。消息只发给该模型,输出区变为全宽详情。
┌─ claude ──────────────────────────────────────────────────────────┐
│ │
│ 我来详细分析这个方案的优缺点: │
│ │
│ **优点:** │
│ 1. 四层架构清晰,每层职责单一,易于测试和维护 │
│ 2. Provider 接口设计简洁,新增模型只需实现 chat() 方法 │
│ │
│ 2K/200K · 15 lines · done │
└────────────────────────────────────────────────────────────────────┘
────────────────────────────────────────────────────────────────────
claude ● gpt — Tab:model d:compare m:mute r:reset q:quit ↑↓:scroll
[claude] > ▊再按 Tab 切换到下一个模型(跳过静音模型),循环回到总览。按 Esc 返回总览。
对比模式(按 d)
输入栏为空时按 d,将当前模型与下一个模型的回答并排对比。
┌─ claude ──────────────────────┐ ┌─ gpt ─────────────────────────┐
│ │ │ │
│ 推荐使用策略模式,将每种算法封 │ │ 建议用工厂模式配合依赖注入来解 │
│ 装为独立的策略类。 │ │ 耦。 │
│ │ │ │
│ 2K/200K · 12 lines · done │ │ 1K/128K · 14 lines · done │
└───────────────────────────────┘ └───────────────────────────────┘
────────────────────────────────────────────────────────────────────
claude ● gpt ● — Tab:model d:exit-compare m:mute r:reset q:quit
[claude] > ▊再按 d 退出对比,按 Esc 也能退出并回到总览。
团队模式(Shift+Tab 进入)
多个模型接力协作,起草 → 修订 → 终审,产出一份经过多视角打磨的文档。
启动审议
在广播总览按 Shift+Tab 进入团队总览,输入任务描述后回车:
────────────────────────────────────────────────────────────────────
团队模式
输入任务描述即可启动多模型接力审议。
Tab 可切换到特定模型私聊。Shift+Tab 返回广播模式。
────────────────────────────────────────────────────────────────────
minimax deepseek ● — Tab:model d:compare m:mute r:reset q:quit
[team] > 写一篇关于兰州拉面的美食日记▊审议进行中
模型按顺序接力:起草(模型 A)→ 修订(模型 B)→ 终审(模型 C)。每轮在上一轮的基础上改进。
┌─ 团队审议 ─────────────────────────────────────────────────────────┐
│ │
│ 第 2/3 轮:deepseek (修订) │
│ │
│ ✓ 起草 ● 修订 ○ 终审 │
│ minimax deepseek minimax │
│ │
│ 修订中 — deepseek — 正在生成… │
│ │
│ ## 今天吃了兰州拉面,我很开心 │
│ │
│ 今天中午去楼下那家兰州拉面馆… │
│ │
└────────────────────────────────────────────────────────────────────┘
────────────────────────────────────────────────────────────────────
minimax deepseek ● — Tab:model d:compare m:mute r:reset q:quit Esc:cancel
[team] > ▊审议进行中按 Esc 中止。
审议完成
审议结束后,显示审议过程和最终文档。每轮显示模型名称、角色、修改处数,以及代表性修改内容:
┌─ 团队审议 ─────────────────────────────────────────────────────────┐
│ │
│ 审议完成 · 3 轮 · 4 处修改 │
│ │
│ ✓ 起草 ✓ 修订 ✓ 终审 │
│ minimax deepseek minimax │
│ │
│ ── 审议过程 ── │
│ │
│ 1. minimax(起草) │
│ 2. deepseek(修订) — 4 处修改 │
│ 明天还想去! → 我决定下次再来。 │
│ 這個味道吧。 → 这个味道吧。 │
│ 明天还想再来一碗。 → 计划下次再品尝一次。 │
│ 3. minimax(终审) — 无修改 │
│ │
│ ── 最终文档 ── │
│ │
│ # 今天吃了兰州拉面,我很开心 │
│ 今天中午去楼下那家兰州拉面馆… │
│ │
└────────────────────────────────────────────────────────────────────┘
────────────────────────────────────────────────────────────────────
minimax ● deepseek ● — Tab:model d:compare m:mute r:reset q:quit
[team] > ▊审议后与模型私聊
审议完成后,按 Tab 切换到任一模型,可以就该模型在审议中的表现、最终文档的内容进行讨论。每个模型的对话历史中已自动注入审议结果上下文,模型知道自己参与了审议并了解最终成果。
按 Tab → [team:minimax] > 你觉得终审时deepseek的修改是否合理?合并已有回答(/merge)
先在广播模式下让各模型各自回答一个问题,然后在团队模式下输入 /merge,选一个模型把所有回答合并为综合文档,标注共识和分歧。
安装
npm install -g multiarena快速开始
# 创建配置文件
cat > .multiarenarc << 'EOF'
[models.claude]
provider = "anthropic"
model = "claude-sonnet-4-6"
api_key = "${ANTHROPIC_API_KEY}"
[models.gpt]
provider = "openai"
model = "gpt-4o"
api_key = "${OPENAI_API_KEY}"
[defaults]
active = ["claude", "gpt"]
EOF
# 启动
multiarena配置
配置文件 .multiarenarc(TOML 格式),放在当前目录或 ~/.multiarenarc。
[models.<名称>]
provider = "anthropic" # anthropic | openai | google | deepseek | minimax | ollama
model = "claude-sonnet-4-6" # API 模型名
api_key = "${ENV_VAR}" # API key,支持环境变量
endpoint = "..." # 自定义端点(可选)
context_limit = 200000 # 上下文窗口大小(可选)
[defaults]
active = ["claude", "gpt"] # 启动时加载的模型
[deliberation]
constraint_file = "rules.md" # 审议约束文件(可选)会话保存至 ~/.multiarena/sessions/。使用 multiarena --resume <id> 恢复历史会话。
支持的模型
| 厂商 | 模型 | |------|------| | Anthropic | Claude Sonnet 4.6、Opus 4.7、Haiku 4.5 | | OpenAI | GPT-4o、GPT-4.1 | | Google | Gemini 2.5 Flash、Gemini 2.5 Pro | | DeepSeek | DeepSeek-V4、DeepSeek-R1 | | MiniMax | MiniMax-M2.1 | | Ollama | 任意本地模型 |
快捷键速查
| 按键 | 功能 | 约束 |
|------|------|------|
| Tab | 当前模式内循环切换目标(总览 → 模型1 → 模型2 → 总览) | 不切换模式,跳过静音模型 |
| Shift+Tab | 广播 ↔ 团队模式切换 | 仅在总览时生效,切换后落在目标模式总览 |
| Esc | 返回当前模式总览 / 退出对比 / 中止审议 | 不切换模式 |
| d | 对比两个模型的回答(输入栏为空时) | 需要至少 2 个非静音模型 |
| m | 静音/取消静音当前模型 | 定向模式下生效 |
| r | 重置当前模型对话历史 | 定向模式下生效 |
| ↑ ↓ | 输入为空:浏览历史输入;输入非空:滚动输出 | 团队总览下审议内容也可滚动 |
| /team | 等同于 Shift+Tab | |
| /merge | 合并各模型最近的回答 | 需要至少 2 个模型有回复 |
| q | 退出(自动保存会话) | |
License
MIT
