Cómo funciona Derogada por dentro: el pipeline, las fuentes oficiales que consulta, cómo instalarlo y cómo usarlo como CLI y como biblioteca.
# desde PyPI $ pip install derogada # desarrollo $ python3 -m venv .venv && .venv/bin/pip install -e ".[dev]" # demo web opcional con IA + EUR-Lex (landing + API local en :8000) # la landing ya incluye una demo 100% navegador: BOE directo (CORS) y EUR-Lex vía proxy CORS $ .venv/bin/pip install -e ".[demo]" && .venv/bin/python demo/server.py
La extracción funciona en dos canales: regex determinista (siempre activo, sin configuración) y LLM vía LiteLLM (opcional, mejora el recall con siglas y nombres comunes). Sin LLM configurado, todo sigue funcionando en modo solo-regex.
| Variable | Para qué | Ejemplo |
|---|---|---|
| DEROGADA_MODEL | Modelo LiteLLM para extracción y sugerencias | gpt-5.6 · anthropic/claude-sonnet-5 · gemini/gemini-3.5-flash · openai/qwen3.6 · ollama/llama4 |
| DEROGADA_API_BASE | Endpoint OpenAI-compatible | https://api.nan.builders/v1 |
| DEROGADA_API_KEY | Clave del proveedor | sk-… |
| DEROGADA_CACHE_DIR | Directorio de la caché SQLite (defecto ~/.cache/derogada) | /tmp/derogada-cache |
$ derogada check demanda.pdf # informe Markdown por stdout $ derogada check demanda.docx -f json -o informe.json $ derogada check demanda.pdf -f tabla # tabla en terminal $ derogada check demanda.pdf --no-llm # solo regex $ derogada check demanda.pdf --model openai/qwen3.6 $ derogada norma BOE-A-1992-26318 # estado de una norma suelta $ derogada norma 32016R0679 # también CELEX (EUR-Lex) $ derogada cache clear # vacía la caché local
Como biblioteca:
from derogada import analizar_documento informe = analizar_documento("demanda.pdf") for r in informe.resultados: print(r.cita.texto, "->", r.estado.value, r.derogada_por)
Solo APIs oficiales; sin scrapers HTML. Las respuestas se cachean en SQLite (TTL 7 días) con reintentos exponenciales, para ser educados con los servicios públicos.
API de datos abiertos del BOE: https://www.boe.es/datosabiertos/api
| Endpoint | Uso en Derogada |
|---|---|
| GET /legislacion-consolidada | Búsqueda de candidatos por título (DSL tipo Elasticsearch en el parámetro query, JSON) |
| GET …/id/{id}/metadatos | estatus_derogacion, vigencia_agotada, fecha_derogacion, numero_oficial, rango, URLs consolidada y ELI |
| GET …/id/{id}/analisis | Referencias posteriores: quién la deroga (SE DEROGA) o modifica (SE MODIFICA), con id_norma |
| GET …/id/{id}/texto/indice | Bloques del texto consolidado (artículos, disposiciones) |
| GET …/id/{id}/texto/bloque/{bloque} | Versiones de un artículo concreto (nivel artículo) |
CELLAR / EUR-Lex: endpoint SPARQL público https://publications.europa.eu/webapi/rdf/sparql
| Predicado CDM | Uso en Derogada |
|---|---|
| cdm:resource_legal_id_celex | Localiza el acto por CELEX limpio (32016R0679). El endpoint no casa literales simples con xsd:string: se filtra con FILTER(STR(?o) = "…") |
| cdm:resource_legal_in-force | Vigencia codificada "1"/"0" |
| cdm:resource_legal_date_entry-into-force cdm:resource_legal_date_end-of-validity | Entrada en vigor y fin de validez |
| cdm:resource_legal_repeals_resource_legal | En sentido inverso: qué acto deroga al consultado (p. ej. 95/46/CE ← RGPD) |
La IA se usa para dos cosas puntuales, y nunca para decidir si una norma está vigente: eso pertenece exclusivamente a las APIs oficiales. Un modelo generativo tiene fecha de corte y no puede saber qué está derogado hoy; el BOE y CELLAR sí.
| Uso | Para qué | Cómo |
|---|---|---|
| extract/llm.py | Recall de citas: siglas y menciones informales ("la LRJCA", "el Estatuto de los Trabajadores") que el regex no ve | Salida estructurada con JSON Schema estricto (texto, jurisdiccion, rango, numero, articulo, alias), temperatura 0, troceo con solape en documentos largos, degradación a json_object si el proveedor no soporta json_schema |
| suggest/rewrite.py | Redacta la propuesta de sustitución de citas derogadas o agotadas | El prompt solo contiene datos reales devueltos por la API (norma que deroga, URL, nota oficial, contexto). Regla de oro: sin fuente oficial, no hay sugerencia; si la llamada falla, se omite en silencio |
| Estado | Significado |
|---|---|
| VIGENTE | La norma está en vigor y sin modificaciones posteriores consolidadas |
| MODIFICADA | Sigue viva pero tiene modificaciones consolidadas posteriores (con lista y fuentes) |
| DEROGADA | Derogada: quién la derogó y cuándo, con enlace oficial |
| VIGENCIA AGOTADA | Su vigencia temporal se agotó según el BOE |
| NO RESUELTA | Candidatos ambiguos: se listan, nunca se adivina |
| NO ENCONTRADA | No se pudo identificar en las fuentes oficiales |
Limitaciones conocidas del MVP: sin OCR (los PDF escaneados se detectan y avisan), normativa no consolidada en el BOE queda NO ENCONTRADA, la jurisprudencia está fuera de alcance, y los textos consolidados del BOE son meramente informativos (el informe enlaza siempre la publicación oficial).