中文 ▾
打开账户

无审查聊天机器人 API:五分钟完成首次请求

如果你已经拥有 Python,无审查聊天机器人 API 只需五分钟即可尝试。你需要一个密钥,更改 OpenAI SDK 中的两项设置,并发送一个请求。之后,通过系统提示词和流式输出将其变成聊天机器人。

最后更新于

玻璃纸飞机携带聊天气泡,从钥匙形状的发射台飞向灯塔

要点

第 1 到 2 分钟:获取密钥

前往 API 密钥页面 并使用 Google 或电子邮件及密码注册。注册后,密钥页面会显示一个领取试用额度的按钮:$0.50,每人一次,有效期 7 天,无需信用卡。

复制密钥并将其放入环境变量中。密钥被意外提交到文件中是丢失额度最常见的方式。

# model ID for later requests: uncensored
export UF_API_KEY="paste-your-key-here"
pip install openai

试用密钥允许 2 个并发请求和每分钟 60 个请求。这些限制足以满足本教程的需求。

第 3 分钟:首次请求

该服务与 OpenAI 兼容,因此只要你更改 base_url 和密钥,官方 SDK 即可工作。模型 ID 为 uncensored。

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.chatbotunfiltered.com/v1",
    api_key=os.environ["UF_API_KEY"],
)

resp = client.chat.completions.create(
    model="uncensored",
    messages=[{"role": "user", "content": "Give me three names for a cyberpunk bar."}],
)

print(resp.choices[0].message.content)
print("tokens in/out:", resp.usage.prompt_tokens, resp.usage.completion_tokens)

使用 python first.py 运行它。如果看到名称列表和 token 计数,说明一切正常。如果看到认证错误,请检查变量。如果连接失败,请检查 Base URL 是否以 /v1 结尾。

响应遵循 OpenAI 聊天格式:包含消息的 choices 列表、包含 token 计数的 usage 块,以及在该格式中指示生成停止原因的 finish reason。截断的回答通常意味着 max_tokens 设置过低。关于成本,一次包含 500 个输入 token 和 300 个输出 token 的请求成本为 $0.000075 + $0.00015 = $0.000225。本教程中的五次请求总共花费约十分之一美分,因此试用额度几乎未受影响。

第 4 分钟:添加系统提示词和设置

裸请求会提供默认的助手语气。对于聊天机器人,添加定义角色的系统消息,并传递适合该角色的采样设置。

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.chatbotunfiltered.com/v1",
    api_key=os.environ["UF_API_KEY"],
)

raw = client.chat.completions.with_raw_response.create(
    model="uncensored",
    messages=[
        {"role": "system", "content": "You are Rook, a smuggler with a dry sense of humor. Stay in character. Keep replies under 80 words."},
        {"role": "user", "content": "Can you get me across the border tonight?"},
    ],
    temperature=0.9,
    top_p=0.95,
    max_tokens=200,
    seed=7,
)

resp = raw.parse()
print(resp.choices[0].message.content)
print("balance:", raw.headers.get("x-balance-usd"))
print("request id:", raw.headers.get("x-request-id"))
  • temperature 和 top_p 控制多样性。较高的值会产生更生动、更不可预测的文本。
  • seed 使测试更容易重复。它会透传,因此可用于比较提示词编辑。
  • max_tokens 是可选的。如果没有它,补全可以使用剩余的 100,000-token 上下文窗口。
  • 余额标头会在每次调用后告诉你剩余的额度。

这里的提示词就是产品。保持简短具体。说明角色是谁、他们如何说话、故事是什么以及长度应该是多少。所有这些内容都一次性放入系统消息中,并且每次请求都会发送它,因为 API 在调用之间不记住任何内容。

第 5 分钟:流式输出

流式输出会在生成时打印文本。只需在请求中进行一次更改,加上一个读取数据块的循环。

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.chatbotunfiltered.com/v1",
    api_key=os.environ["UF_API_KEY"],
)

stream = client.chat.completions.create(
    model="uncensored",
    stream=True,
    messages=[
        {"role": "system", "content": "You are Rook, a smuggler with a dry sense of humor."},
        {"role": "user", "content": "Tell me about the worst job you ever took."},
    ],
)

for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)
print()

流式请求会占用一个并发槽位,直到流结束。使用试用密钥时,两个打开的流已经占用了所有槽位,第三个请求将返回 HTTP 429 错误,代码为 concurrency。等待并重试。

如果你想确认流结束后的使用情况,最后一个数据块包含一个 usage 块。

有计划地选择采样值

采样设置比大多数人预期的更能改变机器人的感觉。从下面的值开始,一次只移动一个。

