Telefonsamtal in, svar ut. Realtid-transkribering och tone-validering.
Modul-id: voice-agent · Version: 1.0.0 · Röst: kapaciti · Modell: claude-haiku-4-5
Voice-agenten är en av sexton compliance-AI-moduler i Kapaciti-sviten. Den tar emot en strukturerad transkribering av ett pågående telefonsamtal, klassificerar ringarens intent, bedömer tonläge bortom orden, identifierar regelefterlevnads-triggers och producerar ett kort svarsutkast på talad svenska som kan spelas direkt via TTS. Hela bedömningen avslutas med ett signerat audit-bundle som kan verifieras separat. Modulen är byggd för att plugga in framför en mänsklig handläggare, inte ersätta den.
Den primära användningen är inkommande supportsamtal där en realtidstranskribering finns tillgänglig från en STT-pipeline (Whisper, Deepgram eller motsvarande). Modulen körs efter varje nytt ringare-yttrande eller i slutet av samtalet. Output styr två saker. För det första, om bot ska fortsätta hantera samtalet eller om det ska kopplas vidare. För det andra, om något har sagts som kräver omedelbar regelefterlevnads-flagg till Bolagsverket-, IMY- eller säkerhetsteam.
Input är ett JSON-objekt med följande nycklar.
{
call_id: "string",
caller: { phone: "string", name: "string?", verified: boolean },
transcript: [
{ speaker: "caller" | "agent", text: "string", timestamp_ms: number, confidence: 0-1 }
],
call_started_at: "ISO timestamp",
customer_brand: "string?"
}
Transkriberingen ska vara icke-tom och tidssorterad. Varje yttrande har en konfidensnivå från STT-motorn så att modulen kan vikta lågkonfidens-rader mindre. verified: true betyder att numret har matchats mot en känd kund i CRM, vilket gör att modulen kan tillåta vissa GDPR-flöden utan extra identitetskontroll.
Output är ren text i fast struktur, parsbar utan JSON-tolkning.
INTENT: <faktura | teknisk-support | sales | klagomal | regulatorisk-fraga | annat>
TONLAGE: <neutral | frustrerad | uppjagad | hotfull | osaker>
ESKALERING: <fortsatt-bot | tier-2 | manager | regelefterlevnad | sakerhet>
REGELEFTERLEVNAD: <ingen | gdpr-radata | lex-uggla | annat>
SVARSUTKAST:
<en till två korta meningar på talad svenska>
INTERNA NOTERINGAR:
<en till tre korta punkter för handläggaren>
Strukturen är medvetet rad-baserad för att vara robust mot små formuleringsavvikelser från modellen. Validatorn i modulen läser block för block och kontrollerar att varje rubrik finns och att varje värde tillhör sin tillåtna mängd.
Telefoni är inte chatt. Tonläge bedöms från sammanhanget, inte enskilda ord. Snabba avbrott i ringarens replik, höjd röst i transkriberingen markerad via versaler eller upprepningar, hot om att gå till Polisen eller ARN, eller upprepade frågor utan att modulen besvarat dem, allt detta räknas som signaler. Tonläget hotfull triggar automatisk eskalering, och om modellen ändå skulle skriva fortsatt-bot så fångar validatorn det som en regelbrottsvarning innan output släpps vidare.
Fyra triggers flaggas separat. gdpr-radata täcker varje begäran om dataexport, radering, rättelse, eller fråga om var data lagras. lex-uggla täcker fall som rör visselblåsning, anonym rapportering eller hänvisning till Lag (2021:890) om skydd för personer som rapporterar om missförhållanden. annat används för PSD2, konsumentköpslagen, eller övriga regulatoriska områden där en jurist bör titta. Modulen gör inte juridiska bedömningar själv. Den markerar för en människa.
Inspelnings-medgivande är ett specialfall. Om ringaren frågar om samtalet spelas in, eller säger att hen inte vill bli inspelad, så ska modulen flagga regelefterlevnad i eskalering oavsett intent. Detta är en hård regel i Kapaciti-policy och täcks av cross-rule-validatorn.
Utkastet är skrivet för TTS. Det ska vara en till två korta meningar, läsas naturligt högt, och inte innehålla listor, punkter eller siffror som måste tolkas. Modulen lovar aldrig kreditering, juridiska åtgärder eller specifik återbetalning. Den hänvisar till handläggare när situationen kräver det. Voice-profilen kapaciti filtrerar dessutom bort förbjudna ord (ensure, crucial, journey, delve, dive, navigate, samt tankstreck) på det sista steget.
Varje körning skapar en kedja av block:
input_received med hela samtalets metadatacontext_loaded (här tom, modulen använder inte extern källa)agent_call med modell, voice och promptlängdoutput_generated med modellsvar och durationvoice_validated med kvarvarande röst-violationsoutput_validated med parsade fält och regelbrottaudit_sealed med slutstatusVarje block är SHA-256-hashat, kedjat med prev_hash till föregående och signerat med organisationens Ed25519-nyckel. Bundlen kan verifieras fristående via node scripts/verify-all-bundles.mjs eller via verify-skriptet i kapaciti-site.
Sviten ligger i tests/voice-agent.test.mjs och täcker input-validering, prompt-konstruktion, output-parsning, regelbrott-detektion, end-to-end-körning, bundle-verifiering och tamper-test där ett block i en signerad bundle modifieras och verifikationen då måste säga nej.
Tre punkter ligger på efterhand. Först, integration mot en levande STT-pipeline i stället för att ta emot färdig transkribering, så att modulen kan trigga partiellt efter varje ny mening. Andra, per-kund prompttillägg via customer_brand så att svarsutkastet anpassas till kundens specifika tonregister. Tredje, en mätare på tonläge över tid för långa samtal, så att eskalering kan triggas när tonen försämras även om enskilda yttranden ligger under tröskeln.
Justera input-objektet eller använd starter-värdena. När du trycker på Kör modulen anropas samma agent som i produktion. Audit-kedjan byggs framför dig och hela sessionen signeras med Ed25519 i samma format som exempel-bundlen ovan.
JSON-payload som matchar modulens validateInput. Starter-värdena kommer från en riktig produktionskörning. Max 12 000 tecken.
Audit-kedjan visas här när scenariot körs
● Nyhetsbrev
En sammanfattning ungefär en gång i månaden. Vad förändrats i regelverket, vilka pilot-cases vi sett och vilka vendor-shifts som påverkar svenska bolag. Skickas av oss, inte av en automation som låtsas vara oss.