Supporto
Triagea un ticket di supporto in una bozza di risposta fondata
Maschera il ticket, classifica intento e priorità con Chat, recupera i passaggi che rispondono dalla documentazione, controlla conversazioni pubbliche di incidente e lascia una bozza instradata per l’approvazione umana.
Copia il prompt
Sostituisci i campi tra parentesi quadre e incolla in Claude Code, Codex o qualsiasi IA con accesso al terminale. Installa lo skill Felo, chiede prima di spendere crediti ed esegue il workflow.
Fai il triage di questo ticket di supporto e scrivi una bozza di risposta per la revisione umana: [incolla il ticket dopo aver rimosso nome, email, ID account, dati di pagamento e altre informazioni identificative]. Area prodotto: [prodotto]. Piano o regione: [solo se serve per rispondere]. Fonte documentale: [URL del centro assistenza o LiveDoc short_id]. Percorso di approvazione: [chi revisiona]. Coda di escalation: [team o canale]. Produci: 1. Intento: una categoria e una frase di motivazione. 2. Priorità: urgente / normale / bassa, con la regola applicata. 3. Prove: i passaggi di documentazione che rispondono al ticket, con titolo e rilevanza. 4. Controllo incidenti: i report pubblici suggeriscono un disservizio ampio? Link e data, oppure «nessun segnale pubblico». 5. Routing: bozza, richiesta di informazioni al cliente o escalation — e perché. 6. Bozza di risposta: due-quattro frasi, solo sulle prove, citando la fonte usata. Regole: - Non inserire nomi, email, numeri d’ordine, token o dati di pagamento nelle chiamate API o negli output. Lavora solo sul ticket mascherato. - Rispondi solo dalla documentazione recuperata. Senza prove, escala invece di indovinare. - Non promettere rimborsi, sconti, scadenze o modifiche all’account; manda questi casi all’escalation. - Le voci pubbliche di disservizio sono segnali, non prove. Cita post e data. - Prima di consumare crediti, mostra le chiamate previste e attendi la mia approvazione. - Non inviare risposte, non aggiornare il ticket e non eseguire azioni sull’account. Restituisci la bozza per la revisione. - Scrivi il risultato in ./support-triage.md e riassumilo in chat.
La copia include anche i passaggi di installazione e le regole di sicurezza.
Cosa ottieni
Output di esempio di un'esecuzione. Non è generazione dal vivo.
Triage — ticket di esempio
Intento
Domanda di fatturazione / rinnovo. Il cliente chiede perché il piano si è rinnovato di nuovo.
Priorità
Normale. È una domanda di fatturazione, non un disservizio, e il cliente non è bloccato.
Prove
- «domande frequenti sulla fatturazione» — momento del rinnovo e retry della carta. Rilevanza: alta.
- «Modifiche al piano» — downgrade tra rinnovi. Rilevanza: media.
Controllo incidenti
Nessun report pubblico nelle ultime 48 ore.
Routing
Bozza. La documentazione copre la domanda.
Bozza di risposta
Ciao — il tuo piano si rinnova il primo del mese e una carta rifiutata viene ritentata per tre giorni prima di sospendere la licenza. Puoi cambiare la carta nelle impostazioni di fatturazione; la domande frequenti sulla fatturazione ha i passaggi. Se devi spostare la data di rinnovo, rispondi e lo escaleremo al team fatturazione.
Nota per la revisione
Approva, modifica o escala alla coda fatturazione.
Le chiamate esatte
Per gli sviluppatori: lo stesso workflow come codice, nell'ordine di esecuzione.
Mostra le chiamate API reali
Maschera e classifica
Rimuovi con codice email, telefono e numero ordine, poi usa Chat per intento e priorità.
triage.ts const BASE = "https://openapi.felo.ai"; const headers = { Authorization: `Bearer ${process.env.FELO_API_KEY}`, "Content-Type": "application/json", }; async function felo<T>(path: string, body?: unknown): Promise<T> { const res = await fetch(`${BASE}${path}`, { method: body ? "POST" : "GET", headers, body: body ? JSON.stringify(body) : undefined, }); if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`); return res.json() as Promise<T>; } const redact = (text: string) => text .replace(/[\w.+-]+@[\w.-]+\.\w+/g, "[email]") .replace(/\b(?:acct|account|order|invoice)[-_ ]?\w+\b/gi, "[id]") .replace(/\b(?:\d[ -]?){13,19}\b/g, "[card]"); type Ticket = { id: string; product: string; subject: string; body: string; plan?: string; sensitive?: boolean; }; const ticket: Ticket = { id: "T-1042", product: "Acme Workspace", subject: "Why did my plan renew?", body: "I was charged again and cannot find the renewal date on my account.", plan: "team", }; const summary = redact(`${ticket.subject}\n\n${ticket.body}`).slice(0, 1500); type ChatData = { data: { answer: string; resources: { link: string; title: string; snippet: string }[]; }; }; const triage = await felo<ChatData>("/v2/chat", { query: `Classify this support question by intent and priority, and list what is missing:\n\n${summary}`, }); console.log(triage.data.answer);Output di esempio
{ "answer": "Intent: billing / renewal question. Priority: normal. Missing: the renewal date the customer expects.", "resources": [ { "link": "https://example.com/billing-faq", "title": "Billing FAQ", "snippet": "…" } ] }Recupera prove documentali
Cerca passaggi rilevanti nel LiveDoc della base di conoscenza, conservando titoli e punteggi.
triage.ts type Hit = { title: string; content: string; score: number }; const KB = process.env.SUPPORT_LIVEDOC_ID!; // the help-center LiveDoc short_id const retrieved = await felo<{ data: Hit[] }>( `/v2/livedocs/${KB}/resources/retrieve`, { query: summary }, ); const hits = retrieved.data.filter((hit) => hit.score >= 0.7).slice(0, 4); if (hits.length === 0) { console.log("No grounded evidence: escalate instead of drafting"); }Output di esempio
[ { "title": "Billing FAQ", "content": "Your plan renews on the first of the month; a failed card retries for three days…", "score": 0.91 } ]Controlla incidente pubblico
Cerca su X prodotto e parole come “disservizio/offline” nelle ultime 48 ore, solo come segnale pubblico.
triage.ts type XData = { data: { tweets: { content: string; author: { username: string }; created_at: string; url: string; }[]; }; }; const since = Math.floor((Date.now() - 48 * 60 * 60 * 1000) / 1000); const incident = await felo<XData>("/v2/x/tweet/search", { query: `"${ticket.product}" (outage OR "not working" OR error)`, limit: 20, since_time: since, }); const reports = incident.data.tweets.map((post) => ({ text: post.content, handle: post.author.username, at: post.created_at.slice(0, 10), link: post.url, }));Output di esempio
[ { "text": "Workspace login is failing for my whole team.", "handle": "example_user", "at": "2026-10-30", "link": "https://x.com/example_user/status/..." } ]Definisci percorso e componi risposta
Le regole decidono la coda; impacchetta prove, prossimo passo e bozza.
triage.ts type Route = "draft" | "ask-customer" | "escalate"; function decideRoute(): { route: Route; reason: string } { if (hits.length === 0) { return { route: "escalate", reason: "no grounded evidence in the knowledge base" }; } if (ticket.sensitive) { return { route: "escalate", reason: "an account or billing action is requested" }; } if (reports.length >= 3) { return { route: "escalate", reason: "public reports suggest a wider issue" }; } if (!ticket.plan) { return { route: "ask-customer", reason: "the plan is needed to answer the question" }; } return { route: "draft", reason: "the documentation covers the question" }; } const decision = decideRoute(); const packet = [ `# Triage — ${ticket.id}`, "", `Route: ${decision.route} (${decision.reason})`, "", "## Intent and priority", triage.data.answer, "", "## Evidence", ...hits.map((hit) => `- ${hit.title} (score ${hit.score})`), "", "## Public signal", ...(reports.length ? reports.map((report) => `- @${report.handle} (${report.at}): ${report.text} — ${report.link}`) : ["No public reports in the last 48 hours."]), "", "## Reply draft", "[Written by the host Agent from the evidence above — human review required]", ].join("\n"); console.log(packet);Output di esempio
# Triage — T-1042 Route: draft (the documentation covers the question) ## Intent and priority Intent: billing / renewal question. Priority: normal. ## Evidence - Billing FAQ (score 0.91)
Registra il triage
Scrivi il risultato nel LiveDoc per retrospettiva e audit.
triage.ts type LiveDocData = { data: { short_id: string } }; const log = await felo<LiveDocData>("/v2/livedocs", { name: "Support triage log", description: "One document resource per triaged ticket", }); await felo(`/v2/livedocs/${log.data.short_id}/resources/doc`, { title: `Triage — ${ticket.id}`, content: packet, }); console.log(log.data.short_id); // reuse it for the next ticketOutput di esempio
{ "short_id": "PvyKouzJirXjFdst4uKRK3" }
Cosa include
- Intento e priorità dopo il mascheramento
- Prove documentali con punteggi
- Controllo di incidente pubblico
- Bozza di risposta instradata
- LiveDoc con il registro del triage
Cosa non fa
- Non invia risposte, non chiude ticket e non esegue azioni account
- Non inviare password, dati di pagamento o dati completi del cliente all’API
- Senza risultati documentali l’escalation è obbligatoria
- X è un segnale pubblico di incidente, non lo stato del sistema di supporto
- Le regole di priorità sono tue; il modello propone soltanto
Domande
Quali dati del ticket posso inviare?
Solo il contesto necessario dopo il mascheramento: prodotto, descrizione, piano e regione. Niente password, pagamenti, indirizzo completo o conversazioni private.
Da dove viene la risposta?
Dai passaggi recuperati nel LiveDoc della documentazione. Senza risultati il workflow escala invece di indovinare.
Risponde o chiude il ticket?
No. Genera solo bozza e percorso; invio e chiusura spettano a una persona o al tuo sistema.
Come si decide la priorità?
Con le tue regole; il modello propone e motiva, il percorso conferma la priorità finale.
E se la documentazione non copre?
Escalation alla coda umana, con “non coperto” nel pacchetto di triage.
Quanto costa un triage?
Chat, ricerca e X Search sono a consumo; le tariffe sono nella pagina prezzi e il prompt chiede approvazione prima di spendere.
Workflow correlati
Rispondi alle domande di supporto dalla tua documentazione
Crea un LiveDoc, carica help center e runbook interno, recupera i passaggi che rispondono al ticket e lascia che il modello risponda solo da quelle prove.
Apri il workflowContenutiTrasforma le conversazioni social in un brief settimanale di ascolto
Cerca i post X dell’ultima settimana su brand e concorrenti, aggiungi contesto web con fonti, leggi le pagine dietro e archivia ogni edizione perché la settimana dopo parta da ciò che si sa.
Apri il workflowRicercaTrasforma una domanda in un brief di ricerca con fonti
Interroga il web, salva come Markdown le pagine dietro la risposta, aggiungi ciò che dicono i professionisti su X e conserva le prove in un LiveDoc che potrai interrogare di nuovo.
Apri il workflowAdattala a te
La stessa ricetta, adattata a come lavori davvero.
Solo classificazione
Senza risposta: solo intento, priorità e coda suggerita.
Collega al sistema ticket
Con il tuo webhook scrivi il pacchetto nel ticket, senza invio automatico.
Passa alla base di conoscenza
Con risultati documentali passa al workflow della base per una risposta più completa.
Continua
Le pagine di riferimento dietro questa ricetta e i prossimi passi.