Hoppa till innehållet

Devportalen /portal/dev

Startsideportalens ekosystem för människa och agent

Dokumentationen / API

POST /api/flows/felanmalan

APIStartsideportalen

Samtalsflödets enda serverända: äger prompten, validerar turen och fattar beslutet om ärendet får skapas.

källa: apps/portal/src/app/api/flows/felanmalan/route.tsuppdaterad: 2026-08-30

Ansvar

  • Hämta identiteten ur sessionen – aldrig ur klientens payload.
  • Hålla takgränsen: 40 anrop per användare och femminutersfönster.
  • Validera inkommande med zod och sanera fältvärden innan de kan bli ett ärende.
  • Välja regelmotor eller modell utifrån AI_PROVIDER, med samma kontrakt åt båda hållen.
  • Avgöra själv om allt obligatoriskt finns. Att modellen sätter create räcker aldrig.

Filer

Tabell: Sökväg, Roll
SökvägRoll
app/api/flows/felanmalan/route.tsPOST-handlern: takgräns, validering, förankring, turkörning, beslut.
ai/faltsignatur.tsHMAC över fältvärdena, så att klientens förankring bevisligen är serverns egen (ADR-013).
ai/faltsignatur.test.tsTester på signaturen, inklusive att ett tillagt fält avvisas.

Kontrakt

Ordningen är inte utbytbar

const user = await getCurrentUser();              // identitet från servern
if (!inomTakgrans(user.userId)) return 429;      // takgräns före arbete
const rad = Body.safeParse(await request.json()); // zod på inkommande
const varden = sanera(tur.varden);                // styrtecken bort, 500 tecken
farSkapas(flow, tur.create, varden, antalSvar);   // serverns beslut
  • Meddelandehistoriken är begränsad till 60 meddelanden och 2000 tecken per meddelande.
  • Turkontraktet garanteras av structured outputs, inte av en instruktion i prompten.
  • Ett omtag vid ogiltigt svar, inte en loop – latensen hålls nere och kostnaden förutsägbar.
  • Klienten skickar tillbaka fälten så att assistenten kan återge dem ordagrant, men de når prompten bara om serverns egen signatur stämmer (ADR-013). Utan den kontrollen vore fältvärden en väg att mata in uppgifter förbi samtalet.
  • Förankringen påverkar aldrig beslutet: allaObligatoriskaIfyllda och farSkapas läser modellens svar, inte klientens.

Beroenden och beslut

Kvarstår

  • Takgränsen ligger i minnet och överlever inte omstart eller flera instanser. Flyttar till Redis i fas 4.
  • Ingen ärendeadapter: beslutet att skapa fattas, men ingenting skapas (M3).
  • Signaturnyckeln lever i processen. Vid omstart eller flera instanser faller förankringen och fälten kan formuleras om igen – M3:s sessionsdata gör den överflödig.