Course EN
← back to chapter

Fábrica de stickers

La misma llamada de generación, pero la app envuelve tu sujeto en una receta de

Showcase — Fábrica de stickers

La misma llamada de generación, pero la app envuelve tu sujeto en una receta de estilo fija — troquelado, contorno grueso, colores planos, fondo blanco — para que cada resultado sea on-brand. Es plantillado de prompt apuntado a imágenes: el usuario aporta el sujeto, la app aporta el look.

Córrelo

bash bootstrap-secrets.sh              # reads ../../../../.env, writes secrets/
docker compose up --build              # default: PROVIDER=openai

Abre http://localhost:3000. Gemini: PROVIDER=gemini docker compose up --build.

Qué hay aquí

  • backend/ai_openai.py / backend/ai_gemini.py — la plantilla de estilo alrededor del sujeto del usuario, devolviendo un data URI.
  • frontend/app/page.tsx — caja de sujeto; renderiza el sticker.

Detenlo

docker compose down

Ejecútalo en tu máquina

Descarga el proyecto como ZIP y córrelo con Docker. Levanta un backend FastAPI y un frontend Next.js en localhost:3000.

Descargar sticker-maker.zip

unzip sticker-maker.zip
cd sticker-maker
bash bootstrap-secrets.sh   # one-time: pulls API keys into ./secrets
docker compose up --build   # default provider: openai
# or:  PROVIDER=gemini docker compose up --build

Escribe algo, elige un proveedor y ejecuta el mismo código de Código contra la API real. Requiere iniciar sesión.


  

Los mismos módulos que ejecuta el botón Run. El proyecto completo (frontend, Dockerfile, compose) está en el ZIP, pestaña README.

backend/ai_openai.py

"""Showcase 2 (OpenAI): sticker maker.

The same generate call, but the app wraps your subject in a fixed style recipe —
die-cut sticker, bold outline, flat colors, white background. Prompt templating
for images: the user supplies the subject, the app supplies the look, so every
result is on-brand.
"""
from openai import OpenAI

_client = OpenAI()

_MODEL = "gpt-image-1"

_STYLE = ("A die-cut sticker of {subject}. Bold clean outline, flat vibrant "
          "colors, simple shading, centered on a plain white background, glossy "
          "vinyl sticker style.")


def run(subject: str) -> str:
    s = subject.strip()
    if not s:
        return "Describe the sticker subject (e.g. 'a happy avocado')."
    response = _client.images.generate(model=_MODEL, prompt=_STYLE.format(subject=s), size="1024x1024")
    return f"data:image/png;base64,{response.data[0].b64_json}"

backend/ai_gemini.py

"""Showcase 2 (Gemini): sticker maker via the image model.

Same style recipe wrapped around the user's subject; Gemini's image model via
generate_content.
"""
import base64
import os

from google import genai
from google.genai import types

_client = genai.Client(api_key=os.environ["GEMINI_API_KEY"])

_MODEL = "gemini-2.5-flash-image"

_STYLE = ("A die-cut sticker of {subject}. Bold clean outline, flat vibrant "
          "colors, simple shading, centered on a plain white background, glossy "
          "vinyl sticker style.")


def _generate(prompt: str) -> str:
    response = _client.models.generate_content(
        model=_MODEL, contents=prompt,
        config=types.GenerateContentConfig(response_modalities=["TEXT", "IMAGE"]),
    )
    for part in response.candidates[0].content.parts:
        if getattr(part, "inline_data", None) and part.inline_data.data:
            b64 = base64.b64encode(part.inline_data.data).decode()
            return f"data:image/png;base64,{b64}"
    return "No image was generated — try a different subject."


def run(subject: str) -> str:
    s = subject.strip()
    if not s:
        return "Describe the sticker subject (e.g. 'a happy avocado')."
    return _generate(_STYLE.format(subject=s))

Archivos del proyecto

  • .gitignore
  • README.es.md
  • README.md
  • backend/Dockerfile
  • backend/ai_gemini.py
  • backend/ai_openai.py
  • backend/main.py
  • backend/requirements.txt
  • bootstrap-secrets.sh
  • docker-compose.yml
  • frontend/Dockerfile
  • frontend/app/layout.tsx
  • frontend/app/page.tsx
  • frontend/next.config.ts
  • frontend/package.json
  • frontend/tsconfig.json