229 lines
8.1 KiB
Markdown
229 lines
8.1 KiB
Markdown
# 图片生成脚本与后端选择
|
||
|
||
需要实际生成配图文件、使用 API/CLI fallback、批量生成 assets,或排查图片接口配置时,先读本文件。
|
||
|
||
## 后端选择
|
||
|
||
优先顺序:
|
||
|
||
1. Codex / 当前 agent 的内置图片生成工具。适合大多数配图任务。
|
||
2. `scripts/maomomo_image_gen.py` API/CLI fallback。适合用户明确要求 API/CLI、内置工具不可用、需要批量 manifest、或希望把生成过程记录到文件时。
|
||
|
||
不要因为脚本存在就强制使用脚本。若内置图片工具可用,仍优先使用内置工具生成独立 PNG,再保存到 `assets/`。
|
||
|
||
生成第一张图前,必须向用户确认:
|
||
|
||
- 已检查哪种内置图片生成工具是否可用。
|
||
- 准备使用的生图后端。
|
||
- 是否需要 `scripts/maomomo_image_gen.py` fallback,以及原因。
|
||
- 当前会沿用环境变量或配置文件中的 baseURL、model、quality,不会擅自改成 `low`。
|
||
|
||
确认后,整篇文章所有图片保持同一个生图后端和质量配置。只有用户明确要求切换,或当前后端无法完成必需能力时,才重新确认后端。
|
||
|
||
## 配置来源
|
||
|
||
脚本按以下顺序读取配置:
|
||
|
||
- `MAOMOMO_IMAGE_API_KEY` / `OPENAI_API_KEY`
|
||
- `MAOMOMO_IMAGE_BASE_URL` / `OPENAI_BASE_URL`
|
||
- `MAOMOMO_IMAGE_MODEL` / `CODEX_PPT_IMAGE_MODEL`
|
||
- `~/.codex/config.toml` 中的 `base_url`
|
||
- `~/.codex/auth.json` 中可识别的 API key
|
||
|
||
不要在日志、回答、Markdown 或 manifest 中写入完整 API key。
|
||
|
||
## 单张生成
|
||
|
||
```bash
|
||
uv run python scripts/maomomo_image_gen.py generate \
|
||
--out article/origin_image/hsbc-mastercard-alipay-campaign-01-cover.png \
|
||
--style warm-fintech-guide \
|
||
--title "汇丰 Mastercard 支付宝活动" \
|
||
--image-type "封面图" \
|
||
--core-text "先看报名、门槛和封顶,避免白刷"
|
||
```
|
||
|
||
先只看 prompt:
|
||
|
||
```bash
|
||
uv run python scripts/maomomo_image_gen.py generate \
|
||
--out article/origin_image/hsbc-mastercard-alipay-campaign-01-cover.png \
|
||
--style data-card-dashboard \
|
||
--title "返现计算图" \
|
||
--image-type "计算图" \
|
||
--core-text "HKD 190 ÷ 9% ≈ HKD 2,112,超过部分没有额外收益" \
|
||
--dry-run
|
||
```
|
||
|
||
## prompt 文件输入
|
||
|
||
- `prompts/*.json` 用于管理图片 job、路径、参考素材、可见文字白名单和完整 prompt。
|
||
- 如果生成脚本的 `--prompt-file` 读取纯文本,必须先从 JSON 的 `prompt` 字段抽取为同名 `.prompt.txt`,再把 `.prompt.txt` 传给图片接口。
|
||
- 不要把整个 JSON 文件作为 `--prompt-file` 传入;否则模型可能把 JSON 外壳、字段名或管理信息画进图片。
|
||
- 抽取出的 `.prompt.txt` 仍必须包含可见文字限制:只允许出现指定业务文案和 `MAOMOMO`,不得出现风格标签、prompt 描述、额外 slogan 或无关文字。
|
||
|
||
推荐抽取方式:
|
||
|
||
```bash
|
||
uv run python - <<'PY'
|
||
from pathlib import Path
|
||
import json
|
||
|
||
path = Path("article/prompts/hsbc-mastercard-alipay-campaign_01.json")
|
||
data = json.loads(path.read_text(encoding="utf-8"))
|
||
prompt = str(data["prompt"]).strip()
|
||
out = path.with_suffix(".prompt.txt")
|
||
out.write_text(prompt + "\n", encoding="utf-8", newline="\n")
|
||
print(out)
|
||
PY
|
||
```
|
||
|
||
然后生成:
|
||
|
||
```bash
|
||
uv run python scripts/maomomo_image_gen.py generate \
|
||
--out article/origin_image/hsbc-mastercard-alipay-campaign-01-cover.png \
|
||
--prompt-file article/prompts/hsbc-mastercard-alipay-campaign_01.prompt.txt
|
||
```
|
||
|
||
## 批量 manifest
|
||
|
||
manifest 示例:
|
||
|
||
```json
|
||
{
|
||
"images": [
|
||
{
|
||
"file_name": "origin_image/hsbc-mastercard-alipay-campaign-01-cover.png",
|
||
"type": "封面图",
|
||
"title": "汇丰 Mastercard 支付宝活动",
|
||
"core_text": "先报名,再看门槛和封顶",
|
||
"alt_text": "MAOMOMO 汇丰 Mastercard 支付宝返现活动封面图",
|
||
"style": "warm-fintech-guide",
|
||
"aspect_ratio": "16:9"
|
||
},
|
||
{
|
||
"file_name": "origin_image/hsbc-mastercard-alipay-campaign-02-calculation.png",
|
||
"type": "计算图",
|
||
"title": "怎么刷到刚刚好",
|
||
"core_text": "HKD 190 ÷ 9% ≈ HKD 2,112,超过部分没有额外收益",
|
||
"style": "data-card-dashboard"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
运行:
|
||
|
||
```bash
|
||
uv run python scripts/maomomo_image_gen.py batch \
|
||
--manifest article/image_manifest.json \
|
||
--base-dir article
|
||
```
|
||
|
||
`file_name` 必须与本次生成目录一致,且最终文件必须真实存在。发布用 Markdown 默认引用 `assets/`,因此输出到 `origin_image/` 后要在 QA 通过时同步到同名 `assets/` 文件。
|
||
|
||
重要限制:
|
||
|
||
- 不要在样张确认前运行批量生成。
|
||
- 默认用 `generate` 单张生成;`batch` 只用于用户明确授权的全量生成或 dry-run prompt 输出。
|
||
- 即使使用 `batch`,脚本也是逐项请求图片接口;生成后仍要逐张 QA,并把通过的图片同步到 `assets/`。
|
||
- 发布用 Markdown 默认引用 `assets/`,因此如果 manifest 输出到 `origin_image/`,必须在 QA 后复制到对应 `assets/` 路径。
|
||
- 金融活动 manifest 中涉及信用卡、支付卡或支付网络时,必须记录 `reference_assets`、`payment_network` 和 `card_art_rule`,并在 QA 中核对卡组织没有画错。
|
||
- manifest、prompt、`deck_spec.json` 和发布稿中的港币金额统一使用 `HKD`,来源原文抽取文件除外。
|
||
|
||
## 内置风格名
|
||
|
||
可用:
|
||
|
||
- `warm-fintech-guide`
|
||
- `clean-professional`
|
||
- `clean-editorial`
|
||
- `data-card-dashboard`
|
||
- `handdrawn-note`
|
||
- `creative-magazine`
|
||
- `retro-flat-illustration`
|
||
- `e-ink-editorial`
|
||
- `scientific-defense`
|
||
- `mckinsey-brief`
|
||
- `xiaohongshu-vertical`
|
||
|
||
查看完整描述:
|
||
|
||
```bash
|
||
uv run python scripts/maomomo_image_gen.py styles
|
||
```
|
||
|
||
## 失败处理
|
||
|
||
- API key 缺失:提示用户配置环境变量或检查 Codex 配置,不要编造图片文件。
|
||
- 接口失败:保留已生成图片,说明失败项,必要时用 `--dry-run` 交付 prompt 清单作为临时排查材料。
|
||
- 图片文字乱码或金额错误:重新生成该单张图片;不要手工覆盖文字伪装成模型输出。
|
||
- 图片不符合风格:先更新 manifest 的 `style` / `core_text` / `extra`,再重跑对应项。
|
||
- 图片生成超时:可以对同一张图重试较长超时;不要为了快擅自降低 `quality`。
|
||
- Playwright 只用于已有 HTML / SVG / 网页截图检查,不能替代 GPT Image2 / 图片 API 生成海报、OG 图、卡片图或文章配图。
|
||
|
||
## 状态记录
|
||
|
||
每张图片 job 的 dispatch、result 和 blocker 都要写入项目状态文件。推荐状态文件:
|
||
|
||
```text
|
||
{article_dir}/slide_jobs.json
|
||
{article_dir}/slide_run_state.json
|
||
```
|
||
|
||
记录字段至少包括:
|
||
|
||
- job id,例如 `hsbc-mastercard-alipay-campaign_01`
|
||
- prompt 文件,例如 `prompts/hsbc-mastercard-alipay-campaign_01.json`
|
||
- 输出原图,例如 `origin_image/hsbc-mastercard-alipay-campaign-01-cover.png`
|
||
- 发布图,例如 `assets/hsbc-mastercard-alipay-campaign-01-cover.png`
|
||
- 状态:`pending`、`dispatched`、`recorded`、`blocked`
|
||
- 生图后端、agent id、QA note、失败原因
|
||
|
||
使用 `scripts/maomomo_job_state.py` 更新状态,不要手工改 JSON 后声称完成。
|
||
|
||
初始化状态:
|
||
|
||
```bash
|
||
uv run python scripts/maomomo_job_state.py init article \
|
||
--selected-backend "built-in image tool"
|
||
```
|
||
|
||
查看状态:
|
||
|
||
```bash
|
||
uv run python scripts/maomomo_job_state.py status article
|
||
```
|
||
|
||
记录 dispatch:
|
||
|
||
```bash
|
||
uv run python scripts/maomomo_job_state.py dispatch article \
|
||
--job hsbc-mastercard-alipay-campaign_02 \
|
||
--agent-id "<agent id>" \
|
||
--prompt-file prompts/hsbc-mastercard-alipay-campaign_02.json
|
||
```
|
||
|
||
单张 QA 通过后,记录结果并同步到 `origin_image/` 和 `assets/`:
|
||
|
||
```bash
|
||
uv run python scripts/maomomo_job_state.py result article \
|
||
--job hsbc-mastercard-alipay-campaign_02 \
|
||
--agent-id "<agent id>" \
|
||
--backend-used "built-in image tool" \
|
||
--selected-source /absolute/path/to/generated.png \
|
||
--qa-note "文字清楚,日期、金额、公式和卡组织已核对,风格与样张一致。"
|
||
```
|
||
|
||
记录 blocker:
|
||
|
||
```bash
|
||
uv run python scripts/maomomo_job_state.py blocker article \
|
||
--job hsbc-mastercard-alipay-campaign_02 \
|
||
--agent-id "<agent id>" \
|
||
--reason "选定图片后端在 worker 中不可用"
|
||
```
|
||
|
||
如果状态脚本失败,最终报告必须说明原因,并附上状态文件当前路径和未完成 job。
|