Compatibility
Source:
COMPATIBILITY.mdat the repo root.
tapedeck operates at the Vercel AI SDK's wrapLanguageModel middleware
layer (language-model spec v3). The structural ceiling on the
project's lifetime is that spec's request/response shape — so this file
is the public, dated record of what tapedeck is tested against.
Tested versions
SDK (ai) | Date tested | tapedeck | Status | Notes |
|---|---|---|---|---|
| 6.0.0 | 2026-06-10 | 0.3.0 | ✅ pass | Multi-interaction named cassettes (v2 format); v1 cassettes replay as-is. |
| 6.0.0 | 2026-06-10 | 0.2.0 | ✅ pass | Same spec surface as the launch row. Hash digests and cassette format unchanged. |
| 6.0.0 | 2026-06-10 | 0.1.0 | ✅ pass | Launch row. Model spec v3: doGenerate returns content[]; doStream yields text-delta / tool-call parts. |
Edge runtimes (Cloudflare Workers, etc.)
As of 0.2.0 the core import graph is edge-safe: hashing uses WebCrypto, the
default filesystem store imports node:fs lazily (pass memoryCassetteStore() or a KV/R2-backed store and it never loads), and the
one static Node builtin left is node:async_hooks — provided by Cloudflare
Workers under the nodejs_compat flag.
A deployed-Worker smoke test is still TODO — treat Workers support as designed-for, not yet CI-verified. The CLI is Node-only by design.
Pinned peer range
{ "peerDependencies": { "ai": ">=6.0.0 <7" } } Bumping the SDK major requires a tapedeck major. The cassette version field (tapedeck@<pkg>) and the recorded modelProvider / modelId make a format boundary loud at replay time.
What "pass" means
A row is ✅ pass when:
pnpm typechecksucceeds against the SDK version.pnpm testis green (the suite usesMockLanguageModelV3— no live API calls).- A round-trip holds: a cassette recorded under
recordreplays byte-identical stream parts underreplay, and a changed prompt or tool schema misses.
A row is ⚠️ partial when the suite passes but a known shape change
required a documented workaround (linked in Notes).
A row is ❌ fail when the suite breaks against a new SDK version.
version field (tapedeck@<pkg>)
together with the recorded modelProvider / modelId makes that boundary loud at replay time: a
cassette written under an incompatible version fails rather than
replaying silently.