Files over tools — Knock Agent 架构解析:虚拟文件系统与 Bash 驱动的智能体设计

Knock(客户消息通知平台)在 2026 年 3 月推出了 AI 智能体,可管理工作流、模板、受众和用户分组。其团队近期公开了背后的架构设计,核心思想值得关注:少暴露工具,多提供文件

Knock 的第一个原型使用传统工具函数模式——为每个 API 端点暴露一个工具,工具描述中编码领域知识。但很快发现这种方式不可扩展:智能体的上下文窗口被大量工具描述填满,每增加一个新资源类型就需要新增一个工具,维护成本直线上升。

受 Vercel 的 d0 内部工具启发,Knock 团队转向了“文件系统即接口”的范式。他们基于 just-bash 项目(一个纯 TypeScript 的虚拟 Bash 实现)在 Elixir 中构建了完整的虚拟文件系统和 Bash 解释器。智能体不再通过函数调用来操作资源,而是通过读写文件来探索和修改数据

工作流程如下:智能体启动时,账户的元数据被挂载为虚拟文件系统的目录结构(workflows/templates/channels.json 等)。智能体可以用 lscatjq 等 Bash 命令浏览数据,用 edit_file 修改文件内容,最后通过 upsert_resource 工具将变更持久化回 Knock 后端。整个交互方式与 Claude Code 等编程智能体如出一辙。

这一架构带来了几个关键优势:智能体可以在多个回合之间保持文件系统状态,无需重复加载上下文;读写文件比调用工具函数更自然、token 消耗更低;新资源类型只需映射为新的目录结构即可,无需新增工具描述。

Knock 还引入了一种“技能”系统(Skills),将每种资源类型的使用规范和常见陷阱文档化为 SKILL.md 文件,放在虚拟文件系统的 skills/ 目录下。智能体在执行操作前可以主动“学习”相关技能,从而在不膨胀系统提示词的前提下获取深度领域知识。

对于智能体开发者来说,Knock 的这篇博文提供了一个可落地的架构模板:当工具的粒度越来越细、数量越来越多时,退一步思考“我的领域是否可以用文件系统来表示”,往往能带来更简洁、更可扩展的设计。

阅读原文