Felo API PlatformFelo API Platform

Podpora

Triažujte ticket podpory do podloženého návrhu odpovědi

Maskujte ticket, klasifikujte záměr a prioritu s Chat, získejte pasáže odpovídající z dokumentace, zkontrolujte veřejné diskuse o incidentu a nechte routovaný návrh k lidskému schválení.

Čas20 minutÚroveňStředníAktualizováno2026-10-30
Pro kohoLídři podporyHelpdesk AgentInženýři podpory

Zkopírovat prompt

Nahraďte pole v hranatých závorkách a vložte do Claude Code, Codex nebo AI s přístupem k terminálu. Nainstaluje skill Felo, zeptá se před utracením kreditů a spustí workflow.

Zatřiď tento ticket podpory a napiš návrh odpovědi k lidské kontrole: [vlož ticket po odstranění jména, e-mailu, ID účtu, platebních údajů a dalších identifikujících informací].

Oblast produktu: [produkt]. Plán nebo region: [jen pokud je potřeba k odpovědi]. Zdroj dokumentace: [URL help centra nebo LiveDoc short_id].
Cesta schválení: [kdo kontroluje]. Eskalační fronta: [tým nebo kanál].

Vytvoř:
1. Záměr: jedna kategorie a jedna věta odůvodnění.
2. Prioritu: naléhavá / normální / nízká, s použitým pravidlem.
3. Důkazy: pasáže dokumentace, které odpovídají na ticket, s názvem a relevancí.
4. Kontrolu incidentu: naznačují veřejné zprávy rozsáhlý výpadek? Odkaz a datum, nebo „žádný veřejný signál“.
5. Routing: koncept, žádost o doplňující informace, nebo eskalace — a proč.
6. Návrh odpovědi: dvě až čtyři věty, pouze na důkazech, s uvedením použitého zdroje.

Pravidla:
- Nedávej jména, e-maily, čísla objednávek, tokeny ani platební údaje do volání API nebo výstupů. Pracuj jen s maskovaným ticketem.
- Odpovídej pouze z načtené dokumentace. Bez důkazů eskaluj, nehádej.
- Neslibuj vratky, slevy, termíny ani změny účtu; tyto případy posílej na eskalaci.
- Veřejné zvěsti o výpadku jsou signál, ne důkaz. Cituj příspěvek a datum.
- Než utratíš kredity, ukaž plánovaná volání a počkej na mé schválení.
- Neposílej odpověď, neaktualizuj ticket a neprováděj akce na účtu. Vrať koncept k revizi.
- Výsledek zapiš do ./support-triage.md a shrň ho v chatu.

Kopie obsahuje i instalační kroky a bezpečnostní pravidla.

Co dostanete

Ukázkový výstup jednoho běhu. Ne živé generování.

Ukázkový triage (výňatek)

Triage — ukázkový ticket

Záměr

Dotaz na fakturaci / obnovení. Zákazník se ptá, proč se plán znovu obnovil.

Priorita

Normální. Je to fakturační dotaz, ne výpadek, a zákazník není blokován.

Důkazy

  • „časté dotazy k fakturaci” — čas obnovení a opakování karty. Relevance: vysoká.
  • „Změny plánu” — downgrade mezi obnoveními. Relevance: střední.

Kontrola incidentů

Žádná veřejná hlášení za posledních 48 hodin.

Routing

Koncept. Dokumentace dotaz pokrývá.

Koncept odpovědi

Dobrý den — váš plán se obnovuje prvního dne v měsíci a neúspěšná karta se opakuje tři dny, pak se místo pozastaví. Kartu změníte v nastavení fakturace; časté dotazy k fakturaci má kroky. Pokud potřebujete posunout datum obnovení, odpovězte a eskalujeme to fakturačnímu týmu.

Poznámka pro recenzenta

Schválit, upravit nebo eskalovat do fakturační fronty.

Přesná volání

Pro vývojáře: stejný workflow jako kód, v pořadí provádění.

Zobrazit skutečná API volání
  1. Maskujte a klasifikujte

    Odstraňte kódem e-mail, telefon a číslo objednávky, potom použijte Chat pro záměr a prioritu.

    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);

    Ukázkový výstup

    {
      "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": "…" }
      ]
    }
  2. Získejte důkazy z dokumentace

    Hledejte relevantní pasáže v LiveDoc podpory, držte tituly a skóre.

    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");
    }

    Ukázkový výstup

    [
      {
        "title": "Billing FAQ",
        "content": "Your plan renews on the first of the month; a failed card retries for three days…",
        "score": 0.91
      }
    ]
  3. Zkontrolujte veřejný incident

    Hledejte na X produkt a slova jako „výpadek/offline“ za 48 hodin, jen jako veřejný signál.

    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,
    }));

    Ukázkový výstup

    [
      {
        "text": "Workspace login is failing for my whole team.",
        "handle": "example_user",
        "at": "2026-10-30",
        "link": "https://x.com/example_user/status/..."
      }
    ]
  4. Určete cestu a sestavte odpověď

    Pravidla určují frontu; zabalte důkazy, další krok a návrh.

    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);

    Ukázkový výstup

    # 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)
  5. Zaznamenejte triáž

    Zapište výsledek do LiveDoc pro zpětný pohled a 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 ticket

    Ukázkový výstup

    { "short_id": "PvyKouzJirXjFdst4uKRK3" }

Co obsahuje

  • Záměr a priorita po maskování
  • Důkazy z dokumentace se skóre
  • Kontrola veřejného incidentu
  • Routovaný návrh odpovědi
  • LiveDoc se záznamem triáže

Co nedělá

  • Neposílá odpověď, nezavírá ticket a nevykonává akce účtu
  • Neposílejte do API hesla, platební data ani plná data zákazníka
  • Bez výsledku dokumentace je eskalace povinná
  • X je veřejný signál incidentu, ne stav systému podpory
  • Pravidla priority jsou vaše; model jen navrhuje

Otázky

Jaká data ticketu mohu poslat?

Jen potřebný kontext po maskování: produkt, popis, plán a region. Bez hesel, plateb, plné adresy a privátní konverzace.

Odkud odpověď?

Z pasáží získaných v LiveDoc dokumentace. Bez výsledků workflow eskaluje místo hádání.

Odpovídá nebo zavírá ticket?

Ne. Tvoří jen návrh a cestu; odeslání a zavření dělá člověk nebo váš systém.

Jak se určuje priorita?

Vašimi pravidly; model navrhuje a zdůvodňuje, cesta potvrzuje konečnou prioritu.

Když dokumentace nepokrývá?

Eskalace do lidské fronty s „nepokryto“ v balíčku triáže.

Kolik stojí jedna triáž?

Chat, hledání a X Search se účtují podle užití; aktuální sazby na stránce cen a prompt žádá schválení před útratou.

Související workflowy

Přizpůsobte

Stejný recept, upravený podle toho, jak skutečně dodáváte.

Jen klasifikace

Bez odpovědi: jen záměr, priorita a doporučená fronta.

Připojte k ticket systému

Svým webhookem zapište balíček do ticketu bez automatického odeslání.

Rozšiřte na znalostní bázi

Při výsledcích dokumentace přejděte do workflow znalostní báze pro plnější odpověď.

Referenční stránky za tímto receptem a další kroky.