Skip to content

durable_app

The wiring entrypoint — pass an ADK agent, get back a configured (App, Runner) pair.

import tape
from tape.adk import durable_app

app, runner = durable_app(
    name="treasury",
    agent=root_agent,
    budget=tape.Budget(usd_cap=50, token_cap=2_000_000),
)

tape.adk.durable.durable_app

durable_app(*, name: str, agent: Any, tape_url: Optional[str] = None, budget: Optional[Any] = None, resumable: bool = True, check_cancellation: bool = True, app_kwargs: Optional[dict] = None, runner_kwargs: Optional[dict] = None) -> Tuple[Any, Any]

Return (App, Runner) for an ADK agent backed by Tape.

The agent's tool bodies stay plain. Pass @tape.effect(...) decorators on tools whose UNKNOWN you want resolved or whose forward action needs an inverse; pass @tape.outbox_tool(...) for non-idempotent upstreams that must be journaled-first, dispatched-by-reactor.


  • The (App, Runner) pair is what runner.run_async(...) consumes; see ADK's Runner docs for the call shape.
  • For non-idempotent tools, prefer @tape.outbox_tool.