Migration guide

Converse to Dialt

Use the Dialt names for all new integrations. The alpha cleanup removes deprecated SDK names and experimental controls. Update integrations before upgrading.

Name mapping

LegacyCanonical Dialt nameCompatibility
ck_...dk_... for newly issued keysExisting keys remain valid.
CONVERSE_API_KEYDIALT_API_KEYEnvironment fallback remains temporary.
@trelis/converse@dialt/sdk 0.41.0Install the Dialt package for updates.
ConverseClientDialtClientRemoved.
mode.kind: 'converse'mode.kind: 'dialt'Rejected.
converse-sdkdialt-sdk 0.33.0The final bridge remains installable.
converse_sdkdialtLegacy imports emit a deprecation warning.
ConverseError, ConverseMode, ConverseSessionDialtError, DialtMode, DialtSessionRemoved.
https://converse.trelis.comhttps://dialt.comHTTP redirects permanently with method preservation.
wss://converse.trelis.com/wswss://api.dialt.com/v1/realtimeRemoved. Connect to the canonical URL.
wss://dialt.com/wswss://api.dialt.com/v1/realtimeRemoved. Connect to the canonical URL.

Alpha API cleanup

Remove flow, raw-assist research controls, vendor relay configuration and ambience. Only mode.kind: 'dialt' is supported. Use brain: 'smart' instead of 'genius', dialt-smart instead of the retired eval target dialt-genius, and recorded_bridge instead of wait_for_tool. The later expected_duration field remains a deprecated compatibility alias. Use DialtMode instead of SessionMode. Python mode configuration is keyword-only.

Reset now ends the old conversation and opens a new logical session with a fresh UUID. Browser await client.reset() retains capture and selected configuration. Python returns a new object: session = await session.reset(). Direct protocol clients close and reconnect without a resume token; there is no reset frame. Application-owned tasks remain the application's responsibility.

Instructions are required

From Browser SDK 0.49.0 and Python SDK 0.41.0, every session sets mode.instructions. The platform prompt no longer says "You are a voice assistant on a phone call" or tells the agent to ask a clarifying question; the agent's role comes only from your instructions. A fresh start without non-empty instructions fails with the nonretryable error code missing_instructions and closes with 1008, and both SDKs refuse such a mode before connecting. To keep the previous behaviour, pass You are a helpful voice assistant on a phone call. If a request is missing a key detail, ask one concise clarifying question. Eval case targets and simulators also need instructions. See assistant instructions.

Browser

npm remove @trelis/converse
npm install @dialt/sdk

import { DialtClient } from '@dialt/sdk';

const client = new DialtClient({
  url: 'wss://api.dialt.com/v1/realtime',
  mode: {
    kind: 'dialt',
    instructions: 'You are a helpful voice assistant on a phone call. If a request is missing a key detail, ask one concise clarifying question.',
  },
});

Use the canonical Browser SDK guide for new integrations. It covers secure scoped credentials, SDK and AudioWorklet loading, microphone lifecycle, and input selection.

Python

uv remove converse-sdk
uv add dialt-sdk

from dialt import DialtMode, DialtSession

Credentials and endpoints

DIALT_API_KEY=dk_your_key

Mint browser credentials with POST https://api.dialt.com/v1/session-keys. Do not rely on an HTTP redirect for credential creation. Keep persistent keys out of browser JavaScript.

Versioned public API

Machine requests use https://api.dialt.com. Browser SDK 0.41.0 and Python SDK 0.33.0 are the oldest releases that default to the canonical API; pass the base URL shown here to use another deployment. The legacy machine routes below are removed; upgrade older SDKs.

  • POST /api/v1/session-keys is removed; use POST /v1/session-keys.
  • /api/app/evals/... is removed; use /v1/evals/.... Collections use {results, next, has_more} with an optional opaque signed cursor and optional limit from 1 through 100 (default 50). Follow next verbatim; there is no page, count or previous field. Cases, suites and runs are ordered by descending created_at, then UUID. Malformed or mismatched cursors return structured 400 errors.
  • DELETE /v1/evals/runs/{uuid} deletes a finished run and its results. Active runs return 409; cancel and wait first. Python clients can use evals.delete_run(run_id). Creation retry keys remain reserved after deletion, so replay returns 409.
  • /api/app/sessions lists recording rows. The new /v1/sessions lists logical calls; read a call's segments at /v1/sessions/{uuid}/segments.

The ID copied from a current recording on the Sessions dashboard is its logical session UUID, accepted by GET /v1/sessions/{uuid}. Historical recordings without a known parent have no copyable public session ID; their trace URLs still use segment UUIDs.

A session keeps its server UUID across successful reconnects and transfers. Each recording-row UUID identifies one segment, which can contain many turns. Client session_id is a correlation value, not unique call identity. Historical recordings without logical session identity remain available in the dashboard; the API does not guess their membership.

App routes under /api/app accept only the signed-in dashboard session, never an API key. Keep browser login, account and dashboard requests on dialt.com; persistent API keys belong on your backend and the API origin.

Compatibility policy

The warning-bearing releases provide a migration window. Dialt will announce a specific removal version before deleting legacy aliases. Existing persistent keys are not invalidated by the SDK migration.