多人协作房间
在 Potato 里开实时的标准对齐与校准会议。盲投票、主持人揭晓、集体讨论,还有一块实时的 Krippendorff's α 仪表,直接告诉你这场会开得值不值。
v2.7.0 新增
多人协作房间把标注从一个人的活儿变成实时的共享会议。一组标注者同时处理同一个条目,其中的社交动态被测量下来,而不只是被允许发生。不需要 LLM,不需要外部服务,也没有新依赖。

三种房间类型:
| 类型 | 会发生什么 |
|---|---|
| Norming(标准对齐) | 所有人盲投,主持人揭晓,全组讨论,任何人都可以改票。实时一致性仪表会把盲投的 α 与讨论后的 α 对照显示。 |
| Huddle(集中裁定) | 逐条走查团队当前存在分歧的条目,并把每个人原来的标注作为上下文展示出来。相当于一场实时裁定会。 |
| Shadow(观摩) | 新手以观察者身份加入,实时观看主持人标注,包括主持人在文本里高亮了哪一部分。 |
为什么要用 Norming 房间
标注团队本来就会开屏幕共享的标准对齐会,而结论最后只留在某个人的笔记里。房间把这场会议变成工具的一部分,并给它装上仪表。
- 先盲投。 揭晓之前,成员只看得到谁投了票,看不到投了什么。这一点由服务端强制,所以第一印象是真正独立的。
- 揭晓本身就是一次测量。 盲投票一经揭晓便不可更改。揭晓后的每一次改票都会被记录:从什么改成什么,以及当时的多数意见是什么,由此得到每个成员的从众记录。
- α 仪表回答“这场会值不值”。 Krippendorff's α 会在已揭晓的条目上算两次:一次基于盲投票,一次基于当前投票。两者之差就是这场会带来的对齐增益,会议进行中就显示在屏幕上。
配置
rooms:
enabled: true
who_can_create: any # "any" logged-in user, or "admin" only
persist_votes: true # final votes write into members' annotation state
poll_interval_ms: 1500 # client sync cadence (500–30000)
max_members: 12 # per room (2–100)
schema: sarcasm # optional; defaults to the first radio/likert scheme房间只对一个单选方案(radio 或 likert)投票。如果没有设置 schema,就用 annotation_schemes 里的第一个这类方案。
开一场会
- 启动服务器,登录,打开
/rooms。 - 创建房间(选类型和条目数)。房间会拿到一个六字母房间码,比如
MKT4QP。房间码避开了容易混淆的字形,方便口头念出来。 - 其他人从大厅列表加入,或者直接打开
/rooms/<CODE>。 - 投票,主持人揭晓,在侧边聊天区讨论,被说服就改票,然后主持人推进到下一条。最后一条结束后房间关闭并给出会议总结,主持人可以下载完整的事件日志。
Huddle
创建时选择 Huddle,房间会装入该房间所用方案下标注者当前存在分歧的所有条目,最多 200 条。原始标注显示在投票面板上方作为上下文。分歧是从标注状态实时算出来的,所以不需要启用裁定子系统。
Shadow 会话
在 shadow 房间里,除主持人外所有人都以观察者身份加入。观察者不能投票,但能看到主持人的投票、揭晓和文本选区,延迟约 1.5 秒。主持人当前的选区会在观察者屏幕上以琥珀色高亮。
持久化与崩溃恢复
每个房间都是事件溯源的。每次变更(加入、投票、揭晓、改票、发消息、推进、关闭)都会向下面的文件追加一行 JSON:
<output_annotation_dir>/rooms/room-<CODE>.jsonl
房间状态完全由该日志重放得到,因此进行中的房间能挺过服务器重启。这份日志同时也是会议的审计轨迹:盲投票、时间戳、讨论内容,以及揭晓后每一次改票及其当时的多数意见。GET /rooms/api/<CODE>/export(主持人或管理员)以 JSON 返回日志加上计算出的指标。
设为 persist_votes: true(默认)时,主持人推进条目时会把每个成员在已揭晓条目上的最终投票写入其常规标注状态。房间里的工作算作真实标注,并进入所有现有的导出路径。
客户端通过带游标轮询 /events 来同步。这里没有用 WebSockets,因此房间在多线程开发服务器和任何 WSGI 部署下都能工作。
API 一览
| 端点 | 方法 | 谁可以用 |
|---|---|---|
/rooms、/rooms/<code> | GET | 已登录用户(页面) |
/rooms/api/list、/rooms/api/disagreements | GET | 已登录用户 |
/rooms/api/create | POST | 取决于 who_can_create |
/rooms/api/<code>/join、/leave、/vote、/message、/presence | POST | 成员 |
/rooms/api/<code>/state、/events?since=N | GET | 成员 |
/rooms/api/<code>/reveal、/advance、/close | POST | 主持人 |
/rooms/api/<code>/export | GET | 主持人或管理员 |