feat(short): generación y render de Shorts vía shortsmith
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:
ChemaVX
2026-08-01 21:55:42 +00:00
co-authored by Claude Opus 5
parent 8b81ef87e4
commit 20c8d03aa7
27 changed files with 4350 additions and 23 deletions
+11
View File
@@ -68,6 +68,17 @@ class Settings(BaseSettings):
ghost_url_en: str = Field("")
ghost_api_key_en: str = Field("")
# shortsmith (renderizador de Shorts) — env directo, sin secreto.
# El bot habla con el Service interno; el renderizador no se expone fuera
# del cluster. shortsmith_enabled=false es el kill switch: /generate short_en
# responde "desactivado" en vez de fallar.
shortsmith_url: str = Field("http://shortsmith-svc.shortsmith.svc.cluster.local:8080")
shortsmith_timeout: float = Field(600.0)
shortsmith_enabled: bool = Field(True)
# MP4 renderizados: en disco, NUNCA en SQLite (blobs en la DB hacen
# patológico el WAL — misma razón que source_contents guarda texto y ya).
shorts_dir: str = Field("/data/shorts")
# SEO autofill — "off" | "on" | "dryrun" (default off).
# off = today's exact behavior (bare draft, no second LLM call).
# on = adds best-effort meta/OG/Twitter/tags/internal-links to the DRAFT