1仕組みと動作原理
独自プロバイダーアダプタ層による実装:各事業者ごとに1モジュールを配置し、統一された generateImage(prompt, model, args) をエクスポート。メインスクリプトがプロバイダーに応じて処理を振り分け、リクエストボディ、サイズ、品質ルールは個別実装されています。
const imageData = await task.providerModule.generateImage(task.prompt, task.model, task.args);
プロバイダーの自動選択は「どのキーが存在するか」で判定され、codex-cli は自動選択の対象外として明示的に除外されています。
const hasGoogle = !!(process.env.GOOGLE_API_KEY || process.env.GEMINI_API_KEY);
APIキーとモデル構成には明確な優先順位チェーンが存在:CLI > EXTEND.md > 環境変数 > <cwd>/.baoyu-skills/.env > ~/.baoyu-skills/.env。キー未設定時はプロバイダー別のエラーと取得手順を表示します。
Env file load order: CLI args > EXTEND.md > process.env > <cwd>/.baoyu-skills/.env > ~/.baoyu-skills/.env
バッチ並行処理は本格的なワーカープールとプロバイダー単位の流量制御(同時実行上限および起動間隔)で動作し、1画像につき最大3回再試行します。
const enoughCapacity = current.active < limit.concurrency;
バッチタスクは JSON ファイルによって駆動され、outline.md と prompts/ ディレクトリを batch.json にまとめるアセンブラーを備え、記事の挿絵パイプラインに対応します。
# Build a batch file from outline.md + prompts/ (e.g. baoyu-article-illustrator output)
codex-cli プロバイダーは API キーを使用せず、ローカルの codex CLI(サブスクリプションログイン状態)を起動して同梱の codex-imagegen ラッパースクリプトを実行。このラッパー層が当該ターンで実際に image_gen が呼び出されたかを検証します。
const child = spawn(command, args, { stdio: ["ignore", "pipe", "pipe"] });
参照画像の同一性維持は感覚任せではなく、SKILL.md で具体的なプロンプト規律を提示:簡潔で確定的なアイデンティティ保持文句句と変更可能な要素の明示により、参照画像が抽象的な説明に置き換わるのを防ぎます。
Do not redesign it or create a similar-looking new subject.
品質とサイズには2系統のマッピングが存在:プリセット normal/2k(デフォルトは 2k)を各社パラメータにマッピング。OpenAI ネイティブは quality=medium/high および 2048px レベルの正当なサイズに対応し、16の倍数・最大辺・アスペクト比を制約します。
width/height must be multiples of 16, max edge 3840px, ratio no wider than 3:1
2コア機能
3外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| api | OpenAI Images API(gpt-image-2.5-flare 默认) |
| api | Azure OpenAI(deployment + api-version) |
| api | Google Gemini 图像生成(gemini-3-pro-image 默认) |
| api | OpenRouter(/chat/completions 流程) |
| api | 阿里云 DashScope(qwen-image-2.0-pro 默认) |
| api | Z.AI / 智谱(GLM-Image、cogview-4) |
| api | MiniMax image-01 |
| api | 火山引擎即梦(Jimeng,V4 签名,AccessKey/SecretKey) |
| api | 火山引擎 ARK / Seedream(豆包) |
| api | Replicate(nano-banana / seedream / wan 等家族) |
| api | Agnes |
| cli | codex CLI(本地订阅登录态;codex exec 通道) |
| cli | bun(运行 TS 脚本;缺 bun 时 npx -y bun) |
4推奨統制措置と判定根拠
- SKILL.md / 脚本: 未公開またはリバースエンジニアリングされたプライベートAPIの呼び出し / クライアント識別情報の偽装
- SKILL.md / 脚本参数: 自動化された検出の回避、ホストサンドボックスの無効化、またはSSL証明書検証のスキップを含む
- scripts/: ローカルスクリプトまたはコマンドの実行: bun {baseDir}/scripts/main.ts(単一画像または --batchfile バッチ処理)
- 网络端点: 外部ネットワークアクセスの宣言: api.openai.com / *.openai.azure.com(カスタム AZURE_OPENAI_BASE_URL を含む)
- 本地工作目录: ファイルの読み書きおよび成果物の出力: --image/--batchfile で指定された出力パスに従って画像ファイルを書き込み。バッチモードでは複数枚を出力しタスクごとに集約
5二重目の独立検証
- [ok] 12 家 provider 的端点与默认模型 — 逐个文件核对:openai.ts(api.openai.com/v1, gpt-image-2.5-flare)、azure.ts、google.ts(gemini-3-pro-image)、openrouter.ts、dashscope.ts(qwen-image-2.0-pro)、zai.ts、minimax.ts、jimeng.ts(jimeng_t2i_v40)、seedream.ts(doubao-seedream-5-0-260128)、replicate.ts(google/nano-banana-2)、agnes.ts(agnes-image-2.5-flash)、codex-cli.ts;与 SKILL.md 描述一致。
- [ok] 密钥读取清单 — SKILL.md 的 Environment Variables 表逐项在代码中命中对应 process.env 读取;另有 <PROVIDER>_BASE_URL 覆盖(jest 风格测试里也验证了 base URL 拼接)。
- [ok] codex-cli 存在 --sandbox danger-full-access(安全降级) — skills/baoyu-image-gen/scripts/codex-imagegen/spawn.ts 内 args 含 '"--sandbox"' 与 '"danger-full-access"';同目录 main.ts 注释与 assertSafePath 佐证该指令会被直接交给 codex。
- [ok] prompt 被逐字插入无沙箱 agent 指令 — codex-imagegen/main.ts 的 buildInstruction 返回模板内含 'PROMPT:' 后接 ${prompt},逐字使用;main.ts:104-109 注释说明只对 output/ref 路径做元字符校验,未覆盖 prompt 内容。
- [ok] codex-cli 不会被自动选中(红线触发条件) — SKILL.md Provider Selection 第 5 条与 main.ts 的 has* 判定均不含 codex-cli;需显式 --provider 或 EXTEND.md。
- [ok] 批量并行与重试参数 — main.ts 常量 MAX_ATTEMPTS=3、DEFAULT_MAX_WORKERS=10、provider 级 concurrency/startIntervalMs 表(codex-cli 为 concurrency=1/2000ms),与 SKILL.md 文案一致。
- [ok] 『Codex OAuth 不等于 API key』的说明与代码一致 — SKILL.md 明写不要把 Codex OAuth token 塞进 OPENAI_API_KEY;代码中 openai provider 只读 OPENAI_API_KEY,codex-cli 走独立 spawn 通道,未混用。
- [discrepancy] 红线判级与上游口头结论的关系 — 批4 口径曾一度把 image-gen 判为 orange(理由假设『无绕过/降级』)。本目录 evidence 与该假设不符:目录内确含 `--sandbox danger-full-access` 与 raw prompt 插值(上方两条 ok)。故按『证据优先』记 red,并在 reason 写明触发条件(仅 codex-cli 通道);默认 provider 路径仍为橙级行为。
6結論
4faafab87aede136…