中文 ▾
获取 API 密钥

无审查 AI 故事生成器 API

因剧情转暗而在场景中途停止的故事生成器是糟糕的写作工具。本文展示如何基于 OpenAI 兼容端点构建此类工具,并提供今日即可运行的代码。

更新于

一本打开的书,书页化为发光丝带流入终端,代表 API 故事生成

要点

  • 将任何 OpenAI SDK 指向基础 URL,使用模型 ID uncensored,即可在约二十行代码内构建故事引擎。
  • 设定流派、语气和规则的系统提示词比任何采样设置都重要。
  • 100,000 token 的窗口允许你在单个请求中保留整个故事圣经和数章内容。
  • 1200 token 的章节成本约为 0.1 美分,因此成本很少成为限制因素。

无审查故事生成器究竟是什么

无审查 AI 故事生成器是一种文本模型,它在撰写小说时不会停下来给你上课,不会将反派替换为友善角色,也不会因为题材阴暗而拒绝生成场景。犯罪惊悚、战争小说、恐怖、道德灰色主角以及成人间的成熟浪漫都需要一种将黑暗素材视为素材而非警报的模型。

本网站背后的服务提供一款开放权重模型,经过调整可在合法成人用途下无内容审查地回答。该模型由独立提供商运行,通过标准 OpenAI 风格 API 访问。你发送消息列表,获得文本回复。无需学习网页编辑器,也无需填写模板,这正是其要点:你决定故事工具的工作方式,模型提供文本。

有一条规则是固定的。涉及未成年人的性内容始终禁止,且任何提示词无法改变这一点。合法成人小说中的其他所有内容均由你撰写。如果你想了解这与托管角色平台的一般对比,NoFilter AI与Character AI页面对此进行了覆盖。

二十行 Python 代码生成你的第一个故事

由于 API 遵循 OpenAI 格式,官方 openai 包可无需更改地使用。你只需替换基础 URL 和密钥。使用 pip install openai 安装它,然后运行此代码。

from openai import OpenAI

client = OpenAI(
    base_url="https://api.nofilterai.cc/v1",
    api_key="YOUR_KEY",
)

resp = client.chat.completions.create(
    model="uncensored",
    temperature=0.9,
    messages=[
        {"role": "system", "content": (
            "You are a fiction author. Write in third person, past tense. "
            "Use concrete detail and subtext. Never summarise the scene, "
            "never moralise, never address the reader."
        )},
        {"role": "user", "content": (
            "Genre: noir crime. Setting: a flooded harbour town. "
            "Write the opening 600 words. A smuggler finds a body in his net."
        )},
    ],
)
print(resp.choices[0].message.content)

模型 ID 为 uncensored。密钥来自 API 密钥页面。如果你尚未注册,新用户可在该页面一键领取 $0.50 试用额度,有效期 7 天,因此此脚本对你而言零成本。

curl 也可使用相同的调用,这在包装代码前测试提示词时很方便。

curl https://api.nofilterai.cc/v1/chat/completions \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "uncensored",
    "messages": [
      {"role": "user", "content": "Write a 200 word horror scene set in a lighthouse."}
    ]
  }'

生成可用小说的提示词结构

故事模型最令人失望的输出通常来自模糊的指令,而非模型本身。提示词的三个部分承担主要工作。

系统消息设定作者,而非主题

在此处添加文风规则:视角、时态、句子节奏、避免的内容。例如添加一行“不要在场景结尾反思一切的意义”,即可消除许多语言模型共有的习惯。在整个项目中保持此消息稳定,使章节风格保持一致。

用户消息设定节奏

一次只给一个场景。命名角色、地点、场景结束时的变化以及目标长度。“写 700 字。Mara 就失踪的账本与她的兄弟对峙。她没有得到回答”远优于“继续故事”。

故事圣经随行

保留一个简短区块,包含角色事实、迄今为止的时间线和未解决的线索,并在每次请求时发送。800 token 的故事圣经成本几乎可以忽略不计,并能防止模型改变眼睛颜色或复活角色。

  • 草稿阶段使用 temperature 约 0.8 到 1.0,编辑阶段使用 0.5 到 0.7。
  • 如果以固定格式生成,使用 stop 序列,例如在读取“END SCENE”的行时停止。
  • 如果模型重复使用惯用语,请轻微使用 presence_penalty 和 frequency_penalty。两者均传递给模型。
  • 当你希望以同等条件比较两个提示词版本时,使用 seed。

保持长篇故事的一致性

上下文窗口为 100,000 token,包含提示词和回复的总 token 数。这足以容纳完整的故事设定集、之前的数个章节以及单次请求中的新章节输出。对于大多数小说项目,你可以长时间不再担心记忆技巧。

简单循环处理序列化故事。保持消息的滚动列表,追加模型撰写的每个章节,并添加你的下一个指令。当列表接近限制时,用简短摘要替换最旧的章节,并要求模型撰写该摘要。

from openai import OpenAI

client = OpenAI(base_url="https://api.nofilterai.cc/v1", api_key="YOUR_KEY")

bible = "Mara Voss, 34, ferry pilot. Brother Teo owes money. Setting: Harbor Nine, rain every night."
history = [{"role": "system", "content": "Fiction author. Third person, past tense. No moralising.\nBible: " + bible}]

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

