Audin Docs
Operator SDK

API reference

Configurazione, metodi, eventi e tipi di @audin.ai/operator-sdk — versione 0.6.0, wire protocol v1.

Versione Markdown di questa pagina

Scarica o copia il contenuto di questa pagina in formato .md — utile per fornirlo a un agente AI che integra questa specifica feature.

Scarica .md

Reference completa della superficie pubblica di @audin.ai/operator-sdk.

Questa pagina copre @audin.ai/operator-sdk 0.6.0, che parla con il servizio operatori Audin tramite il wire protocol v1. Un cambio incompatibile al protocollo comporta un bump MAJOR. Consulta il CHANGELOG prima di aggiornare attraverso una MAJOR.

new AudinOperator(config)

Crea un'istanza dell'SDK. L'unico parametro è l'oggetto di configurazione AudinOperatorConfig.

OpzioneTipoDefaultNote
coreUrlstringURL base del servizio operatori Audin. Uno schema http(s) viene convertito internamente nel corrispondente ws(s); gli slash finali sono tollerati.
getToken() => Promise<{ token: string; expiresAt?: string }>Recupera un token di sessione fresco dal tuo backend. Chiamata alla connessione e a ogni riconnessione: restituisci sempre un token nuovo, mai uno scaduto in cache.
heartbeatIntervalMsnumber25000Intervallo (ms) dei keep-alive del canale di presenza. Il server scarta le connessioni inattive da ~90s, quindi tienilo ben sotto.
reconnectBackoffMsnumber[][1000, 2000, 5000, 10000, 30000]Schedulazione del backoff (ms) per la riconnessione della presenza. L'SDK percorre l'array sui fallimenti consecutivi e resta sull'ultimo valore.
audioConstraintsMediaTrackConstraintsecho cancel + noise suppress + AGCVincoli passati a getUserMedia({ audio }) per la cattura del microfono.
loggerOperatorLoggerconsoleSink per la diagnostica dell'SDK.

Metodi

MetodoFirmaDescrizione
listPhoneNumbers(): Promise<OperatorPhoneNumber[]>Elenca i numeri dell'account ({ id, phoneNumber, displayName }), recuperati con lo stesso token di sessione dei WebSocket. Su 401 persistente lancia OperatorRequestError con code: "UNAUTHORIZED"; altri fallimenti lanciano con code: "REQUEST_FAILED".
goOnline(phoneNumberIds: string[]): Promise<void>Connette il canale di presenza e annuncia la disponibilità sui numeri indicati (per id). Richiamabile per cambiare l'insieme di numeri.
goOffline(): Promise<void>Annulla la disponibilità, termina l'eventuale chiamata attiva e chiude il canale di presenza (interrompe la riconnessione automatica).
dial(to: string, opts: DialOptions): Promise<OperatorCall>Avvia una chiamata in uscita. Si risolve quando la piattaforma accetta e il bridge audio si apre.
setAudioConstraints(constraints: MediaTrackConstraints): voidAggiorna i vincoli del microfono (es. cambio device). Hanno effetto dalla prossima apertura del canale audio.
get statePresenceStateStato corrente del canale di presenza.
get currentCallOperatorCall | nullLa chiamata attualmente in corso, se presente.
on(event, listener): () => voidSottoscrive un evento; restituisce una funzione di unsubscribe.
off(event, listener): voidRimuove un listener.
once(event, listener): voidSottoscrive un evento una sola volta.

Eventi

Sottoscrivibili con op.on(name, cb). Le firme sono tipate (AudinOperatorEventMap).

EventoPayloadQuando
presenceStateChangedPresenceStateLo stato del canale di presenza cambia.
availabilityChanged{ accepted: string[]; rejected: string[] }Il server conferma su quali numeri sei andato online.
incomingCallOperatorCallUna chiamata in entrata sta squillando (state: "ringing").
callStartedOperatorCallL'audio è stabilito (dopo accept / dial).
callAnsweredOperatorCallIl chiamato ha risposto (la conversazione è iniziata). Sulle chiamate in uscita callStarted indica solo che il leg audio è aperto — il destinatario può ancora stare squillando: usa callAnswered per far partire i timer. Sulle inbound segue immediatamente callStarted.
callEndedOperatorCallUna chiamata è terminata (ispeziona endReason).
errorOperatorErrorUn errore non fatale; l'SDK continua a funzionare dove può.

OperatorCall

Handle a una singola chiamata, ottenuto dagli eventi incomingCall / callStarted o restituito da dial.

