fin-infra 0.1.71__tar.gz → 0.1.72__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. {fin_infra-0.1.71 → fin_infra-0.1.72}/PKG-INFO +1 -1
  2. {fin_infra-0.1.71 → fin_infra-0.1.72}/pyproject.toml +1 -1
  3. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/categorization/engine.py +11 -8
  4. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/crypto/insights.py +4 -3
  5. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/insights/__init__.py +4 -1
  6. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/net_worth/aggregator.py +4 -2
  7. {fin_infra-0.1.71 → fin_infra-0.1.72}/LICENSE +0 -0
  8. {fin_infra-0.1.71 → fin_infra-0.1.72}/README.md +0 -0
  9. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/__init__.py +0 -0
  10. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/__main__.py +0 -0
  11. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/analytics/__init__.py +0 -0
  12. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/analytics/add.py +0 -0
  13. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/analytics/cash_flow.py +0 -0
  14. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/analytics/ease.py +0 -0
  15. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/analytics/models.py +0 -0
  16. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/analytics/portfolio.py +0 -0
  17. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/analytics/projections.py +0 -0
  18. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/analytics/rebalancing.py +0 -0
  19. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/analytics/savings.py +0 -0
  20. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/analytics/scenarios.py +0 -0
  21. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/analytics/spending.py +0 -0
  22. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/banking/__init__.py +0 -0
  23. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/banking/history.py +0 -0
  24. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/banking/utils.py +0 -0
  25. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/brokerage/__init__.py +0 -0
  26. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/budgets/__init__.py +0 -0
  27. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/budgets/add.py +0 -0
  28. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/budgets/alerts.py +0 -0
  29. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/budgets/ease.py +0 -0
  30. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/budgets/models.py +0 -0
  31. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/budgets/scaffold_templates/README.md +0 -0
  32. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/budgets/scaffold_templates/__init__.py +0 -0
  33. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/budgets/scaffold_templates/models.py.tmpl +0 -0
  34. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/budgets/scaffold_templates/repository.py.tmpl +0 -0
  35. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/budgets/scaffold_templates/schemas.py.tmpl +0 -0
  36. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/budgets/templates.py +0 -0
  37. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/budgets/tracker.py +0 -0
  38. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/cashflows/__init__.py +0 -0
  39. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/cashflows/core.py +0 -0
  40. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/categorization/__init__.py +0 -0
  41. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/categorization/add.py +0 -0
  42. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/categorization/ease.py +0 -0
  43. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/categorization/llm_layer.py +0 -0
  44. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/categorization/models.py +0 -0
  45. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/categorization/rules.py +0 -0
  46. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/categorization/taxonomy.py +0 -0
  47. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/chat/__init__.py +0 -0
  48. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/chat/ease.py +0 -0
  49. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/chat/planning.py +0 -0
  50. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/cli/__init__.py +0 -0
  51. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/cli/cmds/__init__.py +0 -0
  52. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/cli/cmds/scaffold_cmds.py +0 -0
  53. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/clients/__init__.py +0 -0
  54. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/clients/base.py +0 -0
  55. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/clients/plaid.py +0 -0
  56. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/compliance/__init__.py +0 -0
  57. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/credit/__init__.py +0 -0
  58. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/credit/add.py +0 -0
  59. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/credit/experian/__init__.py +0 -0
  60. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/credit/experian/auth.py +0 -0
  61. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/credit/experian/client.py +0 -0
  62. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/credit/experian/parser.py +0 -0
  63. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/credit/experian/provider.py +0 -0
  64. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/credit/mock.py +0 -0
  65. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/crypto/__init__.py +0 -0
  66. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/documents/__init__.py +0 -0
  67. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/documents/add.py +0 -0
  68. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/documents/analysis.py +0 -0
  69. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/documents/ease.py +0 -0
  70. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/documents/models.py +0 -0
  71. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/documents/ocr.py +0 -0
  72. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/documents/storage.py +0 -0
  73. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/exceptions.py +0 -0
  74. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/goals/__init__.py +0 -0
  75. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/goals/add.py +0 -0
  76. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/goals/funding.py +0 -0
  77. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/goals/management.py +0 -0
  78. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/goals/milestones.py +0 -0
  79. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/goals/models.py +0 -0
  80. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/goals/scaffold_templates/README.md +0 -0
  81. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/goals/scaffold_templates/__init__.py +0 -0
  82. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/goals/scaffold_templates/models.py.tmpl +0 -0
  83. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/goals/scaffold_templates/repository.py.tmpl +0 -0
  84. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/goals/scaffold_templates/schemas.py.tmpl +0 -0
  85. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/insights/aggregator.py +0 -0
  86. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/insights/models.py +0 -0
  87. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/investments/__init__.py +0 -0
  88. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/investments/add.py +0 -0
  89. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/investments/ease.py +0 -0
  90. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/investments/models.py +0 -0
  91. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/investments/providers/__init__.py +0 -0
  92. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/investments/providers/base.py +0 -0
  93. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/investments/providers/plaid.py +0 -0
  94. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/investments/providers/snaptrade.py +0 -0
  95. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/investments/scaffold_templates/README.md +0 -0
  96. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/investments/scaffold_templates/__init__.py +0 -0
  97. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/investments/scaffold_templates/models.py.tmpl +0 -0
  98. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/investments/scaffold_templates/repository.py.tmpl +0 -0
  99. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/investments/scaffold_templates/schemas.py.tmpl +0 -0
  100. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/markets/__init__.py +0 -0
  101. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/models/__init__.py +0 -0
  102. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/models/accounts.py +0 -0
  103. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/models/brokerage.py +0 -0
  104. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/models/candle.py +0 -0
  105. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/models/credit.py +0 -0
  106. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/models/money.py +0 -0
  107. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/models/quotes.py +0 -0
  108. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/models/tax.py +0 -0
  109. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/models/transactions.py +0 -0
  110. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/net_worth/__init__.py +0 -0
  111. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/net_worth/add.py +0 -0
  112. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/net_worth/calculator.py +0 -0
  113. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/net_worth/ease.py +0 -0
  114. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/net_worth/goals.py +0 -0
  115. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/net_worth/insights.py +0 -0
  116. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/net_worth/models.py +0 -0
  117. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/net_worth/scaffold_templates/README.md +0 -0
  118. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/net_worth/scaffold_templates/__init__.py +0 -0
  119. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/net_worth/scaffold_templates/models.py.tmpl +0 -0
  120. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/net_worth/scaffold_templates/repository.py.tmpl +0 -0
  121. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/net_worth/scaffold_templates/schemas.py.tmpl +0 -0
  122. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/normalization/__init__.py +0 -0
  123. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/normalization/currency_converter.py +0 -0
  124. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/normalization/models.py +0 -0
  125. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/normalization/providers/__init__.py +0 -0
  126. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/normalization/providers/exchangerate.py +0 -0
  127. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/normalization/providers/static_mappings.py +0 -0
  128. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/normalization/symbol_resolver.py +0 -0
  129. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/obs/__init__.py +0 -0
  130. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/obs/classifier.py +0 -0
  131. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/providers/__init__.py +0 -0
  132. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/providers/banking/base.py +0 -0
  133. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/providers/banking/plaid_client.py +0 -0
  134. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/providers/banking/teller_client.py +0 -0
  135. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/providers/base.py +0 -0
  136. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/providers/brokerage/alpaca.py +0 -0
  137. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/providers/brokerage/base.py +0 -0
  138. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/providers/credit/experian.py +0 -0
  139. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/providers/identity/stripe_identity.py +0 -0
  140. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/providers/market/alphavantage.py +0 -0
  141. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/providers/market/base.py +0 -0
  142. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/providers/market/ccxt_crypto.py +0 -0
  143. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/providers/market/coingecko.py +0 -0
  144. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/providers/market/yahoo.py +0 -0
  145. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/providers/registry.py +0 -0
  146. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/providers/tax/__init__.py +0 -0
  147. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/providers/tax/irs.py +0 -0
  148. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/providers/tax/mock.py +0 -0
  149. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/providers/tax/taxbit.py +0 -0
  150. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/py.typed +0 -0
  151. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/recurring/__init__.py +0 -0
  152. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/recurring/add.py +0 -0
  153. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/recurring/detector.py +0 -0
  154. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/recurring/detectors_llm.py +0 -0
  155. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/recurring/ease.py +0 -0
  156. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/recurring/insights.py +0 -0
  157. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/recurring/models.py +0 -0
  158. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/recurring/normalizer.py +0 -0
  159. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/recurring/normalizers.py +0 -0
  160. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/recurring/summary.py +0 -0
  161. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/scaffold/__init__.py +0 -0
  162. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/scaffold/budgets.py +0 -0
  163. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/scaffold/goals.py +0 -0
  164. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/security/__init__.py +0 -0
  165. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/security/add.py +0 -0
  166. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/security/audit.py +0 -0
  167. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/security/encryption.py +0 -0
  168. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/security/models.py +0 -0
  169. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/security/pii_filter.py +0 -0
  170. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/security/pii_patterns.py +0 -0
  171. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/security/token_store.py +0 -0
  172. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/settings.py +0 -0
  173. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/tax/__init__.py +0 -0
  174. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/tax/add.py +0 -0
  175. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/tax/tlh.py +0 -0
  176. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/utils/__init__.py +0 -0
  177. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/utils/http.py +0 -0
  178. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/utils/retry.py +0 -0
  179. {fin_infra-0.1.71 → fin_infra-0.1.72}/src/fin_infra/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: fin-infra
