/research/,Writer 读 /research/ 写 /drafts/,Editor 读 /drafts/ 写 /reviews/。每次写都是 commit。每个角色只看到该看的。明天的 crew 接着今天停的地方干。CrewAI 项目几乎都按同样的四个阶段演化:
./tmp/research.md,让下一个角色能读。一台机器上能跑。上生产就死。接上 puppyone 之后,你的 CrewAI crew 拿到:
/research/ 的 read+write、/specs/ 的 read。Writer 拿 /research/ 的 read、/drafts/ 的 read+write。Editor 拿 /drafts/ 的 read、/reviews/ 的 read+write。Orchestrator 不强制这个 —— 工作空间强制。/drafts/post-2026-04-23.md,任何有正确 Access Point 的人都能打开。CrewAI 继续干表达协作的活。puppyone 干那个让协作能持续累积的容器的活。
Agent、Task、Crew、Process 定义。 我们不替换其中任何一个。/research/ read+write,/specs/、/integrations/ read。/research/、/specs/ read,/drafts/ read+write。/drafts/ read,/reviews/ read+write。Agent 的 tools=[...],配上该角色的 Access Point。/research/<topic>.md。先从 /specs/<feature>.md 读规格")。run_id,每次 crew 跑都有自己的子树(/runs/<run-id>/research/...),per-run 历史天然干净。整个集成就这些。无 glue code,无 schema,无 ACL 管道。
没 puppyone: Researcher 返回 4KB 字符串。Writer prompt 里现在带 4KB 输入。Editor prompt 里现在带 Writer 的整篇草稿加上原始 research。到第三个角色,每次模型调用都在为 context 付费。
有 puppyone: Researcher 写 /research/topic.md 返回路径。Writer 读文件(只在需要时),写 /drafts/post.md,返回路径。Editor 读它需要的。Orchestrator 传路径,不传 payload。
没 puppyone: Plan agent 出一个计划。Execute agent 行动。Verifier 发现 bug。你重跑整个流程,因为没有执行开始时的干净 plan 快照。
有 puppyone: Plan agent 写 /runs/<run-id>/plan.md。Execute agent 读它,写 /runs/<run-id>/execution.md。Verifier 读两者。出问题就回滚、只重跑受影响的步、看不同 attempt 之间的 diff。
没 puppyone: 一个本应"跑一周、人每天 check-in 一次"的 crew 做不到 —— 没地方让状态在 run 之间活。
有 puppyone: 状态住在工作空间。Crew checkpoint 进文件。任何时候重启进程,下一次 run 读上一次 run 写的东西,继续。人在 session 之间审文件。
没 puppyone: Crew A 产出 Crew B 需要的东西。你搭一个 serialise 格式、一个 queue、一个 handoff agent。
有 puppyone: Crew A 写 /handoff/。Crew B 读 /handoff/。"格式"就是"任意结构的 markdown 文件"。每个 crew 有合适的 Access Point。
没 puppyone: Crew 产出。你建一个 UI 让人审。你把改动 serialise 回下一个 crew 的 prompt。
有 puppyone: Crew 写 /drafts/。人打开 puppyone(或任何能跟它对话的文本编辑器)改。下一个 crew 读改过的版本。无 UI 要建。版本历史精确显示人改了什么。
没 puppyone: 除非你小心切分,每个客户的 crew 都能访问"全部 agent 状态"。漏数据轻而易举。
有 puppyone: 每个租户拿一个工作空间(或一个 scope 子树)。每个角色拿一个 scope 到该租户的 Access Point。存储层隔离。你应用代码不强制 tenancy —— 存储层就强制了。
/research/ 没问题;Researcher 直接写 /specs/ 是在找麻烦。让 review 步(人或另一个角色)才提升进 canonical 路径。run_id 分区。 每天跑一次的 crew 用扁平命名空间很快就乱。Per-run 子树让历史干净。CrewAI 描述 crew。puppyone 是它们真正干活的房间。
这是 CrewAI 官方集成吗?
我们提供 Python SDK,里面有 CrewAI 兼容的 tool wrapper。把它们放进 Agent 的 tools=[...],配上该角色的 Access Point。
puppyone 替代 CrewAI 内置 memory 吗? 长跑、多 session、多 crew 场景 —— 是,puppyone 是持久层。单次 crew run 内的短期 context,CrewAI 内置 memory 够用。
能跟 CrewAI 的 hierarchical process 一起用吗? 能。Hierarchical process 里的 "manager" agent 能读工作空间决定下一步派给谁,每个被派的角色读写自己的 scope。
"整个 crew 在做的那份规格"在 puppyone 里怎么表达?
/specs/ 下面一个文件(或目录)。所有角色拿 read;只有指定角色(或一个人)拿 write。版本历史显示随时间的变化。
不同 crew 能安全共享同一个工作空间吗? 能 —— 那就是多 crew 交接模式。每个 crew 用独立 Access Point、写 scope 不重叠(读 scope 重叠没问题 —— 那才是交接的方式)。
两个角色同时写同一个文件会怎么样? puppyone 底下用乐观并发 —— 后写赢,但输的那方看到 conflict,版本历史显示两次 attempt,方便你 reconcile。实践中 crew 设计成两个角色不要同时写同一个 canonical 文件就行。
puppyone 能跟 CrewAI 的 kickoff_for_each 一起做并行 crew 吗?
能。每个并行 crew 写到自己的 /runs/<run-id>/ 子树,下游聚合 crew 读它们全部。
我笔记本上做 3 个 agent 的 demo,需要 puppyone 吗? 不需要。Demo 和单机实验,本地文件够。一旦有多 session、多用户、多 crew 交接,或者需要版本历史 —— 就该上 puppyone 了。
CrewAI 是把"我想要一个 Researcher、一个 Writer、一个 Editor"变成可运行 agent 的框架。puppyone 是 Researcher 的笔记、Writer 的草稿、Editor 的审稿真正住下的工作空间 —— 持久、版本化、按角色 scope、人能看。把它们接起来,你的 crew 不再让大段字符串穿过 orchestrator,开始在真实工作空间里协作。
给你 crew 一份真实工作空间,而不是 orchestrator prompt 里的一个 50KB 字符串。Get started