feat(short): generación y render de Shorts vía shortsmith
Build & Deploy ResearchOwl / build-and-push (push) Successful in 9s
Build & Deploy ResearchOwl / build-and-push (push) Successful in 9s
Añade /generate short_en y /short_spec. El pipeline genera un shot spec con Haiku, verifica cada cifra, fecha y cita contra los chunks de la sesión, lo renderiza en shortsmith y entrega el MP4 por Telegram junto a un informe de claims. - ShortsmithClient con sondeo y fallback al spec JSON si el render falla - Contrato de plantillas obtenido de GET /templates, no codificado - Comprobación de fundamento determinista, sin LLM - outputs.published_url para enlazar el artículo de Ghost - Normalización de comillas rectas a tipográficas (ver KNOWN-ISSUES.md) Lo que no aparece en los chunks se contrasta contra el ejemplo del prompt: si casa ahí es fuga, no invención, y se informa como tal. El purgado de sesiones se lleva también su MP4. La subida a YouTube queda fuera a propósito: fase 3. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -10,7 +10,52 @@ VENDORED := src/seo/rules.py
|
||||
HEADER := src/seo/_vendor_header.py
|
||||
MARKER := BEGIN VENDORED seo_rules.py
|
||||
|
||||
.PHONY: sync-seo check-seo-sync
|
||||
.PHONY: sync-seo check-seo-sync test golden-db golden shortsmith-live
|
||||
|
||||
test: ## Suite completa (los tests vivos se saltan solos)
|
||||
python3 -m pytest tests/ -q
|
||||
|
||||
# --- Shorts: pruebas contra el servicio vivo ---------------------------------
|
||||
# El renderizador no se expone fuera del cluster, así que desde el nodo se le
|
||||
# habla por la ClusterIP. Los dos targets de abajo la resuelven solos.
|
||||
|
||||
SHORTSMITH_IP = $(shell kubectl get svc shortsmith-svc -n shortsmith \
|
||||
-o jsonpath='{.spec.clusterIP}' 2>/dev/null)
|
||||
GOLDEN_SESSION ?= 153
|
||||
GOLDEN_DB ?= /tmp/researchowl-golden.db
|
||||
|
||||
golden-db: ## Extrae UNA sesión de la DB de producción a un fichero pequeño
|
||||
@test -n "$(SHORTSMITH_IP)" || echo "aviso: shortsmith-svc no encontrado"
|
||||
kubectl exec -n researchowl deployment/researchowl -- python3 -c "\
|
||||
import sqlite3, os; \
|
||||
src = sqlite3.connect('file:/data/researchowl.db?immutable=1', uri=True); \
|
||||
out = '/tmp/golden.db'; os.path.exists(out) and os.remove(out); \
|
||||
src.execute('ATTACH DATABASE ? AS g', (out,)); \
|
||||
src.executescript('''CREATE TABLE g.research_sessions AS SELECT * FROM research_sessions WHERE 0; \
|
||||
CREATE TABLE g.sources AS SELECT * FROM sources WHERE 0; \
|
||||
CREATE TABLE g.chunks AS SELECT * FROM chunks WHERE 0; \
|
||||
CREATE TABLE g.outputs AS SELECT * FROM outputs WHERE 0; \
|
||||
CREATE TABLE g.api_usage AS SELECT * FROM api_usage WHERE 0;'''); \
|
||||
[src.execute(f'INSERT INTO g.{t} SELECT * FROM {t} WHERE ' + ('id=$(GOLDEN_SESSION)' if t=='research_sessions' else 'session_id=$(GOLDEN_SESSION)')) \
|
||||
for t in ('research_sessions','sources','chunks','outputs')]; \
|
||||
src.commit(); print('sesión $(GOLDEN_SESSION) ->', os.path.getsize(out), 'bytes')"
|
||||
kubectl cp -n researchowl \
|
||||
$$(kubectl get pod -n researchowl -o name | head -1 | cut -d/ -f2):/tmp/golden.db \
|
||||
$(GOLDEN_DB)
|
||||
@echo "escrito en $(GOLDEN_DB)"
|
||||
|
||||
golden: ## Eval dorada (GASTA dinero: una llamada a Claude + un render)
|
||||
@test -f $(GOLDEN_DB) || { echo "falta $(GOLDEN_DB) — ejecuta 'make golden-db'"; exit 1; }
|
||||
RESEARCHOWL_GOLDEN_DB=$(GOLDEN_DB) \
|
||||
RESEARCHOWL_GOLDEN_SESSION=$(GOLDEN_SESSION) \
|
||||
SHORTSMITH_LIVE_URL=http://$(SHORTSMITH_IP):8080 \
|
||||
SHORTS_DIR=/tmp/researchowl-shorts \
|
||||
python3 -m pytest tests/test_short_golden.py -v -s
|
||||
|
||||
shortsmith-live: ## Fontanería contra el shortsmith vivo (renderiza el ejemplo)
|
||||
SHORTSMITH_LIVE_URL=http://$(SHORTSMITH_IP):8080 \
|
||||
python3 -m pytest tests/test_shortsmith_live.py -v -s
|
||||
|
||||
|
||||
sync-seo: ## Re-copy canonical seo_rules.py into the vendored file + record hash
|
||||
@test -f "$(CANON)" || { echo "canonical not found at $(CANON)"; exit 1; }
|
||||
|
||||
Reference in New Issue
Block a user