接口
Agent NAS 的数据面用文件,控制面用工具:字节走挂载、Git 和 S3;授权、审批、记忆、搜索与解释走 MCP、HTTP 和 CLI。每个接口都是同一份数据的投影,语义差异用明确的错误表达,而不是假装不存在。
准则
- 数据面用文件,控制面用工具。 字节走挂载、Git、S3;授权、审批、记忆、搜索与解释走 MCP、HTTP 与 CLI。
- 网关无状态。 授权只发生在 Trust 层的一个点上。
- 每个接口都是投影。 语义差异用明确的错误映射表达(例如“闸门待处理”映射成一个带说明文件的
EACCES),不假装 S3 有分支。 - 窄工具面。 面向智能体的 MCP 工具不超过 10 个;人与运营者的动作放在单独的操作员接口里。
- 适配器隔离协议变化。 MCP、A2A 的版本演进只影响适配器。
接口矩阵
| 接口 | 面 | 面向 | 映射 | 等级 |
|---|---|---|---|---|
| 挂载(FUSE、NFS、SMB) | 数据 | 智能体、人、任何程序 | 分支视图;错误映射见下文 | L0 |
| Git(SSH、HTTPS) | 数据 | 智能体、人、CI | 运行分支即 Git 分支;Agent PR 即合并请求 | L0 |
| S3 兼容 | 数据 | 数据管线、批处理 | 桶对应某棵树的某个分支视图;版本 ID 即提交 | L0(可选) |
| WebDAV | 数据 | 人(Finder、资源管理器) | 只读的活动视图 | L0(可选) |
CLI nas | 控制 | 人、脚本 | 与 HTTP API 一一对应 | L0 |
| HTTP API | 控制 | 编排器、控制室 | 全部 POST 加 JSON;字段使用 snake_case | L1 |
| MCP | 控制 | 智能体 | 九个工具(见下文) | L1、L2 |
| A2A | 控制 | 其他智能体 | 任务对应 inbox/ 与 outbox/ | L4(可选) |
MCP 工具面
面向智能体的只有九个工具:
| 工具 | 作用 | 所需的租约动作 | 备注 |
|---|---|---|---|
nas_list | 列目录,含标签与审阅状态 | list | 租约之外的路径不可见。 |
nas_read | 预算化读取:视图、范围、预算 | read | Budgeted Reads |
nas_search | 搜索(全文,可选向量),返回片段与指针 | read | 默认不返回隔离区。 |
nas_write | 写入分支内的文件,可附 intent | write | 多数运行时直接用挂载,不需要它。 |
nas_branch | 创建、检查点、恢复、列出分支 | write | Agent Branch |
nas_propose | 生成 Agent PR | propose | 可能触发闸门。 |
nas_lease | 申请更窄的子租约;查询当前租约与预算;请求扩权(走闸门) | 无 | Capability Lease |
nas_remember | 写入笔记,含来源与类型 | write | Agent Memory |
nas_recall | 召回笔记:预算化,含来源与审阅状态 | read | Agent Memory |
只面向人与运营者的操作
explain、gate approve/deny、forget、trash restore、label admin、lease revoke 和 policy edit 不暴露给智能体。这些动作改变的是保证本身,不应该由被约束者来调用。智能体可以请求其中一部分(扩权、遗忘),但不能执行。
挂载语义
- 挂载绑定一个分支和一张租约;租约到期后挂载变为只读,随后卸载。
- 自动提交(防抖,例如静默 5 秒);
fsync会触发一次提交。 - 租约之外的路径不出现在目录列表里:这减少信息泄露,也缩小了提示注入的攻击面。
- 对沙箱友好:不需要 root;FUSE 与 NFS 二选一,不需要内核模块;可以只读挂载。
| 情况 | POSIX 错误 | 说明 |
|---|---|---|
| 租约之外的路径 | ENOENT(可见但被拒时为 EACCES) | 拒绝被记录。 |
| 配额或预算用尽 | EDQUOT | 运行可以据此自我节制。 |
| 闸门待处理 | EACCES,并在 /.nas/pending 给出说明 | 避免智能体无限重试。 |
| 租约过期 | ESTALE,随后只读 | 分支保留到它自己的 TTL 到期。 |
Git
- 运行分支名为
<role>/<run_id>;main是受保护的,服务器端的pre-receive钩子会拒绝直接推送。 nas propose创建 Agent PR。- 提交自动附带
Run:、Lease:、Principal:等 trailer。
S3
- 一个桶对应一棵树的某个分支视图;对象版本 ID 即提交。
- 分支这类 S3 没有的语义,用桶前缀或请求头(
x-nas-branch)表达。这是一种降级的投影:数据管线能读写,但拿不到完整的分支体验。 - 租约通过 STS 风格的临时凭据传递。
A2A(可选)
- 收到的任务落在
inbox/里的任务文件;产物放进outbox/。 - Agent Card 声明角色的技能与所需的租约。
- NAS 不是 A2A 的参与者, 代表角色的运行时才是。NAS 只负责任务与产物的存放、交接包与租约。
HTTP API 约定
- **全部接口使用
POST,参数放在 JSON 请求体里;** 响应字段一律snake_case。 - 路径带版本:
/v1/...。 - 幂等:写操作接受
idempotency_key。 - 分页:
cursor加limit。 - 预算与限流通过响应头反馈(剩余字节、剩余请求数),便于运行时自我节制。
预算化读取的请求与响应大致如下:
POST /v1/files/read
{ "path": "/agents/cleo/memory/notes/customer-acme.md",
"view": "outline", "budget_tokens": 400 }
200 OK
{ "view": "outline", "tokens": 212, "generated": false, "truncated": false,
"content": "# Acme\n## Renewal (L12-L18)\n## Contacts (L19-L31)\n## Open issues (L32-L40)",
"evidence": [
{ "pointer": "nas://home-box/agents/cleo/memory/notes/customer-acme.md@9f2c1de#L1-L40" }
] } 错误使用统一的结构:
{
"error": {
"code": "gate_required",
"message": "This merge requires human approval.",
"retryable": false,
"request_id": "req_01JB7W2X4N",
"details": { "gate_id": "gt_2Mx4" }
}
} 发现
- 机器可读的入口与本站相同:
/.well-known/ai-catalog.json、MCP Server Card、llms.txt。 nas://证据指针的解析与校验端点。- MCP 的
server/discover。
引用本页
为读者、搜索引擎和智能体提供稳定的网址与建议的引用格式。
- Markdown 版本
- https://agentnas.com/zh-cn/interfaces/index.md
- 建议引用格式
- Agent NAS project. “接口.” agentnas.com, 2026-11-11. https://agentnas.com/zh-cn/interfaces/