45416000f9
feat(features): per-feature freshness spec — JIT vs batched ( #61 )
...
Each ml/features/*.py now declares freshness, source, and fallback per
feature. ProfileFeature gains ttl_sec (mirrored from registry.ts),
freshness="batched", source, and fallback. context.py adds
ContextFeatureSpec + CONTEXT_FEATURES for the three JIT features
(hour_of_day, day_of_week, tasks). CI test parses ttlSec from registry.ts
to catch drift. ml/README updated with split JIT/batched feature contract.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-25 17:02:55 +00:00
ffdf70733f
feat: M2 AI tips — LiteLLM gateway, context assembler, end-to-end generation pipeline
...
Issues closed : #86 , #87 , #88 , #89 , #90 , #91 , #79 , #80 , #82
infra:
- docker-compose `ai` profile: Ollama + LiteLLM services
- infra/litellm/litellm_config.yaml: tip-generator / embedder / judge aliases
- .env.example: LITELLM_URL, LITELLM_MASTER_KEY, OLLAMA_URL
ml/serving:
- POST /generate: calls LiteLLM tip-generator alias, returns TipCandidate[]
- JSON retry loop (2 retries with correction prompt on malformed response)
- _parse_llm_json strips markdown fences
ml/features:
- context.py: build_context() assembles user signals → PromptContext
(sorts overdue/high-priority tasks first for LLM prompt quality)
shared-types:
- TipKind, TipSource, TipCandidate types
- Tip gains kind + rationale fields
services/api:
- recommender: 3-stage pipeline (assemble → score → serve)
Stage 1: Todoist tasks + LLM candidates fetched in parallel
Stage 2: egreedy bandit scores merged candidate pool
Stage 3: serve + log with prompt_version, llm_model, tip_kind
- tip_scores: prompt_version, llm_model, tip_kind columns + migrations
- config: LITELLM_URL added
- integrations: surface token_status in /integrations response
tests:
- ml/serving/tests/test_generate.py: 13 tests (retry, 502/503, fence variants)
- ml/features/test_context.py: 9 tests (sorting, edge cases)
- services/api recommender.unit.test.ts: 16 pure-function tests (inferReward, dueAgeDays)
- services/api recommender.test.ts: 4 integration tests (tip_scores columns, LLM fallback)
- shared-types: TipCandidate, rationale, full TipFeedback action set
docs:
- ADR-0008: LiteLLM AI gateway decision
- overview.md: M2 pipeline description updated
- ml/README.md: serving + features roles updated
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-17 14:09:02 +00:00