1. 为什么用AI写小说还会卡文?先看清三个真实断点
很多人以为卡文是「灵感不够」,其实用上 AI 写作软件之后,卡文往往换了个形式出现:工具越多,切换越乱;模型越强,人设越飘。我试过同时开着四五个网页,把同一段大纲复制来复制去,结果主角名字在第三章变成了另一个,反派动机前后对不上,最后花在「对齐设定」上的时间比写正文还多。
这篇内容聚焦一个具体问题:AI 写小说卡文,到底是工具不行,还是工作流没搭好。我会横向实测 10 款常见 AI 写作软件在续写、扩写、人设一致性上的表现,然后给出一套可复用的写作工作流,核心是用 TaoToken 做统一 Key / API 通道,把「模型调用」这件事从写作流程里剥离出去,让你不再因为换工具而丢上下文。
适合谁看:正在用 AI 辅助写网文、短篇、同人的写作者;手里有一堆模型账号但不知道怎么串起来的;以及想用 API 方式把续写、扩写、人设检查做成稳定流水线的人。下面所有配置都可以直接复制,改掉 Key 就能跑。
2. TaoToken 前置:把多模型调用收进一个通道
2.1 为什么写作工作流需要一个统一通道
写小说用 AI,最怕的不是模型笨,而是上下文断裂。你在 A 工具里调好了人设,换到 B 工具续写,B 不知道前面发生过什么;你想让一个模型专门做「人设一致性检查」,另一个模型专门做「扩写」,结果每个都要单独配 Key、单独记参数,写两章就乱了。
TaoToken 在这里的角色是统一 API 通道:你拿一个 Key,就能在同一个接口规范下调用不同模型,把「续写」「扩写」「人设校验」拆成三个独立请求,但共用同一份设定文件。这样你的工作流是稳定的,换模型只改一个字段,不用重配环境。
官网入口在这里,注册和看文档都从这进:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
API 基础地址(配置里会用到):https://taotoken.net/api
2.2 拿 Key 和确认模型名
登录后进控制台,在 API Keys 页面创建一个新 Key。建议按用途分:一个给「正文续写」,一个给「人设检查」,方便后面排查是哪个环节出问题。
创建 Key 的直达入口:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
模型名以文档页为准,不要凭记忆写。文档入口:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
注意:Key 只显示一次,复制后先存到本地环境变量或配置文件,不要直接写进会提交到 Git 的代码里。
3. 可复制配置:settings.json 与 config.toml 骨架
3.1 settings.json:给支持 OpenAI 兼容格式的编辑器/插件用
如果你用的是 VS Code 插件、或者自己写脚本调 API,用这份settings.json骨架。核心是把baseURL指向 TaoToken,apiKey从环境变量读,model按你实际要用的模型填。
{ "aiWriter": { "provider": "taotoken", "baseURL": "https://taotoken.net/api", "apiKey": "${TAOTOKEN_API_KEY}", "models": { "continue": "你的续写模型名", "expand": "你的扩写模型名", "consistency": "你的人设检查模型名" }, "temperature": { "continue": 0.8, "expand": 0.7, "consistency": 0.2 }, "maxTokens": 2048 }, "novelContext": { "characterFile": "./novel/characters.md", "outlineFile": "./novel/outline.md", "recentChapters": 3 } }几个参数说明:temperature续写给 0.8 让文字有变化,人设检查给 0.2 让它别乱发挥;recentChapters控制每次请求带多少章上下文,带太多会超 token,带太少会丢设定,3 章是个比较稳的起点。
3.2 config.toml:给命令行工具和本地脚本用
如果你习惯用命令行跑批量任务,比如一次性检查十章的人设一致性,用config.toml:
[provider] name = "taotoken" base_url = "https://taotoken.net/api" api_key_env = "TAOTOKEN_API_KEY" [models] continue = "你的续写模型名" expand = "你的扩写模型名" consistency = "你的人设检查模型名" [generation] max_tokens = 2048 timeout_seconds = 60 [context] character_file = "./novel/characters.md" outline_file = "./novel/outline.md" recent_chapters = 3环境变量这样设(Linux / macOS):
export TAOTOKEN_API_KEY="你创建的Key"Windows PowerShell:
$env:TAOTOKEN_API_KEY="你创建的Key"3.3 人设文件怎么写才不飘
配置里引用了characters.md,这个文件是整条工作流的锚点。不要写成长篇小传,用固定字段,每个角色一段:
## 主角:林晚 - 身份:边城药铺学徒 - 核心动机:找到失踪的师父 - 说话习惯:短句,少用形容词 - 禁忌:不会主动提起身世 ## 反派:周砚 - 身份:商会二把手 - 核心动机:掩盖十年前的事 - 说话习惯:客气但带刺 - 禁忌:不直接承认任何指控每次请求续写或检查,都把这份文件塞进 system prompt。模型换了,这份文件不变,人设就不会因为换工具而崩。
4. 验证请求:确认通道通了再开始写
4.1 用 curl 做最小验证
配置写完先别急着写正文,用一条最小请求确认通道通。把你的模型名和 Key 换成实际值:
curl https://taotoken.net/api/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -d '{ "model": "你的模型名", "messages": [ {"role": "system", "content": "你是一个小说续写助手,只输出正文,不解释。"}, {"role": "user", "content": "林晚推开药铺后门,看见地上有一封信。续写200字。"} ], "temperature": 0.8, "max_tokens": 512 }'成功的话你会拿到一段 JSON,choices[0].message.content里就是续写正文。如果返回 401,检查 Key 和环境变量;返回 404,检查模型名和 base URL 拼写。
4.2 用 Python 脚本验证人设检查环节
续写通了之后,单独验证「人设一致性检查」这个环节。这段脚本读characters.md,把最近一章正文发过去,让模型只输出冲突点:
import os import requests API_KEY = os.environ["TAOTOKEN_API_KEY"] BASE_URL = "https://taotoken.net/api" with open("./novel/characters.md", "r", encoding="utf-8") as f: characters = f.read() with open("./novel/chapter_03.md", "r", encoding="utf-8") as f: chapter = f.read() prompt = f"""以下是角色设定: {characters} 以下是章节正文: {chapter} 请只列出正文中与角色设定冲突的地方,每条一行,没有冲突就输出「无冲突」。不要改写正文。""" resp = requests.post( f"{BASE_URL}/chat/completions", headers={ "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" }, json={ "model": "你的人设检查模型名", "messages": [{"role": "user", "content": prompt}], "temperature": 0.2, "max_tokens": 1024 }, timeout=60 ) print(resp.json()["choices"][0]["message"]["content"])跑通之后,你就有了两个独立环节:续写走一个模型,检查走另一个模型,共用同一份设定文件。这就是工作流的骨架。
4.3 10 款工具实测后的分工建议
实测下来,没有哪款工具能包办全部。按环节分工更稳:
| 环节 | 适合的工具类型 | 注意点 |
|---|---|---|
| 起名 / 碎片灵感 | 对话型助手 | 别指望它记长设定 |
| 搭大纲 / 剧情树 | 垂直大纲工具 | 生成后必须二次创新 |
| 正文续写 | 长上下文模型 | 温度调高,带足上下文 |
| 扩写 / 润色 | 文风模仿强的模型 | 先喂自己的存稿 |
| 人设 / 逻辑检查 | 长文本推理模型 | 温度调低,只让它挑错 |
| 敏感词 / 错字 | 平台自带校对 | 发文前必过一遍 |
把这张表对应到你的settings.json里,就是continue、expand、consistency三个模型字段的来源。
5. 本篇常见错排查
5.1 报错 401 / 403:Key 没读到或权限不对
最常见的是环境变量没生效。先确认:
echo $TAOTOKEN_API_KEY如果输出为空,说明当前终端没加载。检查你是写进了.bashrc还是只在某个窗口临时 export。另外确认 Key 没有多余空格,复制时容易带上换行。
5.2 报错 404:base URL 或模型名写错
baseURL必须是https://taotoken.net/api,不要自己加/v1或结尾斜杠。模型名去文档页复制,不要用记忆里的名字。改完配置后重启编辑器或脚本进程,很多工具不会热加载配置。
5.3 续写内容人设飘:上下文没带够
如果模型把主角说话习惯写变了,先检查recentChapters是不是太小,以及characters.md有没有真的塞进 system prompt。另一个坑是温度太高,续写 0.8 可以,但如果你同时让它做检查,检查环节必须降到 0.2,否则它会「帮你改写」而不是「挑错」。
5.4 请求超时:max_tokens 和上下文太大
一次带十章正文加完整设定,很容易超时。把recentChapters降到 3,max_tokens控制在 2048 以内。如果确实需要检查全书,分批跑,每批三章,别一次全塞。
5.5 换模型后配置失效:字段名不统一
不同工具对baseURL的写法不一样,有的叫base_url,有的叫api_base。改配置时以你用的工具文档为准,但值始终是https://taotoken.net/api。改完先用第 4 节的 curl 验证,再回到写作流程。
6. 把工具串成流水线:长期编码与 Agent 场景
如果你不只是写单篇,而是想长期维护一个小说项目,甚至让 Agent 自动跑「续写 → 检查 → 修订」循环,那配置要再往前走一步。这时候建议用 Coding Plan 把模型调用额度固定下来,避免写到一半额度不够打断节奏。
Coding Plan 入口:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
模型对话调试入口(用来快速试 prompt 效果):https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
接入文档(配置字段和参数以这里为准):https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
API Keys 管理:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
Claude Code / Anthropic 兼容场景入口:https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
最后说个实际经验:卡文从来不是靠某一个「最强模型」解决的,而是靠设定文件 + 统一通道 + 分环节调用这三件事稳定下来。你今晚可以先做一件事——把characters.md按 3.3 的格式写出来,然后用第 4 节的 curl 跑通一次续写。通道通了,剩下的就是往流水线里填章节。