
Installera och dokumentera @cloudflare/voice 0.4.0 tillsammans med en kompatibel Agents SDK-version. Spara ett lokalt test-id, SDK-version, turnId, source, outcome, turnTotalMs och bara de valfria tidsmått som finns. Spara inte transkript, modellsvar, ljud, leverantörssvar eller råa felmeddelanden. Godkänn loggningen först när samma prov skiljer terminala modell- och TTS-utfall från separata STT-, anslutnings- och uppspelningsfel.
Vad Cloudflare ändrade i 0.4.0
I changeloggen Inspect Voice Agent turn latency and outcomes från den 11 september 2026 beskriver Cloudflare en ny typad VoiceTurnMetrics-sammanfattning för varje tal- eller texttur. Tidigare fanns fyra aggregerade pipelinemått för lyckade, icke-tomma talade turer. De kunde visa att något tog lång tid, men inte hur en misslyckad, tom, avbruten eller textbaserad tur slutade.
Den nya sammanfattningen innehåller ett turnId för korrelation, ett terminalt utfall och varaktigheter för de steg som faktiskt nåddes. Installationsparet i changeloggen är:
npm i @cloudflare/voice@^0.4.0 agents@^0.22.0
Caret-intervallen kan ge en senare kompatibel version. Spara därför de faktiskt installerade versionerna från låsfilen i varje testkörning. Om fälten ändras efter 0.4.0 ska loggkontraktet och provets facit granskas igen, inte bara kompilatorfelet rättas.
Logga turens slut, inte samtalet
Cloudflares officiella typdefinition har fyra obligatoriska fält: turnId, source, outcome och turnTotalMs. source är speech eller text. Den fullständiga utfallsunionen i källkoden för den kontrollerade versionen har nio värden:
| Utfall | Vad det avgränsar | Nästa kontroll |
|---|---|---|
completed | Serverns tur nådde ett normalt terminalt slut. | Om användaren hör tystnad: kontrollera ljudsändning, webbläsaruppspelning och utdataenhet separat. |
no_output | Modellvägen gav ingen användbar utdata. | Kontrollera modellens typade utfall och den installerade versionens streamform. |
output_limit | Utdata nådde en gräns. | Reproducera med samma syntetiska indata och dokumenterad modellkonfiguration. |
content_filtered | Modellutfallet knyts till innehållsfiltrering. | Spara utfallet, inte texten som utlöste det, i driftloggen. |
model_error | Modellsteget slutade med fel. | Jämför om modellens första text eller streamkonsumtion hann mätas. |
tts_error | Talsyntesen slutade med fel. | Kontrollera om modelltext fanns men första serverljud saknas. |
aborted | Turen avbröts, till exempel vid nytt användartal under uppspelning. | Avgör om avbrottet var väntat i barge-in-provet. |
skipped | Pipelinen valde bort turen. | Kontrollera hookar och villkor i den egna agenten. |
error | Ett generellt terminalt fel fångades. | Korrelera med typad felkategori, inte med en rå provider-payload. |
Loggradens nyckel ska vara ett eget test-id plus turnId. Ett praktiskt test-id kan vara voice-20260912-03; det säger vilken körning raden tillhör utan att avslöja vem som talade. Lägg inte telefonnummer, konto-id eller sessionsnamn i nyckeln om de inte behövs för ett uttryckligt, granskat ändamål.
client.addEventListener("turnmetrics", (turn) => {
const safeTurn = {
schema: "voice-turn-v1",
testId: currentTestId,
voiceVersion: installedVoiceVersion,
agentsVersion: installedAgentsVersion,
turnId: turn.turnId,
source: turn.source,
outcome: turn.outcome,
turnTotalMs: turn.turnTotalMs,
speechStartToFinalMs: turn.speechStartToFinalMs ?? null,
modelToFirstTextMs: turn.modelToFirstTextMs ?? null,
ttsToFirstAudioMs: turn.ttsToFirstAudioMs ?? null,
finalInputToFirstAudioMs: turn.finalInputToFirstAudioMs ?? null
};
console.info("voice_turn", safeTurn);
});
Exemplet plockar bara ut fält på en tillåten lista. Att först serialisera hela händelsen och rensa efteråt är en sämre kontroll: ett nytt innehållsfält kan då hinna nå loggsystemet innan filtret uppdateras. Samma princip används i AI-kreatörs guide om känsliga data i AI-arbete: bestäm vad som får lämna processen och bygg representationen från den listan.
Tolka tiderna utan att summera dem
VoiceTurnMetrics har tio valfria varaktigheter. Bland dem finns tid från talstart till första preliminära respektive slutliga transkript, tid i afterTranscribe, tid från modellstart till första text, streamkonsumtion, tid till första serverljud samt TTS-väggtid och TTS-arbete. Ett valfritt fält saknas när turen inte nådde den livscykelpunkten.
Addera inte stegvaraktigheterna till turnTotalMs. Cloudflare säger uttryckligen att mätningarna överlappar. TTS för flera meningar kan dessutom pågå samtidigt som modellen fortfarande producerar text. Jämför samma fält mellan likvärdiga testfall och använd terminalutfallet för att förstå vilka steg som alls ska finnas.
Fältet modelToFirstTextMs svarar på en annan fråga än modelStreamConsumptionMs. Det första hjälper dig hitta väntan före den första icke-tomma textdelen; det andra sträcker sig över konsumtionen av den normaliserade modellströmmen. På samma sätt är ttsToFirstAudioMs en startlatens, medan ttsWallMs omfattar TTS-arbetets väggtid. För en baslinje räcker fyra värden ofta: slutligt transkript, första modelltext, första serverljud och total tur.
Webbläsarens uppspelning ingår inte. Cloudflares typkommentar förklarar att webbläsare och Worker använder oberoende klockor. Om utfallet är completed och servern har ett värde för första ljud, men användaren hör inget, har mätningen flyttat gränsen: fortsätt på klientsidan med anslutning, mottagna ljudbytes, uppspelningsstart, vald utdataenhet och webbläsarens fel. Påstå inte att TTS fungerade hela vägen till högtalaren.
Prova sju vägar till tystnad
Kör proven i en testmiljö med syntetiska fraser. Använd samma agentversion, samma modellkonfiguration och samma korta text där provet tillåter det. Ett prov ändrar en sak i taget och sparar förväntat utfall före körningen. Det följer arbetsformen i AI-kreatörs guide om testning av AI-genererad kod: kriteriet måste mäta samma sak som provet beställer.
| Prov | Ingrepp | Förväntat bevis |
|---|---|---|
| 1. Baslinje | En kort syntetisk talad fråga med fungerande STT, modell och TTS. | completed, samma turnId i turposterna och tider för de nådda huvudstegen. |
| 2. Ingen modellutdata | En testdubbel returnerar en tom normaliserad modellström. | no_output; inga TTS-tider krävs. |
| 3. Utgångsgräns | Testdubbeln avslutar med den typade gränsorsak som 0.4.0 stöder. | output_limit, inte ett generellt TTS-fel. |
| 4. Modellfel | Modellanropet ger ett kontrollerat fel utan känslig meddelandetext. | model_error; eventuell modellstart kan finnas men TTS-start ska inte antas. |
| 5. TTS-fel | En TTS-testdubbel misslyckas efter att modellen producerat text. | tts_error och modell-till-text kan finnas, men första serverljud saknas. |
| 6. Avbrott | Spela upp ett svar och börja tala igen. | aborted för den avbrutna turen; en ny tur får ett annat turnId. |
| 7. Anslutning | Bryt WebSocket efter etablering i ett kontrollerat test. | Typat anslutningsfel fångas separat. Om ingen tur tilldelades ska du inte kräva en påhittad turnmetrics-rad. |
Lägg till ett åttonde lokalt kontrollfall om problemet bara syns i en webbläsare: låt servervägen slutföras men gör utdataenheten otillgänglig eller stoppa uppspelningen i testklienten. Förväntningen är fortfarande att servermåttet och klientobservationen kan säga olika saker. Det är poängen med att inte pressa in uppspelningsfel i tts_error.
Håll tre diagnostikströmmar isär
Turnmetrics är den stabila terminala sammanfattningen. Cloudflare beskriver dessutom typade klienthändelser för STT-fel, anslutningsfel och modellutfall. Fånga dem i separata poster med samma lokala test-id och, när den installerade typdefinitionen faktiskt erbjuder det, samma turnId. Hitta inte på en koppling när ett anslutningsfel inträffar innan någon tur har skapats.
Den tredje strömmen är browser console-diagnostik. Den aktiveras på serversidan för lokal felsökning:
const VoiceAgent = withVoice(Agent, {
diagnostics: {
browserConsole: true
}
});
Cloudflare säger att funktionen är avstängd som standard och att dess händelsenamn och fält kan ändras. Använd den därför för en avgränsad lokal reproduktion, stäng av den efter provet och bygg inga produktionslarm på dess interna namn. Ett enkelt godkännandekriterium är att applikationens permanenta logg fungerar utan browser console-diagnostik.
Cloudflare uppger också att SDK:t tar bort kända innehållsfält och inte läser godtyckliga provider-svar. Det är inte ett frikort för egna feltexter. Ett meddelande som byggs av "TTS failed for " + transcript har redan gjort loggen känslig. Normalisera i stället till egna koder som stt_unavailable, connection_closed eller model_failed och spara högst steg, kod och om felet enligt den typade händelsen kan försökas igen.
Godkänn först när beviset går att läsa baklänges
Välj tre till fem syntetiska testfraser och kör hela matrisen efter varje versionsändring. För varje körning ska en granskare kunna börja i ett rapporterat tyst svar, hitta test-id och turnId, se terminalutfallet, se vilka tidsfält som saknas och därefter öppna rätt separata felström. Rådata ska samtidigt vara oanvändbar för att återskapa vad personen sade eller vad modellen svarade.
@cloudflare/voice och agents finns i körningsmetadata.completed.Om teamet behöver en bredare metod för att formulera hypotes och ändra en variabel i taget finns den i guiden Felsökning med AI: förstå innan du fixar. Här är stoppregeln mer specifik: uppgradera inte fler röstagentmiljöer förrän matrisen kan skilja modell, TTS, avbrott, anslutning och lokal uppspelning utan att samtalsinnehåll hamnar i loggen.
Källor
- Cloudflare Changelog: Inspect Voice Agent turn latency and outcomes – datum, versioner, turnmetrics, terminala utfall, överlappande tider, klientytor, diagnostik och säker loggning.
- Cloudflare Agents docs: Voice – Pipeline metrics – röstpipelinen och den äldre kompatibilitetsytans fyra aggregerade mått.
- Cloudflare Agents: voice/types.ts – den fullständiga 0.4.0-typen med nio utfall, obligatoriska dimensionsfält, valfria varaktigheter och avgränsningen mot webbläsaruppspelning.
Uppgifterna kontrollerades mot Cloudflares primärkällor den 12 september 2026. API-exemplen och utfallslistan är versionsbundna till @cloudflare/voice 0.4.0. Kontrollera den installerade typdefinitionen när du uppgraderar.