Summarize tone: re-summarize in a chosen voice (backend)

POST /reprocess?job=summarize&tone=<voice> persists the voice on the job
row (queue carries only ids, so a sweep re-enqueue keeps it), the LLM
prompt appends 'write every field in a <tone> tone — the tone colors
the wording, never the facts', and the resulting summary records its
tone (SummaryOut.tone). Plain re-summarize clears a previous tone.
Migration tone0000000001 (summaries.tone, processing_jobs.tone).
78 passed, 1 skipped; ruff clean.
This commit is contained in:
avi 2026-09-15 14:24:36 -05:00
commit b63f49241d
11 changed files with 82 additions and 13 deletions

View file

@ -21,12 +21,21 @@ SYSTEM_PROMPT = (
MAX_TRANSCRIPT_CHARS = 12_000
def build_user_message(transcript: str, title: str | None) -> str:
def build_user_message(transcript: str, title: str | None,
tone: str | None = None) -> str:
text = transcript[:MAX_TRANSCRIPT_CHARS]
if len(transcript) > MAX_TRANSCRIPT_CHARS:
text += f"\n\n[truncated from {len(transcript)} chars]"
head = f'Title: "{title}"\n\n' if title else ""
return head + "Transcript:\n" + text
msg = head + "Transcript:\n" + text
if tone:
# Same JSON contract and same fidelity rules — only the voice changes.
msg += (
f"\n\nWrite every field of the JSON in a {tone} tone of voice. "
"Stay faithful to the transcript: the tone colors the wording, "
"never the facts."
)
return msg
def parse_summary(data: object, model: str) -> SummaryResult: