Wsparcie
Odpowiadaj na pytania wsparcia z własnej dokumentacji
Utwórz LiveDoc, wczytaj centrum pomocy i wewnętrzny runbook, pobierz fragmenty odpowiadające ticketowi i pozwól modelowi odpowiadać tylko z tych dowodów.
Skopiuj prompt
Podmień pola w nawiasach kwadratowych i wklej do Claude Code, Codex albo AI z dostępem do terminala. Instaluje skill Felo, pyta przed wydaniem kredytów i uruchamia workflow.
Odpowiedz na to pytanie wsparcia wyłącznie na podstawie naszej dokumentacji: [pytanie klienta]. Baza wiedzy: [URL centrum pomocy lub LiveDoc short_id]. Ścieżka eskalacji: [osoba odpowiedzialna lub kolejka]. Dostępny kontekst klienta: [plan, region, produkt] (nigdy nie proś o hasło ani dane płatności). Przygotuj: 1. Bezpośrednią odpowiedź w dwóch do czterech zdaniach. 2. Fragmenty dokumentacji, które ją wspierają, z tytułem zasobu. 3. Następny krok dla klienta. 4. Notatkę wewnętrzną: użyte zasoby i oceny trafności. Zasady: - Odpowiadaj tylko z pobranych fragmentów. Brak wyników lub niska trafność oznacza eskalację; nigdy nie zgaduj. - Nie wymyślaj polityk, zwrotów, cen ani działań na koncie. - Nie wprowadzaj prywatnych danych klienta, poświadczeń ani informacji o płatnościach. - Pytaj przed zużyciem kredytów na ingestię lub wyszukiwanie. - Nie wysyłaj odpowiedzi do klienta; zwróć ją mnie do przeglądu.
Kopia zawiera też kroki instalacji i zasady bezpieczeństwa.
Co otrzymujesz
Przykładowy wynik jednego uruchomienia. Nie generowanie na żywo.
Odpowiedź: Twój plan odnawia się pierwszego dnia miesiąca. Odrzucona karta jest ponawiana przez trzy dni, zanim miejsce zostanie wstrzymane.
Źródła: „najczęstsze pytania o rozliczenia” - https://example.com/help/billing
Jeśli to nie obejmuje: eskaluj do kolejki rozliczeń z ID faktury.
Dokładne wywołania
Dla deweloperów: ten sam workflow jako kod, w kolejności wykonania.
Pokaż rzeczywiste wywołania API
Utwórz bazę wiedzy
Utwórz bazę przez LiveDoc API i zapisz short_id.
support.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>; } type LiveDocData = { data: { short_id: string } }; const kb = await felo<LiveDocData>("/v2/livedocs", { name: "Support knowledge base", description: "Help center, policy pages, and internal runbooks", }); const kbId = kb.data.short_id; // save this in your configPrzykładowy wynik
{ "short_id": "PvyKouzJirXjFdst4uKRK3", "name": "Support knowledge base", "description": "Help center, policy pages, and internal runbooks" }Wczytaj publiczne centrum pomocy
Dodaj URL centrum pomocy jako zasób LiveDoc.
support.ts type UrlResult = { data: { url: string; status: string; fail_reason: string | null; resource_id: string | null; }[]; }; const added = await felo<UrlResult>( `/v2/livedocs/${kbId}/resources/urls`, { urls: [ "https://example.com/help/getting-started", { url: "https://example.com/help/billing", title: "Billing FAQ" }, ], }, ); const failed = added.data.filter((item) => item.status === "failed");Przykładowy wynik
[ { "url": "https://example.com/help/getting-started", "status": "success", "resource_id": "res_003" }, { "url": "https://example.com/help/billing", "status": "existed", "resource_id": "res_004" } ]Dodaj dokumentację wewnętrzną
Dodaj wewnętrzny runbook jako dokument.
support.ts type ResourceData = { data: { id: string } }; const runbook = `# Refund policy Refunds are available within 30 days of purchase. Requests after 30 days need a manual review by the billing team. `; const policy = await felo<ResourceData>( `/v2/livedocs/${kbId}/resources/doc`, { title: "Refund policy", content: runbook }, ); console.log(policy.data.id); // use this for updatesPobierz dowody na pytanie
Wyszukiwanie semantyczne zwraca najtrafniejsze fragmenty i wyniki.
support.ts type Hit = { id: string; title: string; content: string; score: number }; async function findEvidence(question: string) { const res = await felo<{ data: Hit[] }>( `/v2/livedocs/${kbId}/resources/retrieve`, { query: question }, ); return res.data.filter((hit) => hit.score >= 0.7).slice(0, 4); } const question = "Can I get a refund after 45 days?"; const hits = await findEvidence(question);Przykładowy wynik
[ { "id": "res_005", "title": "Refund policy", "content": "Refunds are available within 30 days of purchase…", "score": 0.92 } ]Odpowiadaj tylko z dowodów
Pozwól modelowi użyć tylko pobranych fragmentów i eskaluj bez wyników.
support.ts type Completion = { choices: { message: { content: string | null } }[]; usage: { prompt_tokens: number; completion_tokens: number; total_tokens: number }; }; const context = hits .map((hit) => `### ${hit.title}\n${hit.content}`) .join("\n\n"); const completion = await felo<Completion>("/api/v1/chat/completions", { model: "anthropic/claude-haiku-5.5", messages: [ { role: "system", content: "Answer only from the context. If the context does not cover the question, say so and hand the ticket to a human.", }, { role: "user", content: `Context:\n${context}\n\nQuestion: ${question}`, }, ], }); console.log(completion.choices[0].message.content); console.log(completion.usage.total_tokens);Przykładowy wynik
"No. The Refund policy says refunds are available within 30 days of purchase, so a request at 45 days needs a manual review by the billing team."
Co zawiera
- LiveDoc z centrum pomocy i wewnętrznym runbookiem
- Wyszukiwanie semantyczne z fragmentami i tytułami
- Odpowiedź z cytowalnymi źródłami
- Jasna eskalacja przy braku pokrycia
Czego nie robi
- Odpowiada tylko z twojej dokumentacji i nie przegląda otwartego webu
- Nie wykonuje działań na koncie, zwrotów ani zmian planu
- Bez prywatnych danych klientów i danych logowania w bazie
- Nieaktualna dokumentacja daje nieaktualne odpowiedzi; aktualizuj ją
- Tylko szkic odpowiedzi, bez wysyłki do klienta
Pytania
Skąd odpowiedź?
Tylko z twojego LiveDoc: stron centrum pomocy i runbooka. Wyszukiwanie zwraca fragmenty, a agent pisze z nich.
Jeśli dokumentacja nie pokrywa?
Eskalacja. Brak wyników lub niska trafność są traktowane jako brak pokrycia, nie pozwolenie na zgadywanie.
Jak utrzymać bazę aktualną?
Gdy zmienia się polityka, dodaj ponownie URL-e i zaktualizuj dokumenty; workflow zawiera polecenia aktualizacji i audytu.
Czy można użyć w kolejce ticketów?
Tak, jako krok szkicu. Zachowaj ludzkie zatwierdzenie przed wysyłką do klienta.
Czy obsługuje pytania o konto?
Tylko z dokumentacją nie. Dane konta są w twoim systemie; przekazuj tylko potrzebny bezpieczny kontekst, nigdy dane logowania.
Ile kosztuje jedno uruchomienie?
Ingestia i wyszukiwanie są rozliczane według użycia; aktualne stawki na stronie cen, a prompt pyta o zgodę przed wydaniem.
Powiązane workflowy
Zamień jedno pytanie w brief badawczy ze źródłami
Zapytaj web, zapisz strony stojące za odpowiedzią jako Markdown, dodaj to, co mówią praktycy na X, i zachowaj dowody w LiveDoc, który można później przeszukać.
Otwórz workflowTreściPublikuj codzienny digest AI, który zespół naprawdę czyta
Weź podsumowanie ze źródłami, dodaj rozmowy praktyków na X, pobierz transkrypt wideo, złóż wydanie w Markdown i zarchiwizuj w LiveDoc.
Otwórz workflowBiuroZamień stronę badawczą w prezentację
Wyekstrahuj stronę, zapisz jako kontekst LiveDoc, pozwól PPT Task API zbudować deck i pytaj, aż link będzie gotowy.
Otwórz workflowDostosuj
Ta sama receptura, dopasowana do tego, jak naprawdę dostarczasz.
Tylko jedna linia produktu
Ogranicz do jednego produktu, by baza była czystsza.
Dodaj klasyfikację ticketów
Najpierw klasyfikuj typ pytania, potem szukaj właściwej dokumentacji.
Okresowy audyt
Co miesiąc sprawdzaj zepsute linki i stare polityki.
Idź dalej
Strony referencyjne za tą recepturą i kolejne kroki.