Skip to content

Documentation / Guides / Live updates

Apply atomic live updates

CallUpdate changes future call configuration without rewriting committed history. Every named field commits together or none does.

Change one thing

To change only the voice:

receipt = await active.update(
    CallUpdate(
        expected_revision=active.revision,
        reason="caller selected a different approved voice",
        boundary=UpdateBoundary.AFTER_CURRENT_REPLY,
        speech_generation=replacement_generation_profile,
    )
)

Prompt, language, reasoning, STT, tools, history, and business state remain unchanged. Fields default to the public UNCHANGED sentinel.

Choose the handoff boundary

Boundary Effect
AFTER_CURRENT_REPLY preserve the reply already being delivered
INTERRUPT_NOW stop current reasoning/speech before commit

INTERRUPT_NOW also requires InterruptedReplyHandling:

  • REGENERATE_LATEST_TURN: run the latest participant turn under the new configuration;
  • WAIT_FOR_NEXT_TURN: do not regenerate.

Already-heard speech remains interrupted transcript evidence.

Revisions prevent races

Prepare every update against the revision you observed. The first competing commit advances the revision; stale work is rejected rather than merged. Re-read the active revision and reconsider the whole business decision before submitting a new update.

Capability and failure behavior

Adapters declare update capabilities. Required capabilities can be checked at preflight. An optional unsupported request raises UnsupportedUpdate, names the unsupported fields, and leaves the active revision unchanged.

A supported update may still fail during bounded preparation. That attempt does not partially commit and does not extend the switching deadline. A failure in new conversation work after a successful commit is a post-update failure—not an automatic rollback to the old model.

Tool changes

Adding a tool requires its definition, schemas, handler, context, and compatibility to be ready before commit. Removing one blocks only future admission; earlier calls/results remain immutable. Running side effects are not magically undone.

Next: multilingual switching or configuration reference.