Skip to content

A durable journal underneath your ADK agent

Crash-survival, exactly-once-effective tool calls, and an explicit UNKNOWN outcome — without changing one line of your ADK agent code.


Wire it in fifteen lines

import tape
from tape.adk import durable_app

app, runner = durable_app(
    name="treasury",
    agent=root_agent,                                # your ADK LlmAgent
    budget=tape.Budget(usd_cap=50, token_cap=2_000_000),
)
import (
    "context"
    tape "github.com/vamsiramakrishnan/durable-agents/tape/sdk/go"
)

d, _ := tape.NewDurableApp(ctx, tape.DurableConfig{
    Name:   "treasury",
    Budget: tape.Budget{USDCap: 50, TokenCap: 2_000_000},
})
defer d.Close()
import { durableApp } from 'tape-ts';

const app = durableApp({
  name: 'treasury',
  budget: { usdCap: 50, tokenCap: 2_000_000 },
});
import dev.tape.DurableApp;

try (DurableApp app = DurableApp.wire(new DurableApp.Config()
        .name("treasury")
        .budget(new DurableApp.Budget(50.0, 2_000_000)))) {
    // app.client() is the journalled gRPC client
}

Tool bodies stay plain. Mark a tool with @tape.outbox_tool(...) and the outbox reactor owns the dispatch — non-idempotent upstreams stop being a footgun. → ADK on Tape


What you get

  • Crash-survival


    Every decision and effect is journaled. A crashed run reconstructs and continues. Confirmed effects are not re-executed — once is the contract.

    Replay & resume

  • Non-idempotent safety


    Outbox + reconciliation makes UNKNOWN a first-class outcome. Blind retry on a wire transfer is structurally impossible.

    Non-idempotent upstreams

  • Production on GCP


    Cloud Run · GKE Autopilot · AlloyDB · Bigtable · Spanner · Pub/Sub · Secret Manager · OTel. One Typer CLI composes the whole topology.

    Deploy on Cloud Run

  • Four SDKs, one wire


    Python, Go, TypeScript, Java — identical surface, language-idiomatic shape. The CLI stays Python; your agent process can be any of the four.

    SDK reference

  • Sharp primitives


    Reactive KV with watch streams. Durable gates. Budgets as run state. Compensation registries. A reactor event bus.

    Concepts

  • Visible IaC


    Terraform/OpenTofu modules + a Helm chart you can read, edit, and own. No black-box managed runtime — the substrate is yours.

    Cloud Run topology


Choose your entry point


Three commands to production

pip install -e tape/sdk/python    # tape-py — SDK + ADK adapter
pip install -e tape/cli           # tape   — the standalone CLI

tape init treasury                # scaffold a new project
cd treasury && tape dev           # server + reactors + agent on sqlite

tape provision gcp --apply        # render & apply Terraform on GCP
tape deploy gcp --target cloud-run

Quickstart walks through each command with what to expect.


Honest project status

Surface Status
Python SDK + ADK adapter Reference implementation
Go / TypeScript / Java SDKs Wired client + smoke tests
Rust server SQLite / Postgres / AlloyDB
Bigtable backend Production-ready
Spanner backend Experimental — gated
Hard multi-tenancy Design-only — proto change pending
Continue-as-new, child workflows Roadmap

The roadmap and trade-offs are explicit on the parity matrix. When something doesn't exist yet, the docs say so.


Get started in 10 minutes Help & FAQ