VI ▾
Uncensored Chatbot APITruy cập API trực tiếp vào một LLM không kiểm duyệtLấy khóa API

Uncensored Chatbot APIAn toàn

Vận hành sản phẩm chatbot người lớn có trách nhiệm: Danh sách kiểm tra cho nhà phát triển

Bot trò chuyện người trưởng thành là một sản phẩm thực sự, và các sản phẩm thực sự đều đi kèm trách nhiệm. API cung cấp cho bạn một mô hình không từ chối nội dung người trưởng thành hợp pháp, nghĩa là ứng dụng của bạn, chứ không phải mô hình, mới là nơi thực hiện kiểm tra độ tuổi, quy tắc nội bộ, báo cáo và kiểm soát lạm dụng. Danh sách kiểm tra này sẽ đi qua từng lớp với mã nguồn hoạt động, để bạn có thể ra mắt sản phẩm với sự tự tin.

Cập nhật

Các điểm chính

  • Nền tảng dành riêng cho người lớn; hãy xác minh độ tuổi tại cửa của bạn và giữ việc kiểm tra ở phía máy chủ.
  • Hãy tự viết chính sách nội dung và đường dẫn báo cáo, vì tính mở của mô hình không thay thế các quy tắc của bạn.
  • Nội dung tình dục liên quan đến vị thành niên luôn bị chặn bằng mã 403; hãy thiết kế giao diện người dùng rõ ràng và bình tĩnh cho trường hợp này.
  • Giới hạn mức sử dụng theo từng người dùng và giữ khóa API trên máy chủ của bạn; một khóa duy nhất phục vụ cho tất cả lưu lượng truy cập của bạn.

Ai chịu trách nhiệm về việc gì

Hãy nghĩ về ngăn xếp theo hai lớp. API phục vụ nội dung người lớn hợp pháp, tiểu thuyết và các chủ đề gây tranh cãi mà không từ chối, dành cho người dùng từ 18 tuổi trở lên. Mọi thứ xung quanh mô hình, những người có thể truy cập nó, các quy tắc họ đồng ý và những gì xảy ra khi có sự cố, đều thuộc về bạn. Sự phân chia này rất tự do, nhưng chỉ khi bạn nghiêm túc với phần của mình.

Dưới đây là một bảng trách nhiệm ngắn để treo trên tường.

Mối quan tâmNền tảngỨng dụng của bạn
Nội dung tình dục liên quan đến trẻ vị thành niênLuôn bị chặn (403)Giải thích, kết thúc cảnh, ngăn chặn các cách khắc phục
Độ tuổi người dùng của bạnChỉ dành cho người lớn theo điều khoảnKiểm soát và xác minh tại cửa vào của bạn
Quy tắc nội bộ vượt ra ngoài luật phápKhông được áp dụngViết, công bố và thực thi chúng
Lạm dụng theo người dùng300 yêu cầu mỗi phút trên mỗi khóaGiới hạn theo người dùng và theo ngày
Khóa bí mậtCấp nóGiữ nó trên máy chủ của bạn

Đây là hướng dẫn kỹ thuật, không phải lời khuyên pháp lý; các quy tắc khác nhau tùy theo địa điểm, vì vậy hãy kiểm tra các yêu cầu nơi người dùng của bạn sống.

Kiểm soát độ tuổi thực sự kiểm soát

Một banner với nút "Tôi 18 tuổi" là mức tối thiểu, và một vị thành niên có thể xác định sẽ nhấp vào nó. Điều này vẫn quan trọng vì nó ghi nhận một tuyên bố khẳng định và giữ cho chính sách của bạn minh bạch. Điểm mấu chốt là nơi bạn thực thi nó. Nếu việc kiểm tra chỉ ẩn bot trò chuyện trong trình duyệt, bất kỳ ai cũng có thể gọi endpoint của bạn trực tiếp. Hãy để máy chủ từ chối giao tiếp cho đến khi tồn tại một dấu hiệu đã được ký.

import crypto from "node:crypto";

// Minimal 18+ gate: the user must confirm before the chat routes work.
// Replace the confirmation with a real verification step when your market requires it.
const SECRET = process.env.GATE_SECRET;   // random string kept on the server

function sign(value) {
  return crypto.createHmac("sha256", SECRET).update(value).digest("hex");
}

export function issueAdultCookie(res, userId) {
  const stamp = String(Date.now());
  const payload = `${userId}.${stamp}`;
  res.cookie("adult_ok", `${payload}.${sign(payload)}`, {
    httpOnly: true, sameSite: "strict", secure: true, maxAge: 30 * 24 * 3600 * 1000,
  });
}

