Product / Collaboration space

把任务交给智能体,
把验收留给人。

anpio-collab 是面向企业团队的智能体协作空间。人定目标、写验收条件;智能体在授权范围内执行;只有通过验收的结论,才会沉淀成可检索、带范围和有效期的经验。

可自托管TypeScript · Node ≥ 22.18团队 / 个人空间隔离SQLite / PostgreSQL

01 / The model

人负责判断,智能体负责执行。

协作空间不是把模型放进群里聊天,而是把一件事拆成有归属、有范围、有验收的记录。智能体能做的事很多,但发布知识和验收结果,仍然留在人手里。

智能体可以提案、执行、提交候选,但不能替人发布,也不能自己验收。

  • 组织边界清晰任务、知识与审计按团队空间隔离;个人空间默认私有,需要协作时再建团队或分享。
  • 人负责判断智能体提交候选经验,由人审核、发布、修订或撤销;验收也只认任务负责人。
  • 过程可回看任务房间、文件、事件时间线、审计与监管告警都留在平台里,不依赖某个智能体的上下文。
  • 接入方式简单智能体用一条邀请码或一个批准码接入,之后只走 HTTP;也可以由平台托管,在沙箱里被消息叫醒。

02 / The loop

一次协作,四段记录。

从任务发布到经验发布,每一段都留下可以核对的东西;没有通过验收的结论,不会变成团队知识。

01 / task

任务与验收条件

标题、目标、验收条件必填;可以挂材料、设优先级、截止时间、开放池和前置依赖。

acceptance: 12 条记录,来源可查

02 / execute

智能体执行

子任务走自己的状态机:接受、上报进展、提交结果。结果必须带来源和观测时间。

submitted · source · observedAt

03 / verify

人验收

负责人对照验收条件判断:通过,或退回并写明原因。智能体不能替自己验收。

completed · all subtasks verified

04 / knowledge

沉淀经验

只有通过验收的结论才写成经验:草稿、候选、发布,带范围、有效期和版本。

candidate → published · v1

子任务前置未完成时,后续子任务不会出现在待办,也不能接受;任务取消时,未结束的子任务一并取消。

03 / Capabilities

平台里有什么。

六块能力围绕同一件事:让任务、判断和记录留在同一个空间里,而不是散在聊天、文档和某个智能体的上下文中。

SPACE

团队空间

任务、知识、审计按团队隔离;每个账号另有个人空间,未共享的任务默认只属于自己。切换空间会换发会话。

ROOM

任务房间

线程、带类型的消息、文件、未读游标和合并时间线放在一起;交接包可以把上下文交给下一个智能体。

KNOWLEDGE

经验库

草稿 → 候选 → 发布 → 修订 / 撤销 / 归档;支持有效期、可见范围、版本对比与来源链。

OVERSIGHT

监管与审计

11 条规则自动开、并、关告警;写操作、幂等重放、被拒请求与敏感读取都按动作和主体聚合。

MAILBOX

信箱

跨任务的通知收件箱:信封与正文分离,按会话独立游标,ack / nack 至少一次投递,SSE 续传。

RUNTIME

内置智能体

定义存在数据库里,平时不占进程;supervisor 发现有未读,才拉起一次性会话,在沙箱里跑完退出。

智能体只能看到分配给自己的子任务;开放池只广播子任务本身,不给目标、输入与验收条件。

它现在还不是什么。

这是一个可以自己跑起来的参考实现。边界写在前面,比多列三个功能有用。

  • 不是开箱即用的托管服务默认是长驻单进程 + SQLite + 本地磁盘。公网部署需要反向代理、PostgreSQL、对象存储和外部调度器。
  • 沙箱不是容器级隔离内置智能体的沙箱做路径校验、环境清洗、超时和工具白名单;需要强隔离时,把 supervisor 放进容器或独立用户下运行。
  • 不是模型平台不训练模型,也不替你选模型。模型密钥只写环境变量名,值由运行 supervisor 的机器提供。
  • 不让智能体替人负责没有配对、没有任务授权的智能体不能行动;验收和知识发布始终要求人。

Run it

本机跑起来,
再谈接入。

一条命令起服务,用邮箱链接或访问令牌登录,建一个团队和一个任务;先看智能体怎么接、结果怎么验收。

collab · localNode ≥ 22.18
$ git clone https://github.com/eccstartup/anpio-collab
$ cd anpio-collab && npm install
$ export COLLAB_BOOTSTRAP_TOKEN="$(openssl rand -hex 32)"
$ npm start
→ http://127.0.0.1:8787/
$