qm:面向工作的多人协作 Agent 框架

查看原文 HN 讨论

文章摘要

qm 是 Y Combinator 内部软件团队(yc-software)开源的一套「面向工作的多人协作 agent 框架」(multiplayer agent harness),同时提供 Slack 与 Web 两个入口,以 MIT 协议开源。

它的设计出发点是对现有产品形态的一个批评:绝大多数 agent 都被设计成个人助理,你可以硬把它塞给整个公司用,但很快就会变得极其复杂。qm 是为初创公司设计的——每位员工拥有自己隔离的工作空间,彼此独立工作互不干扰,同时也能在频道、群聊和项目中与 agent 协作。每个人、每个房间都有各自作用域(scope)下的记忆、文件、密钥视图、权限、定时任务、Web 应用和持久化沙箱。项目从一开始就以开源为前提构建:Pi、OpenCode、Codex、Claude Code 都能驱动同一个内核,因此部署不会被绑定到任何单一厂商。

核心特性包括:个人作用域与共享作用域并存;Slack 与 Web 之间共享同一套身份与配置;管理员可设置组织级配置、安全姿态以及允许使用哪些 harness 和模型;可以快速搭建内部 Web 应用并发布给对的人;技能(skills)归属于作用域、可按授权共享,管理员可将其提升到全组织,也可从 git 仓库导入技能包;定时任务与 watch 可在无人值守时跑后台工作。

架构上,每一轮对话都经过一个中心化的无头内核(headless core),由它调用各种模型与 harness 生成响应;Postgres 持久层保存用户数据、会话历史和其他持久状态。Agent 的工具面(tool surface)小而固定,其中一个工具是 execute,在该作用域自己的隔离沙箱里执行命令——那是它的「持久电脑」,装过的工具会一直在。Web UI、管理面板和公开门户都是内核 HTTP API 之上的可选插件,Slack 则是由内核启动并监管的进程内插件。内核用 TypeScript 直接跑在 Node 上,HTTP 用 Fastify,Slack 插件用 Bolt,Web UI 用 Vite 构建、Lit 渲染。所有与单一公司相关的东西(组织配置、自定义工具与技能、沙箱镜像、基础设施)都放在一个「部署目录」中,由 qm CLI 校验和部署;每个底层组件(harness、会话存储、沙箱、记忆)都藏在接口后面,生产实现通过一个接线文件替换。

安全模型上,qm 沿用本地编码 agent(OpenCode、Codex、Claude Code)的思路:agent 以它所服务的那个人的身份行事,使用其凭证与权限,一切行为都被审计。组织选择一种安全姿态,更窄的作用域只能收紧不能放松:Strict 下每次 harness 工具调用都暂停等待人工批准(两个无副作用的回合终止工具除外);默认的 Auto 会用一个分类器在带来源标记的外部数据和工具结果抵达模型之前进行筛查,部署方可以把它指向自己的筛查代理;Dangerous 则不做内容筛查、工具调用之间不暂停。预声明的命令策略(针对递归删除、破坏性 SQL 之类的批准规则与硬性拒绝)在所有姿态下都生效,Dangerous 也不例外。

最引人注目的一条是贡献方式:qm 只接受人类撰写的文本,而不接受代码。想要某个改动,就在 adrs/ 目录里用 .txt.md 非正式地描述你想要什么,如果双方达成一致,由维护方来实现。CONTRIBUTING.md 里还明确要求:不要让 AI 把你想做的事人为膨胀成一份正式提案。

HN 评论精华

讨论热度不低(679 分),但走向相当分裂——一半在争论那条贡献政策,一半在质疑这个项目到底解决了什么问题。