feat: 完成T-302p提示词管理
新增app/prompts.py,支持标题提示词读写、封面模板列表/读取/保存/重命名/删除,以及旧标题、新标题、商品id、店铺变量替换。
Tab②接入标题提示词启动回显和保存,封面模板下拉、新建、保存、另存为、重命名、删除、插入{新标题}与变量预览;本任务仍不调用AI、不写SQLite。
新增tests/test_prompts.py并扩展GUI测试覆盖提示词文件管理和预览;同步任务看板、API、routes、current-state和progress,下一个任务更新为T-303。
This commit is contained in:
+16
-9
@@ -247,19 +247,21 @@ generate_batch(tasks, prompts, ai_cfg, on_progress, should_stop) -> None
|
||||
- 调用有成本与失败可能:超时、限流、内容安全拒绝都要返回明确错误。
|
||||
- 生成结果**直接进入 ③ 更新候选**;③ 点击「开始更新」后弹窗批量确认,确认后提交线上。本地留档 + 回写 Excel 供追溯。
|
||||
|
||||
## prompts 模块(`app/prompts.py`,待建)
|
||||
## prompts 模块(`app/prompts.py`,已建)
|
||||
|
||||
```python
|
||||
class PromptError(RuntimeError): ...
|
||||
|
||||
# 标题提示词:单文件
|
||||
load_title_prompt(path="title_prompt.txt") -> str # 启动回显;缺失返回 ""
|
||||
save_title_prompt(text, path="title_prompt.txt") -> None # 「保存」按钮
|
||||
|
||||
# 封面提示词:多模板(prompts/cover/<名称>.txt)
|
||||
list_cover_templates() -> list[str] # 模板名列表(下拉用)
|
||||
load_cover_template(name) -> str
|
||||
save_cover_template(name, text) -> None # 保存 / 另存为
|
||||
rename_cover_template(old, new) -> None # 重名校验,重复则报错
|
||||
delete_cover_template(name) -> None # 删除(二次确认由 GUI 负责)
|
||||
list_cover_templates(directory="prompts/cover") -> list[str] # 模板名列表(下拉用)
|
||||
load_cover_template(name, directory="prompts/cover") -> str
|
||||
save_cover_template(name, text, directory="prompts/cover") -> None
|
||||
rename_cover_template(old, new, directory="prompts/cover") -> None
|
||||
delete_cover_template(name, directory="prompts/cover") -> None
|
||||
|
||||
# 变量替换
|
||||
render_prompt(template_text, task) -> str
|
||||
@@ -271,6 +273,8 @@ render_prompt(template_text, task) -> str
|
||||
- 「插入标题」在封面提示词光标处插入 `{新标题}`;「预览」对选中任务调用 `render_prompt` 后展示。
|
||||
- 生成封面时 `gen_cover` 的 prompt = `render_prompt(当前封面模板, task)`。
|
||||
- 模板与 `title_prompt.txt` 均为可手改的纯文本文件。
|
||||
- `list_cover_templates()` 不会在启动时创建文件;只有保存/新建/另存为才写 `prompts/cover/*.txt`。
|
||||
- 模板名不可为空,不允许路径分隔符、`..` 或 Windows 非法文件名字符;重命名时目标重名会报错。
|
||||
|
||||
## gui 模块(`app/gui.py`,已建,PySide6)
|
||||
|
||||
@@ -279,7 +283,7 @@ render_prompt(template_text, task) -> str
|
||||
main() -> int # 创建 QApplication + MainWindow
|
||||
class MainWindow(QMainWindow) # QTabWidget: ①②③④⑤;支持注入 db_path/config 便于测试
|
||||
class CollectTab(QWidget) # ① 导入采集:导入 Excel + 汇总栏 + QTableView 任务列表 + 未匹配略过标记
|
||||
class GenerateTab(QWidget) # ② AI生成:左标题/封面提示词,右批次/店铺/状态筛选 + 任务列表
|
||||
class GenerateTab(QWidget) # ② AI生成:提示词管理 + 批次/店铺/状态筛选 + 任务列表
|
||||
class CollectWorker(BaseWorker) # ① 后台采集:账号就绪预检 -> editor.collect -> db.set_collected/mark_skipped/mark_failed
|
||||
class WriteBackWorker(BaseWorker) # ① 后台回写:excel.write_back(batch_id) 写旧标题/旧封面到原 Excel
|
||||
class TaskTableModel(QAbstractTableModel) # 任务表格模型:账号/别名/商品ID/阶段;未匹配别名显示“略过”
|
||||
@@ -313,12 +317,15 @@ TAB_STYLE: str # 顶层 Tab 栏防误点样式:
|
||||
- 「回写旧数据到 Excel」通过 `WriteBackWorker` 后台调用 `excel.write_back()`,把已采集旧标题/旧封面路径按原 Excel 行定位写回;该按钮主要作为自动回写失败后的手动重试入口。原文件被占用时弹窗提示关闭后重试,SQLite 采集结果不回滚。
|
||||
- 采集前由 `CollectWorker` 做账号就绪预检:无账号、当前批次匹配账号未启动 CDP 端口或未登录时,返回 `blocked=True`,GUI 弹窗汇总并跳转/引导去④账号管理;不无提示批量启动所有账号 Chrome。匹配账号未登录属于预检阻断,不是逐条 skipped。
|
||||
|
||||
② AI生成当前要点(T-302):
|
||||
② AI生成当前要点(T-302/T-302p):
|
||||
|
||||
- 左右 `QSplitter`:左侧约 1/4 为标题提示词、封面提示词两个多行输入;右侧为筛选栏 + 任务列表。
|
||||
- 标题提示词启动时从 `title_prompt.txt` 回显;点击「保存标题提示词」写回该文件。
|
||||
- 封面提示词模板下拉读取 `prompts/cover/*.txt`;支持新建、保存、另存为、重命名、删除。删除由 GUI 二次确认,删空后下拉显示内存态“默认”,不会自动建文件。
|
||||
- 「插入标题」在封面提示词光标处插入 `{新标题}`;「预览」使用当前选中任务(无选择则用第一条)调用 `prompts.render_prompt()` 并弹窗展示。
|
||||
- 筛选栏包含:批次、店铺、状态、刷新。批次来自 `db.list_batches()`;店铺来自当前任务别名并优先显示匹配账号名;状态支持全部/待生成/已生成/失败/略过/已更新。
|
||||
- 任务列表使用 `QTableView + GenerateTaskTableModel`,列为:店铺、商品ID、旧标题、新标题、状态。`stage=collected` 显示“待生成”,`stage=generated` 显示“已生成”,`status=failed/skipped/running` 优先显示对应状态。
|
||||
- T-302 只实现布局与只读列表筛选,不调用 `app.ai`、不写 SQLite;提示词保存/模板管理留给 T-302p,开始生成/停止/进度与 `set_generated()` 留给 T-303。
|
||||
- T-302/T-302p 不调用 `app.ai`、不写 SQLite;开始生成/停止/进度与 `set_generated()` 留给 T-303。
|
||||
|
||||
## workers 模块(`app/workers.py`,已建,PySide6)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user