Skip to content

feat(editorial): magazine hero — nano-banana 인프라 + collage 렌더#445

Closed
cocoyoon wants to merge 2 commits into
devfrom
feature/editorial-magazine-hero-gen
Closed

feat(editorial): magazine hero — nano-banana 인프라 + collage 렌더#445
cocoyoon wants to merge 2 commits into
devfrom
feature/editorial-magazine-hero-gen

Conversation

@cocoyoon
Copy link
Copy Markdown
Member

@cocoyoon cocoyoon commented May 4, 2026

Summary

매거진 hero 이미지 두 가지 개선:

  1. nano-banana 동적 생성 인프라 (ai-server) — text-to-image generate 메서드 + generate_hero LangGraph 노드 + R2 업로드
  2. Collage 렌더링 (web) — curation_card source 이미지들을 grid로 합쳐 hero 자리에 표시 (지금 default)

Why

초기 hero 는 source post 이미지 그대로 픽 → curation_card 와 시각적 중복, 표지 quality 미달. 두 경로를 모두 구축:

  • nano-banana: 프롬프트 기반 단일 editorial cover 생성. 비용 ~$0.01-0.04, 추가 시간 ~5-10s. 인프라 보존 — OG 이미지 등 다른 용도 활용 가능.
  • Collage: source 이미지 (curation_card) top 4 grid. 비용 0, 추가 시간 0, source fidelity 보존, 매거진 내부와 시각적 일관성. 현재 default 렌더 채택.

Changes

ai-server (nano-banana 인프라)

  • nano_banana.py: text-only generate(prompt, aspect_ratio) 추가 (기존 reframe edit-mode 와 분리).
  • editorial_article/nodes/generate_hero.py: 신규 노드. layout.title + intro → editorial cover prompt → nano-banana → R2 업로드 (editorial-magazines/{article_id}/hero.png) → layout.hero_image_url 갱신.
  • editorial_article/graph.py: compose_layout → generate_hero → publish. graceful — 실패해도 publish 진행.
  • editorial_article_service.py: ctx 에서 nano + r2 받아 graph config 주입.
  • worker.py: ctx 에 nano_banana_client + r2_client 추가.
  • _container.py: nano_banana_clientRawPostsContainerInfrastructureContainer 로 이동 (raw_posts + editorial_article 공용).

web (collage 렌더 — 현재 default)

  • MagazineRenderer.tsx:
    • pickCollageImages: curation_card image_url top 4. 없으면 hero_image_url fallback.
    • CollageHero: 1개 → 단일, 2 → 2-up, 3 → 1+2, 4 → 2x2 grid.
    • SectionView: hero 본문 섹션은 header collage 가 담당하므로 스킵 (중복 방지).

Trade-off

이 PR 머지 후 default 는 collage. nano-banana 가 R2 에 hero.png 를 계속 만들지만 (인프라 보존) frontend 가 안 씀. 나중에:

  • collage가 약하다 → MagazineRenderer 수정으로 nano-banana hero 로 재전환
  • hybrid (nano-banana 가 collage 형식 자체를 생성) → 다른 PR

Test plan

  • /admin/editorial/magazine/drafts/{기존 article id} → header 가 4-up collage 로 보임
  • curation_card 본문 그대로 (이미지 + body + 솔루션 카드)
  • 신규 generation 시 ai.log generate_hero: ok article=... url=... 확인 (인프라 정상)
  • R2 에 editorial-magazines/{article_id}/hero.png 업로드 확인
  • Failure test: GEMINI_API_KEY 일시 invalid → generate_hero 실패해도 publish 성공, collage 자동 fallback

Bump

`bump:patch` (ai-server)

매거진 hero 가 source post 이미지 그대로라 curation_card 와 시각적 중복 + 매거진
표지 quality 미달이었음. nano-banana (gemini-2.5-flash-image) 로 16:9 editorial
cover 를 동적 생성.

- nano_banana.py: text-only generate(prompt, aspect_ratio) 메서드 추가.
  기존 reframe (image+prompt edit mode) 와 분리.
- editorial_article/nodes/generate_hero.py: 신규 노드.
  layout.title + subtitle + intro 섹션 → cover prompt → nano-banana →
  R2 업로드 (editorial-magazines/{article_id}/hero.png) → layout.hero_image_url
  + hero 섹션의 image_url 갱신.
- editorial_article/graph.py: compose_layout → generate_hero → publish.
  generate_hero 는 graceful — 실패해도 publish 진행하고 fallback (compose 가
  픽한 source post 이미지) 사용. error_log 에만 기록.
- services/editorial_article/editorial_article_service.py: ctx 에서 nano +
  r2 받아서 graph config 에 주입.
- managers/queue/worker.py: ctx 에 nano_banana_client + r2_client 추가.
- config/_container.py: nano_banana_client 를 RawPostsContainer 에서
  InfrastructureContainer 로 이동 (raw_posts + editorial_article 공용).
  RawPostsContainer 는 infrastructure.nano_banana_client 참조하도록 업데이트.

추가 시간 ~5-10s/article. 추가 비용 ~$0.01-0.04/article. #429
@cocoyoon cocoyoon added enhancement New feature or request backend 백엔드/API ai AI/자동화 labels May 4, 2026
@vercel
Copy link
Copy Markdown

vercel Bot commented May 4, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
decoded-app Ready Ready Preview, Comment May 4, 2026 2:33pm

단일 AI 생성 hero (nano-banana, #429 PR #445) 대신 source 이미지 collage 로
교체. 매거진 내부 curation_card 와 시각적 일관성, AI 비용/시간 0, source
fidelity 보존.

- pickCollageImages: curation_card 섹션의 image_url top 4. 없으면
  hero_image_url 단일 fallback.
- CollageHero: 이미지 개수별 grid 패턴 (1: 단일, 2: 2-up, 3: 1+2, 4: 2x2).
- SectionView: type='hero' 본문 섹션은 헤더 collage 가 담당하므로 스킵.
  (HeroSection 함수 제거 — dead code.)

기존에 생성된 article 도 frontend HMR 만으로 collage 렌더 적용. nano-banana
hero 인프라 (PR #445) 는 그대로 유지 — 다른 용도 (예: OG 이미지 별도 생성)
나 향후 hybrid 모드에서 재활용 가능.
@cocoyoon cocoyoon changed the title feat(editorial): magazine hero 이미지 nano-banana 동적 생성 feat(editorial): magazine hero — nano-banana 인프라 + collage 렌더 May 4, 2026
@cocoyoon
Copy link
Copy Markdown
Member Author

cocoyoon commented May 6, 2026

superseded by #446 (Stage 3 thumbnail flow)

@cocoyoon cocoyoon closed this May 6, 2026
@github-project-automation github-project-automation Bot moved this from Todo to Done in decoded-monorepo May 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ai AI/자동화 backend 백엔드/API enhancement New feature or request

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

1 participant