From 1391f15c280be1681e3afaae78198a8809e12b3e Mon Sep 17 00:00:00 2001 From: Giorgio Gilestro Date: Mon, 25 May 2026 23:00:07 +0200 Subject: [PATCH] digest: factor tone clause; kw-only digest helper; empty-data test --- app/services/openrouter.py | 38 ++++++++++++++++++++++-------------- tests/test_digest_prompts.py | 16 +++++++++++++++ 2 files changed, 39 insertions(+), 15 deletions(-) diff --git a/app/services/openrouter.py b/app/services/openrouter.py index 539c553..a542b98 100644 --- a/app/services/openrouter.py +++ b/app/services/openrouter.py @@ -508,6 +508,12 @@ def build_user_prompt( return "\n".join(parts) +def _digest_tone_clause(tone: str) -> str: + if tone.upper() == "NOVICE": + return "Use plain English. Define any jargon on first use." + return "Write for a reader who already speaks markets fluently." + + def build_daily_digest_prompt( *, tone: str, @@ -521,21 +527,19 @@ def build_daily_digest_prompt( Different from the hourly log: the daily digest reflects on the past 24h and looks forward to the upcoming session. Longer, less 'live-blogging,' more contextual. Target ~600 words.""" - tone_clause = ( - "Use plain English. Define any jargon on first use." - if tone.upper() == "NOVICE" - else "Write for a reader who already speaks markets fluently." - ) system = ( "You write the daily editorial digest for Read the Markets. " - f"Audience tone: {tone.upper()}. {tone_clause} " + f"Audience tone: {tone.upper()}. {_digest_tone_clause(tone)} " "Cover: (1) what mattered yesterday, (2) what to watch in today's " "EU and US sessions, (3) one cross-asset thread connecting them. " "No predictions of price level, no buy/sell language. Target ~600 " "words. Output HTML using only

,

,