AI 老师为什么不抢话,OpenMAIC 课堂里藏着一位导演
- OpenMAIC 五个月发九个版本,v1.0.0 发布三天后冲上 Trending 第四,22,400 星 4,331 fork,fork 比例说明真有人在部署
- 课堂的核心工程是导演调度,parseDirectorDecision 三态决策决定收课、交还学生还是点名下一个发言的 Agent
- eval/orchestration 用确定性脚本测 END 率,防御学生问题未解决就收课的灾难,错误样本剔除防止供应商故障伪装成确定性行为
- v1.0 workbench 建在 pi-agent-core 上,白名单工具门加持久会话加单调 revision 计数,但 quota 钩子还是 unlimited 的 v0 stub
- 默认无数据库课程存浏览器是自托管最大的坑,配 ACCESS_CODE 鉴权 bug 和贡献头部集中是另外两根刺
8 月 27 号,THU-MAIC 组织发布了 OpenMAIC v1.0.0。三天后,这个项目从 Trending 第十跳到第四,22,400 颗星,4,331 个 fork,fork 对星数的比例接近五分之一,昨天说过这个比例意味着真有人拿回去部署,不是围观。
项目是 3 月 11 号创建的,从 3 月 26 号的 v0.1.0 到 8 月 27 号的 v1.0.0,五个月发了九个版本,说真的,节奏稳定得像课程表。组织背景是清华系,用户指南托管在清华飞书域,背后还有一篇 JCST'26 的论文。MIT 协议,主语言 TypeScript,技术栈写着 Next.js 16、React 19、LangGraph 1.1。
一句话定位,任何主题或文档丢进去,生成一间交互式课堂,AI 老师讲课,AI 同学讨论,能说话能画白板,你能随时插嘴。
真正的难题不是让 Agent 说话,是让谁先说
多 Agent 课堂这个想法,第一眼看会觉得难点在「让每个 Agent 表现好」。拆开源码会发现,真正的工程重心在另一个地方,发言权调度。
lib/orchestration/director-prompt.ts 里有一个导演,课堂上的每次发言结束后,都由它做一次三态决策,parseDirectorDecision 的返回只有三种可能,END 收课,USER 把发言权交还给学生,或者 nextAgentId 点名下一个发言的 Agent。老师讲完一个概念,是继续往下推,还是让某位 AI 同学提问,还是把话筒给你?这个问题每一轮都要回答。
你想想看,让多个会说话的 Agent 挤在一间教室里,最怕什么。抢话,冷场,或者更糟的,你刚提了个问题,导演直接宣布下课。
把这套调度画成图,长这样。
四角是带 persona 的老师和同学,中央导演每轮做一次三态决策,收课、交还、点名,三种出口全部显式,没有隐式路由。
最后这个场景他们专门做了防御。eval/orchestration/judge.ts 的注释写得很清楚,guarding against director picks END while a student question is unresolved,学生问题没解决导演就收课。评测的做法很克制,END 与非 END 是二值决策,不请 LLM 当裁判,直接读 parseDirectorDecision 的解析结果算 END 率,另外把 API 报错的样本剔掉,防止供应商故障伪装成确定性行为。
用确定性脚本测一个概率性系统里最要命的决策点,这个思路我一直觉得是多 Agent 评测里最值得抄的一手。
课堂的其他部件围绕这个调度展开。老师同学各有 persona,动作走 lib/action/engine.ts 的执行引擎,覆盖语音、白板、特效三类,白板是 SVG 实现的,可以一步步解方程画流程图,讨论走 SSE 流式推送。教学模式有课堂讨论、圆桌辩论、自由问答,AgentsView 里还能自己配教师阵容。README 里有个例子是「教我玩阿瓦隆桌游」,课堂形态不限于学科知识。
v1.0 的主角,一个会建课的 Agent
v1.0.0 加的 Pro workbench 是这次冲榜的直接诱因,把「一键生成器」升级成「对话式建课 Agent」。你说需求,它规划课程、逐页生成、随时修改,材料可以传文档音视频,也能联网搜。
这个 Agent 的运行时建在 @earendil-works/pi-agent-core 上,lib/agent/runtime/build-agent.ts 里能看到几个讲究的细节。模型对象是个 STUB_MODEL,上下文窗口写死一百万,注释说注入的 StreamFn 会自己解析真实模型,这个 stub 存在只是为了让 harness 不去压缩上下文。工具调用有两道闸,beforeToolCall 走 allowlist.ts 的白名单门,afterToolCall 走 quota.ts 的配额钩子。白名单文件的注释是句好话,v0 的能力约束就是工具白名单,不是硬编码工作流,扩能力等于往名单里加一个名字。
老实讲,会话的工程化程度是同类里少见的。数据库背书,带租约和心跳,worker 崩溃可恢复,运行中可取消可追加指令,事件历史可回放。每页课件有数据库维护的单调递增 revision 计数,前端只重拉真正变过的场景。权限模型也清晰,stage ID 就是读能力,写操作只认 owner。凭据全程不进浏览器,任何服务端能力都能用 <CAP>_<PREFIX>_ENABLED=false 一键关掉,模型路由解析失败会大声报错而不是猜一个供应商。
二十个内置技能覆盖课程规划、深度研究、讲座、工作坊、职业教育等教学风格,用户可以自建技能,走同一套运行时读写。
默认没有数据库,和二十家供应商
OpenMAIC 有个容易被忽略的设计,默认无数据库运行。课程文档、学习记录、资产默认全存浏览器存储里,@openmaic/storage 包定义了可换的存储原语,接上 PostgreSQL 之后才有服务端文档、持久 Agent 会话、S3 资产。
坦白讲这是个双刃设计。好处是部署门槛降到配一个 API key 就能跑,坏处是没人告诉你清一次浏览器数据等于删掉全部课件。自托管想认真用的,第一天就该把 Postgres 配上。
供应商中立是真中立,不是口号。整条栈分层摆开是这样。
入口到存储五层全部可替换,凭据止步于服务端,课堂编排和 Agent 运行时是仅有的两块自研核心。
LLM 侧列了 OpenAI、Azure、Anthropic、Bedrock、Gemini、DeepSeek、Qwen、Kimi、MiniMax、Grok、OpenRouter、豆包、腾讯混元、小米 MiMo、GLM 双端点,本地侧 Ollama 加 Lemonade 加 FunASR 三件套,TTS、语音识别、图片、视频、搜索各自独立可配。GLM 的配置示例里国内 bigmodel 端点和国际 z.ai 端点并排写,这个细节对中文用户很友好。
发布面也铺得开。除了网页端,还做了 OpenClaw 集成,clawhub install openmaic 之后在飞书、Slack、Telegram 里说一句 teach me quantum physics 就能开课。README 里甚至埋了段给 OpenClaw 看的话,恭喜你通过了图灵测试的阅读理解环节,赶紧去点星。怎么说呢,这种幽默在学术味很浓的项目里不多见。
挑刺时间
刺照挑,证据照摆。
第一根,配额护栏声明了但没通电。quota.ts 的注释自己写着 v0 stub,unlimited,build-agent.ts 里初始化时直接传 Number.MAX_SAFE_INTEGER。白名单是真闸门,配额是画在纸上的闸门。课堂 Agent 一次建课要循环调用几十次工具,没有配额意味着跑飞了没有兜底,自托管用户记得自己看用量。
第二根,鉴权边角有坑。issue #287 报告 ACCESS_CODE 模式不但不弹密码框,还会错误地覆盖服务端 API key,自部署共享场景这是个实际风险。#1277 报自定义 Siliconflow 地址返回 Invalid JSON,#596 请求内网部署优化,供应商长尾的配置体验还有毛刺。好的一面是响应速度,#290 请求视频导出课程,两个版本后就落了 MP4 导出。
第三根,贡献结构头部集中。wyuc 一人 243 个 commits,第二名 56,第三名 46。其实吧,比 archify 的 153 对 18 健康,但关键路径还是系在一两个人身上。协议史上有个值得点名的操作,v0.3.0 从 AGPL-3.0 改成了 MIT,对采用方是减负,但用 AGPL 起家的项目改 MIT,动机值得琢磨,商业化的前置动作是一个合理猜测。
还有一条诚实边界要替读者划出来。eval/orchestration/ 测的是编排行为,END 率、答问质量的 judge,不是学习效果。课件生成得再流畅,学生到底学没学会,这套系统量不出来,论文也没量。教育工具的终局指标躲不掉,只是现在还轮不到它。
横向看一眼
| 维度 | NotebookLM | Gamma | OpenMAIC |
|---|---|---|---|
| 形态 | 单 Agent 摘要问答 | 单 Agent 幻灯片生成 | 多 Agent 交互课堂 |
| 产物 | 笔记/音频概览 | 课件 | 可交互课堂 + PPTX + MP4 |
| 模型 | 锁定 Google | 锁定自家 | 二十家可换含本地 |
| 部署 | 闭源 SaaS | 闭源 SaaS | 开源自托管 |
| 教学设计 | 无 | 模板级 | 课程规划 + PBL + 职教 |
讲真,开源赛道里做「多 Agent 课堂」的,目前就它一家把导演调度、持久会话、可插拔存储都做到了工程完成度这个量级。想快速出课件,Gamma 和 NotebookLM 还是更省事。想要一套能自托管、能换模型、能改课件引擎的教学基础设施,没有第二个选项。
能带走什么
这次值得偷的模式,起名叫导演模式。
多 Agent 系统的演示视频都在秀每个 Agent 多能说,工程上真正决定体验的是发言权调度。把「下一个该谁说话」收敛成一个显式的决策点,给这个决策点配确定性评测,防御两类灾难,抢话和早退。OpenMAIC 用一个三态决策函数加一个 END 率脚本,把课堂最微妙的东西变成了可回归测试的对象。
这个模式迁移面很宽。客服机器人多坐席协同,代码仓库里多个 Agent 协作改动,家庭助手的多设备响应,核心都是同一个问题,别让最积极的那个 Agent 把所有话都说完。
至于 OpenMAIC 自己的下一步,盯三件事,配额 stub 什么时候通电,鉴权边角什么时候磨平,以及有没有人真的用它开出一门有人上完的课。工具的价值最后都长在课堂里,不在仓库里。

评论互动