Felo API PlatformFelo API Platform

Sokongan

Triaj tiket sokongan kepada draf jawapan berasas

Masker tiket, klasifikasikan niat dan keutamaan dengan Chat, ambil bahagian yang menjawab dari dokumentasi, semak perbualan insiden awam dan tinggalkan draf dihalakan untuk kelulusan manusia.

Masa20 minitTahapPertengahanDikemas kini2026-10-30
Untuk siapaKetua sokonganHelpdesk AgentJurutera sokongan

Salin prompt

Ganti medan dalam kurungan siku lalu tampal ke Claude Code, Codex atau AI dengan akses terminal. Ia memasang skill Felo, bertanya sebelum kredit digunakan dan menjalankan aliran kerja.

Triage tiket sokongan ini dan tulis draf balasan untuk semakan manusia: [tampal tiket selepas membuang nama, e-mel, ID akaun, data pembayaran dan maklumat pengenalan lain].

Bidang produk: [produk]. Pelan atau wilayah: [hanya jika perlu untuk jawapan]. Sumber dokumentasi: [URL pusat bantuan atau LiveDoc short_id].
Laluan kelulusan: [siapa semak]. Baris gilir eskalasi: [pasukan atau saluran].

Hasilkan:
1. Niat: satu kategori dan satu ayat sebab.
2. Keutamaan: segera / biasa / rendah, dengan peraturan digunakan.
3. Bukti: petikan dokumentasi yang menjawab tiket, dengan tajuk dan kaitan.
4. Semakan insiden: adakah laporan awam menunjukkan gangguan luas? Pautan dan tarikh, atau “tiada isyarat awam”.
5. Penghalaan: draf, minta maklumat tambahan atau eskalasi — dan mengapa.
6. Draf balasan: dua hingga empat ayat, hanya berdasarkan bukti, menyebut sumber yang digunakan.

Peraturan:
- Jangan masukkan nama, e-mel, nombor pesanan, token atau data pembayaran dalam panggilan API atau output. Bekerja hanya dengan tiket yang disamarkan.
- Jawab hanya daripada dokumentasi yang diambil. Tanpa bukti, eskalasi dan jangan meneka.
- Jangan janji bayaran balik, diskaun, had masa atau perubahan akaun; hantar kes itu ke eskalasi.
- Khabar angin gangguan awam ialah isyarat, bukan bukti. Petik siaran dan tarikh.
- Sebelum menggunakan kredit, tunjukkan panggilan yang dirancang dan tunggu kelulusan saya.
- Jangan hantar balasan, kemas kini tiket atau lakukan tindakan akaun. Kembalikan draf untuk semakan.
- Tulis hasil ke ./support-triage.md dan ringkaskan dalam chat.

Salinan turut menyertakan langkah pemasangan dan peraturan keselamatan.

Apa yang anda dapat

Contoh output daripada satu larian. Bukan penjanaan langsung.

Contoh triaj (petikan)

Triaj — tiket contoh

Niat

Soalan bil / pembaharuan. Pelanggan bertanya mengapa pelan diperbaharui lagi.

Keutamaan

Biasa. Ini soalan bil, bukan gangguan, dan pelanggan tidak tersekat.

Bukti

  • “soalan lazim bil” — masa pembaharuan dan cubaan semula kad gagal. Perkaitan: tinggi.
  • “Perubahan pelan” — turun taraf antara pembaharuan. Perkaitan: sederhana.

Semakan insiden

Tiada laporan awam dalam 48 jam lepas.

Laluan

Draf. Dokumentasi meliputi soalan.

Draf balasan

Hai — pelan anda diperbaharui pada 1 haribulan, dan kad yang gagal dicuba semula selama tiga hari sebelum tempat duduk dijeda. Anda boleh tukar kad dalam tetapan Bil; soalan lazim bil ada langkahnya. Jika perlu alih tarikh pembaharuan, balas dan kami akan eskalasi ke pasukan bil.

Nota penyemak

Lulus, sunting, atau eskalasi ke baris gilir bil.

Panggilan sebenar

Untuk pembangun: aliran kerja sama sebagai kod, mengikut urutan pelaksanaan.

Tunjukkan panggilan API sebenar
  1. Masker dan klasifikasikan

    Buang e-mel, telefon dan nombor pesanan melalui kod, kemudian guna Chat untuk niat dan keutamaan.

    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 output

    {
      "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 bahagian relevan dalam LiveDoc sokongan, simpan tajuk 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 output

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

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

    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 output

    [
      {
        "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 laluan dan susun jawapan

    Peraturan menentukan baris gilir; gabungkan bukti, langkah seterusnya 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 output

    # 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. Rekod triaj

    Tulis hasil dalam LiveDoc untuk semakan 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 output

    { "short_id": "PvyKouzJirXjFdst4uKRK3" }

Termasuk

  • Niat dan keutamaan selepas masking
  • Bukti dokumentasi dengan skor
  • Semakan insiden awam
  • Draf jawapan dihalakan
  • LiveDoc dengan rekod triaj

Apa yang tidak dilakukan

  • Tidak menghantar jawapan, menutup tiket atau menjalankan tindakan akaun
  • Jangan hantar kata laluan, data bayaran atau data pelanggan penuh ke API
  • Tanpa hasil dokumentasi, eskalasi wajib
  • X ialah isyarat insiden awam, bukan status sistem sokongan
  • Peraturan keutamaan milik anda; model hanya mencadang

Soalan

Data tiket apa boleh dihantar?

Hanya konteks perlu selepas masking: produk, penerangan, pelan dan wilayah. Tiada kata laluan, bayaran, alamat penuh atau perbualan peribadi.

Dari mana jawapannya?

Dari bahagian diambil dalam LiveDoc dokumentasi. Tanpa hasil, aliran eskalasi daripada meneka.

Adakah ia menjawab atau menutup tiket?

Tidak. Hanya membuat draf dan laluan; penghantaran dan penutupan oleh orang atau sistem anda.

Bagaimana keutamaan ditentukan?

Oleh peraturan anda; model mencadang dan menjelaskan, laluan mengesahkan keutamaan akhir.

Jika dokumentasi tidak meliputi?

Eskalasi ke baris gilir manusia dengan “belum diliputi” dalam pakej triaj.

Berapa kos satu triaj?

Chat, carian dan X Search dibilkan mengikut penggunaan; kadar semasa di halaman harga dan prompt meminta kelulusan sebelum berbelanja.

Aliran kerja berkaitan

Sesuaikan

Resipi sama, disesuaikan dengan cara anda benar-benar menyampaikan.

Klasifikasi sahaja

Tanpa jawapan: hanya niat, keutamaan dan baris gilir dicadang.

Sambung ke sistem tiket

Dengan webhook anda, tulis pakej ke tiket tanpa penghantaran automatik.

Lanjut ke pangkalan pengetahuan

Apabila ada hasil dokumentasi, lanjut ke aliran pangkalan untuk jawapan lebih lengkap.

Halaman rujukan di sebalik resipi ini dan langkah seterusnya.