Redactor de PII
Pega texto con nombres, emails, teléfonos, direcciones o números de tarjeta y recíbelo de vuelta con cada uno reemplazado por una etiqueta tipada. Un guardrail que corre a la salida — antes de que registres, guardes o reenvíes.
Showcase — Redactor de PII
Pega texto con nombres, emails, teléfonos, direcciones o números de tarjeta y recíbelo de vuelta con cada uno reemplazado por una etiqueta tipada. Un guardrail que corre a la salida — antes de que registres, guardes o reenvíes.
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— el prompt de redacción.frontend/app/page.tsx— caja de texto, texto redactado 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.
unzip pii-redactor.zip
cd pii-redactor
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): PII redaction.
Before you log a prompt, store a transcript, or forward text to another service,
strip the personal data. Paste text with names, emails, phone numbers, or card
numbers and get it back with each replaced by a typed tag. A guardrail that runs
on the way OUT of your system, not just in.
"""
from openai import OpenAI
_client = OpenAI()
_MODEL = "gpt-5.4-nano"
_PROMPT = (
"Redact all personally identifiable information in the user's text: person "
"names, email addresses, phone numbers, street addresses, credit-card numbers, "
"and government ids. Replace each with a typed tag like [NAME], [EMAIL], "
"[PHONE], [ADDRESS], [CARD], [ID]. Preserve everything else exactly. Return "
"ONLY the redacted text."
)
def run(text: str) -> str:
t = text.strip()
if not t:
return "Paste text containing PII to redact."
return _client.responses.create(model=_MODEL, instructions=_PROMPT, input=[{"role": "user", "content": t}]).output_text
backend/ai_gemini.py
"""Showcase 2 (Gemini): PII redaction.
Same redaction task, 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"
_PROMPT = (
"Redact all personally identifiable information in the user's text: person "
"names, email addresses, phone numbers, street addresses, credit-card numbers, "
"and government ids. Replace each with a typed tag like [NAME], [EMAIL], "
"[PHONE], [ADDRESS], [CARD], [ID]. Preserve everything else exactly. Return "
"ONLY the redacted text."
)
def run(text: str) -> str:
t = text.strip()
if not t:
return "Paste text containing PII to redact."
r = _client.models.generate_content(
model=_MODEL,
contents=[types.Content(role="user", parts=[types.Part(text=t)])],
config=types.GenerateContentConfig(system_instruction=_PROMPT),
)
return r.text or ""
Archivos del proyecto
.gitignoreREADME.es.mdREADME.mdbackend/Dockerfilebackend/ai_gemini.pybackend/ai_openai.pybackend/main.pybackend/requirements.txtbootstrap-secrets.shdocker-compose.ymlfrontend/Dockerfilefrontend/app/layout.tsxfrontend/app/page.tsxfrontend/next.config.tsfrontend/package.jsonfrontend/tsconfig.json