很多人误以为 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 社区公开教程