Reference
Breaking changes
The 0.32.0 identifier change and the intentional 0.30.0 hard cut.
0.32.0 changes every resource ID
Resource IDs are canonical UUIDs. The turn_, conv_, agent_, and mspc_
prefixes are gone, and so is the validation that required them.
before turn_01h455vb4pex5vsknk084sn02q
after 01890a5d-ac96-774b-bcce-b302099a8057- Upgrade every client and the CLI to 0.32.0 together. The 0.31 clients validated the prefixed form and raise on every ID this API now returns.
- Store IDs in a column wide enough for 36 characters, and re-fetch any ID you persisted before the change — the old values name nothing.
- Drop
default_tenantfrom calls to/v1/credits,/v1/credits/allocations, and/v1/turns, and send a realtenant_key.tenant_keyis no longer nullable in any response. - Set
max_iterationson any Turn that needs a cap. There is no longer a service default, only a runaway ceiling.
IDs are opaque, and now stay that way
nvoken mints UUIDv7, but the contract declares no pattern for a record ID and
the API asserts nothing about the shape of one you supply. A tool_call_id
your application chooses is stored, compared, and returned as written.
This is deliberate. 0.31 briefly compiled an ID pattern into every generated client, which is what made 0.32 a breaking change for all of them at once. Nothing constrains record ID shape now, so a future change to what nvoken mints will not break a client that treats IDs as opaque strings. Trace and span IDs are the exception and keep their W3C formats.
0.30.0 is a clean contract boundary
There is no compatibility mode, alias resource, translation layer, or data backfill for the pre-0.30 runtime model. Upgrade the service and every SDK/CLI consumer together, start from the new schema epoch, and recreate development data through the current APIs.
Update application code
- Create one owner-namespaced Agent instead of a template plus customer instance. Publish immutable revisions to change stored behavior.
- Start a Turn with
agent.start,agent.run, oragent.text. Useclient.inlinefor one-off behavior. - State
tenantand optional actoruseron every machine Turn. They are not inferred from resource ownership. - Add a Conversation only when ordered transcript continuity is needed.
- Select a MemorySpace independently with user scope or an explicit tenant
namespace; use
nonewhen memory is disabled. - Persist Turn IDs and stable idempotency keys. Reconstruct work with
client.turn(id, { tenant, user })after uncertain admission or disconnect. - Replace CLI scripts with the
agent,turn,conversation, andmemory-spacecommand groups.
Do not recreate the removed coupling
An Agent does not own a Conversation or MemorySpace. A Conversation does not select an Agent or actor. An actor user does not silently select memory. A tenant MemorySpace namespace is a host sharing decision, not evidence of group membership.
The current quickstart and TypeScript SDK guide show the supported 0.32 client surface. The resource model is still the 0.30 contract; 0.32 changes what an identifier looks like, not what the resources are.