print(write("Chapter 1, 700 words: Mara finds Teo's boat adrift."))
print(write("Chapter 2, 700 words: she searches the cabin and finds a second ledger."))

达到限制时,不要静默截断。丢失故事开头的模型通常会保留情节但忘记小事实。500 到 800 token 的书面摘要插入到系统消息之后,可以在低成本下保持这些事实的活跃。

失败或拒绝的请求不收费,因此错误后的重试不会使账单翻倍。完整参数列表在 API 文档 中。

流式输出与互动小说

对于文字冒险游戏或实时写作助手,你需要文字随到达显示在屏幕上。设置 stream: true 并读取服务器发送的事件。使用量数据在流结束时到达。

import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.nofilterai.cc/v1",
  apiKey: process.env.NOFILTER_KEY,
});

const stream = await client.chat.completions.create({
  model: "uncensored",
  stream: true,
  messages: [
    { role: "system", content: "You are the narrator of a survival horror text adventure. Second person, present tense." },
    { role: "user", content: "I open the cellar door." },
  ],
});

for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}

有两个实际限制。完整密钥允许 8 个并发请求和每分钟 300 个请求;试用密钥允许 2 个和 60 个。流式请求在其流结束前占用其并发槽位,因此网页上的慢速读取器可能会比预期更长时间阻塞槽位。如果超过限制,你将收到 HTTP 429 错误,错误代码为 rate_limited 或 concurrency。在短暂过载时,你还会收到带有 Retry-After: 5 的 429,等待五秒后重试是正确的响应。

生成故事为何平淡无奇及修复方法

即使没有拒绝,模型也可能写出枯燥的小说。一旦了解原因,通常很容易修复。

第一个是总结倾向。模型在无人干预时会将事件压缩为整洁的摘要。指定一个场景,规定其长度,并在系统提示词中禁止摘要。第二个是同质化:每个角色的语气都相同。为每个有台词的角色提供两行的声音说明,例如“说话简短,从不把话说完”或“正式,即使对朋友也使用头衔”。第三个是缺乏冲突。像“他们讨论计划”这样的节拍会产生填充内容,而“她需要在黎明前让他同意,而他知道这一点”则会产生张力。

最后,以编辑的身份审视输出。如果相同的句式连续开启了四个段落,在下一个请求中告知模型并要求重写。你在引导,而不是接受任何到达的内容。将首次输出视为草稿的作家,其章节质量远胜于期望直接获得成品的人。

故事的成本

定价为每 1M 输入 token $0.15,每 1M 输出 token $0.50,从预付额度中扣除,无订阅。额度永不过期。以下数字基于这两个价格计算。

任务输入 token输出 token成本
一章包含故事圣经和早期文本3,0001,200$0.00045 + $0.0006 = $0.00105
100 章300,000120,000$0.045 + $0.06 = $0.105
互动会话:50 轮,每轮 20,000 token 上下文,1,000 token 回复1,000,00050,000$0.15 + $0.025 = $0.175
一个填满窗口的输入请求100,0000$0.015

即使一百个章节的成本也仅约 10 美分。充值从 $20 起,最高可达 $500,支持任意整数金额,$50 起赠 5%,$100 起赠 10%,$200 起赠 15%。仅支持加密货币支付,使用 TRC20 上的 USDT 或 Base 上的 USDC。当前详情见定价页面。

高成本的习惯是在互动故事的每一轮都重新发送很长的历史记录。总结旧轮次,你的输入 token 会大幅下降。

实用建议与限制

在开始构建时,以下几点能节省时间。

  • 仅文本。 该服务不生成图像、音频或视频,也不提供向量嵌入或微调功能。如需封面艺术或语音,请使用其他工具。
  • JSON 模式有助于结构化。 当你希望模型返回角色表或场景列表供代码解析时,请请求 response_format: {"type":"json_object"}。
  • 你的提示词不用于训练。 如果你的手稿尚未发表,这一点很重要。
  • 分次编辑。 在高温度下起草,然后将草稿发回,并指示在较低温度下精简对话或删减副词。
  • 检查结果。 无拒绝的模型会遵循你的引导,因此你得到的语气就是你要求的语气。

该模型是通用的开放权重模型,而非厂商的官方 API,因此在围绕其构建产品之前,请先在你的特定类型上进行测试。从免费试用额度开始,先写几章真实内容。

问答

是否可以通过 API 免费试用无审查 AI 故事生成器?

新用户可在注册后,在 API 密钥页面一键领取 $0.50 的试用额度。无需支付,有效期 7 天,每人限领一次。

单个故事请求的长度限制是多少?

上下文窗口为 100,000 token,由提示词和回复共享。回复可以使用提示词剩余的任意空间,且 max_tokens 是可选的。

我能否将其与已支持 OpenAI 的工具一起使用?

是的。任何允许你设置自定义 URL 和密钥的客户端均可使用,使用模型 ID uncensored。支持的接口为 POST /v1/chat/completions 和 GET /v1/models。

该模型是否有任何不能写的内容?

涉及未成年人的性内容始终不允许。除此之外,该模型经过调整,可在合法成人用途下不进行内容拒绝。

你会存储或基于我的故事进行训练吗?

提示词不用于训练。

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

创建账户,复制密钥,更改基础 URL。这就是全部设置。