read.markets/app/services
Giorgio Gilestro 7348055d72 llm: estimate cost from tokens when provider omits it
DeepSeek's native API returns prompt_tokens/completion_tokens but not
`usage.cost`. OpenRouter returns both. Result: with DeepSeek-direct as
primary (current default), every LogResult.cost_usd was None — and
every downstream cost ledger row (AICall, StrategicLog,
IndicatorSummary, translation tables) stored None instead of the real
spend.

Added a per-model rate table and fallback computation in _call_provider:
when the upstream omits cost, multiply tokens by the table rates. If the
upstream DOES return cost, keep it (authoritative). Falls back to None
if both the upstream and the table miss.

deepseek-v4-flash rates: \$0.07/M input, \$0.28/M output (per DeepSeek).
2026-05-28 12:36:55 +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: add LANGUAGES, ACTIVE_LANGUAGES, respond_in_clause helper 2026-05-27 16:46:32 +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 openrouter: split into llm_prompts (prompt engineering) + transport 2026-05-27 21:27:23 +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 llm: estimate cost from tokens when provider omits it 2026-05-28 12:36:55 +02:00
otp_service.py phase G: data minimisation + passwordless auth + DeepSeek-first LLM 2026-05-18 14:16:57 +01:00
portfolio_analysis.py openrouter: split into llm_prompts (prompt engineering) + transport 2026-05-27 21:27:23 +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: add translate() helper backed by call_llm 2026-05-27 16:48:32 +02:00