read_file、write_file、list_directory、search,背后是持久、版本化、按 agent 鉴权的文件工作空间。明天的运行能读到今天的运行写下的东西。其他 agent(Cursor、Claude Code、n8n、你其他 Python 服务)也都看得见。绝大多数 LangChain 项目都长一个样:
ConversationBufferMemory、一个 vector DB、一张自定义 Postgres 表、一文件夹 pickle。puppyone 把第 4–6 步压缩成"注册一个 Tool / Retriever,用就行":
read_file、write_file、list_directory、search。标准 BaseTool 形态。Document。DocumentLoader。/research/。写作链写 /drafts/。审稿链读 /drafts/ 写 /reviews/。没有任何 agent 看到超出它需要的范围。LangChain 继续做编排框架。puppyone 让你不用第五次重建持久化层。
/scratch/<agent>/,读 /specs,读 /integrations/,等等。read_file、write_file、list_directory、search、version_history。BaseTool 实例。跟其他 tool 一样加进 AgentExecutor / LCEL chain。Document(路径、版本、来源连接器、最后由哪个 agent 改的)。NotionLoader、SlackLoader、PostgresLoader 等等,背后是 puppyone 的连接器,你不用自己写集成代码。没 puppyone: 研究 agent 把发现拼成内存里的字符串。进程退出。除非你写了自定义 serializer,发现就没了。
有 puppyone: Agent 的 tool spec 里有 write_file。它把发现写到 /research/<topic>/<date>.md。明天的 agent 读这个目录,接着干。完整版本历史。其他 agent(review、summarisation)读同一份文件。
没 puppyone: "Plan" 链产出一个计划。"Execute" 链拿过去。你把 plan serialize 进 conversation buffer 或者你自己写的 JSON 文件。
有 puppyone: Plan 链写 /plans/<run-id>.md。Execute 链读它。Reviewer 链读 /plans/<run-id>.md 和 /executions/<run-id>.md。每条链有自己的 Access Point。"plan 格式"就是"一个 markdown 文件" —— 人也能读、也能改。
没 puppyone: 你 crew 里的每个 agent 有自己的 memory。在它们之间协调 context 意味着通过 orchestrator 传消息,orchestrator 变瓶颈。
有 puppyone: Agent 共享一个工作空间。Researcher 写 /research/。Writer 读 /research/ 写 /drafts/。Reviewer 读 /drafts/ 写 /reviews/。Orchestrator 只负责 route;状态住在所有 agent 都能看到的文件里。
没 puppyone: 你起一个 vector DB,给每个源(Notion、Slack、Postgres、GitHub issues)写 loader,维护 ingestion pipeline,去重,同步。
有 puppyone: 连接器把源同步进工作空间。puppyone Retriever 跨它们做混合搜索。DocumentLoader 返回带 provenance 的 Document(哪个源、哪个路径、哪个版本)。你的 RAG 链不在乎一些来自 Notion 一些来自 Slack —— 它就是检索文件。
没 puppyone: Agent 产出一个东西,你建一个独立 UI 让人 review、edit,把改动 serialize 回 agent 的 memory。
有 puppyone: Agent 写到 /drafts/。人打开 puppyone(或者任何能跟它对话的文本编辑器)改。下一个 agent 读改过的版本。"Review UI"就是"一文件夹文件"。
没 puppyone: 你 Python LangChain agent 和你 TypeScript LangChain.js agent 各有自己的 memory。共享需要一个共享 DB,schema 你自己维护。
有 puppyone: 两边都连同一个工作空间。两边读写同样的文件。Schema 就是"目录树里的文件"。零协调代码。
RunnableLambda 输出留在内存里就行。puppyone 用来放你以后会读、会被另一次运行、另一个 agent、或一个人读的状态。LangChain 还是你拿来用的框架。puppyone 让你不用再重建底下那层无聊的基础设施。
这是 LangChain 官方集成吗?
我们提供 Python 和 TypeScript SDK,里面有遵循 LangChain 标准接口的 BaseTool、BaseRetriever、BaseLoader 实现。直接放进你已有的链就行。
puppyone 替代 ConversationBufferMemory / chat memory 吗?
长跑、多 session 的 agent —— 是,你会想要 puppyone 后端的 memory,让它撑过进程重启。请求结束就不用活的 5 轮 chat,内存版的够了。
puppyone 替代我的 vector DB 吗? 多源、不断变化、文件形态的 context(不然你得自己搭 loader 和 ingestion 管道)—— 是。高吞吐、单领域语义搜索索引 —— 不是,专门 vector DB 留着。
能跟 LangGraph 一起用吗? 能。图里每个节点都能通过同一个 Tool 读写 puppyone。跨 graph execution 的持久状态就成了工作空间的属性,不再是 graph runtime 的属性。
LangSmith / tracing 怎么处理? puppyone 调用在你 trace 里跟标准 tool call 一样显示 —— 文件路径、操作、延时、返回大小。无需特殊集成。
支持 LangChain.js 吗? 支持。一样的 SDK 形态、一样的 Access Point、一样的工作空间。Python agent 和 TypeScript agent 能透明共享一个工作空间。
多租户 SaaS 里每个客户有自己的 LangChain agent,权限怎么管? 每个租户拿自己的 puppyone 工作空间(或一个空间内独立 scope 的子树),每个 agent 有自己的 Access Point,存储层不会跨租户漏。你应用逻辑不用强制 tenancy —— 存储层就强制了。
只用 LCEL 不用老的 agent 抽象呢?
一样 —— 把 tool 注册成 RunnableLambda wrapper(或者用 SDK helper),组合进你的链就行。
LangChain 给你 agent。它不给你放状态的地方 —— 那是给用户做的练习题。puppyone 用 drop-in Tool、Retriever、DocumentLoader 把这个洞补上,你的 agent 不再忘事,你的团队不再维护临时凑出来的持久化层。同样的链。同样的 prompt。底下是真正的工作空间。
给你 LangChain agent 一份工作空间,而不是一个进程退出就死的 Python dict。Get started