export function requireAdult(req, res, next) {
  const raw = req.cookies?.adult_ok || "";
  const [userId, stamp, sig] = raw.split(".");
  if (!sig || sign(`${userId}.${stamp}`) !== sig) {
    return res.status(403).json({ state: "age_required" });
  }
  req.userId = userId;
  next();
}

Kết nối requireAdult ở đầu mỗi tuyến bot trò chuyện. Thêm xác minh mạnh mẽ hơn khi thị trường hoặc mức độ rủi ro của bạn yêu cầu, chẳng hạn như kiểm tra độ tuổi của bên thứ ba, và giữ cho dấu hiệu có thời hạn đủ ngắn để bạn có thể yêu cầu lại. Không nhắm mục tiêu vào sinh viên hoặc trường học trong marketing của bạn, và đặt cổng kiểm soát trước khi bất kỳ nội dung người trưởng thành nào được hiển thị, bao gồm cả bản xem trước và các đoạn hội thoại mẫu.

Viết chính sách nội dung của riêng bạn

Mô hình không từ chối tài liệu người lớn hợp pháp, vì vậy bạn quyết định sản phẩm của mình cho phép gì. Một chính sách một trang là đủ. Bao gồm những gì được chào đón, những gì nằm ngoài giới hạn trong cộng đồng của bạn ngay cả khi hợp pháp (ví dụ quấy rối người thật hoặc tiết lộ thông tin cá nhân), cách người dùng báo cáo sự cố và các hành động bạn thực hiện: cảnh báo, tạm khóa, cấm.

  1. Công bố nó nơi người dùng đăng ký, bằng ngôn ngữ rõ ràng.
  2. Sao chép nó vào prompt hệ thống của bạn. Một dòng như "Tất cả các nhân vật đều là người lớn; kết thúc bất kỳ cảnh nào trở nên không đồng thuận hoặc liên quan đến người thật có tên" giúp bot tuân thủ các quy tắc của bạn.
  3. Làm cho việc thực thi nhàm chán. Quyết định các ngưỡng trước đó để các người điều hành không improvisation.
  4. Xem xét chính sách mỗi quý khi sản phẩm của bạn phát triển.

Một đường dẫn báo cáo mà người dùng có thể tìm thấy

Mỗi tin nhắn đều có một nút báo cáo nhỏ và hãy để nó hoạt động mà không cần chuyển hướng đăng nhập. Khi ai đó báo cáo một câu trả lời, hãy ghi lại những gì bạn cần nhất để hành động: id người dùng, id tin nhắn, lý do ngắn và dấu thời gian. Định tuyến nó vào một hàng đợi mà người điều hành của bạn theo dõi.

app.post("/api/report", requireAdult, express.json(), (req, res) => {
  const { messageId, reason } = req.body;
  // Store only what you need to act on: who, which message, why, when.
  queueForModerator({ userId: req.userId, messageId, reason: String(reason).slice(0, 500), at: Date.now() });
  res.json({ ok: true });
});

Giữ các lời hứa của bạn hẹp. Hãy cho người dùng biết chính xác một báo cáo kích hoạt gì, và chỉ lưu trữ những gì chính sách của bạn và các quy định áp dụng yêu cầu. Xem xét thời gian bạn giữ các báo cáo và xóa chúng theo lịch trình. Xác nhận mỗi báo cáo cho người đã nộp, ngay cả với một lời cảm ơn một dòng, vì người dùng ngừng báo cáo khi không có gì xảy ra. Theo dõi tốc độ người điều hành đóng các mục và đặt một mục tiêu bạn có thể đáp ứng.

Thiết kế cho việc chặn người dưới 18 tuổi với mã 403

Nội dung tình dục liên quan đến vị thành niên luôn bị chặn, cả trong truyện hư cấu và nhập vai, và API trả về mã 403 cùng mã content_blocked. Không thử lại và không cố gắng diễn giải lại thay mặt người dùng. Thay vào đó, hãy coi đây là một điểm chạm sản phẩm xứng đáng với một thiết kế rõ ràng.

  • Chuyển đổi nó trên máy chủ thành một trạng thái mà giao diện người dùng của bạn biết, để văn bản gốc không bao giờ đạt đến màn hình.
  • Nói những gì đã xảy ra trong một câu bình tĩnh và nêu rõ quy tắc.
  • Kết thúc hoặc đặt lại cảnh. Việc cung cấp tùy chọn "tiếp tục dù sao đi nữa" sẽ làm mất đi ý nghĩa của cơ chế này.
  • Ghi lại sự kiện kèm theo id người dùng để các lần thử lặp lại có thể kích hoạt việc tự thực thi các biện pháp kiểm soát của bạn.
  • Đừng đoán ý định. Một số lệnh chặn xuất phát từ cách diễn đạt mơ hồ; thông điệp trung lập hoạt động cho cả hai trường hợp.
