9148c358d0
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 폴더 제거.
5.4 KiB
5.4 KiB
id, title, category, status, canonical_id, aliases, duplicate_of, source_trust_level, confidence_score, verification_status, tags, raw_sources, last_reinforced, github_commit, tech_stack
| id | title | category | status | canonical_id | aliases | duplicate_of | source_trust_level | confidence_score | verification_status | tags | raw_sources | last_reinforced | github_commit | tech_stack | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| wiki-2026-0508-api-backed-image-generation-work | API-backed Image Generation Workflow | 10_Wiki/Topics | verified | self |
|
none | A | 0.9 | applied |
|
2026-05-10 | pending |
|
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
- Prompt construction: template + user input + style tokens.
- API call: async, retry, idempotency key.
- Polling/webhook: 매 long-running job (>5s) 의 webhook, 매 short job 의 sync.
- Asset storage: S3/R2 + CDN, signed URL.
- Moderation: pre-prompt filter + post-image NSFW check.
💻 패턴
FAL async (recommended 2026)
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
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)
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)
@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
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
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
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
🤖 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.
ImageProviderinterface).
🧪 검증 / 중복
- 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 |