read.markets/app/services
Giorgio Gilestro 13dd3a8330 i18n: prepend a strong language directive for portfolio + chat
Reports that portfolio AI analysis was coming back in English even
for IT-toggled users. Traced the chain (DB user.lang IS set to it,
router passes it into the payload, parse_request reads it, build_prompt
appends respond_in_clause), so the wiring is correct end-to-end. The
model was simply ignoring the single-sentence tail nudge: when the
system prompt is hundreds of lines of English and the user message
adds more English context, "Respond in Italian." at the end is easy
to drop on the floor.

Add a new services/i18n.language_directive_lead() that returns a
strong, explicit top-of-prompt block — "# LANGUAGE — write everything
in <X>" plus the verbatim-tickers-and-numbers carve-out — meant to
be PREPENDED so the model anchors on the target language before it
reads the bulk of the instructions. Combined with the existing tail
clause it's belt-and-suspenders: top + bottom of the prompt both
say "in this language".

Applied to portfolio_analysis.build_prompt() and chat.py — the two
surfaces that generate user-facing prose in real time (the strategic
log + indicator summaries get post-hoc translation via translate(),
so the directive isn't needed there).

Empty-string return for en / unknown lang means callers can wire
it in unconditionally; no extra plumbing in i18n callsites.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-29 15:21:00 +02:00
..
__init__.py initial commit — cassandra v0.1 2026-05-15 21:56:10 +01:00
access.py docs: drop Phase D.x markers now that the referral loop is closed 2026-05-26 23:09:39 +02:00
auth_service.py phase G: data minimisation + passwordless auth + DeepSeek-first LLM 2026-05-18 14:16:57 +01:00
cadence.py news: weekend ingestion cadence 6h → 2h 2026-05-23 21:06:17 +02:00
csv_import.py cleanup: drop stale tombstones and dead config fields 2026-05-27 19:25:33 +02:00
digest_email.py email: split digest renderer to digest_email.py 2026-05-27 21:33:06 +02:00
email_service.py email: split digest renderer to digest_email.py 2026-05-27 21:33:06 +02:00
feeds_bootstrap.py initial commit — cassandra v0.1 2026-05-15 21:56:10 +01:00
fx.py phase G: data minimisation + passwordless auth + DeepSeek-first LLM 2026-05-18 14:16:57 +01:00
glossary.py css: split cassandra.css into per-section files 2026-05-28 12:31:29 +02:00
i18n.py i18n: prepend a strong language directive for portfolio + chat 2026-05-29 15:21:00 +02:00
instrument_map.py phase B (1/4): CSV parser + InstrumentMap (T212 shortcode → Yahoo ticker) 2026-05-16 10:53:08 +01:00
llm_csv_parser.py models: align translation column naming + add token counts 2026-05-27 21:18:29 +02:00
llm_prompts.py ai: structured-output + reviewer agent for indicator summaries 2026-05-29 13:10:52 +02:00
market.py add ECB Data Portal source; group-aware stale thresholds 2026-05-15 23:13:58 +01:00
markets.py add Eurostat + UK ONS sources; valuation/bubble/economy/bonds groups; aggregate read; market-open header 2026-05-15 23:07:42 +01:00
news.py initial commit — cassandra v0.1 2026-05-15 21:56:10 +01:00
news_tagging.py news: auto-tag headlines + market-aware cadence + filter UI 2026-05-21 23:25:03 +01:00
openrouter.py ai: route reviewer through OpenRouter + Claude Haiku 4.5 2026-05-29 13:21:26 +02:00
otp_service.py phase G: data minimisation + passwordless auth + DeepSeek-first LLM 2026-05-18 14:16:57 +01:00
output_review.py review: gate strategic-log, portfolio, chat, and digest on reviewer 2026-05-29 14:40:04 +02:00
portfolio_analysis.py i18n: prepend a strong language directive for portfolio + chat 2026-05-29 15:21:00 +02:00
portfolio_sync.py sync: detect orphaned blobs (pepper rotation) + fix AESGCM arg order 2026-05-25 12:49:11 +02:00
referral_service.py referrals: close D.3 — both parties get 45 days credit on conversion 2026-05-26 23:05:29 +02:00
ticker_universe.py phase G: data minimisation + passwordless auth + DeepSeek-first LLM 2026-05-18 14:16:57 +01:00
trading212.py initial commit — cassandra v0.1 2026-05-15 21:56:10 +01:00
translation.py i18n: stop truncating IT translations + localise the chat sidebar 2026-05-29 11:44:41 +02:00