实战

Codex 做文生图调度员:构建可审计的图像生成工作流

2026/9/214 分钟阅读

很多人误以为 Codex 能"直接画图",但实际上 Codex 是纯文本模型,不具备图像生成能力。真正的高阶玩法是:把 Codex 当作调度中枢,串联外部图像服务,构建一条可审计、可复用的文生图流水线。

这篇文章从零开始,教你搭建这套系统。

一、核心分工:谁负责什么

组件 职责 可替换性
Codex(CLI 或 Skill) 理解意图、重写 prompt、构造 JSON、解析响应 ✅ 可替换为任何 LLM CLI
图像生成服务 DALL·E 3 / SDXL / Flux 执行实际生成,返回 base64 或 URL ✅ 可自由切换
中间件(FastAPI) 验证参数、注入默认值、统一错误码、记录日志 可省略但强烈建议保留
本地缓存层 SQLite 存储 prompt→image 映射,避免重复生成 ✅ 可替换为 Redis 或目录

关键原则:Codex 不碰图像数据,只管"说人话"和"下命令"。各组件通过标准 HTTP 通信,任意一环故障都不会拖垮整条流水线。

二、Step 1:构建 Prompt 重写 Skill

Codex 的核心价值是把模糊中文需求转化为精准、模型友好的英文 prompt。示例:

  • 用户输入:"做个微信公众号封面图,主题是'AI 编程入门',要有机器人和代码符号,科技感,蓝紫色调"
  • Codex 输出(JSON):
{
  "prompt": "A high-resolution WeChat official account cover image, featuring a friendly humanoid robot holding a glowing laptop with visible Python code on screen, surrounded by floating binary digits and circuit board patterns, cyberpunk aesthetic, dominant colors: electric blue and deep purple, clean background, 16:9 aspect ratio",
  "model": "dall-e-3",
  "size": "1792x1024",
  "quality": "hd",
  "style": "vivid"
}

System Prompt 模板(可直接复用):

你是一个专业的 AI 图像生成提示词工程师,专精于将中文设计需求转化为 DALL·E 3 / SDXL 兼容的英文 prompt。请严格遵守以下规则:
1. 输出必须为合法 JSON 对象,字段仅限:prompt, model, size, quality, style;
2. prompt 字段必须包含:主体描述 + 动作/状态 + 环境/背景 + 风格关键词 + 色彩限定 + 构图比例;
3. 禁止使用模糊词汇(如"好看""高级""简约"),必须替换为具体视觉元素(如"无衬线字体""浅灰渐变背景""微距镜头");
4. 若用户未指定尺寸,默认 size="1024x1024";若未指定模型,默认 model="dall-e-3";
5. 若需求含敏感内容(暴力、政治、成人),立即返回空 prompt 并设置 error="content_policy_violation"。
现在请处理以下用户输入:

💡 实测建议:用 code-davinci-002 模型比 gpt-3.5-turbo 对 JSON 格式约束更强,极少出现字段缺失或引号错乱。

三、Step 2:中间件服务(FastAPI 示例)

中间件是工作流健壮性的核心,主要解决三个问题:缓存穿透、参数污染、错误归因。

# image_gateway.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import httpx, hashlib, sqlite3, base64
from pathlib import Path

app = FastAPI()
DB_PATH = Path("image_cache.db")

class ImageRequest(BaseModel):
    prompt: str
    model: str = "dall-e-3"
    size: str = "1024x1024"

@app.post("/generate")
async def generate_image(req: ImageRequest):
    # 生成 cache key
    cache_key = hashlib.sha256(
        f"{req.prompt}|{req.model}|{req.size}".encode()
    ).hexdigest()[:16]

    # 检查缓存
    conn = sqlite3.connect(DB_PATH)
    cursor = conn.cursor()
    cursor.execute("SELECT image_path FROM cache WHERE key = ?", (cache_key,))
    cached = cursor.fetchone()
    if cached:
        return {"status": "cached", "image_url": f"/static/{cached[0]}"}

    # 调用 DALL·E 3 API
    try:
        async with httpx.AsyncClient() as client:
            resp = await client.post(
                "https://api.openai.com/v1/images/generations",
                headers={"Authorization": f"Bearer {OPENAI_API_KEY}"},
                json={"prompt": req.prompt, "model": req.model,
                      "size": req.size, "quality": "hd"},
                timeout=60.0
            )
            if resp.status_code != 200:
                raise HTTPException(status_code=resp.status_code)

            image_data = resp.json()["data"][0]["b64_json"]
            image_path = f"{cache_key}.png"
            with open(f"static/{image_path}", "wb") as f:
                f.write(base64.b64decode(image_data))
            cursor.execute(
                "INSERT INTO cache (key, image_path) VALUES (?, ?)",
                (cache_key, image_path)
            )
            conn.commit()
            return {"status": "generated", "image_url": f"/static/{image_path}"}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

四、高频踩坑与修复

错误现象 根因 修复方案
prompt contains banned word: 'Apple' 未做品牌词泛化 在 system prompt 追加:所有知名商业品牌必须替换为通用描述,末尾加 no brand logos, no trademarked elements
prompt too long, max 400 chars 未做截断处理 在中间件增加预处理函数,按词粒度截断至 380 字符
invalid size parameter(size 明明是 "1024x1024") JSON 序列化末尾有空格 中间件强制 req.size.strip(),加正则校验 ^\d+x\d+$
rate limit exceeded 多客户共用同一 project ID 每个客户分配独立 OpenAI project
base64 decode error: Incorrect padding CDN 节点截断导致缺少补位符 解码前自动补 =:s + "=" * ((4 - len(s) % 4) % 4)

五、选型决策:什么时候该用这套方案

场景 推荐方案
每日 < 100 次生成、无离线需求 Python 脚本直调 API(10 行代码即可)
每日 > 100 次、需要缓存和审计 Codex + 中间件(本教程方案)
完全离线、数据不出域 ComfyUI 本地方案(需额外配置 workflow JSON)
团队有专职 prompt 工程师 纯 Python 脚本足够,人力成本低
无专职 prompt 工程师 Codex 结构化输出能力可降低 60% 以上调试时间

来源:编程知识《Codex不生成图像:构建可审计的文生图调度工作流》,hqwc.cn,2026-09-21

资料最后核对日期:2026-09-21 · 内容整理自 CodexGuide 社区公开教程