要点
- 一个基础 URL 和一个模型 ID(uncensored)可与任何 OpenAI SDK 或客户端配合使用。
- 支持流式输出、函数调用和 JSON 模式,拥有 100,000 token 的上下文窗口。
- 完整密钥允许 8 个并发请求和每分钟 300 个请求,因此请为繁忙的应用程序规划一个小队列。
- 计费为每 1M 输入 token $0.15,每 1M 输出 token $0.50,从预付额度中扣除,且提示词不用于训练。
从一个接口获得的内容
人们寻找 Uncensored LLM Hub,是因为他们想要一个在合法成人用途下不对内容进行拒绝的模型,但不想运行 GPU。该服务是一个普通的 HTTPS 接口。你将 OpenAI 客户端指向 https://api.uncensoredllmhub.com/v1,发送模型 ID uncensored,并使用 Authorization: Bearer YOUR_KEY 进行身份验证。有两种方法:POST /v1/chat/completions 用于对话,GET /v1/models 用于列出。
清楚该接口背后的情况很有帮助。它是一个开放权重模型,由独立提供商运行,并经过调整以跳过内容拒绝。它不是任何大型供应商的官方接口,也不是在模型之间进行选择的路由。它仅处理文本:不支持图像、音频、视频、嵌入或微调。一条硬性规则毫无例外地适用:禁止涉及未成年人的性内容。
这种狭窄的范围正是其要点。一个稳定的接口易于构建。下面的章节展示了一个小型聊天后端,然后是智能体循环,以及你需要设计应对的限制。
步骤 1:连接现有客户端
由于 API 遵循 OpenAI 格式,你很少需要编写新的客户端代码。打开你的 SDK 或工具,更改 Base URL 和密钥,并将模型设置为 uncensored。首先在 API 密钥页面(Google,或电子邮件和密码)注册,然后点击一次领取 $0.50 的免费试用额度。该试用不需要信用卡,有效期为 7 天,每人限领一次。
Python 中的最小请求:
from openai import OpenAI
client = OpenAI(
base_url="https://api.uncensoredllmhub.com/v1",
api_key="YOUR_API_KEY",
)
resp = client.chat.completions.create(
model="uncensored",
messages=[
{"role": "system", "content": "You are a concise assistant for a writing tool."},
{"role": "user", "content": "Give me three opening lines for a mystery set on a ferry."},
],
temperature=0.9,
top_p=0.95,
)
print(resp.choices[0].message.content)
temperature、top_p、stop、seed 等采样设置以及频率和存在惩罚会传递给模型,因此你从其他提供商处熟悉的旋钮以相同方式工作。相同的调用也适用于接受自定义 OpenAI 兼容端点的工具,例如 SillyTavern 或 Open WebUI:粘贴基础 URL,添加密钥,手动输入模型 ID。
步骤 2:将答案流式输出到聊天界面
如果用户盯着空白框直到完整答案到达,聊天应用会感觉缓慢。流式输出解决了这个问题。设置 stream: true,API 将以服务器发送事件的形式发送答案,并在流结束时报告使用情况。这是一个 Node 版本,它在令牌到达时转发令牌:
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.uncensoredllmhub.com/v1",
apiKey: process.env.API_KEY,
});
export async function streamReply(history, onToken, signal) {
const stream = await client.chat.completions.create(
{ model: "uncensored", messages: history, stream: true },
{ signal }
);
let text = "";
for await (const chunk of stream) {
const piece = chunk.choices[0]?.delta?.content ?? "";
if (piece) {
text += piece;
onToken(piece);
}
}
return text;
}
两个习惯可以省去以后的麻烦。首先,始终传递一个中止信号,并在用户关闭标签页或按下停止时取消它。流式请求会占用其并发槽位,直到流结束,因此废弃的流会消耗你的额度。其次,保留你组装的完整文本,因为你会将其作为助手消息追加到历史记录中,用于下一轮对话。
如果你在流式传输时在前端看到模糊错误,我们关于诊断流式传输故障的说明涵盖了常见原因,例如错误的基础 URL、缓冲事件的代理以及两个 429 代码。
步骤 3:刻意使用长上下文
上下文窗口为 100,000 token,由提示词和补全共享。对于故事编写工具、角色聊天或文档助手,这为长历史记录、大型系统提示词和参考资料提供了同时存在的空间。你不需要设置 max_tokens;补全可以使用剩余的任何内容。
以这些价格尝试长上下文很便宜。用输入填满整个窗口,针对 100,000 个输入 token 的成本为 0.1 × $0.15 = $0.015。加上 2,000 token 的回答(0.002 × $0.50 = $0.001),一个几乎满额的调用成本为 $0.016。你仍然需要管理窗口,原因有三:延迟随提示词大小增长,每轮对话都会重新发送历史记录,因此成本会在会话中累积,而且很长的历史记录会稀释顶部的指令。
一个简单的策略效果很好:
- 将系统提示词和任何固定参考文本放在开头。
- 保留最近的轮次原文。
- 当历史记录超过你选择的阈值(例如 60,000 token)时,要求模型将最老的部分总结为简短笔记,并用它替换这些对话轮次。
- 从每个响应中读取
usage.prompt_tokens以了解下一个请求的大小,而不是通过字符进行估算。
步骤 4:智能体的工具和结构化输出
智能体需要从模型获得两样东西:一种调用函数的方法,以及你可以解析的输出。两者都支持。工具调用使用标准的 tools 和 tool_choice 参数,工具调用可以流式输出,结果以 role: "tool" 消息返回。单次交互如下所示:
import json
from openai import OpenAI
client = OpenAI(
base_url="https://api.uncensoredllmhub.com/v1",
api_key="YOUR_API_KEY",
)
tools = [{
"type": "function",
"function": {
"name": "lookup_order",
"description": "Find an order by its number.",
"parameters": {
"type": "object",
"properties": {"order_id": {"type": "string"}},
"required": ["order_id"],
},
},
}]
messages = [{"role": "user", "content": "Where is order A-1042?"}]
first = client.chat.completions.create(model="uncensored", messages=messages, tools=tools)
msg = first.choices[0].message
if msg.tool_calls:
call = msg.tool_calls[0]
args = json.loads(call.function.arguments)
result = {"order_id": args["order_id"], "status": "shipped"} # your real lookup goes here
messages.append(msg)
messages.append({"role": "tool", "tool_call_id": call.id, "content": json.dumps(result)})
final = client.chat.completions.create(model="uncensored", messages=messages, tools=tools)
print(final.choices[0].message.content)
在执行任何具有副作用的操作之前,始终验证参数。模型可能会产生格式错误或意外的值,而你的代码是最后一道防线。
对于不带工具的直接结构化输出,请使用 JSON 模式,将 response_format 设置为 {"type": "json_object"}。在提示词中描述你想要的形状,并在 try 块中解析回复,以便错误响应触发重试而不是崩溃。
curl https://api.uncensoredllmhub.com/v1/chat/completions -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" -d '{
"model": "uncensored",
"response_format": {"type": "json_object"},
"messages": [
{"role": "system", "content": "Reply with JSON: {"title": string, "tags": [string]}"},
{"role": "user", "content": "Describe a noir story set in a rainy port city."}
]
}'
需考虑的限制
完整密钥允许 8 个并发请求和每分钟 300 个请求。试用密钥允许 2 个和 60 个。请求体最多可达 8 MB。每个响应都包含 X-Request-Id、X-Balance-USD、X-RateLimit-Limit-Requests 和 X-RateLimit-Limit-Concurrency,这些很有用,可用于记录日志。
当你超过限制时,API 返回 HTTP 429。代码为 rate_limited 表示每分钟请求过多,concurrency 表示同时请求过多。临时过载也返回 429,带有 Retry-After: 5。对于多用户应用,在 API 前面放置一个小队列:一个大小低于并发限制的信号量和一个尊重 Retry-After 的重试。对于将输出扇出到并行工具调用的智能体,将扇出限制在相同的数量。
完整的参数列表和错误格式在 API 文档 中。
成本、充值和数据处理
定价为每 1M 输入 token $0.15,每 1M 输出 token $0.50,从预付额度中扣除。没有订阅,额度永不过期,失败或被拒绝的请求不收费。一次包含 1,500 个输入和 500 个输出的聊天轮次成本为 0.0015 × $0.15 + 0.0005 × $0.50 = $0.000225 + $0.00025 = $0.000475,因此 $20 的额度可以覆盖约 42,000 次此类轮次。
你可以充值任意金额,从 $20 到 $500。赠送额度为:$50 起 +5%,$100 起 +10%,$200 起 +15%。支持银行卡(Visa、Mastercard、Apple Pay、Google Pay)或加密货币(TRC20 上的 USDT,Base 上的 USDC)支付。定价页面 有当前表格。
关于数据:提示词不用于训练。阅读 隐私政策 获取完整措辞。你需对使用模型构建的内容负责,该服务仅供成年用户合法使用。
