
tapeapi
io.github.BruceLanLan/tapeapi
Signed BNB Chain reads (balances, tokens, NFTs, prices, TapeOut names) with verifiable receipts
Documentation
中文 | English
TapeAPI
每个 Agent,都能被陌生人核验。 每次 AI 调用都附一张签名回执:谁回答的、回答的是哪个请求、回了哪些字节、声称用了多少 token、收多少钱,任何人都能核验;3.0 起,一个 Agent 是谁、守什么规矩,别人也能在自己的机器上重新查一遍。
English · 网站 · 手册 · 指南 · 规范 · 示例 · 更新日志 · 路线图 · 升级到 2.0 · 升级到 3.0
它是什么
TapeAPI 是 TapeOut 的签名 API 层。在你的 OpenAI 或 Anthropic 兼容接口前面加一个旁路,每个回答都会带上一张任何人都能核验的回执;你的用户照旧用官方 SDK,只改 base URL,不改代码。同一套链上身份和签名,也用在 MCP 工具、容器之间端到端加密的通道与群聊上,支持 BNB Chain、X Layer 和 Base。3.0 又加了四样,都能在你自己的机器上重新核对:身份(Agent 护照)、工具(钉在链上的 MCP 工具定义)、账目(回执、对账、花费清单、本地预算)和规则(策略电路)。
现状
最新发布的版本是 3.0.0(2026-11-06)。 今天上线的一切都免费。**稳定的:**除标注
@experimental或@internal的以外,其余全部;按 3.0 文档写的代码,在所有 3.x 版本里都能继续工作。实验性的,不在兼容承诺之内:三个新包(@tapeapi/interop、@tapeapi/passport、@tapeapi/policy-circuit,都是 0.1.0)、@tapeapi/sdk/agent、@tapeapi/sdk/review,以及没有部署的付费调用(TAPI-22):托管合约未经审计、未部署。**支持期:**3.0.0 发布后 2.x 继续获得 6 个月的安全修复,1.x 到 2027-04-12,0.x 的包没有支持期(修复只随新的 0.x 版本发布)。所有代码和合约都没有经过第三方审计。**安全说明:**1.0.0 至 1.4.0 的流式 AI 回执核验,在特定分块下可能把被截断或被注入内容的流显示为“已核验”;1.5.0 已修复(更新说明)。
从这里开始
-
你在运行 AI 服务(new-api、网关、自建模型):在
examples/new-api-sidecar里docker compose up,到持有人操作台发布价目表,把用户的 base URL 指向旁路,再跑一遍tapeapi-doctor <你的名字>。指南:AI 服务方指南。 -
**你在调用服务:**从发布页安装 SDK(Node.js 22 或以上),然后用
tapeapi-verify <服务方名字>核验每个回答(Claude Code 和 Codex 可以指向它),或在代码里用createVerifyingFetch。指南:调用服务;具体命令见试一试。npm install https://github.com/BruceLanLan/tapeapi/releases/download/v3.0.0/tapeapi-sdk-3.0.0.tgz -
**你在做 Agent,或要雇一个 Agent:**让它调用之前先查一遍。
tapeapi passport <名字>解析它的 Agent 护照(需要同一发布里的 passport 包),tapeapi receipts statement汇总它的回执声称花了多少。指南:Agent 护照、策略电路、对账、容器代理。tapeapi passport 4246.0.tape # 一个 TapeOut 名字(示例);只有 CONFIRMED 时退出码才是 0
| 你是 | 第一步 | 指南 |
|---|---|---|
| MCP 服务器作者 | 在你的服务器前面跑签名代理,再用操作台发布清单 | Tape out 你的 MCP 服务器 |
| Claude、Cursor 等 MCP 客户端的用户 | 把 https://api.tapeapi.fun/mcp 添加为连接器 | MCP 指南 |
| TapeOut 电路持有人 | 开通电路的容器并激活名字,然后在操作台里生成服务密钥、签委托、发布清单 | 运行服务 |
| 应用开发者 | 用 createVerifyingFetch 核验 AI 回执;通道和群聊从 examples/group-chat 开始 | 私密通道 · 群聊 |
| 想为容器雇一个代理,或自己做代理(实验性) | 在仓库检出里运行 node examples/agent-service/hire.mjs,看每一步要钱包签什么 | 容器代理 |
| 从 2.x 或 1.x 升级 | 3.0 有五项破坏性修改(见下);从 1.x 升级的话,还要在代码里搜 conform、labels、TapeAPIError 的顶层别名和 CHANNEL_INVALID,用自定义地址或本地链的地方加 conform: false | 升级到 3.0 · 升级到 2.0 |
3.0 新增
3.0 只有一个主题:让一个 Agent 调用你之前,你自己先查一遍。新增的部分都是实验性的,不在兼容承诺之内;2.x 能做的,3.0 照样能做,只有下面「升级」里的五项修改除外。线上服务的回答与 2.5.0 相同,只有版本号不同。
- Agent 护照(
tapeapi passport <名字>与@tapeapi/passport0.1.0)。只读地解析:同一个钱包持有一个 ERC-8004 身份和一枚 TapeOut 电路,并且持有人公开了这层关联。所有读取都在同一个钉住的区块上,至少两家运营方的节点必须一致;结果是一个状态词(CONFIRMED、BROKEN、UNAVAILABLE……)加一个具名原因,读取不一致就是「不知道」,绝不猜。它跟随未合并的草案 TAPs #83(已提交,评审中);本包按头提交cae25e6的文字实现,草案此后又改过,每个结果都带着它读取时依据的头。*限制:*护照不说明 Agent 跑什么代码,也不说明它诚实与否,主网上目前还没有已知的 CONFIRMED 护照。Agent 护照 - 策略电路(
@tapeapi/policy-circuit0.1.0)。委托人把花钱的规则写成一个小电路,按哈希固定,用签名绑到一个账户;对方在自己机器上把这笔请求重跑一遍,守门方的admit()只要拿不准就拒绝(没有电路、哈希不对、绑定过期或被撤销、换了持有人、读不到撤销记录)。它跟随未合并的草案 TAPs #84,头提交0b73174(已提交,评审中,目前转为 draft PR)。*限制:*这是链下检查,只约束去检查它的一方,不部署任何东西,也不发交易。策略电路 - 花费清单与本地预算。
tapeapi receipts statement按服务、模型、UTC 天汇总回执所声称的花费,并列出你的限额;客户端预算会在调用发出之前就拒绝会超限的调用。两者都建立在 2.x 已有的签名回执与tapeapi reconcile之上,那些格式不变。*限制:*回执只证明签名方说了什么,花费清单没有任何人签名。对账 - 3.0 里另外几项实验性功能:容器应用之间的访客授权(
@tapeapi/interop0.1.0,是原型,背后没有任何 TAP,见 TAPI-28);给有界代理用的 x402 批量结算后端(enforcement: 'x402-batch',默认关闭,付款方只能是普通钱包,没有在主网上运行过);收据引用提案(ai.receiptRef,默认关闭)。每个付费调用现在都先核对托管的代币,核对不了就以未签名的 503 拒绝。托管合约仍然未经审计、未部署。更新日志
提交 TAP 草案不等于被采纳:#83 和 #84 只是已提交,尚未合并。
升级
五项破坏性修改:Node.js 22 或更高版本;createAIProxy 默认拒绝未声明的格式;createMcpProxy 拒绝你没有列出的浏览器来源;tapeapi-verify 默认严格;MCP 代理默认先协商上游的版本。除第一条外,每一项都有保留 2.x 行为的选项。升级到 3.0
各部分怎么配合
flowchart LR
client["客户端<br/>官方 SDK、Claude Code、Codex"]
sidecar["签名旁路或 MCP 代理<br/>(由你自己部署)"]
upstream["你的接口或 MCP 服务器"]
chain[("链上:BNB Chain、X Layer、Base<br/>身份、清单、价目表、签名密钥的委托")]
client -- "请求" --> sidecar
sidecar -- "原样转发" --> upstream
sidecar -- "回答 + 签名回执" --> client
sidecar -. "持有人发布一次" .-> chain
client -. "对照链上核验" .-> chain
| 层 | 是什么 | 规范 |
|---|---|---|
| 身份 | 一枚 TapeOut 电路的 ERC-6551 容器。谁持有电路,谁就拥有这个服务;电路转手,服务跟着走。按 TAP-10 与 TAP-11 §2 解析。 | TAPI-20、TAP-11(Draft) |
| 清单 | 容器链上站点里的 .well-known/tapeapi.json:接口地址、方法、AI 价目表、MCP 工具定义的哈希、签名密钥,以及持有人对这把密钥的委托。 | TAPI-20 |
| 签名回答与回执 | 每个回答都有签名,并和它的请求绑定;AI 调用另有一张用量回执。 | TAPI-21、TAP-13(Draft) |
| 通道与群聊 | 端到端加密,经中继或 ChannelBus 传递;承载方只看得到密文。 | TAPI-26 v2、TAPI-27 v2 |
回执能证明什么,不能证明什么
回执能证明:谁回答的(电路持有人在链上委托的密钥)、回答的是哪个请求(请求的确切字节)、回了什么(回答的确切字节;流式回答则是按固定规则读出的事件数据),以及声称的用量和价格(按链上价目表计算)。
回执不证明实际跑的是哪个模型:服务方可以把便宜模型的回答标成贵的。签名带来的是可追责:回执无法抵赖,任何人用抽检探针发测试请求并公开结果,都会留下证据。回执只证明签名方说了什么。
试一试
**一个带签名的回答。**公共服务 11.1013.tape 提供 8 个免费的读取方法,每个都钉在一个 BNB Chain 区块上:
curl -s https://api.tapeapi.fun/tapeapi/v1/bnbUsd -H 'content-type: application/json' -d '{"id":"1","params":{}}'
curl 只显示签名信封,不做任何核对;核对交给 SDK。SDK 还没发到 npm,从 GitHub Release 安装(Node.js 22 或以上):
npm install https://github.com/BruceLanLan/tapeapi/releases/download/v3.0.0/tapeapi-sdk-3.0.0.tgz
服务端包(@tapeapi/server:服务提供方、AI 旁路、MCP 代理)依赖这个 SDK,而 SDK 也不在 npm 上,所以单独安装服务端包会报 404:请用一条命令同时安装两者,npm install https://github.com/BruceLanLan/tapeapi/releases/download/v3.0.0/tapeapi-sdk-3.0.0.tgz https://github.com/BruceLanLan/tapeapi/releases/download/v3.0.0/tapeapi-server-3.0.0.tgz。
// try.mjs:node try.mjs
import { createTapeAPI, rpcUrlsFor } from '@tapeapi/sdk'
const api = createTapeAPI({ rpcUrls: rpcUrlsFor(56) }) // 3 家不同运营方的节点;多数读取 2 家一致即可,
// ownerOf 与 eth_chainId 要 3 家都作答且一致(严格)
const service = await api.resolve('11.1013.tape') // 按 TAP-10 / TAP-11 §2:同一钉块、已开通、已激活
const { result, verified } = await api.call(service, 'bnbUsd', {})
console.log(result.bnbUsd, verified) // 验签通过才为 true
Claude Code 和 Codex 自己读不到回执。在本机开一个核验代理,再把它们指过去:
# 终端 1(会一直运行)。42.1013.tape 是示例名:换成 AI 服务方的 TapeOut 名字
npx -y --package=https://github.com/BruceLanLan/tapeapi/releases/download/v3.0.0/tapeapi-sdk-3.0.0.tgz tapeapi-verify 42.1013.tape
# 终端 2,macOS 或 Linux
ANTHROPIC_BASE_URL=http://127.0.0.1:8790 claude
OPENAI_BASE_URL=http://127.0.0.1:8790/v1 codex # Codex(或 config.toml 里的 base_url)
# 终端 2,Windows PowerShell
$env:ANTHROPIC_BASE_URL="http://127.0.0.1:8790"; claude
$env:OPENAI_BASE_URL="http://127.0.0.1:8790/v1"; codex
tapeapi-verify 会打印一行 resolution:,写明用了哪种解析;加 --no-conform 用 1.x 的方式。照原样运行 tapeapi-verify 42.1013.tape 会停下:这个名字是示例名,链上没有以它发布的服务。不依赖任何服务方、想看回执端到端核验通过,就在本仓库的检出里跑本地试跑(不需要密钥、电路,也不花钱),先在根目录安装一次依赖:
git clone https://github.com/BruceLanLan/tapeapi.git && cd tapeapi
npm ci --no-audit --no-fund
node examples/relay-trial/trial.mjs
自己要做 AI 服务?从从零到上线开始;服务方的检查工具 tapeapi-doctor(实验性)在同一个发布包里。
**MCP。**同样的 8 个读取方法也是 MCP 工具,地址是 https://api.tapeapi.fun/mcp,每个结果都带签名回执:
claude mcp add --transport http tapeapi https://api.tapeapi.fun/mcp
什么都不想装:调试台在浏览器里跑同一个 SDK。
更多试法:解析失败怎么看、本地链、在 OpenAI SDK 里核验 AI 回执
解析失败时,e.data.status 用 TAP 自己的名字说明原因:
try {
await api.resolve('11.1013.tape')
} catch (e) {
if (e.data?.status === 'not-opened' || e.data?.status === 'unpaid') { /* 要服务方处理:不要重试 */ }
else if (e.data?.status === 'unavailable') { /* 有节点没作答或不一致:重试 */ }
else throw e
}
**本地服务、本地链或你自己的部署。**开发模式只要 dev;不是 TAP-10 列出的 TapeOut 链,要传 conform: false,否则 createTapeAPI() 直接报 INVALID_ARGUMENT:
const dev = createTapeAPI({ dev: true }) // 本地 http:// 服务,不需要链上清单
const local = createTapeAPI({ // anvil 本地链,用你自己部署的 TapeOut 合约
rpcUrls: ['http://127.0.0.1:8545'], allowSingleNode: true, allowHttp: true,
chainId: 31337, hub: HUB, factory: FACTORY, siteRegistry: SITE_REGISTRY,
conform: false, // 1.x 的解析方式;已弃用,3.x 内保留
})
**AI 回执。**把 createVerifyingFetch 接进官方 OpenAI SDK(npm install openai;Anthropic SDK 同样接受 fetch)。把 42.1013.tape 换成服务方的 TapeOut 名字:
import OpenAI from 'openai'
import { createTapeAPI, rpcUrlsFor, ai } from '@tapeapi/sdk'
const api = createTapeAPI({ rpcUrls: rpcUrlsFor(56) })
const service = await api.resolve('42.1013.tape') // AI 服务方的名字(示例)
const { baseUrl } = service.manifest.ai.endpoints.find((e) => e.format === 'openai-chat')
const client = new OpenAI({
baseURL: baseUrl, // 服务方发布在链上的地址
apiKey: process.env.API_KEY, // 你在该服务方的密钥,照旧
fetch: ai.createVerifyingFetch({ api, service }), // 核验每张回执,不通过就抛错
})
const r = await client.chat.completions.create({ model: 'gpt-4o-mini', messages: [{ role: 'user', content: 'Hello' }] })
console.log(r.choices[0].message.content)
链上还没有外部服务方发布价目表,所以这段代码是对 examples/ai-proxy 里的参考旁路(本地开发模式)实际跑通的;接真实服务方时只换名字。
已上线的服务与承诺
- **已上线,免费,无需注册:**公共服务
api.tapeapi.fun(8 个方法)和它的 MCP 端点,公共中继relay.tapeapi.fun(relaySend、relayHandshake、relayRecv),ChannelBus,以及网站上的持有人操作台、回执核验页、调试台和状态页。 - **可用,由你自己部署:**AI 签名旁路与 new-api 一键包、MCP 签名代理、
tapeapi-verify、tapeapi-mcp、抽检探针,以及 SDK 里的群聊一步投递(deliverGroupUpdate)。 - **实验性,未部署:**付费调用与托管合约(TAPI-22,§3.6 为美元报价、BEM 结算)、服务目录、可由电路验证的方法(TAPI-25)。
- **实验性,在 SDK 里:**容器代理(
@tapeapi/sdk/agent:阶段 0 自 1.7 起,有界代理自 2.0 起,只在本地链可用)与评价(@tapeapi/sdk/review,自 2.0 起),不受兼容承诺约束。 - **3.0 承诺什么(3.0.0,2026-11-06):**按 3.0 文档写的代码,在所有 3.x 版本里都能继续工作;除了标注
@experimental或@internal的,其余全部是稳定的;三个新包(@tapeapi/interop、@tapeapi/passport、@tapeapi/policy-circuit,都是 0.1.0)不在承诺之内。3.0 有五项破坏性修改,除 Node.js 22 下限外,每一项都有保留 2.x 行为的选项。3.0 没有任何 TAP 收紧成为默认,规则照旧:放宽与新增状态名在 3.x 次版本里生效,收紧先作为可选 profile、默认到 4.0 才切。conform: false整个 3.x 保留(已弃用,最早 4.0 才移除);labels: 'v1'保留(已弃用)。3.0.0 发布后 2.x 继续获得 6 个月的安全修复,1.x 到 2027-04-12。从 2.x 升级:升级到 3.0。 - **我们不做的事:**不替任何人托管旁路(它会经手你用户的 API 密钥,只能你自己部署);不发币;不帮任何人绕开上游服务商的封禁或地区限制(TapeAPI 只面向在上游条款范围内经营的服务方)。
- **链:**BNB Chain(chainId 56)什么都能做,将来的支付也只在这条链上。X Layer(196)和 Base(8453)只读:身份、解析、回执和 MCP 核验。X Layer 只有两家独立的 RPC 运营方,在 2.0 默认下每次严格读取两家都必须作答。
- **没有经过第三方审计。**测试:JavaScript 测试(
npm test)、合约测试(forge test),另有一份独立的 Python 实现核对每一处 签名、哈希和编码(python3 spec/vectors/verify.py);三者在每次推送时都由 CI 运行。在 3.0.0 的发布提交上,本仓库的npm test共 2,702 项 JavaScript 测试:2,698 项通过,4 项跳过,0 失败。
规范与 TAP 状态
这些是 TapeAPI 自己的规范,不是 TAP。TapeOut 的标准以 TAP 的形式发布,由 TapeOutProtocol/TAPs 的编辑按 TAP-01 编号。我们就其中部分内容提交了 14 份 TAP 草稿:8 份在 2026-09-30 至 10-01,2 份关于容器代理格式在 2026-10-04 与 10-05,2 份在 2026-10-08(付费凭证、评价),2 份在 2026-10-13(托管通道、有界代理)。其中 7 份已合并为 Draft(TAP-11、TAP-13、TAP-14、TAP-15、TAP-16、TAP-17、TAP-18;合并不等于被采纳),另 7 份已提交(评审中):#20、#28、#49、#52、#54、#59、#60(#60 目前转为 draft PR)。另有 1 份 Information 草稿 #61,已提交(评审中)。编辑审的是格式而不是方案本身(TAP-01 §4),所以合并为 Draft 不等于被采纳。TAPI-20 至 TAPI-27(含 TAPI-26、TAPI-27 的第 2 版)仍是兼容承诺的依据。
| 我们的规范 | 草稿(拉取请求) | 状态(截至 2026-11-06) |
|---|---|---|
| TAPI-20(核心:§3.1 至 §3.4、§3.6、§3.10) | 服务身份与清单,#8 | 2026-10-01 合并为 TAP-11,Draft。2.0 默认按它的 §2 解析 |
| TAPI-21 | 签名响应,#10 | 2026-10-04 合并为 TAP-13,Draft |
| TAPI-26(v2) | 私密通道,#12 | 2026-11-03 合并为 TAP-14,Draft(合并不等于被采纳);已改用编辑要求的 tape-channel/ 标签,即 2.0 的默认 |
| TAPI-20 §3.8、TAPI-21 | MCP 工具绑定,#16 | 2026-11-03 合并为 TAP-15,Draft(合并不等于被采纳);它要求的草稿(TAP-11、TAP-13)也已合并为 Draft |
| TAPI-23 | 多家独立服务的交叉验证读取,#18 | 2026-11-03 合并为 TAP-16,Draft(合并不等于被采纳);它要求的草稿(TAP-11、TAP-13)也已合并为 Draft |
| TAPI-27(v2,仅格式 1) | 私密群聊,#20 | 已提交(评审中);已改用编辑要求的 tape-group/ 标签,即 2.0 的默认 |
| TAPI-20 §3.9、TAPI-21 §3.5 | AI 用量回执,#26 | 2026-11-03 合并为 TAP-17,Draft(合并不等于被采纳);已按编辑在 #25 的答复修订 |
| TAPI-20 §3.2(证明模式,说明性) | 证明核验读取,#28 | 已提交(评审中) |
| 容器代理授权书与任务消息,阶段 0(没有对应的 TAPI 规范) | #47 | 2026-11-03 合并为 TAP-18,Draft(合并不等于被采纳) |
| 清单里的代理成员(#41 的上架部分) | #49 | 已提交(评审中) |
| TAPI-22 §3.1、§3.2、§3.6 | 付费凭证:美元报价、BEM 结算,#52 | 已提交(评审中) |
没有对应的 TAPI 规范(@tapeapi/sdk/review) | 有证据的容器间评价,#54 | 已提交(评审中) |
| TAPI-22 §3.3 至 §3.5(托管接口) | 支付容器服务的托管通道(Standards),#59 | 已提交(评审中) |
| 容器代理,阶段 1:有界代理(没有对应的 TAPI 规范) | 由托管通道强制执行的容器代理授权书(阶段 1),#60 | 已提交,目前转为 draft PR |
| 没有对应的 TAPI 规范(Information 草稿) | 容器网站、消息与服务的隐私地图(Information),#61 | 已提交(评审中) |
| TAP-11 的后续修改 | 安全说明补一句 verifyingContract #35、说明性中文译文 #36;删去对 TAP-26/ 标签的提及 #51;两句澄清:priceBEM 可作单次调用的上限、托管合约所在的链由谁规定 #53;参考实现更新到当前版本,并加一条以 resolved 结束的主网向量 #55 | #35、#36 于 2026-10-04 合并;#51、#53、#55 于 2026-11-03 合并 |
| TAP-13 的后续修改 | 保留名的措辞,#46;参考实现一节里一句过时的话 #56 | #46 于 2026-10-05 合并;#56 于 2026-11-03 合并 |
| 对 TAP-11、TAP-13 至 TAP-18 的进一步修改 | 十三份措辞与规则的小修改,#89 至 #101 | 已提交(评审中) |
上面没有计入的:另外 4 份与 3.0 有关的较晚草稿,都没有合并。代理护照 #83,已提交(评审中),实验性的 @tapeapi/passport 跟随它;策略电路闸门 #84,已提交,目前转为 draft PR,实验性的 @tapeapi/policy-circuit 跟随它;电路任务 #85,已提交,目前转为 draft PR,只有一篇指南;容器服务调用的访客授权 #77,已提交(评审中)。@tapeapi/passport 实现的是 #83 在头提交 cae25e6 时的文字;草稿此后已有更新(现为 cbf4e03),跟进新文字的包已列入计划。实验性的 @tapeapi/interop 实现的是我们自己的 TAPI-28(不是 TAP),而不是 #77。
TAPI-22(§3.1 至 §3.6 以外)、TAPI-24、TAPI-25 没有提交。2026-11-03 拿到编号的五份草稿(TAP-14 至 TAP-18)上面已按编号称呼;其余的仍按拉取请求称呼,直到编辑给它们编号。
| 规范 | 标题 | 状态 |
|---|---|---|
| TAPI-1 | TapeAPI 的文档流程与状态,含 Stable (vN) | Draft |
| TAPI-20 | 服务身份与清单,含 AI 价目表与多链名字 | Stable (v1)(稳定);§3.5 实验性 |
| TAPI-21 | 签名响应信封,含 AI 用量回执 | Stable (v1)(稳定) |
| TAPI-22 | 计量支付:凭证与托管;托管资产(§3.5,BEM 优先)与美元报价、BEM 结算(§3.6) | Experimental(实验性) |
| TAPI-23 | 多家交叉验证的读取 | Stable (v1)(稳定) |
| TAPI-24 | 跨链意图询价 | Withdrawn(已撤回) |
| TAPI-25 | 可由电路验证的方法 | Experimental(实验性) |
| TAPI-26 v2 | 容器间的私密通道,tape-channel/ 标签 | Stable (v2)(稳定),2.0 起为 SDK 默认 |
| TAPI-27 v2 | 最多 32 个容器的私密群聊(实验性的格式 2 最多 128 个),tape-group/ 标签 | Stable (v2)(稳定),2.0 起为 SDK 默认 |
| TAPI-26、TAPI-27 | 两者的第 1 版:内容相同,使用冻结的 TAP-26/…、TAP-27/… 标签 | Stable (v1)(稳定);2.x 中用 labels: 'v1'(已弃用) |
规范中英双语,以英文为准。**TAPI-1 与 TAPI-20 至 TAPI-27 是 TapeAPI 自己的文档名,不是 TAP 编号。**含有旧名字的冻结常量(例如第 1 版的 TAP-26/…、TAP-27/… 标签)永不改变;第 1 版保持 Stable (v1),最早在第 2 版成为 Stable 12 个月之后才可能撤回(TAPI-1 §4.1)。
更早的版本
2.0 引入过什么、承诺过什么,全部保留在这里。从 2.x 升级请看 3.0 的升级指南。
2.0 新增:标准即默认
2.0 新增
2.0 只有一个主题:我们向 TapeOut 官方 TAP 流程提交的规则,以及 TapeOut 自己规定的规则,就是你什么都不传时 SDK 的行为(有一个已知例外,见下)。每一项破坏性修改和对应的改法见从 1.x 升级到 2.0;TAPI-20 至 TAPI-27 的线上格式与冻结常量一个字节都不变,所以 2.0 的客户端照样核验所有 1.x 的清单、委托、签名回答和回执。不传任何选项,createTapeAPI() 就按 TapeOut 官方 TAP 的规定解析服务:TAP-10 v1.1 §3 至 §7 与 TAP-11 §2,所有读取钉在同一个区块上,链 ID 与持有人要所有节点一致;名字从未开通(not-opened)、未激活或付费到期(unpaid)、TapeOut 的站点存储或付费合约换成了 SDK 不认识的实现(store-changed),都会得到一个明确的状态,而不是悄悄解析成功。TAP-11 与 TAP-13 是我们起草并提交的草稿,编辑已把两份合并进官方仓库,状态是 Draft;合并为 Draft 不等于被采纳。TAP-10 与 TAP-11 还是 Draft,默认按一条规则跟随它们的文本:放宽与新增状态名在 2.x 次版本里生效,收紧先作为可选 profile、默认到 3.0 才切。要 1.x 的行为,只需一个选项 conform: false(已弃用,整个 3.x 保留,最早 4.0 才移除)。一个已知例外:不开 allChains 时,"处理器合约#ID"会被拒绝,见升级到 2.0。2.0 同时把私密通道与群聊的标签换成 TAPs 编辑要求的 tape-channel/、tape-group/。
标准即默认
import { createTapeAPI, rpcUrlsFor } from '@tapeapi/sdk'
// 2.0:按 TAP-10 / TAP-11 §2 解析,正是 1.x 里 conform: 'tap10' 的行为
const api = createTapeAPI({ rpcUrls: rpcUrlsFor(56) })
// 2.0:1.x 的解析方式,请求逐个相同(已弃用;整个 3.x 保留;建客户端时 onWarning 提示一次)
const legacy = createTapeAPI({ rpcUrls: rpcUrlsFor(56), conform: false })
| 1.x 默认 | 2.0 默认 | |
|---|---|---|
| 怎么解析 | TapeAPI 自己的方式(TAPI-20) | TAP-10 v1.1 §3 至 §7 与 TAP-11 §2 |
| 读取用哪个区块 | 最新块,不钉定 | 一个 TAP-10 钉块,按块号和哈希确认 |
| 节点怎样算一致 | 多数运营方一致 | eth_chainId、ownerOf 与合约持有人的 EIP-1271 调用要所有运营方都作答且一致;其余多数一致 |
| 从未开通的名字 | 清单有效就解析成功 | SITE_STATUS,data.status: 'not-opened' |
| 未激活或付费到期的名字 | 解析成功 | SITE_STATUS,data.status: 'unpaid' |
| TapeOut 升级了站点存储或付费合约 | 解析成功,只告警 | CONTRACT_UNKNOWN,data.status: 'store-changed'(失败关闭,直到补丁版收录新实现) |
自定义地址、本地链或分叉、显式 pin | 允许 | 建客户端时 INVALID_ARGUMENT,提示传 conform: false |
| "处理器合约#ID"字符串 | 在本链解析 | INVALID_ARGUMENT,data.status: 'unsupported',除非 allChains: true(TAP-11 §2.1 的已知例外) |
| 清单缓存多久 | 3,600 秒 | 60 秒 |
TAP-10 与 TAP-11 是合并为 Draft 的(合并不等于被采纳),文本还可能改。改动时:放宽与新增状态名在 2.x 的次版本里直接成为默认;收紧先作为可选的新 profile 提供,默认到 3.0 才切换。状态名只增不改。conform: false 完全不跟随 TAP。默认如何跟随官方 TAP 的变化
- 按
e.data.status分支,不要按错误信息:状态名就是 TAP 里的小写名(unsupported、hub-changed、container-mismatch是 TapeAPI 自己的名字)。状态名只增不改;data.status在 2.0 里仍是实验性的(它跟随的是 Draft),待 TAP-11 评审期满且无未解决的异议后再考虑升为 Stable。not-opened、unpaid要服务方自己处理(不要重试),store-changed要升级 SDK(临时办法是conform: false),unavailable是节点问题(重试,或加一个自己的运营方)。 - 命令行跟着变。
tapeapi-verify、tapeapi-mcp、tapeapi-doctor都用新默认,输出里写明用了哪种解析,加--no-conform回到 1.x 的方式。在默认下,tapeapi-doctor对未激活的名字判为失败(默认客户端解析不了它);加--no-conform仍只是警告。 - **代理工具包也一样。**不给
resolve时,createAgentKit(@tapeapi/sdk/agent,实验性)按 TAP-11 §2 解析代理与服务方。 dev: true就等于conform: false,不出弃用提示:开发模式本来就不核对链上身份。- **代价。**在 BNB Smart Chain 上用默认节点实测:冷客户端解析一个服务,约 45 次 JSON-RPC 调用,1.x 约 24 次(约 2 倍);同一客户端再解析一次约 36 次,1.x 约 9 次(约 4 倍)。公共节点限流时,先给
rpcUrls加一个自己的运营方。 - **我们怎么核对的。**637 个用例的差分测试:
conform: false在全部 637 个用例里与 1.8.1 的默认发出相同的请求、顺序相同、结果相同(只允许两处差异:弃用提示,以及chain.channelKeys报告的收件房间变成第 2 版的房间)。我们自己的11.1013.tape与12.1013.tape按 TAP-10 的方式在主网上解析正常,两者都已激活,付费到 2036-08-09。 - **如果你提供服务:**用 2.0 的安装跑
tapeapi-doctor <你的名字>。前 7 项(name 至 delegation)通过,2.0 的客户端就能解析你;之后各项是针对 AI 服务的,不是 AI 服务的会在ai-field失败,与 1.x 相同。名字的付费一旦到期,2.0 客户端看到的是unpaid,回执核验页也不能再核验你的服务在付费期间签发的回执。
其它破坏性修改
- **私密通道与群聊默认使用 TAPI-26 v2 与 TAPI-27 v2:**标签以
tape-channel/、tape-group/开头,不再是TAP-26/、TAP-27/,这是 TAPs 编辑在评审草稿 #12(现为 TAP-14)、#20 时提出的要求。labels: 'v1'选用第 1 版(2.x 内弃用,不删除)。两个版本不互通,也不会失败放行:不一致的双方会超时,或得到一个写明不一致的错误(data.labels、data.peerLabels)。群聊终身保持创建时的版本,1.x 的群恢复后仍是第 1 版。通道记录、中继和 ChannelBus 都不变,持有人不需要重新签任何东西。 TapeAPIError去掉了弃用的顶层别名(即e.data里各字段的顶层别名):读e.data.*,1.0 起所有细节都在那里(完整列表见升级指南)。- 通道模块把调用方自己的选项或参数错误报为
INVALID_ARGUMENT,与其它模块一致;TAPI-26 数据本身出错仍是CHANNEL_INVALID。
有界代理(实验性,主网不可用)
有界代理(实验性,主网不可用)
**实验性,在 2.0 首次公开。**AI 代理可以替容器花钱,但容器最多会亏多少,由托管合约算死、任何人都能在链上核对:每个服务一条托管通道,代理用一把一次性的会话钥匙,限额器绝不签出超过上限的凭证,重启后接着处理订单,钥匙与订单记录加密保存。边界如实说:托管合约未经审计、未部署,所以今天在主网上不可用;只在本地链与测试中可以验证;
@tapeapi/sdk/agent不受兼容承诺约束。
阶段 0(1.7)只记录谁可以替哪个容器做哪件任务,什么都不强制执行。有界代理是阶段 1:代理可以替容器花钱,而容器最多会亏多少,由托管合约算死、可以在链上核对。电路持有人为代理可以付费的每个服务各充值一条托管通道,并把一把只为这份授权书生成的钥匙授权为这些通道上的会话钥匙,有效期到授权书到期为止。代理的钥匙泄露或代理作恶,损失最多是放进这些通道的钱,而且只能付给授权书点名的服务。
- 核验。
verifyMandate与verifyTaskThread加{ enforcement: 'escrow-channel' }时,在同一个钉块上读取每条有上限的通道,全部读数通过才报告“已强制执行”;链上真正限住的始终是通道余额(bound: 'channel')。 - 持有人的计划。
holderPlan从链上读取事实,给出未签名的approve、fund、authorizeSession交易,从持有人钱包或经容器发出;afterPlan读回核对,closeOut取回剩余的钱。会话历史防止同一份计划跑两次、给同一把钥匙充两次值。 - 代理自己的限额。
createSpendLimiter绝不签出累计超过“开始时通道的claimedOf加上限”的凭证;默认拒绝单次超过上限 10% 的调用。 - **重启。**配一个钥匙保险箱(
passphraseKeyVault:scrypt 与 XChaCha20-Poly1305),代理的会话钥匙,以及examples/agent-service里的订单记录,都加密保存;resume在重启后接着处理订单,已停止、已撤销或已过期的订单绝不恢复。 - **交付里的钱。**交付可以附上代理签名的花费声明,与链上读数和回执逐项对账。
**边界。**它依赖的托管合约(TAPI-22,contracts/src/TapeAPIEscrow.sol)未经审计、未在任何链上部署,SDK 的已审计托管列表是空的,所以在主网上都不可用。它在 SDK 的假链上验证(node --test examples/agent-service/agent-service-spend.test.mjs),交易与凭证另在本地的托管合约副本上验证(cd contracts && forge test --match-path 'test/Phase1*')。它是实验性的,不受兼容承诺约束。阶段 1 的 TAP 草稿已提交为 TapeOutProtocol/TAPs#60(已提交,目前转为 draft PR),它依赖的托管接口已提交为 #59(评审中)。
2.0 里另外两项实验性功能、更早的功能,以及 2.0 承诺过什么
2.0 里另外两项实验性功能
- 容器代理(实验性)。阶段 0(1.7):持有人签名的授权书、从报价到验收的任务线程、只读的付款核验,不需要新合约,不做强制执行。有界代理(2.0):写了金额的授权书由托管通道强制执行,只在本地链与测试中可用。容器代理 · 有界代理
- 美元报价、BEM 结算(TAPI-22 §3.6;TAP 草稿 #52,已提交,评审中)。清单可以用美元给方法定价;服务方在签名的报价里给出 BEM 汇率,客户端签凭证之前对照链上的参考池核对,每个收费的回答都附一张签名的收费记录。方法的
priceBEM仍是单次调用最多花多少。没有usdPricing的清单,回答与付款逐字节照旧。托管合约没有部署,所以不收任何费用。 - 容器之间的评价(
@tapeapi/sdk/review;TAP 草稿 #54,已提交,评审中)。评价由评价方的持有人或其委托的密钥签名,有证据才计入:评价方收到过的签名回答,或两个容器之间的任务线程。汇总只数不同的评价方与持有人,从不按金额加权。tapeapi-verify review <名字>可以把它们打印出来。 - **更早的功能,留作记录。**按 TapeOut 官方 TAP 解析(1.4 起以可选的
conform: 'tap10'提供,2.0 起为默认);MCP 工具与私密通道、群聊(1.0 起稳定);流式 AI 回执,用量也能核验(1.5 至 1.6):被截断或被追加内容的流,回执核验不通过;可选的requestUsage把流式 OpenAI Chat 回答的用量放进签名的流里,像整段回答一样核对(它不证明上游自己的计数),见流式 Chat 的用量:三条路。指南:MCP · 私密通道 · 群聊。
2.0 当时的承诺,照原样记录:
- 2.0 承诺过什么(历史): 按 2.0 文档写的代码,在所有 2.x 版本里都能继续工作;除了标注
@experimental或@internal的, 其余全部是稳定的;其中包括data.status、SiteStatus与svc.conform,它们跟随的是 Draft:TAP-10 与 TAP-11 还是 Draft,默认按一条规则 跟随它们的文本,放宽与新增状态名在 2.x 次版本里生效,收紧先作为可选 profile、默认到 3.0 才切。conform: false与labels: 'v1'已弃用, 整个 2.x 保留。从 1.x 升级:升级到 2.0。
隐私,如实说
- **受保护的:**通道和群聊的内容(端到端加密);AI 回执只带哈希,经 SDK 或
tapeapi-verify发出的请求还会追加 128 位随机空白,短提示词没法靠猜哈希对上;MCP 核验链接默认只带哈希;SDK 的busPrivacyReader(实验性)读取整个 ChannelBus 后在本地筛选,节点看不出你的房间。 - **藏不住的:**服务方看得到它处理的一切(你的请求、IP 和 API 密钥);公共 RPC 节点看得到你的 IP 和你在核验哪个服务;中继和链看得到通道的房间、时间和大小;链上的一切都是公开的,将来的付款也一样。2.0 默认仍不开
allChains,因为一开就会把你的查询发给其它链的公共节点。因此"处理器合约#ID"字符串默认被拒绝(TAP-11 §2.1 的已知例外,见升级到 2.0)。
费用
无强制协议费;默认 1% 维护贡献,任何服务方都可以关闭;运营方没有费率开关。这 1% 只在付费通道结算时从服务方所得中扣,用户的价格不变。服务方也可以设得更高,但不超过合约上限 20%。付费托管合约尚未部署,所以今天所有调用都不收费。AI 服务方照旧在链下向用户收费;清单里的价格是公开的声明,不经过结算。送审的托管合约计划首先托管 BEM,USDT 锚定币与 WBNB 按需(TAPI-22 §3.5)。详见 docs/FEES.md。
仓库
sdk/ @tapeapi/sdk(解析、调用、验签、AI 回执、通道、群聊、MCP、容器代理、评价)· server/ @tapeapi/server(服务端、AI 旁路、MCP 代理)· contracts/(ChannelBus,以及实验性的托管合约和服务目录)· spec/(各规范、测试向量、Python 验证器)· examples/ · conformance/ · site/(网站)· docs/。合约地址见入门。
安全问题请按 SECURITY.md 私下报告。欢迎提 issue 和 pull request,见 CONTRIBUTING.md 与行为准则。
许可证
代码采用 MIT(LICENSE):contracts/、sdk/、server/、examples/、conformance/、scripts/、site/。spec/ 里的规范采用 CC0-1.0(LICENSE-SPEC)。
致谢
为 TapeOut 做一个服务层的想法,也就是“DeWEB 是网站,TapeSend 是消息,TapeAPI 是服务”,来自 @Theairresearch。TapeAPI 的收入自 2026-10-05 起,按季度扣除第三方现金成本后,余额的 10% 永久归他们(口径见 BUSINESS.md)。
No installation packages available.