中文 ▾
Uncensored Chatbot API直接访问一个无审查的 LLM API获取 API 密钥

Uncensored Chatbot API安全

负责任地运营成人聊天机器人产品:开发者清单

成人聊天机器人是一个真实的产品,真实的产品意味着责任。API 提供不拒绝合法成人内容的模型,这意味着年龄检查、内部规则、举报和滥用控制都位于你的应用中,而非模型中。本清单通过可运行的代码逐步介绍每一层,助你自信上线。

更新于

关键点

  • 平台仅限成人;在你的入口处验证年龄,并将检查保留在服务端。
  • 制定你自己的内容政策和举报路径,因为模型的开放性并不能取代你的规则。
  • 涉及未成年人的色情内容始终会被拦截(403);为此设计清晰、平和的用户体验。
  • 限制每个用户的使用量,并将 API 密钥保留在您的服务器上;所有流量共用一个密钥。

谁对什么负责

将技术栈分为两层。API 为 18 岁及以上的用户提供合法的成人内容、小说和争议性话题,且不会拒绝。围绕模型的一切——谁能访问它、他们同意的规则以及出错时发生什么——都归你所有。这种划分是自由的,但前提是你认真对待自己的那部分。

这里有一个简短的责任表,建议贴在墙上。

关注点平台你的应用
涉及未成年人的性内容始终拦截(403)解释、结束场景、防止绕过
用户的年龄条款规定仅限成人在入口处进行限制和验证
超越法律的内部规则未应用制定、发布并执行
按用户滥用每个密钥每分钟 300 次请求按用户和按天限制
密钥签发保留在服务端

这是工程指导,而非法律建议;规则因地区而异,请检查用户所在地的要求。

真正有效的年龄限制

带有“我 18 岁”按钮的横幅是最低要求,但执意点击的未成年人仍可以点过。这仍然很重要,因为它记录了一个肯定的声明,并保持您的政策诚实。关键在于您在哪里执行它。如果检查只是在浏览器中隐藏聊天,任何人都可以直接调用您的接口。让服务器在存在已签署的标记之前拒绝响应。

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

在每条聊天路由前连接 requireAdult。根据您的市场或风险级别添加更强的验证,例如第三方年龄检查,并保持标记足够短暂,以便您可以重新提示。不要在营销中将学生或学校作为目标,并在显示任何成人内容(包括预览和示例对话)之前放置门禁。

制定你自己的内容政策

模型不拒绝合法的成人材料,因此你决定你的产品允许什么。一页政策就足够了。涵盖欢迎的内容、在你的社区中即使合法也不允许的内容(例如针对真人的骚扰或人肉搜索)、用户如何报告问题,以及你采取的措施:警告、临时禁言、封禁。

  1. 在用户注册的地方发布,使用通俗易懂的语言。
  2. 在你的系统提示词中复制它。 例如“所有角色均为成年人;任何变得非自愿或涉及真实、具名人物的场景都应结束”,这能让机器人符合你的规则。
  3. 让执行变得无趣。 提前决定阈值,以便审核人员不必即兴发挥。
  4. 随着产品的发展,每季度审查一次政策。

用户可找到的举报路径

为每条消息提供小型举报控件,并使其无需登录即可工作。当有人举报回复时,捕获你采取行动所需的最小信息:用户 ID、消息 ID、简短原因和时间戳。将其路由到你审核人员监控的队列中。

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

保持你的承诺范围狭窄。明确告诉用户举报会触发什么,只存储你自己的政策和适用规则要求的内容。审查你保留举报的时间,并按计划删除它们。向提交举报的人确认收到,即使只是一行感谢,因为当似乎没有任何事情发生时,用户会停止举报。跟踪审核人员关闭项目的速度,并设定一个你实际能够达到的目标。

为 403 未成年人拦截进行设计

