Felo API PlatformFelo API Platform

Hỗ trợ

Trả lời câu hỏi hỗ trợ từ tài liệu của chính bạn

Tạo LiveDoc, tải trung tâm trợ giúp và runbook nội bộ, lấy các đoạn trả lời ticket và để model chỉ trả lời từ bằng chứng đó.

Thời gian20 phútMứcCơ bảnCập nhật2026-10-29
Dành cho aiNhóm hỗ trợThành công khách hàngNgười xây helpdesk

Sao chép prompt

Thay các trường trong ngoặc vuông rồi dán vào Claude Code, Codex hoặc AI có quyền truy cập terminal. Nó cài skill Felo, hỏi trước khi dùng credit và chạy quy trình.

Trả lời câu hỏi hỗ trợ này chỉ bằng tài liệu của chúng ta: [câu hỏi của khách hàng].

Cơ sở kiến thức: [URL trung tâm trợ giúp hoặc LiveDoc short_id]. Đường chuyển cấp: [người phụ trách hoặc hàng đợi].
Ngữ cảnh khách hàng có sẵn: [gói, khu vực, sản phẩm] (không bao giờ hỏi mật khẩu hay dữ liệu thanh toán).

Tạo:
1. Câu trả lời trực tiếp trong hai đến bốn câu.
2. Các đoạn tài liệu làm căn cứ, kèm tên tài nguyên.
3. Bước tiếp theo cho khách hàng.
4. Ghi chú nội bộ: tài nguyên đã dùng và điểm liên quan.

Quy tắc:
- Chỉ trả lời từ các đoạn đã truy xuất. Không có kết quả hoặc độ liên quan thấp thì chuyển cấp; không bao giờ đoán.
- Không bịa chính sách, hoàn tiền, giá hay thao tác tài khoản.
- Không đưa dữ liệu riêng tư của khách, thông tin đăng nhập hay thông tin thanh toán vào.
- Hỏi trước khi tiêu tín dụng cho nạp dữ liệu hoặc truy xuất.
- Không gửi câu trả lời cho khách; trả lại cho tôi để xem xét.

Bản sao cũng gồm các bước cài đặt và quy tắc an toàn.

Bạn nhận được gì

Kết quả mẫu của một lần chạy. Không phải tạo trực tiếp.

Ví dụ câu trả lời (trích)

Trả lời: Gói của bạn gia hạn vào ngày 1 hàng tháng. Thẻ bị từ chối sẽ được thử lại ba ngày trước khi chỗ ngồi tạm dừng.

Nguồn: “câu hỏi thường gặp về thanh toán” - https://example.com/help/billing

Nếu chưa được đề cập: chuyển lên hàng đợi thanh toán kèm ID hóa đơn.

Các lệnh gọi chính xác

Dành cho lập trình viên: cùng quy trình dưới dạng mã, theo thứ tự chạy.

Hiện lệnh gọi API thật
  1. Tạo cơ sở tri thức

    Tạo cơ sở qua LiveDoc API và lưu 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

    Kết quả mẫu

    {
      "short_id": "PvyKouzJirXjFdst4uKRK3",
      "name": "Support knowledge base",
      "description": "Help center, policy pages, and internal runbooks"
    }
  2. Tải trung tâm trợ giúp công khai

    Thêm URL trung tâm trợ giúp làm tài nguyên 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");

    Kết quả mẫu

    [
      { "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" }
    ]
  3. Thêm tài liệu nội bộ

    Thêm runbook nội bộ làm tài liệu.

    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
  4. Lấy bằng chứng cho câu hỏi

    Tìm kiếm ngữ nghĩa trả các đoạn và điểm liên quan nhất.

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

    Kết quả mẫu

    [
      {
        "id": "res_005",
        "title": "Refund policy",
        "content": "Refunds are available within 30 days of purchase…",
        "score": 0.92
      }
    ]
  5. Chỉ trả lời từ bằng chứng

    Cho model chỉ dùng đoạn đã lấy và escalation khi không có kết quả.

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

    Kết quả mẫu

    "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."

Bao gồm

  • LiveDoc từ trung tâm trợ giúp và runbook nội bộ
  • Tìm kiếm ngữ nghĩa với đoạn và tiêu đề
  • Câu trả lời có nguồn trích được
  • Escalation rõ khi thiếu độ phủ

Không làm gì

  • Chỉ trả lời từ tài liệu của bạn và không duyệt web mở
  • Không thực hiện thao tác tài khoản, hoàn tiền hay đổi gói
  • Không đưa dữ liệu khách riêng hay thông tin đăng nhập vào cơ sở
  • Tài liệu cũ tạo câu trả lời cũ; cập nhật thường xuyên
  • Chỉ soạn câu trả lời, không gửi cho khách

Câu hỏi

Câu trả lời đến từ đâu?

Chỉ từ LiveDoc: trang trung tâm trợ giúp và runbook. Tìm kiếm trả đoạn và agent viết từ đó.

Nếu tài liệu không đủ?

Escalation. Không kết quả hoặc độ liên quan thấp được coi là chưa đủ, không phải phép đoán.

Làm sao giữ cơ sở mới?

Khi chính sách đổi, thêm lại URL và cập nhật tài liệu; quy trình có lệnh cập nhật và audit.

Dùng trong hàng đợi ticket được không?

Có, như bước soạn nháp. Giữ người duyệt trước khi gửi khách.

Có xử lý câu hỏi theo tài khoản không?

Chỉ tài liệu thì không. Dữ liệu tài khoản ở hệ thống của bạn; chỉ truyền bối cảnh an toàn cần thiết, không bao giờ thông tin đăng nhập.

Một lần chạy tốn bao nhiêu?

Ingest và tìm kiếm tính theo mức dùng; giá hiện tại ở trang giá và prompt hỏi duyệt trước khi chi.

Quy trình liên quan

Tùy biến

Cùng công thức, điều chỉnh theo cách bạn thực sự triển khai.

Chỉ một dòng sản phẩm

Giới hạn một sản phẩm để cơ sở gọn hơn.

Thêm phân loại ticket

Phân loại câu hỏi trước rồi tìm tài liệu phù hợp.

Audit định kỳ

Kiểm tra liên kết hỏng và chính sách cũ mỗi tháng.

Các trang tham chiếu đằng sau công thức và nơi đi tiếp.