3
- Version: 0.1.71
3
+ Version: 0.1.72
4
4
  Summary: Financial infrastructure toolkit: banking connections, market data, credit, cashflows, and brokerage integrations
5
5
  License: MIT
6
6
  Keywords: finance,banking,plaid,brokerage,markets,credit,tax,cashflow,fintech,infra
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "fin-infra"
3
- version = "0.1.71"
3
+ version = "0.1.72"
4
4
  description = "Financial infrastructure toolkit: banking connections, market data, credit, cashflows, and brokerage integrations"
5
5
  authors = ["Ali Khatami <aliikhatami94@gmail.com>"]
6
6
  license = "MIT"
@@ -251,8 +251,7 @@ class CategorizationEngine:
251
251
  )
252
252
 
253
253
  except Exception as e:
254
- # Log error and return None (will fallback to uncategorized)
255
- print(f"ML prediction error: {e}")
254
+ logger.error("ML prediction error: %s", e)
256
255
  return None
257
256
 
258
257
  def _load_ml_model(self) -> None:
@@ -273,8 +272,10 @@ class CategorizationEngine:
273
272
  vectorizer_file = self.model_path / "vectorizer.joblib"
274
273
 
275
274
  if not model_file.exists() or not vectorizer_file.exists():
276
- print(f"ML model not found at {self.model_path}")
277
- print("Run training script to generate model files")
275
+ logger.warning(
276
+ "ML model not found at %s. Run training script to generate model files.",
277
+ self.model_path,
278
+ )
278
279
  return