// server: translate upstream outcomes into states your UI understands
if (upstream.status === 403) {
  return res.status(403).json({
    state: "content_blocked",
    message: "That request breaks our rules, so we can't continue this scene.",
  });
}
if (upstream.status === 402) return res.status(503).json({ state: "paused" });
if (upstream.status === 503) return res.status(503).json({ state: "busy" });
// browser: show a calm, specific message for each state
const MESSAGES = {
  content_blocked: "This scene can't continue. Sexual content involving minors is never allowed. Start a new chat any time.",
  age_required: "Please confirm you are 18 or older to use the chat.",
  slow_down: "You're sending messages quickly. Give it a few seconds.",
  daily_limit: "You've reached today's message allowance. Come back tomorrow.",
  paused: "Chat is briefly unavailable. We're on it.",
  busy: "The service is busy. Try again in a moment.",
};

async function send(messages) {
  const res = await fetch("/api/chat", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ messages }),
  });
  if (!res.ok) {
    const info = await res.json().catch(() => ({}));
    showBanner(MESSAGES[info.state] || "Something went wrong.");
    if (info.state === "content_blocked") endCurrentScene();
    return null;
  }
  return res;
}

Kiểm soát lạm dụng và giới hạn tốc độ theo từng người dùng

Khóa API đơn lẻ của bạn cho phép 300 yêu cầu mỗi phút tổng cộng, được chia sẻ bởi tất cả người dùng. Một tài khoản được lập trình có thể làm nghẽn mọi người khác, vì vậy hãy tự áp dụng các giới hạn sử dụng công bằng, thấp hơn nhiều so với ngưỡng đó. Ví dụ giới hạn mỗi người dùng ở 12 tin nhắn mỗi phút và cung cấp cho mỗi người một ngân sách token hàng ngày được đo lường từ số liệu usage trong phân đoạn luồng cuối cùng.

const WINDOW_MS = 60_000;
const PER_USER_PER_MIN = 12;       // your product rule, far below the key's 300
const DAILY_TOKEN_BUDGET = 60_000; // per user, tracked from the usage chunk

const hits = new Map();            // userId -> array of timestamps
const spent = new Map();           // userId -> tokens used today

export function userLimit(req, res, next) {
  const now = Date.now();
  const recent = (hits.get(req.userId) || []).filter((t) => now - t < WINDOW_MS);
  if (recent.length >= PER_USER_PER_MIN) {
    return res.status(429).json({ state: "slow_down" });
  }
  if ((spent.get(req.userId) || 0) >= DAILY_TOKEN_BUDGET) {
    return res.status(429).json({ state: "daily_limit" });
  }
  recent.push(now);
  hits.set(req.userId, recent);
  next();
}

export function recordUsage(userId, totalTokens) {
  spent.set(userId, (spent.get(userId) || 0) + totalTokens);
}

Đối với môi trường sản xuất, hãy lưu trữ các bộ đếm trong một kho dữ liệu dùng chung thay vì bộ nhớ quá trình để các giới hạn tồn tại qua các lần khởi động lại và hoạt động trên nhiều máy chủ. Thêm một giá trị max_tokens hợp lý cho mọi yêu cầu để giới hạn trường hợp xấu nhất, và theo dõi mã 402 trên số dư của bạn. Một gói dùng thử miễn phí trị giá $0.50 trong 7 ngày là cách tốt để kiểm tra các cơ chế kiểm soát này trước khi lưu lượng thực tế bắt đầu.

Giữ khóa trên máy chủ

Không bao giờ đưa khóa vào các gói giao diện người dùng, ứng dụng di động hoặc kho lưu trữ công khai. Lưu khóa dưới dạng biến môi trường hoặc trong bộ quản lý bí mật, chỉ tải nó trong backend của bạn và loại trừ nó khỏi nhật ký và báo cáo lỗi. Nếu bạn nghi ngờ khóa bị lộ, hãy tạo lại khóa từ tài khoản của bạn; khóa cũ sẽ ngừng hoạt động ngay lập tức, vì vậy hãy chuẩn bị sẵn một bản triển khai. Hãy nhớ rằng có một khóa cho mỗi tài khoản, điều này làm cho lớp proxy sạch sẽ càng có giá trị hơn. Hướng dẫn web chat hiển thị mẫu từ đầu đến cuối, và tài liệu liệt kê các mã lỗi mà lớp bao bọc của bạn nên ánh xạ.

