docs(10_Wiki): 위키 전체 재구성 — Topic_* 폴더를 4개 카테고리로 통합 + 대규모 중복 제거
Topic_Agent/Topic_Blog/Topics/Topics_Biz/Topics_Meeting/Topics_Rag의 마크다운 지식 문서를 Topic_General/Topic_Programming/Topic_Graphic/Topic_Business 4개 카테고리로 재분류. - 중복 제거: frontmatter의 status:duplicate/merged + duplicate_of/redirect_to 필드로 자기 자신을 중복으로 선언한 리다이렉트 stub 1032개 제거, 완전 동일 내용 파일 472개 제거, 동일 파일명·다른 내용 충돌 시 더 큰(완전한) 버전만 유지(162개 제거) — 총 1639개 중복 제거. - 분류: 폴더 단위로 명확한 항목(AI_and_ML/Coding/Architecture 등 → Programming, Comfyui/Visual_Effects → Graphic, Topics_Biz/Topics_Meeting/사업 등 → Business, Poetic_Blog_Writing/창의성/Game_Design 등 → General)은 폴더 우선순위로, 나머지 혼재 폴더(Topic_Agent/Topic_Blog/Topics 루트/Thinking & Reasoning/Other/UI_UX_Assets)는 title/tags 키워드 스코어링으로 파일 단위 분류(불명확한 경우 General로 폴백). 원본 폴더명은 "From_*" 서브폴더로 보존해 추적 가능성 유지. - 최종 배치: Programming 2784 / General 1608 / Graphic 285 / Business 249 = 4926개 문서. - 에이전트 운영 상태(.astra/.agent/.obsidian/sessions/memory/_company/docs/lessons/_shared/src)는 지식 콘텐츠가 아니므로 재분류 대상에서 제외하고 원위치 유지. - Topics/Topic_email(상위 보호 폴더 Topic_email과 파일명 100% 중복) 삭제 — 보호 폴더 자체는 미변경. - 완전히 비게 된 Topic_Agent/Topic_Blog/Topics_Biz/Topics_Rag 폴더 제거.
This commit is contained in:
@@ -0,0 +1,159 @@
|
||||
---
|
||||
id: wiki-2026-0508-api-backed-image-generation-work
|
||||
title: API-backed Image Generation Workflow
|
||||
category: 10_Wiki/Topics
|
||||
status: verified
|
||||
canonical_id: self
|
||||
aliases: [Image Gen API, Cloud Image Generation, Hosted Diffusion API]
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.9
|
||||
verification_status: applied
|
||||
tags: [image-generation, api, workflow, diffusion, production]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-05-10
|
||||
github_commit: pending
|
||||
tech_stack:
|
||||
language: Python
|
||||
framework: OpenAI/Replicate/FAL SDKs
|
||||
---
|
||||
|
||||
# API-backed Image Generation Workflow
|
||||
|
||||
## 매 한 줄
|
||||
> **"매 prompt → API → asset, GPU 의 X"**. Hosted endpoint (OpenAI Images, Replicate, FAL, Stability, BFL) 의 호출하여 image asset 를 generate — 매 GPU infra ownership 의 X, 매 per-call cost 의 trade. 2026 production app 의 매 default mode (self-host 의 매 scale-driven decision).
|
||||
|
||||
## 매 핵심
|
||||
|
||||
### 매 hosted vs self-host trade
|
||||
- **Hosted**: 매 zero infra, 매 latest model (FLUX 1.1 Pro Ultra, Imagen 4, gpt-image-1) 즉시 access, 매 per-image $0.02-0.08.
|
||||
- **Self-host (vLLM/MLX/ComfyUI)**: 매 fixed GPU cost, 매 high-volume (>100k img/mo) 의 break-even.
|
||||
- **Break-even**: ~50k img/mo @ A100 spot price ($1.5/hr).
|
||||
|
||||
### 매 provider matrix (2026)
|
||||
- **BFL FLUX 1.1 Pro Ultra**: 매 photoreal SOTA, 4MP, $0.06/img.
|
||||
- **OpenAI gpt-image-1**: 매 text rendering best, multimodal edit, $0.04-0.19/img.
|
||||
- **Google Imagen 4**: 매 prompt adherence, $0.04/img.
|
||||
- **Replicate / FAL**: 매 aggregator, 매 100+ model 의 unified API.
|
||||
- **Stability SD 3.5**: 매 open-weight + hosted dual.
|
||||
|
||||
### 매 workflow stage
|
||||
1. **Prompt construction**: template + user input + style tokens.
|
||||
2. **API call**: async, retry, idempotency key.
|
||||
3. **Polling/webhook**: 매 long-running job (>5s) 의 webhook, 매 short job 의 sync.
|
||||
4. **Asset storage**: S3/R2 + CDN, signed URL.
|
||||
5. **Moderation**: pre-prompt filter + post-image NSFW check.
|
||||
|
||||
## 💻 패턴
|
||||
|
||||
### FAL async (recommended 2026)
|
||||
```python
|
||||
import fal_client
|
||||
|
||||
handler = fal_client.submit(
|
||||
"fal-ai/flux-pro/v1.1-ultra",
|
||||
arguments={"prompt": "cyberpunk city, neon rain, 8k", "aspect_ratio": "16:9"},
|
||||
)
|
||||
# webhook 또는 poll
|
||||
result = handler.get() # blocks until done
|
||||
url = result["images"][0]["url"]
|
||||
```
|
||||
|
||||
### OpenAI gpt-image-1
|
||||
```python
|
||||
from openai import OpenAI
|
||||
client = OpenAI()
|
||||
resp = client.images.generate(
|
||||
model="gpt-image-1",
|
||||
prompt="A futuristic library, isometric, soft lighting",
|
||||
size="1024x1024",
|
||||
quality="high",
|
||||
n=1,
|
||||
)
|
||||
b64 = resp.data[0].b64_json
|
||||
```
|
||||
|
||||
### Replicate (model marketplace)
|
||||
```python
|
||||
import replicate
|
||||
output = replicate.run(
|
||||
"black-forest-labs/flux-1.1-pro-ultra",
|
||||
input={"prompt": "...", "aspect_ratio": "21:9", "raw": False},
|
||||
)
|
||||
# output: list[FileOutput] — stream to S3
|
||||
```
|
||||
|
||||
### Webhook handler (FastAPI)
|
||||
```python
|
||||
@app.post("/webhooks/fal")
|
||||
async def on_fal(req: Request):
|
||||
payload = await req.json()
|
||||
if payload["status"] == "OK":
|
||||
url = payload["payload"]["images"][0]["url"]
|
||||
await store_to_r2(url, key=payload["request_id"])
|
||||
return {"ok": True}
|
||||
```
|
||||
|
||||
### Retry + idempotency
|
||||
```python
|
||||
import httpx
|
||||
from tenacity import retry, stop_after_attempt, wait_exponential
|
||||
|
||||
@retry(stop=stop_after_attempt(3), wait=wait_exponential(min=1, max=10))
|
||||
async def gen(prompt: str, idem: str):
|
||||
async with httpx.AsyncClient(timeout=120) as c:
|
||||
r = await c.post(URL, json={"prompt": prompt}, headers={"Idempotency-Key": idem})
|
||||
r.raise_for_status()
|
||||
return r.json()
|
||||
```
|
||||
|
||||
### Pre-moderation
|
||||
```python
|
||||
def safe_prompt(p: str) -> bool:
|
||||
bad = {"nsfw", "gore", "csam"} # 매 minimal — provider 의 strong filter 의 추가 layer
|
||||
return not any(t in p.lower() for t in bad)
|
||||
```
|
||||
|
||||
### Cost meter
|
||||
```python
|
||||
COSTS = {"flux-pro-ultra": 0.06, "gpt-image-1-high": 0.19, "imagen-4": 0.04}
|
||||
def charge(user_id: str, model: str, n: int):
|
||||
cost = COSTS[model] * n
|
||||
db.execute("UPDATE users SET credit = credit - ? WHERE id = ?", (cost, user_id))
|
||||
```
|
||||
|
||||
## 매 결정 기준
|
||||
| 상황 | Approach |
|
||||
|---|---|
|
||||
| Photoreal hero asset | FLUX 1.1 Pro Ultra |
|
||||
| Text-in-image (poster, UI) | gpt-image-1 |
|
||||
| Bulk variant (>10k/day) | self-host SDXL/SD3.5 + ComfyUI cluster |
|
||||
| Prototype / MVP | Replicate (zero setup) |
|
||||
| Edit / inpaint / multimodal | gpt-image-1 또는 FLUX Fill |
|
||||
|
||||
**기본값**: FAL FLUX 1.1 Pro Ultra (cost/quality 의 sweet spot 2026).
|
||||
|
||||
## 🔗 Graph
|
||||
- 부모: [[Diffusion Models]]
|
||||
- 응용: [[AdSense Revenue Blog Architecture]]
|
||||
|
||||
## 🤖 LLM 활용
|
||||
**언제**: 매 product feature (avatar, blog hero, marketing) 의 image gen — 매 launch speed 의 priority.
|
||||
**언제 X**: 매 >100k img/mo 의 sustained volume (self-host 의 cheaper), 매 strict on-prem (HIPAA/gov).
|
||||
|
||||
## ❌ 안티패턴
|
||||
- **Sync block 60s+**: 매 user request thread 의 block — 매 webhook 또는 background job 의 use.
|
||||
- **No idempotency**: 매 retry 의 duplicate charge — 매 idempotency key 의 always.
|
||||
- **Raw provider URL serve**: 매 expire 24h — 매 own CDN 의 mirror.
|
||||
- **Skip moderation**: 매 brand risk + provider TOS violation.
|
||||
- **Hard-coded provider**: 매 single API 에 lock-in — 매 abstraction layer (e.g. `ImageProvider` interface).
|
||||
|
||||
## 🧪 검증 / 중복
|
||||
- Verified (BFL 2025-10 release notes; OpenAI gpt-image-1 docs 2025; FAL/Replicate pricing 2026-Q1).
|
||||
- 신뢰도 A.
|
||||
|
||||
## 🕓 Changelog
|
||||
| 날짜 | 변경 |
|
||||
|---|---|
|
||||
| 2026-05-08 | Phase 1 |
|
||||
| 2026-05-10 | Manual cleanup — 2026 provider matrix, FAL/FLUX/gpt-image-1 patterns |
|
||||
Reference in New Issue
Block a user