一、核心功能(网页版+批量生成)
✅ 网页可视化界面(无需命令行,打开浏览器即可操作)
✅ 单篇生成:自定义小说类型、主角、世界观、剧情、长度
✅ 批量生成:设置生成数量,一键批量生成多篇不同小说
✅ 本地保存:单篇/批量小说自动保存为TXT,支持自定义保存路径
✅ 实时预览:生成过程实时显示,生成完成可直接在网页查看
✅ 轻量易部署:纯Python实现,无需复杂配置,直接运行
二、准备工作(和之前一致,新增Streamlit依赖)
1. 安装全部依赖
打开终端,执行以下命令,安装所有需要的库(包含Streamlit网页框架):
pip install dashscope python-dotenv streamlit
2. 获取通义千问API Key
和之前步骤一致,无需重复操作:
打开阿里云百炼平台:https://dashscope.console.aliyun.com/
登录 → 右上角头像 → AccessKey 管理 → 创建并复制你的 DASHSCOPE_API_KEY
3. 创建.env配置文件
在代码同目录下,新建一个名为 \.env 的文件,写入以下内容(替换为你的API Key):
DASHSCOPE_API_KEY=你的阿里云通义千问API Key
三、完整代码(网页版+批量生成,直接复制运行)
新建一个Python文件(如 web\_novel\_generator\.py),复制以下完整代码,保存即可:
import osimport dashscopefrom dotenv import load_dotenvfrom dashscope import Generationimport streamlit as stfrom datetime import datetime# 加载环境变量(读取API Key)load_dotenv()dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")# ===================== 核心Skill:小说生成函数(支持单篇/批量复用) =====================defgenerate_single_novel( novel_type: str, main_char: str, world_setting: str, plot_direction: str, length: str = "中篇", style: str = "默认风格"):""" 单篇小说生成Skill:调用通义千问生成小说,供单篇/批量生成调用 :param novel_type: 小说类型(玄幻/都市/言情/科幻/悬疑/古风) :param main_char: 主角设定 :param world_setting: 世界观设定 :param plot_direction: 剧情走向 :param length: 小说长度(短篇/中篇/长篇) :param style: 小说风格(默认/古龙风/鲁迅风/小白文/文艺风) :return: 生成的小说文本(str) """# 长度映射(控制字数) length_map = {"短篇": "800-1000字,单章节完整故事,情节紧凑,有明确结局","中篇": "2000-2500字,2-3个小章节,有起承转合,人物性格鲜明","长篇": "4000-5000字,4-5个章节,情节丰富,有伏笔和转折" }# 风格提示词(优化文笔,适配不同风格) style_map = {"默认风格": "语言流畅,文笔优美,画面感强,逻辑清晰,符合大众阅读习惯","古龙风": "语言凝练,短句为主,节奏明快,善用留白,人物对话犀利,氛围感强","鲁迅风": "文字深刻,略带批判,人物刻画细腻,有时代感,语言朴实而有力量","小白文": "语言简单易懂,节奏快,爽点密集,主角光环明显,无复杂剧情","文艺风": "文笔细腻,情感饱满,注重细节描写,语言优美,有诗意,节奏舒缓" }# 提示词工程(优化生成质量,避免空洞) prompt = f""" 你是一名专业小说作家,擅长创作各类题材小说,请严格按照以下要求创作一篇完整小说: 【核心配置】 小说类型:{novel_type} 主角设定:{main_char} 世界观设定:{world_setting} 剧情走向:{plot_direction} 字数要求:{length_map[length]} 写作风格:{style_map[style]} 【硬性要求】 1. 直接输出小说正文,不要任何多余解释、标题、备注(小说标题可在正文开头自行拟定); 2. 分段清晰,每段不超过3行,章节之间用“---”分隔(长篇/中篇需分章节); 3. 人物性格鲜明,剧情逻辑合理,符合所选类型和风格,无逻辑漏洞; 4. 避免同质化,语言自然,不堆砌辞藻,读起来流畅易懂; 5. 禁止出现低俗、违规、无意义内容,积极正向。 """# 调用通义千问API(使用qwen-turbo,速度快、成本低,适合批量生成)try: response = Generation.call( model="qwen-turbo", messages=[{"role": "user", "content": prompt}], result_format="message", stream=False, temperature=0.7, # 随机性:0.7适中,既保证多样,又不混乱 top_p=0.9 )# 返回生成的小说正文return response.output.choices[0].message.contentexcept Exception as e:returnf"生成失败!错误原因:{str(e)}(请检查API Key是否正确,或网络是否正常)"# ===================== 辅助Skill:小说保存函数(支持单篇/批量保存) =====================defsave_novel(content: str, save_path: str, is_batch: bool = False, batch_index: int = 0):""" 小说保存函数:支持单篇保存、批量保存(自动命名) :param content: 小说文本内容 :param save_path: 保存路径(文件夹) :param is_batch: 是否为批量生成(True/False) :param batch_index: 批量生成时的序号(用于命名) :return: 保存成功提示(str) """# 确保保存路径存在(不存在则创建)ifnot os.path.exists(save_path): os.makedirs(save_path)# 生成文件名(按时间+类型/序号命名,避免重复) now = datetime.now().strftime("%Y%m%d%H%M%S")if is_batch: filename = f"批量小说_{batch_index+1}_{now}.txt"else:# 从小说正文提取前10个字作为文件名(简化命名) title = content[:10].replace("\n", "").replace(" ", "") + f"_{now}.txt" filename = title if len(title) > 5elsef"小说_{now}.txt"# 保存到本地 full_path = os.path.join(save_path, filename)with open(full_path, "w", encoding="utf-8") as f: f.write(content)returnf"✅ 保存成功!路径:{full_path}"# ===================== 网页前端(Streamlit):可视化界面 =====================defweb_ui():# 网页标题和配置 st.set_page_config( page_title="通义千问小说生成器(网页版+批量生成)", page_icon="📖", layout="wide"# 宽屏布局,优化体验 )# 网页标题和说明 st.title("📖 通义千问小说生成器(网页版)") st.subheader("Python + LLM + Streamlit | 支持单篇/批量生成 + 本地保存") st.divider()# 侧边栏:配置参数(所有自定义选项都在这里)with st.sidebar: st.header("⚙️ 生成配置")# 1. 生成模式选择(单篇/批量) generate_mode = st.radio("选择生成模式", ["单篇生成", "批量生成"], index=0)# 2. 基础配置(单篇/批量共用) novel_type = st.selectbox("小说类型", ["玄幻", "都市", "言情", "科幻", "悬疑", "古风"]) main_char = st.text_input("主角设定", placeholder="例:普通少年觉醒上古武魂,性格坚韧") world_setting = st.text_input("世界观设定", placeholder="例:玄幻大陆,武魂至上,弱肉强食") plot_direction = st.text_input("剧情走向", placeholder="例:主角从被嘲笑,一步步逆袭到站在大陆之巅") length = st.selectbox("小说长度", ["短篇", "中篇", "长篇"], index=1) style = st.selectbox("写作风格", ["默认风格", "古龙风", "鲁迅风", "小白文", "文艺风"])# 3. 批量生成专属配置(仅批量模式显示) batch_count = 1if generate_mode == "批量生成": batch_count = st.slider("批量生成数量", min_value=1, max_value=10, value=2, help="一次生成多少篇小说")# 4. 保存配置 save_path = st.text_input("保存路径", value="./生成的小说", help="小说保存到本地的文件夹路径")# 5. 生成按钮(核心触发) generate_btn = st.button("🚀 开始生成", type="primary", use_container_width=True)# 主区域:显示生成结果 result_col, log_col = st.columns([3, 1]) # 分两栏:结果预览 + 生成日志with result_col: st.header("📝 小说预览")# 初始化结果区域 result_area = st.empty() result_area.write("请配置参数,点击【开始生成】按钮,小说将在这里显示...")with log_col: st.header("📊 生成日志") log_area = st.empty() log_area.write("生成日志将在这里显示...")# 生成逻辑(点击按钮触发)if generate_btn:# 校验必填参数ifnot (main_char and world_setting and plot_direction): st.error("❌ 请填写完整主角、世界观、剧情走向!")return# 初始化日志 logs = [] log_area.write("🔄 开始生成,请稍候...")# 分模式生成(单篇/批量)if generate_mode == "单篇生成":# 单篇生成 logs.append(f"📌 单篇生成开始({novel_type} | {length} | {style})") log_area.write("\n".join(logs))# 调用生成函数 novel_content = generate_single_novel( novel_type=novel_type, main_char=main_char, world_setting=world_setting, plot_direction=plot_direction, length=length, style=style )# 显示结果 result_area.markdown(novel_content.replace("\n", " \n"), unsafe_allow_html=True)# 保存小说 save_msg = save_novel(novel_content, save_path, is_batch=False) logs.append(save_msg) logs.append("✅ 单篇生成完成!") log_area.write("\n".join(logs))else:# 批量生成 logs.append(f"📌 批量生成开始({batch_count}篇 | {novel_type} | {length} | {style})") log_area.write("\n".join(logs))# 循环生成多篇for i in range(batch_count): logs.append(f"\n📄 正在生成第{i+1}/{batch_count}篇...") log_area.write("\n".join(logs))# 调用生成函数(批量生成时,剧情会自动略有差异,避免同质化) novel_content = generate_single_novel( novel_type=novel_type, main_char=main_char, world_setting=world_setting, plot_direction=f"{plot_direction}(第{i+1}篇,剧情略有差异,避免重复)", length=length, style=style )# 保存当前篇小说 save_msg = save_novel(novel_content, save_path, is_batch=True, batch_index=i) logs.append(save_msg)# 预览最后一篇生成的小说if i == batch_count - 1: result_area.markdown(novel_content.replace("\n", " \n"), unsafe_allow_html=True)# 批量生成完成 logs.append(f"\n✅ 批量生成完成!共生成{batch_count}篇小说,已保存到:{save_path}") log_area.write("\n".join(logs))# ===================== 启动网页程序 =====================if __name__ == "__main__":# 校验API Key是否配置ifnot dashscope.api_key: print("❌ 请在.env文件中配置正确的DASHSCOPE_API_KEY!")else:# 启动网页界面(自动打开浏览器) web_ui()
四、运行步骤(超简单)
确保已完成「准备工作」(安装依赖、创建.env文件、配置API Key);
打开终端,进入代码所在的文件夹(cd 你的代码文件夹路径);
执行命令:streamlit run web\_novel\_generator\.py;
等待3-5秒,会自动打开浏览器,进入网页界面(默认地址:http://localhost:8501);
在网页侧边栏配置参数,点击「开始生成」,即可实现单篇/批量生成。
五、网页界面操作说明(图文指引)
1. 侧边栏配置区(核心操作)
生成模式:选择「单篇生成」或「批量生成」(批量可设置1-10篇);
基础配置:填写小说类型、主角、世界观、剧情,选择长度和风格;
保存路径:默认保存到「生成的小说」文件夹,可自定义路径;
生成按钮:配置完成后,点击「开始生成」,等待即可。
2. 主区域(结果预览+日志)
小说预览:生成的小说会实时显示在这里,支持换行、分段预览;
生成日志:显示生成进度、保存路径、错误信息(便于排查问题)。
3. 批量生成注意事项
批量生成时,会自动在剧情走向后添加「剧情略有差异」,避免多篇小说内容重复;
每篇小说会自动命名(批量小说_序号_时间.txt),保存到指定文件夹;
批量生成数量建议不超过10篇,避免API调用过于频繁(可根据自身需求调整)。
六、常见问题排查
问题:启动后提示「API Key错误」? 解决:检查.env文件中的API Key是否正确,是否有空格、拼写错误,重新复制粘贴API Key。
问题:生成失败,提示「网络错误」? 解决:检查网络连接,确保能访问阿里云官网,重启程序重试。
问题:网页无法打开? 解决:检查终端是否有报错,确保依赖已全部安装,尝试重新执行启动命令。
问题:生成的小说内容不符合预期? 解决:优化「主角设定」「世界观」「剧情走向」的描述(越详细,生成越精准),调整写作风格。
七、可直接升级的功能(可选)
如果需要,我可以帮你快速添加以下功能,直接整合到当前网页版中:
✅ 小说封面生成(接入通义万相,自动为每篇小说生成封面图);
✅ 章节拆分/编辑(生成后可在网页编辑小说内容,拆分章节);
✅ 导出为Word/PDF(除了TXT,支持导出更规范的文档格式);
✅ 生成记录保存(记录所有生成的小说,便于后续查看);
✅ 自定义字数(不局限于短篇/中篇/长篇,可手动输入具体字数)。