Danh sách kiểm tra trước khi ra mắt

Hãy rà soát danh sách này vào ngày trước khi bạn mở cửa. Mỗi mục chỉ mất vài phút nhưng ngăn ngừa một lớp vấn đề rất khó khắc phục sau khi người dùng đã đến.

  1. Hãy thử phá vỡ cổng kiểm soát. Gọi route chat của bạn bằng curl mà không có cookie. Nó phải trả về mã 403 với age_required, không bao giờ là phản hồi từ mô hình.
  2. Kích hoạt mọi trạng thái. Giả lập upstream trả về 402, 403, 429 và 503 theo thứ tự, và xác nhận mỗi trạng thái hiển thị đúng banner và không bao giờ làm rò rỉ văn bản lỗi thô.
  3. Đọc to chính sách của bạn. Nếu một người kiểm duyệt không thể quyết định một trường hợp từ nó trong một phút, hãy siết chặt cách diễn đạt.
  4. Kiểm tra nút báo cáo từ màn hình điện thoại. Một nút điều khiển khó tiếp cận thì không được tính là một đường dẫn báo cáo.
  5. Tìm kiếm khóa trong kho lưu trữ của bạn. Hãy kiểm tra các thư mục giao diện người dùng, kết quả build, các tệp cấu hình mẫu và lịch sử commit. Hãy tạo lại khóa nếu bạn tìm thấy nó ở bất kỳ nơi nào công khai.
  6. Thiết lập cảnh báo. Hãy tự thông báo khi gặp mã 402, khi có một đợt tăng đột biến các lệnh chặn 403 từ một người dùng duy nhất và khi có sự gia tăng đáng kể về việc sử dụng token hàng ngày.
  7. Chuẩn bị công tắc tạm dừng. Một cờ hiệu đơn giản để tắt chat một cách duyên dáng có giá trị vô cùng trong các sự cố.

An toàn không bao giờ là xong, và danh sách này cũng vậy; hãy thêm các mục mỗi khi một sự cố dạy cho bạn điều mới, và chia sẻ chúng với bất kỳ ai gia nhập đội ngũ của bạn sau này. Hãy xem lại danh sách khi bạn thêm các tính năng như tải lên hình ảnh trong giao diện người dùng của riêng bạn, phòng nhóm hoặc chia sẻ nhân vật công khai, vì mỗi tính năng đều mở ra những đường dẫn mới cho việc lạm dụng. Để giúp định hình các nhân vật, hãy đọc hướng dẫn thiết kế persona, và giữ các ghi chú cơ bản về tích hợp của bạn trong tài liệu luôn sẵn sàng khi đội ngũ của bạn phát triển.

Hỏi đáp

Một hộp kiểm có đủ cho việc xác minh độ tuổi không?

Đây là mức tối thiểu và ghi nhận một tuyên bố, nhưng rất dễ bị vượt qua. Hãy thực thi nó trên máy chủ và thêm xác minh mạnh hơn khi rủi ro hoặc quy định địa phương yêu cầu.

Ứng dụng của tôi nên làm gì khi gặp mã 403 content_blocked?

Đừng thử lại. Hãy chuyển đổi nó thành một thông báo nhẹ nhàng trong ứng dụng, kết thúc hoặc đặt lại cảnh và ghi lại sự kiện để tự thực thi các biện pháp kiểm soát của bạn.

Tôi có thể cho phép người dùng chia sẻ công suất khóa API của tôi một cách công bằng không?

Có, bằng cách thêm các giới hạn tốc độ theo người dùng và giới hạn token hàng ngày trên máy chủ của bạn. Khóa bản thân nó bị giới hạn ở mức 300 yêu cầu mỗi phút tổng cộng.

Mô hình có thực thi các quy tắc nội bộ của tôi không?

Không. Nó không từ chối nội dung người lớn hợp pháp, vì vậy chính sách, prompt hệ thống và luồng kiểm duyệt của bạn phải đảm nhận công việc đó.

Khóa của bạn chỉ cách một biểu mẫu

Tạo tài khoản, sao chép khóa, thay đổi URL cơ sở. Đó là toàn bộ quá trình thiết lập.

Lấy khóa APIĐọc tài liệu