AI 小说生成系统
利用 AI 能力快速生成小说内容,支持多种生成模式和自定义 API 接入
📖 系统概述
AI 小说生成系统是灵码小说助手的核心引擎,提供流式内容生成能力。系统支持多种生成模式(大纲生成、章节生成、内容续写等),并允许用户接入自己的 AI API 服务。
🎯 功能特性
1. 流式生成技术
实时创作体验:
用户请求 → AI 开始生成 → 逐字/逐句返回 → 实时显示在界面| 特性 | 说明 |
|---|---|
| 实时输出 | 内容生成后立即显示,无需等待完整响应 |
| 思维链可视化 | 可选显示 AI 的推理过程 |
| 中断支持 | 用户可随时停止生成 |
| 断点续传 | 网络中断后可从断点继续 |
2. 多种生成模式
| 模式 | 入口 | 说明 |
|---|---|---|
| 大纲生成 | 大纲系统 | 根据项目设定生成完整大纲 |
| 大纲续写 | 大纲系统 | 基于现有大纲续写后续内容 |
| 章节生成 | 章节系统 | 根据大纲生成章节正文 |
| 章节续写 | 章节编辑 | 基于现有内容续写 |
| 快捷生成 | 生成器页面 | 独立的快速生成入口 |
3. 参数化控制
生成参数:
| 参数 | 说明 | 示例 |
|---|---|---|
title | 小说标题 | "星际迷航" |
genre | 小说类型 | 科幻、奇幻、悬疑... |
style | 写作风格 | 现实主义、浪漫主义... |
requirements | 详细要求 | "主角性格要冷酷" |
word_count | 目标字数 | 3000 |
temperature | 创意度 | 0.7 (0-1) |
小说类型:
- 科幻、奇幻、悬疑、爱情、历史
- 军事、都市、武侠、仙侠、游戏
- 体育、灵异、同人、轻小说
写作风格:
- 现实主义、浪漫主义、古典主义
- 现代主义、魔幻现实主义
- 黑色幽默、意识流、自然主义
4. 自定义 API 接入
用户可配置自己的 AI API:
| 配置项 | 键名 | 说明 |
|---|---|---|
| API 地址 | api_base | 兼容 OpenAI 格式的 API 地址 |
| API 密钥 | api_key | API 访问密钥(加密存储) |
| 模型名称 | api_model | 使用的模型(如 gpt-4) |
| 最大 Token | api_max_tokens | 单次生成最大 Token 数 |
🗄️ 数据模型
UserSetting 模型(API 配置存储)
python
class UserSetting(models.Model):
id = fields.IntField(pk=True)
user_id = fields.IntField() # 用户ID
key = fields.CharField(max_length=100) # 配置键
value = fields.TextField() # 配置值(加密存储)
class Meta:
table = "user_settings"
unique_together = (("user_id", "key"),)预定义配置键:
api_key: API 密钥api_base: API 地址api_model: 模型名称api_max_tokens: 最大 Token 数auto_save: 是否自动保存
生成请求模型
python
class GenerateRequest(BaseModel):
project_id: Optional[int] # 关联项目
title: str # 标题
genre: Optional[str] # 类型
style: Optional[str] # 风格
requirements: Optional[str] # 详细要求
word_count: Optional[int] = 2000 # 目标字数
temperature: Optional[float] = 0.7 # 创意度
context: Optional[str] # 上下文(续写时使用)
characters: Optional[List[int]] # 使用的角色ID列表🔌 API 接口
基础路径
/api/generator接口列表
| 方法 | 路径 | 说明 |
|---|---|---|
POST | /generate | 生成小说内容(流式) |
POST | /generate/outline | 生成大纲(流式) |
POST | /continue | 续写内容(流式) |
POST | /stop | 停止生成 |
GET | /models | 获取可用模型列表 |
用户设置接口
| 方法 | 路径 | 说明 |
|---|---|---|
GET | /api/user/settings | 获取用户设置 |
PUT | /api/user/settings | 更新用户设置 |
POST | /api/user/settings/test-api | 测试 API 连接 |
请求/响应示例
生成小说内容
请求:
json
POST /api/generator/generate
{
"title": "星际迷航",
"genre": "科幻",
"style": "硬科幻",
"requirements": "主角是一名宇航员,在执行任务时遇到外星文明",
"word_count": 3000,
"temperature": 0.7,
"characters": [1, 2]
}响应 (Server-Sent Events):
data: {"type": "content", "text": "公元"}
data: {"type": "content", "text": "2157年"}
data: {"type": "content", "text": ","}
data: {"type": "content", "text": "人类"}
...
data: {"type": "done", "word_count": 3024}续写内容
请求:
json
POST /api/generator/continue
{
"project_id": 1,
"chapter_id": 5,
"context": "李明走进了那扇神秘的大门...",
"word_count": 1000
}测试 API 连接
请求:
json
POST /api/user/settings/test-api
{
"api_base": "https://api.openai.com/v1",
"api_key": "sk-xxx",
"api_model": "gpt-4"
}响应:
json
{
"success": true,
"message": "API 连接成功",
"model_info": {
"model": "gpt-4",
"max_tokens": 8192
}
}🖥️ 用户交互
快捷生成页面
布局结构:
┌─────────────────────────────────────────────────────────────┐
│ AI 小说生成器 │
├────────────────────────┬────────────────────────────────────┤
│ │ │
│ 参数设置 │ 生成结果 │
│ │ │
│ 标题: [星际迷航____] │ ┌──────────────────────────────┐ │
│ │ │ │ │
│ 类型: [科幻____▼] │ │ 公元2157年,人类的星际 │ │
│ │ │ 探索已经进入了新纪元... │ │
│ 风格: [硬科幻__▼] │ │ │ │
│ │ │ ▌ (光标闪烁,正在生成) │ │
│ 字数: [3000____] │ │ │ │
│ │ └──────────────────────────────┘ │
│ 详细要求: │ │
│ [________________] │ 字数: 1,234 / 3,000 │
│ [________________] │ │
│ │ [停止] [复制] [保存到项目] │
│ [开始生成] │ │
│ │ │
└────────────────────────┴────────────────────────────────────┘API 设置页面
布局结构:
┌─────────────────────────────────────────────────────────────┐
│ 用户设置 > API 配置 │
├─────────────────────────────────────────────────────────────┤
│ │
│ API 地址 │
│ [https://api.openai.com/v1________________________] │
│ │
│ API 密钥 │
│ [sk-xxxxxxxxxxxxxxxxxxxxxxxxxx____________________] [显示]│
│ │
│ 模型名称 │
│ [gpt-4____________________________________________] │
│ │
│ 最大 Token 数 │
│ [4096_____________________________________________] │
│ │
│ [测试连接] [保存配置] │
│ │
│ ⓘ API 密钥将加密存储,确保您的数据安全 │
│ │
└─────────────────────────────────────────────────────────────┘交互操作
| 操作 | 方式 | 说明 |
|---|---|---|
| 开始生成 | 点击按钮 | 开始流式生成内容 |
| 停止生成 | 点击停止 | 中断当前生成 |
| 复制内容 | 点击复制 | 复制生成内容到剪贴板 |
| 保存到项目 | 点击保存 | 将内容保存到指定项目/章节 |
| 测试 API | 点击测试 | 验证 API 配置是否正确 |
生成状态
空闲 → 生成中 → 完成/停止/错误
│ │
│ └── 显示进度和字数
│
└── 可以开始新的生成⚙️ 技术实现
前端
路径: src/features/novel_generator/frontend/
| 文件 | 说明 |
|---|---|
api.ts | API 调用封装 |
pages/GeneratorPage.tsx | 生成器页面 |
components/ParameterPanel.tsx | 参数设置面板 |
components/ResultPanel.tsx | 结果展示面板 |
components/StreamingText.tsx | 流式文本组件 |
hooks.ts | 自定义 Hooks |
reducer.ts | 状态管理 |
后端
路径: src/features/novel_generator/backend/
| 文件 | 说明 |
|---|---|
router.py | FastAPI 路由 |
services/generator_service.py | 生成服务 |
services/prompt_builder.py | Prompt 构建器 |
路径: src/backend/
| 文件 | 说明 |
|---|---|
ai.py | AI 调用封装 |
core/sse.py | SSE 响应处理 |
core/stream_error_handler.py | 流式错误处理 |
services/prompt_service.py | Prompt 模板服务 |
流式响应实现
后端 (FastAPI):
python
from fastapi.responses import StreamingResponse
@router.post("/generate")
async def generate(request: GenerateRequest):
async def stream_generator():
async for chunk in ai_service.generate_stream(request):
yield f"data: {json.dumps(chunk)}\n\n"
return StreamingResponse(
stream_generator(),
media_type="text/event-stream"
)前端 (React):
typescript
// 使用 EventSource 或 fetch + ReadableStream
const response = await fetch('/api/generator/generate', {
method: 'POST',
body: JSON.stringify(params),
})
const reader = response.body.getReader()
const decoder = new TextDecoder()
while (true) {
const { done, value } = await reader.read()
if (done) break
const text = decoder.decode(value)
// 解析 SSE 数据并更新 UI
onChunk(text)
}API 密钥加密
python
from src.backend.core.security import encrypt_api_key, decrypt_api_key
# 存储时加密
encrypted_key = encrypt_api_key(raw_api_key)
await UserSetting.create(user_id=user_id, key="api_key", value=encrypted_key)
# 使用时解密
setting = await UserSetting.get(user_id=user_id, key="api_key")
api_key = decrypt_api_key(setting.value)Prompt 模板
路径: src/assets/template/
| 模板文件 | 用途 |
|---|---|
project_generate.jinja2 | 项目内容生成 |
project_continue.jinja2 | 项目内容续写 |
outline.jinja2 | 大纲生成 |
chapter_generate.jinja2 | 章节生成 |
chapter_continue.jinja2 | 章节续写 |
chapter_expand.jinja2 | 章节扩写 |
chapter_compress.jinja2 | 章节缩写 |
chapter_optimize.jinja2 | 章节优化 |
character_generate.jinja2 | 角色生成 |
short_story.jinja2 | 短篇快速生成 |
🔒 安全考虑
API 密钥保护
- 加密存储: 使用 AES 加密存储用户 API Key
- 传输安全: 仅通过 HTTPS 传输
- 访问控制: 用户只能访问自己的配置
- 密钥脱敏: 前端显示时部分隐藏
请求限制
- 频率限制: 防止滥用
- Token 限制: 单次请求最大 Token 数限制
- 并发限制: 同一用户同时只能有一个生成任务