6.0 KiB
6.0 KiB
id, title, phase, deps, status, created
| id | title | phase | deps | status | created |
|---|---|---|---|---|---|
| T-583 | 标题提示词模板数据层:泛化 prompts 模板 CRUD + 新增 prompts/title 目录(加法,不换单文件) | 7 | TODO | 2026-07-10 |
问题 / 背景
②标题提示词现为单文件 title_prompt.txt(一条,prompts.load/save_title_prompt),无模板管理;封面提示词已是目录多模板(cover_prompts_dir + 一套 CRUD)。运营希望标题也能像封面一样存/取多个命名模板。
已核关键事实(决定改动范围):
- 生成时
generate_batch(tasks, prompts, ...)的prompts["title"]/["cover"]取编辑框当前文本(generate.py:1219/1281),不读文件/模板。模板只是"把某段文本载入编辑框"的持久化层——本任务不碰generate_batch、不碰生成读取路径。 prompts.py现有list/load/save/rename/delete_cover_template五个写死 cover 的函数 +render_prompt(共享)+ensure_default_prompts(播种默认封面模板)。
定案(已评审):
- 加法、不换单文件:
title_prompt.txt保留为"当前工作文本"(语义不变、不迁移、编辑框仍从它载入),另加data/prompts/title/目录放命名模板。纯新增能力,零迁移、零丢失风险。 - 泛化 CRUD:把 cover 那五个函数泛化成按目录参数化的通用模板 CRUD,标题/封面共用一套,不复制第二份(防两套分叉)。
- 标题默认模板:拿现有默认标题提示词播一条进
data/prompts/title/(不新建default_prompts/title包)。
本任务只做数据层,无 UI(UI reorg 见 T-584)。
方案(改哪个文件、改成什么)
app/prompts.py — 泛化模板 CRUD
- 抽出目录参数化的通用函数(命名实现定,如):
list_templates(directory)、load_template(name, directory)、save_template(name, text, directory)、rename_template(old, new, directory)、delete_template(name, directory),含现有_normalize_name/_template_path/重名保护。 - 现有
*_cover_template保留为薄封装(转调通用函数,传COVER_PROMPTS_DIR),保证封面既有调用点零改动、零回归。 - 新增标题模板薄封装或直接让 GUI 传
title_templates目录调用通用函数(择一,UI 任务据此对接)。 - 通用函数的错误文案使用中性中文,例如「提示词模板名不能为空 / 提示词模板不存在 / 提示词模板已存在」,不要在标题模板路径上暴露“封面提示词模板”。
app/appconfig.py — 目录路径
- 新增
title_templates_dir(config=None)→data_path("prompts", "title", config=config),与现有cover_prompts_dir(config=None)的data/prompts/cover/形成同层目录。 - 不把标题模板放到
data/title_templates/,避免提示词存储分散。
app/prompts.py ensure_default_prompts — 播种标题默认模板
- 现有逻辑保留(
title_prompt.txt缺失时写默认、封面模板缺失时播默认)。 - 新增第三参数
title_templates_dir=None:若为空时播入一条默认标题模板(内容 =_read_default_prompt_text("title_prompt.txt"),模板名如「默认」)。不新建app/default_prompts/title包。 - 调用方显式传入
title_templates_dir时按该目录播种;未传时必须从title_prompt_path推导同一个用户数据根下的prompts/title/,避免测试或临时配置只传title_prompt_path/cover_prompts_dir时误写真实默认data/。 - 已有标题模板时不覆盖;
title_prompt.txt为空时仍按旧逻辑写默认工作文本。
数据/边界
title_prompt.txt语义不变:仍是编辑框当前工作文本的持久化,load/save_title_prompt不动。- 标题模板与封面模板是两个独立目录:
data/prompts/title/*.txt与data/prompts/cover/*.txt,占位符(标题{旧标题}等 vs 封面{新标题}等)各自语义不变;render_prompt共享不改。
文档同步
- 更新
docs/04-architecture.md提示词存储说明:data/title_prompt.txt是当前工作标题提示词;data/prompts/title/*.txt是标题模板;data/prompts/cover/*.txt是封面模板。 - 若
docs/routes.md/ 设置或打包文档已有提示词目录描述,同步保持prompts/title/prompts/cover口径。
验收要点
- 通用模板 CRUD 存在且被 cover 薄封装复用;
list/load/save/rename/delete_cover_template行为不回归(既有封面模板测试全绿)。 - 新增
title_templates_dir指向data/prompts/title;list_templates能对该目录增删查、重名保护生效。 ensure_default_prompts:prompts/title/为空时播入一条默认标题模板(内容 = 现有默认标题提示词);已有模板时不覆盖;传临时title_prompt_path时不会误写真实默认data/。title_prompt.txt及load/save_title_prompt行为不变(编辑框工作文本不受影响,无迁移、无丢失)。- 标题/封面模板互不干扰(各自目录)。
docs/04-architecture.md已同步提示词存储结构。- 不改
generate_batch/生成读取路径/render_prompt。 - 验证命令(unittest,不引入 pytest):
py -3.10 -m unittest tests.test_prompts tests.test_appconfig(若无 test_prompts 则新建)python -m ruff check app tests main.pypy -3.10 -m compileall app main.pypy -3.10 -m unittest discover -s testsgit diff --check
边界(不改什么)
- 不动
generate_batch、生成时的 prompt 读取(仍取编辑框文本)。 - 不改
title_prompt.txt语义、不迁移/删除该文件。 - 不复制第二份模板 CRUD;封面走薄封装复用通用实现。
- 不做 GUI(T-584);不新建
default_prompts/title包。 - 不把标题模板放到
data/title_templates/;统一使用data/prompts/title/。 - 不改 CDP/DB/AI 请求/cmhub/Excel。
执行记录
(做完在这里写:改了什么文件、跑了什么验证命令及结果、遇到的阻塞、关键决策。)