Felo API PlatformFelo API Platform

Dukungan

Triase tiket dukungan menjadi draf jawaban berdasar

Masker tiket, klasifikasikan niat dan prioritas dengan Chat, ambil bagian yang menjawab dari dokumentasi, periksa percakapan insiden publik, dan tinggalkan draf terarah untuk persetujuan manusia.

Waktu20 menitTingkatMenengahDiperbarui2026-10-30
Untuk siapaPemimpin dukunganHelpdesk AgentEngineer dukungan

Salin prompt

Ganti kolom dalam kurung siku lalu tempel ke Claude Code, Codex, atau AI dengan akses terminal. Ia memasang skill Felo, bertanya sebelum memakai kredit, dan menjalankan alur kerja.

Triage tiket dukungan ini dan tulis draf balasan untuk ditinjau manusia: [tempel tiket setelah menghapus nama, email, ID akun, data pembayaran, dan informasi pengenal lain].

Area produk: [produk]. Paket atau wilayah: [hanya jika perlu untuk jawaban]. Sumber dokumentasi: [URL pusat bantuan atau LiveDoc short_id].
Jalur persetujuan: [siapa yang meninjau]. Antrean eskalasi: [tim atau kanal].

Hasilkan:
1. Niat: satu kategori dan satu kalimat alasan.
2. Prioritas: mendesak / normal / rendah, dengan aturan yang diterapkan.
3. Bukti: bagian dokumentasi yang menjawab tiket, dengan judul dan relevansi.
4. Pemeriksaan insiden: apakah laporan publik menunjukkan gangguan luas? Tautan dan tanggal, atau “tidak ada sinyal publik”.
5. Routing: draf, minta informasi tambahan, atau eskalasi — dan alasannya.
6. Draf balasan: dua sampai empat kalimat, hanya berdasarkan bukti, sebutkan sumber yang dipakai.

Aturan:
- Jangan memasukkan nama, email, nomor pesanan, token, atau data pembayaran ke panggilan API atau output. Kerjakan hanya tiket yang sudah disamarkan.
- Jawab hanya dari dokumentasi yang diambil. Tanpa bukti, eskalasi alih-alih menebak.
- Jangan menjanjikan pengembalian dana, diskon, tenggat, atau perubahan akun; teruskan kasus itu ke eskalasi.
- Rumor gangguan publik adalah sinyal, bukan bukti. Kutip unggahan dan tanggal.
- Sebelum memakai kredit, tampilkan panggilan yang direncanakan dan tunggu persetujuan saya.
- Jangan mengirim balasan, memperbarui tiket, atau melakukan tindakan akun. Kembalikan draf untuk ditinjau.
- Tulis hasilnya ke ./support-triage.md dan ringkas di chat.

Salinan juga menyertakan langkah pemasangan dan aturan keamanan.

Yang Anda dapatkan

Contoh keluaran dari satu eksekusi. Bukan pembuatan langsung.

Contoh triase (kutipan)

Triase — tiket contoh

Niat

Pertanyaan penagihan / perpanjangan. Pelanggan bertanya mengapa paket diperpanjang lagi.

Prioritas

Normal. Ini pertanyaan penagihan, bukan gangguan, dan pelanggan tidak terblokir.

Bukti

  • “pertanyaan umum penagihan” — waktu perpanjangan dan retry kartu gagal. Relevansi: tinggi.
  • “Perubahan paket” — downgrade antar perpanjangan. Relevansi: sedang.

Pemeriksaan insiden

Tidak ada laporan publik dalam 48 jam terakhir.

Rute

Draf. Dokumentasi mencakup pertanyaan.

Draf balasan

Halo — paket Anda diperpanjang pada tanggal 1 setiap bulan, dan kartu yang gagal dicoba lagi selama tiga hari sebelum kursi dijeda. Anda dapat mengganti kartu di pengaturan Penagihan; pertanyaan umum penagihan memiliki langkahnya. Jika perlu memindahkan tanggal perpanjangan, balas dan kami akan meneruskannya ke tim penagihan.

