外观
MAI - 多模型协作讨论平台
约 1417 字大约 5 分钟
2026-05-09
MAI 是一个本地优先 (Local-First) 的多模型协作讨论工具。你创建讨论室、拉入多个 AI 人设,让它们按阶段和赛制互相回应、质询、总结,并由书记官、主持信号、裁决与子讨论机制沉淀出可追溯的结论。
它不是一个"模型并排对比"工具。核心差异在于:模型之间共享上下文并真正互相对话,发言由阶段规则调度,用户始终拥有裁决、冻结、阶段推进和配置的最终控制权,全过程以 append-only 的消息、裁决和主持信号形式保留。
✨ 核心理念
- 多人设同场协作:一个讨论室可以同时容纳多个 AI 角色。每个人设有自己的系统提示词、温度、健谈度、主题色和图标,贯穿卡片、消息气泡与状态条。
- 阶段与赛制驱动:发言不是自由乱跑,而是由"阶段 (Phase)"定义的发言范围、排序规则和退出条件调度;若干阶段组成"赛制 (Debate Format)",若干赛制 + 人设 + 初始设置组成"配方 (Recipe)"。
- 用户掌控感优先:AI 可以自动接力,但用户可以随时冻结、推进、裁决或覆盖。发言状态条实时显示
frozen / speaking / scheduling / idle4 态。 - 内置只读 · 实例可改:所有内置人设、阶段、赛制、配方都是只读模板;用户点击"添加"时从内置库复制一份可编辑实例,后续修改不污染原模板。
🧠 机制亮点
多 AI peer 路由
在多角色房间里,每个 AI 只把自己过去的发言视为 assistant,其他角色的发言改写为 user 并加上 「Name」: 前缀。这样可以避免模型退化为"全知叙述者",让每个 AI 真正以自己的立场参与讨论。
complete_tool 三档降级
通过 LiteLLM 统一模型调用,complete_tool 做了三档降级,覆盖像 deepseek-reasoner 这类不支持强制 tool_choice 的模型;同时自动还原 MiMo / OpenRouter 部分通道的 tool 参数双重编码问题。
故事模式
内置的单 phase 持续接力模式:AI 以角色身份连续演下去,直到用户喊停。适合剧情向、角色扮演、沉浸式创作。
工具与 MCP
房间右侧工具面板提供两类工具:
- MAI 内置工具:搜索房间消息、列出房间成员、模板创建等。
- 外部 MCP server:支持
streamable_http和sse传输;添加 server 后点击同步即可读取工具清单。
成员是否能调用工具在房间成员编辑器中按人粒度控制:允许工具 / 允许写入工具 / 允许自动回复。所有工具调用会以 tool_invocation 消息追加进房间并返回完整调用记录,方便复盘和审计。
场景化一键开房
首页"新建房间"提供场景卡片 —— 技术方案评审、产品决策圆桌、头脑风暴、假设压力测试等。场景会预填房间标题、初始问题、赛制或配方,创建后可自动发送第一条消息。
模板 AI 起草
模板页的人设编辑器支持 AI 起草:用自然语言描述即可生成可编辑的人设草稿。后端通过严格 schema PersonaDraftEnvelope 约束输出;接口同时保留了 phase / recipe 草稿类型,为后续模板扩展留了口子。
🧱 架构概览
| 层 | 技术栈 |
|---|---|
| 后端 | FastAPI 单进程,默认 SQLite(开启 WAL + 长 busy_timeout),PostgreSQL 可通过 DATABASE_URL 启用 |
| 前端 | Vite + React + TypeScript,支持中英文切换、暗色模式、Markdown / KaTeX / Shiki 渲染 |
| 桌面壳 | Tauri v2,PyInstaller sidecar 自动启动后端 |
| 模型调用 | LiteLLM 统一路由 |
API 与模型两层配置
| 层级 | 作用 | 示例 |
|---|---|---|
provider | 凭据 + LiteLLM 路由类型 | "我的 OpenAI",类型 openai / anthropic / openrouter / custom |
model | 具体模型条目 | openai/gpt-4o-mini |
调用时的优先级:房间内人设实例绑定的模型 → 人设模板绑定的模型 → 设置页默认模型 → 旧字段兼容回退。
🚀 快速开始
Windows 一键开发启动
.\scripts\dev.ps1 -SkipPostgres脚本会创建后端 .venv、安装依赖、初始化数据库、安装前端依赖,并分别启动后端和前端开发服务。
手动启动后端
cd backend
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
Copy-Item .env.example .env
python -m app.init_db
uvicorn app.main:app --reload --host 0.0.0.0 --port 47821手动启动前端
cd frontend
pnpm install
pnpm dev --host 0.0.0.0 --port 5173开发模式下 Vite 会把 /api 代理到 http://127.0.0.1:47821。打开 http://localhost:5173 即可开始使用。
单进程托管
前端 pnpm build 之后,后端可以直接托管 SPA,不需要单独跑 Vite —— app.main 会在检测到 frontend/dist/index.html 或 MAI_FRONTEND_DIST 环境变量时,把前端挂载到 /,并把前端请求的 /api/... 重写到后端根路由。
📦 打包
普通 release:
.\scripts\package.ps1 -Version v0.1.0桌面安装包(需要 Rust/Cargo、Microsoft C++ Build Tools 和 WebView2 Runtime):
.\scripts\build-sidecar.ps1
.\scripts\package-tauri.ps1🗂️ 运行时数据
默认本地路径:
| 模式 | 数据库 | 上传与 trace |
|---|---|---|
| 开发 | backend/mai.sqlite3 | backend/uploads/、backend/trace_payloads/ |
| 打包 | 系统用户数据目录下的 MAI/mai.sqlite3 | 用户数据目录下的 MAI/uploads/、MAI/trace_payloads/ |
所有运行时文件都被 Git 忽略。
🔗 仓库
更多文档:
docs/usage.md—— 本地运行、模型配置、打包、安装与常见问题docs/product_design.md—— 稳定后的产品概念和边界docs/technical_design.md—— 当前架构、数据模型和前后端契约docs/progress.md—— 当前实现状态快照docs/desktop_tauri.md—— 桌面壳依赖与打包清单
