Skip to content

Tipuri de evenimente ​

Evenimentele tipizate pe care le emite un apel și ce poartă fiecare. Acesta este vocabularul intern de apel, folosit în două locuri: stream-ul de evenimente al apelului (GET /calls/{call}/events) și subiectele NATS pe care și le schimbă cele două plane. Definit ca CallEventType în @callagent/contracts și oglindit în App\Enums\CallEventType, cu un test care citește sursa PHP și eșuează la divergență.

Astea nu sunt nume de evenimente de webhook

Webhook-urile de ieșire folosesc un vocabular separat, versionat deliberat, de 28 de nume, iar cele două se suprapun destul cât să te încurce:

Aici (evenimente de apel)Acolo (webhooks)
call.createdcall.started
call.connectedcall.answered
tool.startedtool.called
user.speech.startedspeech.started

Abonează un endpoint de webhook la un nume din pagina asta și este respins ca necunoscut.

Fiecare eveniment are același envelope; doar data diferă, și doar el este descris mai jos.

Ciclu de viață ​

Evenimentdata
call.createddirection, from, to, phoneNumberId, assistantId, squadId, campaignId, telephonyProvider, idempotencyKey
call.ringingringingAt, destination
call.connectedansweredAt, setupMs, sipCallId
call.endedendedReason, durationMs, billableSeconds, endedBy (customer · assistant · operator · system · provider)
call.failedendedReason, error
call.state.changedfrom, to, reason
transport.connectedtransport, remoteAddress, connectMs, codec, sampleRate
transport.disconnectedcode, reason

Vorbire în stt ​

Evenimentdata
user.speech.startedenergyDb, duringAssistantSpeech
user.speech.endedspeechMs, silenceMs
transcript.partialtext, isFinal: false, confidence, speaker, language, words[]
transcript.finalca mai sus, cu isFinal: true
endpoint.detectedstrategy (provider · vad_timeout · punctuation · semantic · hybrid), silenceMs, minSpeechMs, maxWaitMs, confidence, transcript

words[] poartă startMs, endMs, confidence și speaker pentru fiecare cuvânt, atunci când transcriber-ul le furnizează.

Model llm ​

Evenimentdata
llm.startedprovider, model, temperature, maxTokens, messageCount
llm.first_tokenca mai sus, plus ttftMs
llm.completedplus tokens (prompt, completion, total, cachedPrompt, reasoning), durationMs, finishReason, toolCallCount, fallbackIndex
llm.failederror (code, message, statusCode, retryable)
llm.abortedabortReason: barge_in · timeout · handoff · call_ended · operator

finishReason este stop, length, tool_calls, content_filter, aborted sau error.

Sinteză tts ​

Evenimentdata
tts.startedvoice (provider, voiceId, model), text, chunkIndex
tts.first_audioplus ttfaMs
tts.completedplus characters, durationMs, audioMs, fallbackIndex
tts.failederror
tts.abortedabortReason

Redare playback ​

Evenimentdata
assistant.speech.startedtext, messageId
assistant.speech.interruptedspokenText, remainingText, spokenMs, detectionMs, stopAudioMs
assistant.speech.completedtext, audioMs, messageId

spokenText față de remainingText este perechea care contează: transcrierea păstrează doar ce a auzit efectiv apelantul.

Speech to speech ​

s2s.started · s2s.first_audio (ttfaMs) · s2s.completed (durationMs, inputAudioMs, outputAudioMs, tokens) · s2s.failed.

Tool-uri tool ​

Evenimentdata
tool.startedtoolId, toolCallId, name, toolType, args
tool.completedplus result, durationMs, async
tool.failedplus error
tool.rejectedplus rejectionReason, rejectionMessage

rejectionReason este unul dintre cele unsprezece de pe codurile de eroare.

MCP ​

mcp.started · mcp.completed · mcp.failed, fiecare purtând serverId, serverName, transport (streamable_http · sse · stdio), toolName, args, iar la finalizare result și durationMs.

Cunoștințe ​

Evenimentdata
knowledge.queriedknowledgeBaseId, query, provider, matchCount, topScore, durationMs, documentIds
knowledge.insufficientknowledgeBaseId, query, threshold, topScore, safetyMode

knowledge.insufficient este semnalul de răspuns onest: căutarea a venit înapoi sub prag, iar asistentul a spus asta în loc să inventeze un răspuns. Vezi modul knowledge-only.

Rutare ​

Evenimentdata
handoff.startedfromAssistantId, toAssistantId, squadId, trigger (tool · intent · variable · dynamic · explicit · silent), contextMode, reason
handoff.completedtoAssistantId, durationMs, messagesCarried
transfer.startedmode (blind · warm · queue · sip_uri · assistant · dynamic), destination, destinationType
transfer.completedplus legId, durationMs
transfer.failedplus error

Contact centre ​

operator.queued · operator.ringing · operator.connected · operator.rejected · operator.missed · operator.wrap_up · queue.abandoned · queue.overflowed.

Toate poartă operatorId, operatorName, queueId, queueName, extension, waitMs, ringMs, position și reason acolo unde se aplică. operator.wrap_up adaugă dispositionId, disposition, notes și wrapUpMs; queue.abandoned adaugă abandonedAfterMs; queue.overflowed adaugă overflowTo și overflowType (queue · ring_group · voicemail · assistant · number).

DTMF, SIP și voicemail ​

Evenimentdata
dtmf.receiveddigits, method (rfc2833 · rfc4733 · sip_info · inband · provider), buffer
dtmf.sentdigits, method, interDigitMs
sip.request.sentmethod (INFO · MESSAGE · NOTIFY · REFER · OPTIONS · UPDATE), destination, headers, body
sip.response.receivedstatusCode, reason, method, headers
voicemail.detecteddetector (provider_amd · classifier · beep · tool), confidence, beepDetected, policy (hangup · leave_message · continue · custom), detectionMs

Artefacte ​

Evenimentdata
recording.consent_announcedmode, spokenText, audioUrl, region
recording.consent_recordedplus acknowledged
recording.startedrecordingId, channels (mono · stereo · dual), track (mixed · caller · assistant · operator), format
recording.pausedplus reason
recording.resumedca la recording.started
recording.readyplus url, storagePath, bytes, durationMs
analysis.completedsummary, sentiment, success, successReason, topics, structuredOutputs, scorecardIds, durationMs

analysis.completed

Tipul de eveniment și payload-ul lui sunt definite, iar control plane-ul stochează rezultatele dacă ajung. Pipeline-ul de analiză post-apel care le-ar produce nu este în prezent pornit de control plane — vezi Stadiul implementării și Analytics și costuri.

Sănătatea providerilor ​

Evenimentdata
provider.fallbackcomponent, from, to, reason (timeout · error · rate_limit · auth · circuit_open · health_check), attempt
provider.errorcomponent, provider, model, error, circuitOpened

component este model, transcriber, voice, speech_to_speech, telephony, iar pentru provider.error și storage și observability.

Cum le categorisești ​

Prefixul de dinaintea primului punct este categoria, și așa un consumator se poate abona larg fără să enumere 60 de nume:

ts
const category = (type: string) => type.split('.')[0];
// 'endpoint.detected' → 'endpoint'

const isError = (type: string) =>
  type.includes('failed') || type.includes('error') || type === 'tool.rejected';

Ambele funcții ajutătoare se livrează ca eventCategory() și isErrorEvent() în @callagent/contracts.

Scrisă după cod. Ce nu este încă implementat este marcat ca atare, niciodată descris ca funcțional.