Course EN
← back to chapter

Resumen largo

Pega un artículo, una transcripción o un reporte y recibe un TL;DR más los puntos clave. El contexto largo vuelve trivial resumir — el texto completo entra de una sola vez, sin chunking ni map-reduce.

Showcase — Resumen largo

Pega un artículo, una transcripción o un reporte y recibe un TL;DR más los puntos clave. El contexto largo vuelve trivial resumir — el texto completo entra de una sola vez, sin chunking ni map-reduce.

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 — un resumen TL;DR-más-bullets del pasaje pegado.
  • frontend/app/page.tsx — caja de pasaje, resumen a la salida.

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 long-summarize.zip

unzip long-summarize.zip
cd long-summarize
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): summarize a long passage.

Paste an article, transcript, or report and get a TL;DR plus key points. Long
context makes this trivial — the whole text goes in, no chunking or map-reduce.
"""
from openai import OpenAI

_client = OpenAI()

_MODEL = "gpt-5.4-nano"


def run(text: str) -> str:
    doc = text.strip()
    if len(doc) < 100:
        return "Paste a longer passage (an article, transcript, or report) to summarize."
    response = _client.responses.create(
        model=_MODEL,
        instructions=(
            "Summarize the passage the user provides. Output exactly: a one-line "
            "'TL;DR:' summary, then 3-6 '- ' bullet key points. No preamble."
        ),
        input=[{"role": "user", "content": doc}],
    )
    return response.output_text

backend/ai_gemini.py

"""Showcase 2 (Gemini): summarize a long passage.

Same TL;DR-plus-bullets summary, on Gemini.
"""
import os

from google import genai
from google.genai import types

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

_MODEL = "gemini-3.1-flash-lite"


def run(text: str) -> str:
    doc = text.strip()
    if len(doc) < 100:
        return "Paste a longer passage (an article, transcript, or report) to summarize."
    response = _client.models.generate_content(
        model=_MODEL,
        contents=[types.Content(role="user", parts=[types.Part(text=doc)])],
        config=types.GenerateContentConfig(
            system_instruction=(
                "Summarize the passage the user provides. Output exactly: a one-line "
                "'TL;DR:' summary, then 3-6 '- ' bullet key points. No preamble."
            ),
        ),
    )
    return response.text or ""

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