涉及未成年人的色情内容始终会被屏蔽,小说和角色扮演也是如此,API 会返回 403 错误和代码 content_blocked。不要重试,也不要代表用户重新措辞。相反,将其视为需要清晰设计的 <b>产品体验</b>。

  • 在服务器上将其转换为你 UI 知道的状态,这样原始的上游文本就不会到达屏幕。
  • 用一句平和的话说明发生了什么,并指出规则。
  • 结束或重置场景。 提供“无论如何继续”会破坏其要点。
  • 使用用户 ID 记录事件,以便重复尝试可以触发你自己的执行。
  • 不要猜测意图。 一些拦截来自含糊的措辞;中性消息适用于两种情况。
// 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;
}

按用户进行滥用控制和速率限制

你的单个 API 密钥总共允许每分钟 300 次请求,由所有用户共享。一个脚本账户可能会耗尽其他人的资源,因此你自己执行公平使用限制,远低于该上限。示例将每个用户限制为每分钟 12 条消息,并根据最终流式输出块中的 usage 数字为每个用户分配每日 token 预算。

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

对于生产环境,将计数器存储在共享存储中而不是进程内存中,以便限制在重启后仍然存在,并在多个服务器之间工作。在每个请求上添加适度的 max_tokens 以限制最坏情况,并关注您自己余额上的 402 错误。7 天的 $0.50 免费试用额度是测试这些控制在真实流量到达之前的一种好方法。

将密钥保留在服务器端

不要将密钥放在前端包、移动应用或公共存储库中。将其存储为环境变量或密钥管理器,仅在后端加载,并将其排除在日志和错误报告之外。如果你怀疑泄露,请从你的账户重新生成它;旧密钥会立即失效,因此请准备好部署。请记住每个账户只有一个密钥,这使得干净的代理层更有价值。网络聊天教程 展示了端到端的模式,文档 列出了你的包装器应映射的错误代码。

发布前检查清单

在开放门户的前一天过一遍这个清单。每项只需几分钟,但能防止一类在用户到达后修复起来很痛苦的问题。

  1. 尝试绕过门禁。 使用 curl 调用您的聊天路由且不带 cookie。它必须返回 403 错误和 age_required,而不是模型回复。
  2. 触发每种状态。 模拟上游依次返回 402、403、429 和 503,并确认每种状态都显示正确的横幅且从不泄露原始错误文本。
  3. 大声朗读你自己的政策。 如果审核人员无法在分钟内根据它决定案例,请收紧措辞。
  4. 从手机屏幕测试报告按钮。难以触及的控制不算作报告路径。
  5. 在你的存储库中搜索密钥。 查看前端文件夹、构建输出、示例配置和提交历史。如果在任何公开位置找到它,请重新生成它。
  6. 设置警报。 在出现 402、单个用户的 403 拦截激增或每日 token 使用量激增时通知你自己。
  7. 准备暂停开关。 一个能优雅关闭聊天的单一标志在事故期间非常宝贵。

安全措施永远不会完成,列表也是如此;每次事件教会您新东西时都要添加项目,并与加入团队的任何人分享。当您添加功能(如图像上传、群组房间或公共角色共享)时,请重新查看列表,因为每个功能都会打开新的滥用途径。有关塑造角色本身的帮助,请阅读 角色设计指南,并在团队壮大时将集成注意事项的 文档放在手边。

问答

复选框足以进行年龄验证吗?

这是最低要求,仅记录声明,但很容易被绕过。请在服务器端强制执行,并根据你的风险或当地法规要求添加更强的验证。

当出现 403 content_blocked 时,我的应用程序应该做什么?

不要重试。将其转换为应用内平静的消息,结束或重置场景,并记录事件以供您自己执行。

我可以让用户公平地共享我的 API 密钥容量吗?

是的,通过在您的服务器上添加每个用户的速率和每日 token 限额来实现。API 密钥本身的限制为总共每分钟 300 次请求。

模型会执行我的内部规则吗?

不会。它不会拒绝合法的成人内容,因此你的政策、系统提示词和审核流程必须完成这项工作。

只差一张表单,即可获得密钥

创建账户,复制密钥,更改基础 URL。这就是整个设置过程。

获取 API 密钥阅读文档