279
280
 
280
281
  try:
@@ -282,12 +283,14 @@ class CategorizationEngine:
282
283
 
283
284
  self._ml_model = joblib.load(model_file)
284
285
  self._ml_vectorizer = joblib.load(vectorizer_file)
285
- print(f"Loaded ML model from {self.model_path}")
286
+ logger.info("Loaded ML model from %s", self.model_path)
286
287
  except ImportError:
287
- print("scikit-learn not installed. ML predictions disabled.")
288
- print("Install with: pip install scikit-learn")
288
+ logger.warning(
289
+ "scikit-learn not installed. ML predictions disabled. "
290
+ "Install with: pip install scikit-learn"
291
+ )
289
292
  except Exception as e:
290
- print(f"Error loading ML model: {e}")
293
+ logger.error("Error loading ML model: %s", e)
291
294
 
292
295
  def add_rule(
293
296
  self,
@@ -8,6 +8,7 @@ CRITICAL: Uses ai-infra.llm.LLM (NEVER custom LLM clients).
8
8
 
9
9
  from __future__ import annotations
10
10
 
11
+ import logging
11
12
  from datetime import datetime
12
13
  from decimal import Decimal
13
14
  from typing import TYPE_CHECKING
@@ -17,6 +18,8 @@ from pydantic import BaseModel, Field
17
18
  if TYPE_CHECKING:
18
19
  from ai_infra.llm import LLM
19
20
 
21
+ logger = logging.getLogger(__name__)
22
+
20
23
 
21
24
  class CryptoInsight(BaseModel):
22
25
  """Personalized cryptocurrency insight.
@@ -284,8 +287,6 @@ Provide your insight:"""
284
287
  )
285
288
  )
286
289
  except Exception as e:
287
- # Graceful degradation - log error but don't fail
288
- # In production, use svc-infra logging
289
- print(f"Warning: LLM insight generation failed: {e}")
290
+ logger.warning("LLM insight generation failed: %s", e)
290
291
 
291
292
  return insights
@@ -10,6 +10,7 @@ Aggregates insights from multiple sources:
10
10
  - Cash flow projections
11
11
  """
12
12
 
13
+ import logging
13
14
  from typing import TYPE_CHECKING
14
15
 
15
16
  if TYPE_CHECKING:
@@ -18,6 +19,8 @@ if TYPE_CHECKING:
18
19
  from .models import Insight, InsightFeed, InsightPriority, InsightCategory
19
20
  from .aggregator import aggregate_insights, get_user_insights
20
21
 
22
+ logger = logging.getLogger(__name__)
23
+
21
24
  __all__ = [
22
25
  "Insight",
23
26
  "InsightFeed",
@@ -125,4 +128,4 @@ def add_insights(
125
128
  # Mount router
126
129
  app.include_router(router, include_in_schema=True)
127
130
 
128
- print("Insights feed enabled (unified financial insights)")
131
+ logger.info("Insights feed enabled")
@@ -30,6 +30,7 @@ print(f"Net Worth: ${snapshot.total_net_worth:,.2f}")
30
30
  """
31
31
 
32
32
  import asyncio
33
+ import logging
33
34
  import uuid
34
35
  from datetime import datetime
35
36
  from typing import Any
@@ -47,6 +48,8 @@ from fin_infra.net_worth.models import (
47
48
  NetWorthSnapshot,
48
49
  )
49
50
 
51
+ logger = logging.getLogger(__name__)
52
+
50
53
 
51
54
  class NetWorthAggregator:
52
55
  """
@@ -219,8 +222,7 @@ class NetWorthAggregator:
219
222
 
220
223
  for i, result in enumerate(results):
221
224
  if isinstance(result, BaseException):
222
- # Log error but continue (graceful degradation)
223
- print(f"Provider {providers_used[i]} failed: {result}")
225
+ logger.warning("Provider %s failed: %s", providers_used[i], result)
224
226
  continue
225
227
 
226
228
  # result is now tuple[list[AssetDetail], list[LiabilityDetail]]
File without changes
File without changes