目标设置原因
生动的故事讲述temperature 0.9 到 1.0,top_p 0.95运行之间更多样化
一致的角色temperature 0.6 到 0.7更少的意外
可重复的测试seed 固定,temperature 0相同的提示词给出相同类型的回答
更少的重复频率或存在惩罚约为 0.3阻止循环
在标记处截断回复stop 带字符串出现时结束输出

temperature 和 top_p 控制多样性,惩罚参数会传递给模型。更改一个值,运行相同的提示词五次,阅读五个回答后再更改下一个值。

将其转换为对话

API 不保留历史记录。要使 Rook 记住上下文,请维护一个列表,并在每轮对话后追加双方的内容。

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.chatbotunfiltered.com/v1",
    api_key=os.environ["UF_API_KEY"],
)

messages = [{"role": "system", "content": "You are Rook, a smuggler with a dry sense of humor."}]

def talk(text):
    messages.append({"role": "user", "content": text})
    r = client.chat.completions.create(model="uncensored", messages=messages)
    answer = r.choices[0].message.content
    messages.append({"role": "assistant", "content": answer})
    return answer

print(talk("Where are we headed?"))
print(talk("And what did I just ask you?"))

第二个问题之所以有效,仅因为第一个对话在列表中。这也是为什么对话成本随长度增长的原因:每次回复都会重新发送所有内容。成本与权衡分析深入探讨了这一影响,定价页面显示了每 100 万 token $0.15 和 $0.50 的费率。

随着列表增长,有两个注意事项。首先是成本,因为长历史记录会增加每轮对话的价格。其次是上下文窗口:100,000 个 token 用于提示词和回复已相当充裕,但持续数周的对话可能会达到上限。当列表变长时,删除最旧的对话轮次,保留系统消息,或者用简短的摘要替换它们。

常见问题及后续步骤

问题可能原因修复方法
认证错误密钥错误或为空打印变量长度,去除空格
未找到基础 URL 缺少 /v1使用本页提供的确切 Base URL
429 rate_limited每分钟超过 60 次请求(试用版)降低频率或使用完整密钥(每分钟 300 次)
429 且 Retry-After: 5临时过载等待 5 秒并重试
回复奇怪或平淡系统提示词较弱添加语气、设定、长度限制

失败或被拒绝的请求不会收费。如需后续步骤,请阅读API 文档了解工具和 JSON 模式。该模型仅支持文本,因此没有图像、音频或嵌入功能。充值金额为 $20 至 $500,通过加密货币(TRC20 上的 USDT 或 Base 上的 USDC)进行,且额度永不过期。你负责确保仅限成人访问,并负责在基于此构建的任何内容中进行审查。

如果问题不在表中,请将请求简化为最小的可工作案例:一条用户消息,无系统提示词,无额外参数。然后逐步添加组件,直到问题再次出现。首次集成中的几乎所有问题都源于 URL 中的拼写错误、密钥复制时带有尾随空格,或消息列表格式不正确。

在代码中处理错误

一次运行的脚本不是机器人。针对 API 要求等待的情况添加重试机制。

import os, time
from openai import OpenAI, RateLimitError

client = OpenAI(
    base_url="https://api.chatbotunfiltered.com/v1",
    api_key=os.environ["UF_API_KEY"],
    max_retries=0,
)

def ask(messages, tries=4):
    for i in range(tries):
        try:
            r = client.chat.completions.create(model="uncensored", messages=messages)
            return r.choices[0].message.content
        except RateLimitError:
            time.sleep(5 * (i + 1))
    raise RuntimeError("still rate limited after retries")

SDK 在 HTTP 429 时抛出 RateLimitError。对于临时过载,API 会发送 Retry-After: 5,因此等待五秒是正确的第一步。对于重复的 concurrency 错误,请在你的端对请求进行排队,而不是更快地重试。

常见问题

无审查聊天机器人 API 与 OpenAI API 相同吗?

协议相同,因此 OpenAI SDK 可用。模型不同:这是一个来自独立提供商的开放权重模型,经过调整,可在合法成人使用中不拒绝内容。

我应该使用什么 Base URL 和模型?

Base URL https://api.chatbotunfiltered.com/v1 和模型 ID uncensored。

我需要付费才能试用吗?

不需要。$0.50 的试用额度无需提供支付信息。付费充值仅支持加密货币。

支持流式输出吗?

是。将 stream 设置为 true。流式请求会占用并发槽位,直到流结束。

我如何查看余额?

在任何响应中读取 X-Balance-USD 标头,或调用 GET /v1/balance。

即时获取 API 密钥

注册,复制密钥,更新 Base URL。设置完成。