Compatibility

Source: COMPATIBILITY.md at 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 testedtapedeckStatusNotes
6.0.02026-06-100.3.0✅ passMulti-interaction named cassettes (v2 format); v1 cassettes replay as-is.
6.0.02026-06-100.2.0✅ passSame spec surface as the launch row. Hash digests and cassette format unchanged.
6.0.02026-06-100.1.0✅ passLaunch 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:

  1. pnpm typecheck succeeds against the SDK version.
  2. pnpm test is green (the suite uses MockLanguageModelV3 — no live API calls).
  3. A round-trip holds: a cassette recorded under record replays byte-identical stream parts under replay, 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.

A major ai bump is a format boundary
Bumping the SDK major requires a tapedeck major — the model-spec v3 request/response shape is what cassettes are serialized against. The cassette 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.