| name | image-gen2 |
| description | Batch image generation factory. Give it one prompt template (with a {subject} slot) plus a subject list (csv/json/txt) and it generates dozens-to-hundreds of images concurrently with automatic machine verification and retry. ZERO runtime LLM calls โ prompts are pure template+subject string substitution. Reuses the image-gen Codex/OAuth engine (no API key). Triggers โ ๋๋ ์ด๋ฏธ์ง, ๋ฐฐ์น ์ด๋ฏธ์ง ์์ฑ, image-gen2, ์ด๋ฏธ์ง ๊ณต์ฅ, ์ฌ๋ฌ ์ฅ ์์ฑ, batch image, image factory, bulk image generation. |
| version | 1.0.0 |
| author | Elon (p9) |
| license | MIT |
| metadata | {"hermes":{"tags":["batch","image-generation","codex","oauth","pipeline","factory"],"related_skills":["image-gen","codex"]}} |
image-gen2 โ Batch Image Factory
๋๋ ๋ฐฐ์น ์ด๋ฏธ์ง ์์ฑ ํ์ดํ๋ผ์ธ. ํ๋กฌํํธ ํ
ํ๋ฆฟ 1๊ฐ + subject ๋ชฉ๋ก์ ์ฃผ๋ฉด,
subject๋ง ์นํํด ์์ญ~์๋ฐฑ ์ฅ์ ๋์ ์์ฑํ๊ณ ์๋ ๊ฒ์ยท์ฌ์๋ํ๋ค.
์ค๊ณ ์ถ์ฒ: ํ๊ตญ Threads @zarvan_kim ํ์ดํ๋ผ์ธ(GPT Pro ๊ตฌ๋
์ผ๋ก ํ๋ฃจ
15000์ฅ)์ ์ฐ๋ฆฌ ํ๊ฒฝ(Codex OAuth)์ผ๋ก ์ด์. 4๋ ์์น:
- ๋ฐํ์ LLM ํธ์ถ 0 โ ํ ํฐ ์ ์ฝ์ ํต์ฌ. ํ๋กฌํํธ๋ ํ
ํ๋ฆฟ + subject ๋ฌธ์์ด
์นํ๋ง. ๋งค๋ฒ LLM์ผ๋ก ํ๋กฌํํธ ์์ฑํ์ง ์๋๋ค. ํ
ํ๋ฆฟ ์์ฑ์ ์ฌ๋/1ํ์ฑ.
- ๋์ ์์ฑ โ ThreadPoolExecutor, ๊ธฐ๋ณธ concurrency 4 (Codex ์ฟผํฐ ๋ณด์์ ).
- 2๋จ๊ณ ๊ฒ์ (cheap-first) โ 1์ฐจ ๊ธฐ๊ณ๊ฒ์ฆ(ํ์ผ ์กด์ฌ + ํด์๋/์ข
ํก๋น +
PNG ๋ฌด๊ฒฐ์ฑ + ์ต์ ํฌ๊ธฐ), ํต๊ณผ ๋ชปํ ๊ฒ๋ง 2์ฐจ vision ํ์ (์ต์
, ํ์ฌ ์คํ
).
- ์ฌ์๋ ์ ๋ต โ attempt 1ยท2 = ์๋ณธ ํ๋กฌํํธ, attempt 3 = ์งง์ safety/clarity
suffix ์ถ๊ฐ, ๊ทธ๋๋ ์คํจ โ
failed.jsonl ๊ธฐ๋ก ํ ๋์ด๊ฐ.
image-gen vs image-gen2
| image-gen (๋จ์ผ) | image-gen2 (๋ฐฐ์น) |
|---|
| ์ถ๋ ฅ | 1์ฅ | N์ฅ (์์ญ~์๋ฐฑ) |
| ์
๋ ฅ | ํ๋กฌํํธ 1๊ฐ | ํ
ํ๋ฆฟ 1๊ฐ + subject ๋ชฉ๋ก |
| ๊ฒ์ | ์์ (์ฌ๋์ด ๋์ผ๋ก) | ์๋ ๊ธฐ๊ณ๊ฒ์ฆ (+์ต์
vision) |
| ์ฌ์๋ | ์์ | ์๋ (๊ธฐ๋ณธ 3ํ, attempt3 suffix) |
| ๋์์ฑ | 1 | ๊ธฐ๋ณธ 4 (์กฐ์ ๊ฐ๋ฅ) |
| ์์ง | gen_image.py | gen_image.py ์ฌ์ฌ์ฉ (subprocess) |
์์ง ์ฌ์ฌ์ฉ
์ ๋๊ตฌ๋ฅผ ์ค์นํ์ง ์๋๋ค. ๋จ์ผ ์์ฑ ์์ง์ ๊ทธ๋๋ก subprocess๋ก ํธ์ถ:
~/2lab.ai/skills/image-gen/scripts/gen_image.py
Codex/ChatGPT OAuth ์ธ์
์ฌ์ฉ(API ํค ๋ถํ์). ๊ฒ์๋ identify(imagemagick).
์ํฌํ๋ก์ฐ
- ํ
ํ๋ฆฟ ์์ฑ โ
{subject} ์ฌ๋กฏ 1๊ฐ ํฌํจ. (1ํ์ฑ, LLM ์ ์)
- subject ๋ชฉ๋ก ์ค๋น โ csv/json/txt ์ค ํ1.
- batch_gen.py ์คํ.
- ๊ฒ์/์ฌ์๋ ์๋ โ ๊ธฐ๊ณ๊ฒ์ฆ ์คํจ ์ ์๋ ์ฌ์๋.
- ๊ฒฐ๊ณผ ํ์ธ โ out-dir์ PNG๋ค +
failed.jsonl(์คํจ๋ถ๋ง ๊ธฐ๋ก).
- ํ
๋ ๊ทธ๋จ ์ ์ก โ ์ฌ๋ฌ ์ฅ์ด๋ฉด ๋ํ N์ฅ ๋๋ zip์ผ๋ก.
์ฌ์ฉ๋ฒ
1. subject ๋ชฉ๋ก ํ์ผ
- txt: ํ ์ค์ subject ํ๋ (
# ์ฃผ์/๋น ์ค ๋ฌด์)
- csv:
subject ํค๋ ์ปฌ๋ผ, ์์ผ๋ฉด ์ฒซ ์ปฌ๋ผ
- json:
["a","b"] ๋๋ [{"subject":"a", ...}]
์ (subjects.txt):
cat
rocket
coffee cup
2. ๋ฐฐ์น ์คํ
python3 ~/2lab.ai/skills/image-gen2/scripts/batch_gen.py \
--template "A minimalist flat icon of a {subject}, centered, white background, vector style" \
--subjects ~/2lab.ai/skills/image-gen2/examples/subjects.txt \
--out-dir /tmp/icons \
--concurrency 4 \
--size 1024x1024 \
--quality high
ํ
ํ๋ฆฟ์ ํ์ผ์์ ์ฝ์ผ๋ ค๋ฉด --template-file path ์ฌ์ฉ.
3. ํ๋กฌํํธ ๋น๋ ๋จ๋
(dry-run, LLM 0 ๊ฒ์ฆ)
์ค์ ์์ฑ ์ ์ด๋ค ํ๋กฌํํธ/ํ์ผ๋ช
์ด ๋์ฌ์ง ๋ฏธ๋ฆฌ ํ์ธ:
python3 ~/2lab.ai/skills/image-gen2/scripts/prompt_builder.py \
--template "A flat icon of a {subject}" \
--subjects examples/subjects.txt
ํ๋ผ๋ฏธํฐ
| ํ๋๊ทธ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช
|
|---|
--template | (ํ1 ํ์) | {subject} ํฌํจ ํ
ํ๋ฆฟ ๋ฌธ์์ด |
--template-file | (ํ1 ํ์) | ํ
ํ๋ฆฟ ํ์ผ ๊ฒฝ๋ก |
--subjects | (ํ์) | subject ๋ชฉ๋ก (csv/json/txt) |
--out-dir | (ํ์) | ์ถ๋ ฅ ๋๋ ํ ๋ฆฌ |
--concurrency | 4 | ๋์ ์์ฑ worker ์ |
--size | 1024x1024 | ์์ฒญ ํด์๋ (์ข
ํก๋น ๊ฒ์ฆ์ ์ฌ์ฉ) |
--quality | high | auto | low | medium | high |
--retries | 3 | ์ต๋ ์๋ ํ์ |
--retry-suffix | (๊ธฐ๋ณธ ์ ๊ณต) | attempt 3์ ๋ถ๋ safety/clarity ๋ฌธ๊ตฌ |
--min-bytes | 5120 | ์ต์ PNG ํฌ๊ธฐ (๋ฌด๊ฒฐ์ฑ ๊ฐ๋) |
--vision-check | off | 2์ฐจ vision ๊ฒ์ ํ์ฑํ (ํ์ฌ TODO ์คํ
) |
์ถ๋ ฅ ํ์ผ๋ช
{์ธ๋ฑ์ค}_{subject์ฌ๋ฌ๊ทธ}.png (์: 001_cat.png, 003_coffee_cup.png).
๊ณต๋ฐฑโ_, ํน์๋ฌธ์ ์ ๊ฑฐ.
๊ฒฐ๊ณผ
- ์งํ์ํฉ: stdout์
[N/์ดM] OK/FAIL filename (attempts=K).
- ์์ฝ: ์ฑ๊ณต/์คํจ ์, ์ถ๋ ฅ ๋๋ ํ ๋ฆฌ, Codex ์ฟผํฐ ๋ง์ง๋ง ๊ฐ.
failed.jsonl: ์คํจ๋ถ๋ง {subject, prompt, attempts, last_error, attempt_log}.
(์คํจ ์์ผ๋ฉด ํ์ผ ์์ฑ ์ ๋จ.)
- exit 0 = ์ ๋ถ ์ฑ๊ณต, 2 = ์ผ๋ถ ์คํจ.
ํ ํฐ ์ ์ฝ ์์น (ํต์ฌ)
๋ฐํ์ LLM ํธ์ถ 0. ํ๋กฌํํธ ์์ฑ์ ๋ชจ๋ธ์ ์ฐ์ง ์๋๋ค โ ์์ ํ์ด์ฌ ๋ฌธ์์ด
์นํ. ์ด๊ฒ @zarvan_kim ํ์ดํ๋ผ์ธ์ด ๋๋์ผ๋ก ๋๋ฆด ์ ์๋ ์ด์ . ํ
ํ๋ฆฟ
์์ฑ๋ง ์ฌ๋์ด 1ํ ํ๊ณ , ๋๋จธ์ง N์ฅ์ ์นํ+์์ฑ+๊ฒ์ฆ๋ง ๋ฐ๋ณต.
ํธ๋ฌ๋ธ์ํ
Codex ์ฟผํฐ 80%โ โ
stderr ์ฟผํฐ ๋ผ์ธ์ โ ๋จ๋ฉด 5h ๋๋ 7d ์๋์ฐ๊ฐ 80% ๋์ ๊ฒ. concurrency๋ฅผ
๋ฎ์ถ๊ฑฐ๋(์ --concurrency 2) ์๋์ฐ ๋ฆฌ์
์ ๊ธฐ๋ค๋ฆฐ๋ค.
token_expired / HTTP 401
OAuth access_token ๋ง๋ฃ. codex login status๊ฐ 0์ ๋ฐํํด๋ ํ ํฐ ์์ฒด๊ฐ
๋ง๋ฃ๋์ ์ ์์. ํ ๋ฒ codex exec --skip-git-repo-check "ok"๋ฅผ ๋๋ ค
ํ ํฐ์ ๊ฐฑ์ ํ๊ฑฐ๋ codex logout && codex login.
ํด์๋๊ฐ ์์ฒญ๊ณผ ๋ค๋ฆ
Codex ๋ฐฑ์๋๋ ๋ชจ๋ธ/ํ๋์ ๋ฐ๋ผ --size๋ฅผ ์ ํํ ์งํค์ง ์์ ์ ์๋ค
(1024x1024 ์์ฒญ โ 1254x1254 ๋ฐํ). ๊ทธ๋์ ๊ฒ์๋ ํฝ์
์ ํ ์ผ์น๊ฐ ์๋๋ผ
์ข
ํก๋น ์ผ์น + ์ต์ ํฌ๊ธฐ๋ก ํ๋ค (์ ์ ๋์).
์คํจ ์ฌ์ฒ๋ฆฌ
failed.jsonl์ subject๋ง ์ ๋ชฉ๋ก ํ์ผ๋ก ์ถ๋ ค์ ๋ค์ batch_gen.py ์คํ.
concurrency๋ฅผ ๋ฎ์ถ๋ฉด ์ฟผํฐ/ํ์์์ ์คํจ๊ฐ ์ค ์ ์๋ค.
์ ์งํ ํ๊ณ
- vision ๊ฒ์๋ ์คํ
(MVP).
--vision-check๋ ์๋ฆฌ๋ง ๋ง๋ค์ด์ ธ ์๊ณ ์ค์
vision ํ์ ์ TODO(batch_gen.py: vision_verify). ์ฝ์ด๋ ๊ธฐ๊ณ๊ฒ์ฆ+์ฌ์๋.
- 15000์ฅ ๊ท๋ชจ๋ ์ฐ๋ฆฌ ํ๊ฒฝ์์ ๋ถ๊ฐ. ์๋ณธ์ GPT Pro ์ ์ฉ ์ฟผํฐ. ์ฐ๋ฆฌ๋
Codex ๊ตฌ๋
์ฟผํฐ(5h/7d ์๋์ฐ)์ ๋ฌถ์ฌ ์์ด ๊ทธ๋งํผ ๋ชป ๋ฝ๋๋ค.
- ToS ํ์์ง๋. ๊ตฌ๋
์ธ์
(OAuth)์ผ๋ก ๋๋ ์๋ ํธ์ถํ๋ ๊ฒ์ OpenAI
์ฝ๊ด์ ํ์์ง๋. ์ฟผํฐ ํ๋ ๋ด์์ ๋ณด์์ ์ผ๋ก ์ธ ๊ฒ.
ํฌ๋ ๋ง
ํ์ดํ๋ผ์ธ ์ค๊ณ ์ถ์ฒ: Threads @zarvan_kim (๋๋ ์ด๋ฏธ์ง ์์ฑ 4์์น).
์ฐ๋ฆฌ ํ๊ฒฝ(Codex OAuth + image-gen ์์ง)์ผ๋ก ์ด์.
Changelog
- 1.0.0 (2026-06-17): ์ด๊ธฐ ๋ฒ์ . prompt_builder(LLM 0) + batch_gen
(๋์ ์์ฑ + ๊ธฐ๊ณ๊ฒ์ฆ + ์ฌ์๋ + failed.jsonl). vision ๊ฒ์ ์คํ
.