Felo API PlatformFelo API Platform

Підтримка

Тріажте тікет підтримки в обґрунтовану чернетку відповіді

Замаскуйте тікет, класифікуйте намір і пріоритет із Chat, отримайте уривки з документації, перевірте публічні обговорення інциденту й залиште маршрутизовану чернетку для людського схвалення.

Час20 хвилинРівеньСереднійОновлено2026-10-30
Для когоЛідери підтримкиHelpdesk AgentІнженери підтримки

Скопіювати промпт

Замініть поля в квадратних дужках і вставте в Claude Code, Codex або AI з доступом до термінала. Він встановить скіл Felo, запитає перед витратою кредитів і запустить процес.

Зроби тріаж цього тікета підтримки й підготуй чернетку відповіді для людської перевірки: [встав тікет після видалення імені, email, ID акаунта, платіжних даних та іншої ідентифікуючої інформації].

Галузь продукту: [продукт]. План або регіон: [лише якщо потрібно для відповіді]. Джерело документації: [URL довідкового центру або LiveDoc short_id].
Шлях схвалення: [хто перевіряє]. Черга ескалації: [команда або канал].

Створи:
1. Намір: одна категорія й одне речення обґрунтування.
2. Пріоритет: терміновий / звичайний / низький, із застосованим правилом.
3. Докази: фрагменти документації, що відповідають на тікет, із назвою й релевантністю.
4. Перевірку інциденту: чи публічні звіти вказують на масштабний збій? Посилання й дата, або «публічних сигналів немає».
5. Маршрут: чернетка, запит додаткової інформації або ескалація — і чому.
6. Чернетку відповіді: два-чотири речення, лише на доказах, із зазначенням використаного джерела.

Правила:
- Не додавай імена, email, номери замовлень, токени чи платіжні дані у виклики API або вивід. Працюй лише з маскованим тікетом.
- Відповідай лише з отриманої документації. Без доказів ескалюй, а не вгадуй.
- Не обіцяй повернення коштів, знижки, терміни чи зміни акаунта; такі випадки передавай на ескалацію.
- Публічні чутки про збій — це сигнал, а не доказ. Цитуй допис і дату.
- Перед витратою кредитів покажи заплановані виклики й дочекайся мого схвалення.
- Не надсилай відповідь, не оновлюй тікет і не виконуй дії з акаунтом. Поверни чернетку на перевірку.
- Запиши результат у ./support-triage.md і підсумуй його в чаті.

Копія також містить кроки встановлення й правила безпеки.

Що ви отримаєте

Приклад результату одного запуску. Не живе генерування.

Приклад тріажу (фрагмент)

Тріаж — приклад тікета

Намір

Питання оплати / поновлення. Клієнт питає, чому план знову поновився.

Пріоритет

Звичайний. Це питання оплати, не збій, і клієнт не заблокований.

Докази

  • «часті запитання з оплати» — час поновлення й повтори картки. Релевантність: висока.
  • «Зміни плану» — зниження між поновленнями. Релевантність: середня.

Перевірка інцидентів

Публічних повідомлень за останні 48 годин немає.

Маршрут

Чернетка. Документація покриває питання.

Чернетка відповіді

Вітаю — ваш план поновлюється першого числа місяця, а відхилена картка повторюється три дні, потім місце призупиняється. Картку можна змінити в налаштуваннях оплати; у часті запитання з оплати є кроки. Якщо потрібно перенести дату поновлення, відповідайте, і ми ескалуємо до команди оплати.

Нотатка для рецензента

Схвалити, відредагувати або ескалювати до черги оплати.

Точні виклики

Для розробників: той самий процес як код, у порядку виконання.

Показати справжні виклики API
  1. Замаскуйте й класифікуйте

    Приберіть кодом email, телефон і номер замовлення, потім використайте Chat для наміру й пріоритету.

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

    Приклад результату

    {
      "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. Отримайте докази з документації

    Шукайте релевантні уривки в LiveDoc підтримки, зберігаючи заголовки й оцінки.

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

    Приклад результату

    [
      {
        "title": "Billing FAQ",
        "content": "Your plan renews on the first of the month; a failed card retries for three days…",
        "score": 0.91
      }
    ]
  3. Перевірте публічний інцидент

    Шукайте на X продукт і слова як «збій/офлайн» за 48 годин, лише як публічний сигнал.

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

    Приклад результату

    [
      {
        "text": "Workspace login is failing for my whole team.",
        "handle": "example_user",
        "at": "2026-10-30",
        "link": "https://x.com/example_user/status/..."
      }
    ]
  4. Визначте маршрут і складіть відповідь

    Правила визначають чергу; упакуйте докази, наступний крок і чернетку.

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

    Приклад результату

    # 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. Запишіть тріаж

    Запишіть результат у LiveDoc для огляду й аудиту.

    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

    Приклад результату

    { "short_id": "PvyKouzJirXjFdst4uKRK3" }

Що входить

  • Намір і пріоритет після маскування
  • Докази з документації з оцінками
  • Перевірка публічного інциденту
  • Маршрутизована чернетка відповіді
  • LiveDoc із записом тріажу

Чого не робить

  • Не надсилає відповідь, не закриває тікет і не виконує дій з акаунтом
  • Не надсилайте в API паролі, платіжні дані чи повні дані клієнта
  • Без результату документації ескалація обов’язкова
  • X — публічний сигнал інциденту, не статус системи підтримки
  • Правила пріоритету ваші; модель лише пропонує

Запитання

Які дані тікета можна надіслати?

Лише потрібний контекст після маскування: продукт, опис, план і регіон. Без паролів, платежів, повної адреси й приватної розмови.

Звідки відповідь?

З уривків, отриманих у LiveDoc документації. Без результатів процес ескалує замість вгадувати.

Чи відповідає або закриває тікет?

Ні. Створює лише чернетку й маршрут; надсилання та закриття робить людина або ваша система.

Як визначається пріоритет?

Вашими правилами; модель пропонує й обґрунтовує, маршрут підтверджує фінальний пріоритет.

Якщо документація не покриває?

Ескалація до людської черги з «не покрито» в пакеті тріажу.

Скільки коштує один тріаж?

Chat, пошук і X Search оплачуються за використання; актуальні тарифи на сторінці цін, а промпт просить схвалення перед витратою.

Пов’язані процеси

Адаптуйте

Той самий рецепт, підлаштований під те, як ви насправді працюєте.

Лише класифікація

Без відповіді: лише намір, пріоритет і рекомендована черга.

Підключіть до системи тікетів

Своїм webhook запишіть пакет у тікет без автоматичного надсилання.

Розширте до бази знань

За наявності результатів документації перейдіть у процес бази знань для повнішої відповіді.

Довідкові сторінки за цим рецептом і наступні кроки.