Поддержка
Отвечайте на вопросы поддержки по своей документации
Создайте LiveDoc, загрузите справочный центр и внутренний runbook, найдите фрагменты, отвечающие на тикет, и позвольте модели отвечать только по этим доказательствам.
Скопировать промпт
Замените поля в квадратных скобках и вставьте в Claude Code, Codex или любой AI с доступом к терминалу. Он установит навык Felo, спросит перед списанием кредитов и выполнит процесс.
Ответь на этот вопрос поддержки, используя только нашу документацию: [вопрос клиента]. База знаний: [URL справочного центра или LiveDoc short_id]. Путь эскалации: [ответственный или очередь]. Доступный контекст клиента: [план, регион, продукт] (никогда не запрашивай пароль или платёжные данные). Подготовь: 1. Прямой ответ на два-четыре предложения. 2. Подтверждающие фрагменты документации с названием ресурса. 3. Следующий шаг для клиента. 4. Внутреннюю заметку: использованные ресурсы и оценки релевантности. Правила: - Отвечай только по найденным фрагментам. Если ничего не найдено или релевантность низкая, эскалируй; никогда не угадывай. - Не выдумывай политику, возвраты, цены и действия с аккаунтом. - Не подключай приватные данные клиента, учётные данные или платёжную информацию. - Спрашивай перед расходом кредитов на загрузку данных или поиск. - Не отправляй ответ клиенту; верни его мне на проверку.
В копию также входят шаги установки и правила безопасности.
Что получится
Пример вывода одного запуска. Не живая генерация.
Ответ: Ваш план продлевается первого числа месяца. При ошибке карты списание повторяется три дня, затем место приостанавливается.
Источники: «частые вопросы по оплате» - https://example.com/help/billing
Если это не покрыто: эскалируйте в очередь оплаты с ID счёта.
Реальные вызовы
Для разработчиков: тот же процесс в виде кода в порядке выполнения.
Показать реальные вызовы API
Создайте базу знаний
Создайте базу через LiveDoc API и сохраните 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 configПример вывода
{ "short_id": "PvyKouzJirXjFdst4uKRK3", "name": "Support knowledge base", "description": "Help center, policy pages, and internal runbooks" }Загрузите публичный справочный центр
Добавьте URL справочного центра как ресурс 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");Пример вывода
[ { "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" } ]Добавьте закрытую документацию
Добавьте внутренний runbook как документ.
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 updatesНайдите доказательства по вопросу
Семантический поиск возвращает самые релевантные фрагменты и оценки.
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);Пример вывода
[ { "id": "res_005", "title": "Refund policy", "content": "Refunds are available within 30 days of purchase…", "score": 0.92 } ]Ответьте только по доказательствам
Модель использует только найденные фрагменты и эскалирует, если попаданий нет.
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);Пример вывода
"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."
Что входит
- LiveDoc из справочного центра и внутреннего runbook
- Семантический поиск с фрагментами и заголовками
- Ответ с цитируемыми источниками
- Явная эскалация, когда документации не хватает
Чего не делает
- Отвечает только по вашей документации и не выходит в открытый веб
- Не выполняет действия с аккаунтом, возвраты и смену плана
- Нельзя загружать приватные данные клиентов и учётные данные
- Устаревшая документация даёт устаревшие ответы; обновляйте базу
- Только черновик ответа, без отправки клиенту
Вопросы
Откуда берётся ответ?
Только из вашего LiveDoc: страниц справочного центра и runbook. Поиск возвращает фрагменты, и agent пишет ответ по ним.
Что если документация не покрывает вопрос?
Эскалация. Отсутствие попаданий или низкая релевантность считается отсутствием покрытия, а не разрешением угадывать.
Как поддерживать базу актуальной?
При изменении политик заново добавляйте URL и обновляйте документы; в процессе есть команды обновления и аудита.
Можно встроить в очередь тикетов?
Да, как шаг черновика. Перед отправкой клиенту оставьте ручное утверждение.
Можно отвечать на вопросы по аккаунту?
Только по документации нельзя. Данные аккаунта в вашей системе; передавайте только безопасный контекст, никогда — учётные данные.
Сколько стоит запуск?
Загрузка и поиск оплачиваются по факту использования; актуальные тарифы на странице цен, промпт просит одобрение до трат.
Связанные процессы
Превратите один вопрос в исследовательский бриф с источниками
Спросите веб, сохраните страницы, на которых основан ответ, как Markdown, добавьте мнения практиков из X и оставьте доказательства в LiveDoc, который можно будет искать позже.
Открыть рабочий процессКонтентВыпускайте ежедневный AI-дайджест, который команда действительно читает
Получите подборку новостей с источниками, добавьте обсуждения практиков в X, загрузите один транскрипт видео, соберите выпуск в Markdown и сохраните его в LiveDoc.
Открыть рабочий процессОфисПревратите исследовательскую страницу в презентацию
Извлеките страницу, сохраните её как контекст LiveDoc, затем дайте PPT Task API собрать deck и опрашивайте задачу до готовой ссылки.
Открыть рабочий процессАдаптируйте под себя
Тот же рецепт, подстроенный под ваш реальный процесс.
Только одна продуктовая линейка
Сузьте до одного продукта, чтобы база была чище.
Добавьте классификацию тикетов
Сначала классифицируйте вопрос, затем ищите по нужному разделу.
Регулярный аудит
Раз в месяц проверяйте битые ссылки и устаревшие политики.
Продолжить
Справочные страницы этого рецепта и куда двигаться дальше.