@marcos_feitoza/personal-finance-backend-ai-insights
v1.1.2
Published
Financial intelligence service in the Personal Finance ecosystem.
Readme
AI Insights Service - Personal Finance Backend
Financial intelligence service in the Personal Finance ecosystem.
Purpose
This service transforms user financial data into actionable AI outputs:
- deterministic insights and alerts
- explainable recommendations (why, impact, suggested action)
- simulation and monthly planning endpoints
- chat advisory baseline
- notifications generation and delivery data
- observability metrics for AI usage and quality
It never executes financial actions and does not connect directly to bank accounts.
How It Fits In The Ecosystem
- Frontend calls
backend-core(/api/ai/*). backend-corevalidates auth and forwardsAuthorization+X-Correlation-ID.backend-corecalls this service internally.ai-insightsreads user financial data from Postgres and returns results.
Responsibilities:
frontend: experience and interactionsbackend-core: gateway/orchestration/auth boundaryai-insights: AI/business analysis logicbackend-shared: models/database/auth dependencies
Current API Surface
GET /api/ai/healthGET /api/ai/insightsPOST /api/ai/chatPOST /api/ai/feedbackPOST /api/ai/simulatePOST /api/ai/plan/monthlyGET /api/ai/observability/summaryGET /api/ai/usage/summary
Notifications (backend-backed):
POST /api/ai/notifications/generateGET /api/ai/notificationsGET /api/ai/notifications/unread-countGET /api/ai/notifications/schedulePOST /api/ai/notifications/{notification_id}/readPOST /api/ai/notifications/read-allPOST /api/ai/notifications/scheduler/generate(internal, token-protected)POST /api/ai/notifications/scheduler/deliver(internal, token-protected)
Notifications Strategy
This service supports two generation modes (env controlled):
test_interval: generate window-based notifications every N minutes (default 30) for test flows.daily_6am: production-ready mode for daily generation at configured hour (default 06:00 UTC).
Current env defaults are prepared for test iteration and easy switch to daily.
Dedupe Policy (in-app)
In-app notifications use daily dedupe to avoid feed spam:
- dedupe key format:
insight_<period_end>_<code> - same user + same day + same alert
code=> no duplicate in-app item - repeated scheduler runs in the same day update delivery pipeline but do not create duplicate in-app messages
This keeps the in-app feed concise while allowing richer channel delivery later (email/push).
Segurança e autenticação
- Requisições devem carregar
Authorization: Bearer <token> - O token é validado no ecossistema compartilhado (
personal-finance-backend-shared) - Propagação de
X-Correlation-IDpara rastreio fim-a-fim
Observabilidade
- Logging estruturado JSON
- Correlação por request (
X-Correlation-ID) - Eventos importantes com contexto (
user_id, endpoint, período)
Nota de produto/arquitetura:
- métricas operacionais de observability são consumidas de forma centralizada no Admin Console (via
backend-core). - usuários finais continuam com funcionalidades AI de produto (insights/chat/notificações/plan), sem tela operacional dedicada.
Dependências
- FastAPI + Uvicorn
- PostgreSQL (via
personal-finance-backend-shared) personal_finance_shared(models, db, auth/dependencies, logging)
Data Structures Created At Runtime
ai_feedback: thumbs up/down feedback (chat/insight/notification context)ai_observability_events: endpoint latency, errors, feature usage eventsai_notifications: persisted user notifications + read state + relevance scoreai_notification_deliveries: delivery pipeline state (pending,delivered,failed) per channelai_usage_events: AI metering events (request-level usage, latency, status, feature)ai_usage_credits: AI overage credit balance per userai_usage_credit_ledger: append-only ledger for AI credit adjustments/consumption
Explainability
Insights include explainability fields per alert:
whyimpact_estimatesuggested_action
This supports transparent recommendations in UI and future LLM tool orchestration.
Guardrails
- no direct banking integrations
- no payment/trade execution
- informational guidance only
Security and Traceability
- Bearer token auth via shared dependencies
- structured JSON logs
- correlation via
X-Correlation-ID - endpoint-level observability
Environment Variables
Database/Auth:
DB_HOSTDB_NAMEDB_USERDB_PASSWORDJWT_SECRET_KEYCORS_ALLOWED_ORIGINS
Notifications behavior:
AI_NOTIFICATIONS_MODE(test_intervalordaily_6am)AI_NOTIFICATIONS_TEST_INTERVAL_MINUTES(default30)AI_NOTIFICATIONS_DAILY_HOUR_UTC(default6)AI_NOTIFICATIONS_SCHEDULER_TOKEN(required for internal scheduler endpoints)
AI metering/quota behavior:
AI_QUOTA_ENFORCEMENT_ENABLED(falseby default)AI_MONTHLY_REQUEST_LIMIT(fallback global, default500)AI_MONTHLY_REQUEST_LIMIT_FREE(default60)AI_MONTHLY_REQUEST_LIMIT_PLUS(default300)AI_MONTHLY_REQUEST_LIMIT_PRO(default1200)
Planos de Produto (Free / Plus / Pro) e AI Metering
Proposta de segmentação alinhada ao objetivo do app:
free(oubronze)- contas (cash/cc), categorias, transações
- AI básica: insights e chat com limite reduzido
- sem tela de investimentos
plus(ouprata)- tudo do
free - acesso a investimentos
- AI moderada (insights + chat + análises padrão)
- tudo do
pro(ougold)- tudo do
plus - modo "CFO pessoal"
- AI avançada com previsões, planejamento e relatórios customizados
- tudo do
Add-ons (sob demanda):
- pacote extra de créditos AI
- relatório AI customizado avulso
- recursos "pro" avulsos (upgrade temporário)
Limites sugeridos de AI por plano (fase inicial)
Para controlar custo sem degradar UX:
free:~60requests AI/mêsplus:~300requests AI/mêspro:~1200requests AI/mês
Endpoints considerados para metering/quota:
GET /api/ai/insightsPOST /api/ai/chatPOST /api/ai/simulatePOST /api/ai/plan/monthlyPOST /api/ai/notifications/generate
Status de implementação no serviço
Implementado agora:
- metering por request em
ai_usage_events - summary mensal via
GET /api/ai/usage/summary - quota enforcement por usuário/plano (
free/plus/pro):AI_QUOTA_ENFORCEMENT_ENABLEDAI_MONTHLY_REQUEST_LIMIT_FREEAI_MONTHLY_REQUEST_LIMIT_PLUSAI_MONTHLY_REQUEST_LIMIT_PROAI_MONTHLY_REQUEST_LIMIT(fallback)
- base de overage pronta no ecossistema:
- saldo de créditos por usuário
- ledger de créditos
- endpoints admin no
backend-corepara ajuste/consulta
Resposta do GET /api/ai/usage/summary agora inclui:
quota.planquota.monthly_request_limit(limite efetivo do usuário)quota.plan_limits(tabela de limites por plano)quota.metered_requestsquota.remaining_requests
Próximo passo para monetização completa:
- manter limite por plano e evoluir para entitlements granulares no
backend-core - expor add-ons de crédito AI sobre o limite base do plano
- habilitar overage via add-on (créditos extras)
Exemplo de estratégia de ativação (rollout seguro)
- Ativar quota enforcement com limite global conservador (ex.:
500) para validar comportamento. - Introduzir entitlements por plano no
backend-core. - Migrar para limite por plano mantendo logs e dashboard de uso.
- Ativar add-ons somente após estabilizar custo real por coorte.
Local Run
From monorepo root:
pip install -r personal-finance-backend-ai-insights/requirements.txt
uvicorn personal-finance-backend-ai-insights.app.main:app --reload --app-dir .Deploy
- Build/push image with
dockerbuild.shor monorepopodman-build.sh. - Helm chart:
helm/ - Argo CD application:
argocd-application.yaml
Cluster target URL (default):
http://personal-finance-backend-ai-insights.app.svc.cluster.local:8000
Scheduler (independente de sessão de usuário)
O chart Helm inclui dois CronJobs (habilitados por padrão em prod-values.yaml):
notifications-generate: chamaPOST /api/ai/notifications/scheduler/generatenotifications-deliver: chamaPOST /api/ai/notifications/scheduler/deliver
Com isso:
- A geração de notificações roda sem usuário logado.
- Geração e entrega ficam separadas.
- Estado de entrega fica persistido em
ai_notification_deliveries.
Configuração no Helm (scheduler.*):
scheduler.enabledscheduler.generateSchedulescheduler.deliverSchedulescheduler.tokenSecretNamescheduler.tokenSecretKey
Integração com backend-core
No backend-core, o proxy /api/ai/* chama este serviço via:
AI_INSIGHTS_SERVICE_URL(env var)
Default esperado no cluster:
http://personal-finance-backend-ai-insights.app.svc.cluster.local:8000
Recommended Next Steps
- Add unit tests for scoring/dedupe/window generation rules.
- Add timezone-aware user delivery windows.
- Add email/push channels on top of current
in_appdelivery pipeline (without changing in-app daily dedupe). - Add LLM orchestration layer using these deterministic endpoints as tools.