interface OperatorCall {
  readonly callSid: string;
  readonly direction: "inbound" | "outbound";
  readonly from?: string;          // numero controparte (E.164), quando noto
  readonly to?: string;            // numero locale/chiamato (E.164), quando noto
  readonly state: "ringing" | "connecting" | "active" | "ended";
  readonly endReason?: CallEndReason; // valorizzato quando state === "ended"
  readonly answered: boolean;      // true da quando il chiamato ha risposto
  readonly answeredAt?: Date;      // istante della risposta (vedi callAnswered)
  readonly muted: boolean;

  accept(): void;               // risponde a un'offerta in entrata (no-op se non ringing)
  reject(): void;               // rifiuta un'offerta in entrata (no-op se non ringing)
  mute(on: boolean): void;      // silenzia/riattiva il microfono dell'operatore
  sendDtmf(digit: string): void; // "0"-"9", "*", "#" — vedi nota
  hangup(): void;               // termina la chiamata
}
Proprietà / metodoTipoNote
callSidstringIdentificatore della chiamata sulla piattaforma.
directionCallDirection"inbound" o "outbound".
fromstring | undefinedNumero della controparte (E.164), quando noto.
tostring | undefinedNumero locale/chiamato (E.164), quando noto.
stateCallStateStato corrente del ciclo di vita.
endReasonCallEndReason | undefinedValorizzato una volta che state === "ended".
answeredbooleantrue da quando la conversazione è iniziata (outbound: il chiamato ha risposto; inbound: audio attivo). Distingue "squillo" da "conversazione".
answeredAtDate | undefinedIstante della risposta — utile per calcolare la durata reale della conversazione.
mutedbooleanSe il microfono è attualmente silenziato.
accept()voidRisponde a un'offerta in entrata. No-op se non in ringing.
reject()voidRifiuta un'offerta in entrata. No-op se non in ringing.
mute(on)voidSilenzia (true) o riattiva (false) il microfono.
sendDtmf(digit)voidInvia un tono DTMF — vedi nota sotto.
hangup()voidTermina la chiamata.

sendDtmf inoltra la cifra alla rete telefonica. La cifra è validata, emessa come messaggio di controllo e il server inietta il corrispondente tono DTMF in-band sulla tratta telefonica: la controparte (es. un IVR) lo sente. Durante l'iniezione del tono (~260ms per cifra, cumulativi su cifre rapide) il microfono dell'operatore verso la controparte è brevemente soppresso, così la voce non corrompe il tono. Nota: l'operatore non sente il proprio tono — il feedback locale alla pressione dei tasti è a carico della tua UI.

Tipi

OperatorPhoneNumber

interface OperatorPhoneNumber {
  id: string;                 // passa a goOnline([...])
  phoneNumber: string;        // E.164 — usa come callerId in dial
  displayName: string | null; // etichetta leggibile, quando impostata
}

CallDirection

type CallDirection = "inbound" | "outbound";

CallState

type CallState =
  | "ringing"    // offerta in entrata ricevuta, non ancora accettata
  | "connecting" // accettata / composta, bridge audio in apertura
  | "active"     // audio in transito
  | "ended";     // terminata

CallEndReason

type CallEndReason =
  | "hangup"         // l'operatore locale ha riagganciato
  | "remote_hangup"  // la controparte ha riagganciato / la piattaforma ha chiuso la chiamata
  | "taken_by_other" // un'offerta in entrata accettata da un altro operatore
  | "rejected"       // l'operatore locale ha rifiutato l'offerta in entrata
  | "no_answer"      // nessuna risposta in tempo (offerta in entrata o outbound non risposto)
  | "failed"         // un errore ha impedito di connettere la chiamata (incl. occupato)
  | "offline";       // la sessione è andata offline mentre la chiamata era attiva

PresenceState

type PresenceState = "offline" | "connecting" | "online" | "reconnecting";

DialOptions

interface DialOptions {
  // Caller ID da presentare — DEVE essere un numero del tuo account, attivo.
  callerId: string;
}

OperatorError

Payload dell'evento error (e forma di OperatorRequestError).

interface OperatorError {
  code: string;     // codice macchina stabile, es. "MIC_PERMISSION_DENIED", "WS_ERROR"
  message: string;  // descrizione leggibile
  cause?: unknown;  // errore originale / payload del server, se presente
}

I codici che incontrerai più spesso: MIC_PERMISSION_DENIED, WS_ERROR, UNAUTHORIZED, REQUEST_FAILED. La pagina Troubleshooting li approfondisce.

Vedi anche

On this page