v0.54.0

cheaper-inference/OmniRoutev0.54.0Sep 27, 2026by github-actions[bot]

Upgrading?

AI Summary

This release introduces comprehensive call timeline events with an `offset_ms` axis to map audio waveforms, bot turns, and barge-ins. It updates server SDKs with new types like `PlayoutStarted` and `PlayoutStopped`, along with improved recording anchoring.

Key Highlights

  • Added `offset_ms` to moment-marking events such as `mark`, `barge_in_resolved`, `hold`, `recording_started`, and `stop`.
  • `recording_started.offset_ms` anchors WAV files to the timeline for precise synchronization.
  • New `speech_started.bot_playing: true` flag indicates when a caller starts speaking over the bot.
  • Added `playout_started` and `playout_stopped` events with `duration_ms` and `reason` counters.
  • Schema regeneration for server SDKs to support the new timeline fields.

New Features

  • Call timeline events for LiveKit-style visualization
  • Playout event tracking with reasons (completed, barge_in, muted, etc.)
  • Recording anchoring to timeline axis
  • Bot speech detection during barge-in modes

Full Release Notes

### Added

- **Call timeline events** (PROTOCOL.md §3.15, `docs/design/DESIGN_CALL_TIMELINE.md`).
  Everything a server needs to draw a LiveKit-style call timeline — a waveform with caller
  speech, bot turns and barge-ins mapped along it — now arrives on one `offset_ms` axis.
  All additive within protocol v1.
  - **`offset_ms` on every moment-marking event** that lacked it: `mark` (the estimated
    playout completion it fired at), `barge_in_resolved`, `hold`/`resume`,
    `held`/`resumed`, `recording_started`/`recording_stopped`/`recording_failed`, and
    `stop`. Each is stamped where the moment happens, not when the event is sent.
  - **`recording_started.offset_ms` anchors the WAV**: it is the timeline position of the
    file's first sample, so `timeline_ms = recording_started.offset_ms + sample * 1000 / rate`
    places the recording under every other event.
  - **`speech_started.bot_playing: true`** when the caller started speaking over the bot,
    in every barge-in mode. Absent otherwise.
  - **`playout_started` / `playout_stopped`** bot-turn events, opt-in via
    `[bridge].playout_events` (per-route override). A stop carries `duration_ms` and a
    `reason`: `completed`, `barge_in`, `cleared`, `muted`, `held` or `parked`. New counter
    `siphon_ai_playout_turns_total{reason}`.
  - Schema regenerated; both server SDKs gain the fields and the `PlayoutStarted` /
    `PlayoutStopped` types; the example echo servers log the bot turns.

---

**Artifacts**

- Static musl binaries for `x86_64` and `aarch64` (`.tar.gz`).
- Debian packages (`.deb`) for `amd64` and `arm64` — `apt install ./siphon-ai_*_amd64.deb`.
- `SHA256SUMS` — verify with `sha256sum -c SHA256SUMS`.
- `*-sbom.cdx.json` — CycloneDX SBOM.
- `SHA256SUMS.cosign.bundle` — cosign keyless signature over the checksums.
- Container: `ghcr.io/thevoiceguy/siphon-ai:v0.54.0` (multi-arch, cosign-signed).

Verify the checksums signature:
```
cosign verify-blob --bundle SHA256SUMS.cosign.bundle \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com \
  --certificate-identity-regexp 'release.yml@' SHA256SUMS
```

Related Repositories