Catatan peninjau

Setujui, sunting, atau eskalasi ke antrean penagihan.

Panggilan persisnya

Untuk developer: alur kerja yang sama sebagai kode, sesuai urutan eksekusi.

Tampilkan panggilan API asli
  1. Masker dan klasifikasikan

    Hapus email, telepon, dan nomor pesanan lewat kode, lalu gunakan Chat untuk niat dan prioritas.

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

    Contoh keluaran

    {
      "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. Ambil bukti dokumentasi

    Cari bagian relevan di LiveDoc dukungan, simpan judul dan skor.

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

    Contoh keluaran

    [
      {
        "title": "Billing FAQ",
        "content": "Your plan renews on the first of the month; a failed card retries for three days…",
        "score": 0.91
      }
    ]
  3. Periksa insiden publik

    Cari di X produk dan kata seperti “gangguan/offline” dalam 48 jam, hanya sebagai sinyal publik.

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

    Contoh keluaran

    [
      {
        "text": "Workspace login is failing for my whole team.",
        "handle": "example_user",
        "at": "2026-10-30",
        "link": "https://x.com/example_user/status/..."
      }
    ]
  4. Tentukan rute dan susun jawaban

    Aturan menentukan antrean; gabungkan bukti, langkah berikutnya, dan draf.

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

    Contoh keluaran

    # 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. Catat triase

    Tulis hasilnya di LiveDoc untuk tinjauan dan 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

    Contoh keluaran

    { "short_id": "PvyKouzJirXjFdst4uKRK3" }

Termasuk

  • Niat dan prioritas setelah masking
  • Bukti dokumentasi dengan skor
  • Pemeriksaan insiden publik
  • Draf jawaban terarah
  • LiveDoc berisi catatan triase

Yang tidak dilakukan

  • Tidak mengirim jawaban, menutup tiket, atau menjalankan tindakan akun
  • Jangan kirim kata sandi, data pembayaran, atau data pelanggan lengkap ke API
  • Tanpa hasil dokumentasi, eskalasi wajib
  • X adalah sinyal insiden publik, bukan status sistem dukungan
  • Aturan prioritas milik Anda; model hanya mengusulkan

Pertanyaan

Data tiket apa yang boleh dikirim?

Hanya konteks perlu setelah masking: produk, deskripsi, paket, dan wilayah. Tanpa kata sandi, pembayaran, alamat lengkap, atau percakapan privat.

Dari mana jawabannya?

Dari bagian yang diambil di LiveDoc dokumentasi. Tanpa hasil, alur eskalasi alih-alih menebak.

Apakah menjawab atau menutup tiket?

Tidak. Hanya membuat draf dan rute; pengiriman dan penutupan oleh orang atau sistem Anda.

Bagaimana prioritas ditentukan?

Oleh aturan Anda; model mengusulkan dan menjelaskan, rute mengonfirmasi prioritas akhir.

Jika dokumentasi tidak mencakup?

Eskalasi ke antrean manusia dengan “belum tercakup” di paket triase.

Berapa biaya satu triase?

Chat, pencarian, dan X Search ditagih sesuai pemakaian; tarif saat ini di halaman harga dan prompt meminta persetujuan sebelum mengeluarkan biaya.

Alur kerja terkait

Sesuaikan

Resep yang sama, disesuaikan dengan cara Anda benar-benar mengirim.

Hanya klasifikasi

Tanpa jawaban: hanya niat, prioritas, dan antrean yang disarankan.

Hubungkan ke sistem tiket

Dengan webhook Anda, tulis paket ke tiket tanpa pengiriman otomatis.

Lanjut ke basis pengetahuan

Saat ada hasil dokumentasi, lanjut ke alur basis pengetahuan untuk jawaban lengkap.

Halaman referensi di balik resep ini dan langkah berikutnya.