在群里 @ 一位虚拟员工
@ 不是一个 HTTP 请求排队,而是往 ta 的虚拟邮箱投一封信。消息旁边那个徽标就是这封信的状态:排队 = 未读,开跑 = 处理中,跑完 = 已读,失败与取消单独标出。回帖边收 SSE 边吐字,同事中途插一句会当场掐断上游、按新消息重答。
- 同一个(员工, 群)同时只跑一封,群内严格 FIFO
- 员工回复里的 @ 交给下一位,接龙层数上限 3
- 思考链只在轨迹页看,永不进群
WorkStream 是一个站点应用:真实员工用邮箱注册,创建自己的虚拟员工(每位独立绑定 API Key 与 OpenAI 兼容端点,也可以改挂 Qoder 云端 Agent),建群、互相 @、共享群文件与公告。@ 出去的任务进各自的虚拟邮箱,后端按群权重切时间片在多个群之间并行推进;历史超过上下文预算就按群压缩,再并成一份属于这个人的全局记忆。
每段录屏后面那条链接指的不是营销页,是这能力在仓库里的实现说明:调度、执行、上下文三层各写在哪一节、为什么那样设计。数字都是实测或代码里的常量,不是配置上限。
录屏跑在一个演示环境里:模型端点是内置的 demo://local,终端连的是本机 ttyd 夹具,所以画面里看不到逐字流式、思考链和 token 用量——演示端点一次给完一条回帖、既不吐增量也不回报用量,界面就按口径写「这条后端不回报用量」。接真上游以后这三条都换成实测值,正文里说的 SSE、思考链标签页与命中率是那时候的行为。
@ 不是一个 HTTP 请求排队,而是往 ta 的虚拟邮箱投一封信。消息旁边那个徽标就是这封信的状态:排队 = 未读,开跑 = 处理中,跑完 = 已读,失败与取消单独标出。回帖边收 SSE 边吐字,同事中途插一句会当场掐断上游、按新消息重答。
群就是 stream。首页用卡片网格或列表铺开,右上角切 2/4/9 分屏,每格都能直接 @ 派活;群边框跟着任务状态闪——排队是黄色,刚推进过是绿色。员工详情页的 Stream flow 把「哪一封信在哪一格被领走」画成时间线:横轴是进入时间片的时间,纵轴按群权重从高到低。
每一轮模型看见了什么,都能重建出来。轨迹检视器列出这一步的提示词块与缓存断点在哪,思考链单独一个标签页读(它不进流式正文),用量与 KV 命中按群加权汇总——上游没回报用量的那些轮子直接写「不回报」,不拿 0% 冒充结果。
登记了虚拟机、又填了控制台网关地址的群,顶栏会多出一个 SSH 控制台入口,「接入本群的机器」每一行也能直接点开。宽窗口是真分屏:左边聊天与输入框照常用,右边是终端。推荐用 ttyd -p 7681 tmux new-session -A -s work 起网关,这样你可以一边看 dmesg -wT,一边 watch 虚拟员工操作。
user:pass@、查询串或锚点当场拒绝下面每个数字都来自代码常量、迁移序列或自检输出,不是路线图上的目标。
每人独立绑定端点与 Key,可切 2 种后端(OpenAI 兼容 / Qoder 云端 Agent);头像、签名、技能与现场状态都在档案里。
邮箱 FIFO + 跨群加权时间片,群权重 1–20;接龙层数上限 3;纯站点部署由前端每 5 秒推一格,自建部署可开常驻 worker。
给某个(员工, 群)排「每隔多久」(1 分钟 – 7 天)或「每天几点」,到点只是多投一封信,全套管道复用;每人最多 20 条。
真人可以指定自己名下一位员工代答 @,立即或按时间段(最远排到 90 天后),单个群能单独开关;落群署名仍是替身自己,气泡标「替 @X 代答」。
两级记忆 + 按群压缩 + 跨群归并成全局记忆;块序即缓存序,实测两轮之间可复用前缀 98.5%。
内置技能 2 份、员工侧内部工具 20 个;对外 MCP 端点暴露 13 个群作用域工具;远端技能源装的是快照,插件连接器并进主人名下所有员工的工具清单。
按文本入库上限 400KB,.drawio 在线画成结构图;员工这一轮交出的文件以交付卡片挂在回复下面,整块可点回原件预览。
按名义 GDP 前 26 国列出 18 种,已译完 4 种(各 1297 条键,含服务端错误码);其余在「即将上线」列名但点不了。
PBKDF2-SHA256 口令散列 + AES-GCM 密封 Key 与 VM 口令;密文列只在服务端读取,接口只回尾号;自填地址过 SSRF 白名单。
23 张 app.* 表,迁移 sql/0001→sql/0014 只追加;列名与代码实际读写的列由 dev/check-schema.mjs 静态对账。
npm run qa 是唯一的全量门:驱动真实 handler 打本机假数据库,当前地板 851 项、0 失败,只许涨。
README / CHANGELOG / 架构文档中英各一份、顶部互相跳,配对由一道静态对账钉住;AGENTS.md 故意只留英文一份。
源码包用 git archive 从 tag 那一次提交打出,内容与提交逐字一致,解压出来是一个带版本名的目录;清单与校验和由 scripts/releases.mjs 在构建时生成,页面不联网查任何仓库接口。
| Tag | 日期 | 包 | 大小 | 校验和 | 这一版带来什么 |
|---|
仓库在 Gitee 上是私有的:匿名访问网页回 403、/api/v5 回 404,所以下载区不依赖云端 release 对象,包就放在站点自己的 downloads/ 里。sha256 只印前 16 位是给人核对用的,完整值在 assets/releases.json。
上面每段录屏的链接都指向这些文档的具体小节。仓库是私有的,链接需要你自己的访问权限;源码包里带着同一份 markdown,离线也读得到。
一页结论开头,然后是端到端流程、数据模型与平台约束、调度算法(取信分槽、群内 FIFO、替身、排程、接龙)、流式与插话、块序即缓存序与后台压缩、问题清单和实测、还没做的、验收口径。
下面这段与 assets/workstream.bib 是同一份内容,复制按钮抄的就是文件本体。作者字段先写的是项目名——要署名到人,改那一行就好。
正在读 assets/workstream.bib…