Road Maintenance-connector
Road Maintenance-connectorn bevakar en brevlåda och gör om de vägarbeten som aviseras i de mejlen till vägavstängningar i Yggio.
Vägarbeten aviseras normalt via e-post, som en godkänd trafikanordningsplan. Beslutet är redan fattat; e-posten bär resultatet, och den är skriven för en människa att läsa: fritext, en bilaga, ett gatunamn, ett datumintervall. Connectorn pollar brevlådan, lämnar varje meddelande till en LLM att läsa, och skapar vägavstängningen utifrån det LLM:en extraherar. Ingen behöver skriva om det för hand.
För vad vägavstängningarna sedan används till, inklusive att leda utrycknings- och kommunala fordon runt dem, se Väghinder.
Så fungerar det
- Connectorn pollar en brevlåda över IMAP med ett intervall du bestämmer.
- Ett meddelande behandlas bara om avsändaren står på listan över tillåtna avsändare. Allt annat ignoreras, så ett godtyckligt mejl kan inte stänga en väg.
- Meddelandet skickas till en AI-agent, en separat AI-connector som fungerar som tolk, vilken läser det och returnerar de strukturerade uppgifterna.
- En vägavstängning skapas i Yggio utifrån resultatet.
- Navigering i Yggio leder sedan runt den och hittar snabbaste vägen förbi avstängningen för en bil eller en lastbil.
Innan du börjar
Du behöver en AI-connector av typen Agent som redan är skapad, eftersom Road Maintenance-connectorn väljer en när du sätter upp den. En MCP-connector dyker inte upp i listan: MCP driver chattassistenten, medan Agent kör ett enskilt LLM-anrop med en fast systemprompt, vilket är vad det krävs för att tolka ett mejl. Se AI-connector.
Ge den agenten en systemprompt som beskriver vad som ska extraheras ur mejlet, och sätt dess svarsformat till JSON så att resultatet kan användas direkt.
Du behöver också en brevlåda som connectorn kan läsa, och adresserna som får skriva till den.
Skapa connectorn
- Gå till Connectors → Ny connector → Road Maintenance.
- Välj retention policy och flöde, och fortsätt sedan.
- Fyll i connectorns uppgifter:
Brevlåda
| Fält | Beskrivning |
|---|---|
| Host | IMAP-serverns värdnamn, till exempel imap.example.com |
| Port | IMAP-port, normalt 993 |
| Username | Brevlådans konto |
| Password | Brevlådans lösenord |
| TLS | Om anslutningen ska ske över TLS. Normalt true |
| Poll interval | Hur ofta ny post hämtas, i millisekunder. 60000 är en minut |
Tillåtna avsändare
En lista med e-postadresser vars meddelanden behandlas. Lägg till en post per adress.
Håll den så snäv som verksamheten tillåter. Den här listan är behörighetskontrollen för hela funktionen: en adress på den kan orsaka att en väg markeras som avstängd, så den bör innehålla de entreprenörer och handläggare som har rätt att avisera vägarbeten, och ingen annan.
AI-agent
Välj den AI-connector som ska tolka meddelandena. Bara connectors av typen Agent listas.
Agenten sparas med rollen parser och ett syfte, en kort beskrivning av vad den finns till för,
vilket är användbart när fler än en agent är inblandad senare.
- Bekräfta uppgifterna och skapa connectorn.
Exempel: tolkagenten
Det här är agentkonfigurationen från projektet connectorn byggdes för, med inloggningsuppgifter och adresser utbytta. Betrakta den som en fungerande utgångspunkt snarare än en specifikation: det är prompten som avgör hur väl mejlen läses, och den bör anpassas efter de dokument dina avsändare faktiskt skriver.
Systemprompten
Sätt den här som systemprompt på AI-connectorn, med svarsformatet JSON Object och en låg
temperatur, 0.3 här, eftersom uppgiften är extrahering snarare än komposition.
Prompten är skriven på engelska och lämnas oöversatt: det är den text som skickas till modellen, och att översätta den skulle ändra vad den gör.
You are an emergency service operator helping fire brigades navigate around road blocks in Sweden. Analyze the road closure information and provide location details and structured query in a format suitable for geocoding. Here is an example for "freeform_query" converted into URI component: encodeURIComponent("Klosterbrunnsgatan, Visby, 111 57, Sweden") "Klosterbrunnsgatan%2C%20Visby%2C%20111%2057%2C%20Sweden". The timings mentioned in the email are in the Europe/Stockholm timezone. Convert these timings to UTC (Coordinated Universal Time) before returning the response. If only dates are specified (e.g., 'Monday 2024.10.28 - Friday 2024.11.22'), interpret them as local dates in the Europe/Stockholm timezone, starting at midnight (00:00) on the start date and ending at 23:59:59 on the end date. Ensure that the 'canPass' attribute in 'emergencyAccess' is set to 'false' if emergency vehicles cannot pass through the road block. Set it to 'true' only under the following conditions: (1) there is explicit information allowing emergency vehicles to pass, or (2) the road block's end time (`endTimeAt`) has already passed, meaning the road block is no longer active (`active`=false). Return a JSON object with a "roadBlocks" using this format: { "roadBlocks": { "connectorId": "TBU","userId": "TBU", "roadLocation": [{ "name": "TBU", "tag": "TBU", "active": boolean, "startTimeAt": "YYYY-MM-DDTHH:mm:ssZ", "endTimeAt": "YYYY-MM-DDTHH:mm:ssZ", "reportedAt": "YYYY-MM-DDTHH:mm:ssZ" (copy of startTimeAt), "roadBlockage": string, "lnglat": { "type": "Point", "coordinates": [number, number] ([lon, lat] points) }, "roadName": string, "roadSection": string, "city": string, "restrictionType": string, "emergencyAccess": { "canPass": boolean, "instructions": string, "alternativeRoutes": [{ "description": string, "path": { "type": "LineString", "coordinates": [[number, number]] (array of [lon, lat] points) }, "estimatedTime": string (e.g. "5 min"), "restrictions": string[] }], "osmDetails": { "wayIds": string[], "nodeIds": string[], "boundingBox": { "north": number, "south": number, "east": number, "west": number }, "overpassQuery": string } }, "location": { "structured": { "street": string, "city": string, "county": string, "state": string, "country": "Sweden", "postalcode": string, "amenity": string }, "freeform": string }, "freeformQuery": string }], "email": { "subject": string, "sender": string, "receivedAt": "YYYY-MM-DDTHH:mm:ssZ", "text": string } } } Respond with only this JSON object. Do not include any explanatory text, preamble, or markdown code fences; the output must start with { and end with } and be valid JSON.
Vad prompten gör
Fem uppgifter, var och en av ett skäl:
- Sätter rollen. Den anger operatörskontexten först, vilket förankrar allt som följer.
- Ger en geokodningsbar adress. Mejlet namnger en gata; ruttmotorn behöver koordinater. Prompten
ber om en
freeformQueryi en form som en geokodare accepterar, med ett genomarbetat exempel på URI-kodningen. - Reder ut tidszonen. Mejlen är skrivna i lokal tid och plattformen lagrar UTC. Prompten namnger källzonen och definierar vad ett datumintervall utan klockslag betyder, midnatt till 23:59:59, så att en heldagsavstängning inte läses som ett enda ögonblick.
- Avgör utryckningsåtkomst.
canPassär som standardfalseoch får bara varatruepå angivna grunder: uttryckligt tillstånd i mejlet, eller en avstängning vars sluttid har passerat. Att en tolk gissar fel här är det fel som spelar störst roll, så regeln är skriven som en vitlista. - Låser fast utdataformen. JSON-strukturen anges i sin helhet, och avslutas med en instruktion om att returnera det objektet och ingenting annat.
Varför instruktionen om enbart JSON spelar roll
Den gör att samma prompt kan köras på båda leverantörerna. OpenAI har ett inbyggt JSON-läge, så där är instruktionen hängslen och livrem. Anthropic har inget sådant läge och JSON:en plockas fram genom att tolka modellens text: en kodstaket och omgivande blanktecken tolereras, men prosa runt JSON:en gör att tolkningen misslyckas. Instruktionen är det som förhindrar det.
För att byta leverantör: ändra leverantör och modell-id och låt allt annat vara.
Verifiering
- Skicka ett testmeddelande till brevlådan från en adress på listan över tillåtna avsändare.
- Vänta ett pollintervall.
- Kontrollera att en vägavstängningsenhet dyker upp i Yggio med uppgifterna från meddelandet.
- Skicka ett meddelande från en adress som inte står på listan och bekräfta att ingenting skapas.
Felsökning
Ingenting händer alls. Kontrollera IMAP-uppgifterna och att port och TLS-inställning stämmer med vad e-postleverantören förväntar sig. Många leverantörer kräver dessutom ett appspecifikt lösenord i stället för kontolösenordet.
Vissa mejl behandlas och andra inte. Kontrollera avsändaren mot listan över tillåtna avsändare. En adress som skiljer sig bara genom ett alias eller en subdomän matchar inte.
Vägavstängningar skapas med fel eller saknade uppgifter. Det är agentens prompt snarare än connectorn. Förfina systemprompten på AI-connectorn och bekräfta att dess svarsformat är JSON.