mloda 0.4.1__tar.gz → 0.4.3__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 (264) hide show
  1. mloda-0.4.3/MANIFEST.in +12 -0
  2. mloda-0.4.3/PKG-INFO +314 -0
  3. mloda-0.4.3/README.md +295 -0
  4. mloda-0.4.1/mloda/core/abstract_plugins/components/feature_group_version.py → mloda-0.4.3/mloda/core/abstract_plugins/components/base_feature_group_version.py +1 -1
  5. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/compute_framework.py +1 -1
  6. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/feature_group.py +3 -3
  7. mloda-0.4.3/mloda/core/api/feature_config/__init__.py +15 -0
  8. {mloda-0.4.1/mloda_plugins/config/feature → mloda-0.4.3/mloda/core/api/feature_config}/loader.py +19 -62
  9. {mloda-0.4.1/mloda_plugins/config/feature → mloda-0.4.3/mloda/core/api/feature_config}/models.py +2 -2
  10. {mloda-0.4.1/mloda_plugins/config/feature → mloda-0.4.3/mloda/core/api/feature_config}/parser.py +1 -1
  11. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/api/request.py +6 -1
  12. {mloda-0.4.1 → mloda-0.4.3}/mloda/provider/__init__.py +2 -2
  13. {mloda-0.4.1 → mloda-0.4.3}/mloda/user/__init__.py +10 -2
  14. mloda-0.4.3/mloda.egg-info/PKG-INFO +314 -0
  15. {mloda-0.4.1 → mloda-0.4.3}/mloda.egg-info/SOURCES.txt +10 -7
  16. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/duckdb/duckdb_framework.py +1 -1
  17. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/iceberg/iceberg_framework.py +1 -1
  18. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/pandas/dataframe.py +1 -1
  19. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/polars/dataframe.py +1 -1
  20. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/pyarrow/table.py +1 -1
  21. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/python_dict/python_dict_framework.py +1 -1
  22. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/spark/spark_framework.py +1 -1
  23. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/aggregated_feature_group/base.py +2 -2
  24. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/aggregated_feature_group/pandas.py +1 -1
  25. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/aggregated_feature_group/polars_lazy.py +1 -1
  26. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/aggregated_feature_group/pyarrow.py +1 -1
  27. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/clustering/base.py +2 -2
  28. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/clustering/pandas.py +1 -1
  29. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/data_quality/missing_value/base.py +5 -5
  30. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/data_quality/missing_value/pandas.py +1 -1
  31. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/data_quality/missing_value/pyarrow.py +1 -1
  32. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/data_quality/missing_value/python_dict.py +1 -1
  33. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/dimensionality_reduction/base.py +3 -3
  34. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/dimensionality_reduction/pandas.py +1 -1
  35. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/dynamic_feature_group_factory/dynamic_feature_group_factory.py +4 -4
  36. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/forecasting/base.py +3 -3
  37. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/forecasting/pandas.py +1 -1
  38. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/geo_distance/base.py +3 -3
  39. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/geo_distance/pandas.py +1 -1
  40. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/llm/cli.py +1 -1
  41. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/llm/cli_features/refactor_git_cached.py +4 -4
  42. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/llm/installed_packages_feature_group.py +5 -5
  43. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/llm/list_directory_feature_group.py +2 -2
  44. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/llm/llm_api/claude.py +11 -11
  45. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/llm/llm_api/gemini.py +10 -10
  46. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/llm/llm_api/llm_base_request.py +2 -2
  47. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/llm/llm_api/openai.py +11 -11
  48. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/llm/llm_api/request_loop.py +2 -2
  49. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/llm/llm_file_selector.py +9 -9
  50. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/node_centrality/base.py +2 -2
  51. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/node_centrality/pandas.py +1 -1
  52. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/sklearn/encoding/base.py +8 -8
  53. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/sklearn/encoding/pandas.py +1 -1
  54. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/sklearn/pipeline/base.py +3 -3
  55. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/sklearn/pipeline/pandas.py +1 -1
  56. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/sklearn/scaling/base.py +2 -2
  57. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/sklearn/scaling/pandas.py +1 -1
  58. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/source_input_feature.py +3 -3
  59. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/text_cleaning/base.py +2 -2
  60. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/text_cleaning/pandas.py +1 -1
  61. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/text_cleaning/python_dict.py +1 -1
  62. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/time_window/base.py +3 -3
  63. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/time_window/pandas.py +1 -1
  64. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/time_window/pyarrow.py +1 -1
  65. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/input_data/api_data/api_data.py +27 -27
  66. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/input_data/read_context_files.py +3 -3
  67. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/input_data/read_db.py +1 -1
  68. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/input_data/read_db_feature.py +1 -1
  69. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/input_data/read_dbs/sqlite.py +4 -4
  70. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/input_data/read_file.py +1 -1
  71. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/input_data/read_file_feature.py +1 -1
  72. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/input_data/read_files/csv.py +4 -4
  73. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/input_data/read_files/feather.py +4 -4
  74. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/input_data/read_files/json.py +4 -4
  75. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/input_data/read_files/orc.py +4 -4
  76. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/input_data/read_files/parquet.py +4 -4
  77. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/input_data/read_files/text_file_reader.py +4 -4
  78. mloda-0.4.3/mloda_plugins/function_extender/__init__.py +0 -0
  79. mloda-0.4.3/mloda_plugins/function_extender/base_implementations/__init__.py +0 -0
  80. mloda-0.4.3/mloda_plugins/function_extender/base_implementations/otel/__init__.py +0 -0
  81. mloda-0.4.3/mloda_plugins/py.typed +0 -0
  82. {mloda-0.4.1 → mloda-0.4.3}/pyproject.toml +12 -3
  83. mloda-0.4.1/MANIFEST.in +0 -7
  84. mloda-0.4.1/PKG-INFO +0 -384
  85. mloda-0.4.1/README.md +0 -365
  86. mloda-0.4.1/mloda/__init__.py +0 -17
  87. mloda-0.4.1/mloda.egg-info/PKG-INFO +0 -384
  88. mloda-0.4.1/mloda_plugins/config/__init__.py +0 -1
  89. {mloda-0.4.1 → mloda-0.4.3}/LICENSE.TXT +0 -0
  90. {mloda-0.4.1 → mloda-0.4.3}/NOTICE.md +0 -0
  91. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/__init__.py +0 -0
  92. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/__init__.py +0 -0
  93. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/__init__.py +0 -0
  94. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/base_artifact.py +0 -0
  95. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/base_validator.py +0 -0
  96. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/data_access_collection.py +0 -0
  97. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/data_types.py +0 -0
  98. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/domain.py +0 -0
  99. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/feature.py +0 -0
  100. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/feature_chainer/__init__.py +0 -0
  101. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/feature_chainer/feature_chain_parser.py +0 -0
  102. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/feature_chainer/feature_chain_parser_mixin.py +0 -0
  103. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/feature_collection.py +0 -0
  104. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/feature_name.py +0 -0
  105. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/feature_set.py +0 -0
  106. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/framework_transformer/__init__.py +0 -0
  107. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/framework_transformer/base_transformer.py +0 -0
  108. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/framework_transformer/cfw_transformer.py +0 -0
  109. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/hashable_dict.py +0 -0
  110. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/index/__init__.py +0 -0
  111. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/index/add_index_feature.py +0 -0
  112. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/index/index.py +0 -0
  113. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/input_data/__init__.py +0 -0
  114. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/input_data/api/__init__.py +0 -0
  115. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/input_data/api/api_input_data.py +0 -0
  116. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/input_data/api/api_input_data_collection.py +0 -0
  117. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/input_data/api/base_api_data.py +0 -0
  118. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/input_data/base_input_data.py +0 -0
  119. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/input_data/creator/__init__.py +0 -0
  120. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/input_data/creator/data_creator.py +0 -0
  121. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/link.py +0 -0
  122. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/match_data/__init__.py +0 -0
  123. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/match_data/match_data.py +0 -0
  124. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/merge/__init__.py +0 -0
  125. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/merge/base_merge_engine.py +0 -0
  126. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/options.py +0 -0
  127. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/parallelization_modes.py +0 -0
  128. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/plugin_option/__init__.py +0 -0
  129. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/plugin_option/plugin_collector.py +0 -0
  130. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/utils.py +0 -0
  131. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/validators/__init__.py +0 -0
  132. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/validators/datatype_validator.py +0 -0
  133. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/validators/feature_set_validator.py +0 -0
  134. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/validators/feature_validator.py +0 -0
  135. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/validators/link_validator.py +0 -0
  136. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/components/validators/options_validator.py +0 -0
  137. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/function_extender.py +0 -0
  138. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/plugin_loader/__init__.py +0 -0
  139. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/abstract_plugins/plugin_loader/plugin_loader.py +0 -0
  140. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/api/__init__.py +0 -0
  141. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/api/plugin_docs.py +0 -0
  142. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/api/plugin_info.py +0 -0
  143. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/api/prepare/__init__.py +0 -0
  144. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/api/prepare/setup_compute_framework.py +0 -0
  145. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/core/__init__.py +0 -0
  146. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/core/cfw_manager.py +0 -0
  147. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/core/engine.py +0 -0
  148. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/core/step/__init__.py +0 -0
  149. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/core/step/abstract_step.py +0 -0
  150. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/core/step/feature_group_step.py +0 -0
  151. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/core/step/join_step.py +0 -0
  152. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/core/step/transform_frame_work_step.py +0 -0
  153. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/filter/__init__.py +0 -0
  154. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/filter/filter_engine.py +0 -0
  155. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/filter/filter_parameter.py +0 -0
  156. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/filter/filter_type_enum.py +0 -0
  157. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/filter/global_filter.py +0 -0
  158. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/filter/single_filter.py +0 -0
  159. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/prepare/__init__.py +0 -0
  160. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/prepare/accessible_plugins.py +0 -0
  161. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/prepare/execution_plan.py +0 -0
  162. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/prepare/graph/__init__.py +0 -0
  163. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/prepare/graph/build_graph.py +0 -0
  164. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/prepare/graph/graph.py +0 -0
  165. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/prepare/graph/properties.py +0 -0
  166. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/prepare/identify_feature_group.py +0 -0
  167. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/prepare/joinstep_collection.py +0 -0
  168. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/prepare/resolve_compute_frameworks.py +0 -0
  169. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/prepare/resolve_graph.py +0 -0
  170. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/prepare/resolve_links.py +0 -0
  171. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/prepare/validators/__init__.py +0 -0
  172. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/prepare/validators/resolve_link_validator.py +0 -0
  173. /mloda-0.4.1/mloda/core/runtime/__init__.py → /mloda-0.4.3/mloda/core/py.typed +0 -0
  174. {mloda-0.4.1/mloda/core/runtime/flight → mloda-0.4.3/mloda/core/runtime}/__init__.py +0 -0
  175. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/runtime/compute_framework_executor.py +0 -0
  176. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/runtime/data_lifecycle_manager.py +0 -0
  177. {mloda-0.4.1/mloda/core/runtime/worker → mloda-0.4.3/mloda/core/runtime/flight}/__init__.py +0 -0
  178. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/runtime/flight/flight_server.py +0 -0
  179. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/runtime/flight/runner_flight_server.py +0 -0
  180. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/runtime/run.py +0 -0
  181. {mloda-0.4.1/mloda_plugins → mloda-0.4.3/mloda/core/runtime/worker}/__init__.py +0 -0
  182. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/runtime/worker/multiprocessing_worker.py +0 -0
  183. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/runtime/worker/thread_worker.py +0 -0
  184. {mloda-0.4.1 → mloda-0.4.3}/mloda/core/runtime/worker_manager.py +0 -0
  185. /mloda-0.4.1/mloda_plugins/compute_framework/__init__.py → /mloda-0.4.3/mloda/provider/py.typed +0 -0
  186. {mloda-0.4.1 → mloda-0.4.3}/mloda/steward/__init__.py +0 -0
  187. /mloda-0.4.1/mloda_plugins/compute_framework/base_implementations/__init__.py → /mloda-0.4.3/mloda/steward/py.typed +0 -0
  188. /mloda-0.4.1/mloda_plugins/compute_framework/base_implementations/pandas/__init__.py → /mloda-0.4.3/mloda/user/py.typed +0 -0
  189. {mloda-0.4.1 → mloda-0.4.3}/mloda.egg-info/dependency_links.txt +0 -0
  190. {mloda-0.4.1 → mloda-0.4.3}/mloda.egg-info/entry_points.txt +0 -0
  191. {mloda-0.4.1 → mloda-0.4.3}/mloda.egg-info/requires.txt +0 -0
  192. {mloda-0.4.1 → mloda-0.4.3}/mloda.egg-info/top_level.txt +0 -0
  193. {mloda-0.4.1/mloda_plugins/compute_framework/base_implementations/polars → mloda-0.4.3/mloda_plugins}/__init__.py +0 -0
  194. {mloda-0.4.1/mloda_plugins/compute_framework/base_implementations/pyarrow → mloda-0.4.3/mloda_plugins/compute_framework}/__init__.py +0 -0
  195. {mloda-0.4.1/mloda_plugins/config/feature → mloda-0.4.3/mloda_plugins/compute_framework/base_implementations}/__init__.py +0 -0
  196. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/duckdb/duckdb_filter_engine.py +0 -0
  197. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/duckdb/duckdb_merge_engine.py +0 -0
  198. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/duckdb/duckdb_pyarrow_transformer.py +0 -0
  199. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/iceberg/iceberg_filter_engine.py +0 -0
  200. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/iceberg/iceberg_pyarrow_transformer.py +0 -0
  201. {mloda-0.4.1/mloda_plugins/feature_group → mloda-0.4.3/mloda_plugins/compute_framework/base_implementations/pandas}/__init__.py +0 -0
  202. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/pandas/pandas_filter_engine.py +0 -0
  203. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/pandas/pandas_merge_engine.py +0 -0
  204. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/pandas/pandaspyarrowtransformer.py +0 -0
  205. {mloda-0.4.1/mloda_plugins/feature_group/experimental → mloda-0.4.3/mloda_plugins/compute_framework/base_implementations/polars}/__init__.py +0 -0
  206. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/polars/lazy_dataframe.py +0 -0
  207. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/polars/polars_filter_engine.py +0 -0
  208. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/polars/polars_lazy_merge_engine.py +0 -0
  209. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/polars/polars_lazy_pyarrow_transformer.py +0 -0
  210. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/polars/polars_merge_engine.py +0 -0
  211. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/polars/polars_pyarrow_transformer.py +0 -0
  212. {mloda-0.4.1/mloda_plugins/feature_group/experimental/aggregated_feature_group → mloda-0.4.3/mloda_plugins/compute_framework/base_implementations/pyarrow}/__init__.py +0 -0
  213. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/pyarrow/pyarrow_filter_engine.py +0 -0
  214. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/pyarrow/pyarrow_merge_engine.py +0 -0
  215. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/python_dict/python_dict_filter_engine.py +0 -0
  216. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/python_dict/python_dict_merge_engine.py +0 -0
  217. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/python_dict/python_dict_pyarrow_transformer.py +0 -0
  218. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/spark/spark_filter_engine.py +0 -0
  219. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/spark/spark_merge_engine.py +0 -0
  220. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/compute_framework/base_implementations/spark/spark_pyarrow_transformer.py +0 -0
  221. {mloda-0.4.1/mloda_plugins/feature_group/experimental/data_quality/missing_value → mloda-0.4.3/mloda_plugins/feature_group}/__init__.py +0 -0
  222. {mloda-0.4.1/mloda_plugins/feature_group/experimental/dynamic_feature_group_factory → mloda-0.4.3/mloda_plugins/feature_group/experimental}/__init__.py +0 -0
  223. {mloda-0.4.1/mloda_plugins/feature_group/experimental/forecasting → mloda-0.4.3/mloda_plugins/feature_group/experimental/aggregated_feature_group}/__init__.py +0 -0
  224. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/clustering/__init__.py +0 -0
  225. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/data_quality/__init__.py +0 -0
  226. {mloda-0.4.1/mloda_plugins/feature_group/experimental/llm → mloda-0.4.3/mloda_plugins/feature_group/experimental/data_quality/missing_value}/__init__.py +0 -0
  227. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/default_options_key.py +0 -0
  228. {mloda-0.4.1/mloda_plugins/feature_group/experimental/llm/cli_features → mloda-0.4.3/mloda_plugins/feature_group/experimental/dynamic_feature_group_factory}/__init__.py +0 -0
  229. {mloda-0.4.1/mloda_plugins/feature_group/experimental/llm/llm_api → mloda-0.4.3/mloda_plugins/feature_group/experimental/forecasting}/__init__.py +0 -0
  230. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/forecasting/forecasting_artifact.py +0 -0
  231. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/geo_distance/__init__.py +0 -0
  232. {mloda-0.4.1/mloda_plugins/feature_group/experimental/llm/tools → mloda-0.4.3/mloda_plugins/feature_group/experimental/llm}/__init__.py +0 -0
  233. {mloda-0.4.1/mloda_plugins/feature_group/experimental/llm/tools/available → mloda-0.4.3/mloda_plugins/feature_group/experimental/llm/cli_features}/__init__.py +0 -0
  234. {mloda-0.4.1/mloda_plugins/feature_group/experimental/time_window → mloda-0.4.3/mloda_plugins/feature_group/experimental/llm/llm_api}/__init__.py +0 -0
  235. {mloda-0.4.1/mloda_plugins/feature_group/input_data → mloda-0.4.3/mloda_plugins/feature_group/experimental/llm/tools}/__init__.py +0 -0
  236. {mloda-0.4.1/mloda_plugins/feature_group/input_data/api_data → mloda-0.4.3/mloda_plugins/feature_group/experimental/llm/tools/available}/__init__.py +0 -0
  237. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/llm/tools/available/adjust_and_run_all_tests_tool.py +0 -0
  238. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/llm/tools/available/adjust_file_tool.py +0 -0
  239. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/llm/tools/available/create_folder_tool.py +0 -0
  240. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/llm/tools/available/create_new_file.py +0 -0
  241. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/llm/tools/available/git_diff.py +0 -0
  242. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/llm/tools/available/git_diff_cached.py +0 -0
  243. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/llm/tools/available/multiply.py +0 -0
  244. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/llm/tools/available/read_file_tool.py +0 -0
  245. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/llm/tools/available/replace_file_tool.py +0 -0
  246. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/llm/tools/available/replace_file_tool_which_runs_tox.py +0 -0
  247. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/llm/tools/available/run_single_pytest.py +0 -0
  248. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/llm/tools/available/run_tox.py +0 -0
  249. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/llm/tools/base_tool.py +0 -0
  250. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/llm/tools/tool_collection.py +0 -0
  251. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/llm/tools/tool_data_classes.py +0 -0
  252. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/sklearn/__init__.py +0 -0
  253. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/sklearn/encoding/__init__.py +0 -0
  254. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/sklearn/pipeline/__init__.py +0 -0
  255. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/sklearn/scaling/__init__.py +0 -0
  256. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/feature_group/experimental/sklearn/sklearn_artifact.py +0 -0
  257. {mloda-0.4.1/mloda_plugins/feature_group/input_data/read_dbs → mloda-0.4.3/mloda_plugins/feature_group/experimental/time_window}/__init__.py +0 -0
  258. {mloda-0.4.1/mloda_plugins/feature_group/input_data/read_files → mloda-0.4.3/mloda_plugins/feature_group/input_data}/__init__.py +0 -0
  259. {mloda-0.4.1/mloda_plugins/function_extender → mloda-0.4.3/mloda_plugins/feature_group/input_data/api_data}/__init__.py +0 -0
  260. {mloda-0.4.1/mloda_plugins/function_extender/base_implementations → mloda-0.4.3/mloda_plugins/feature_group/input_data/read_dbs}/__init__.py +0 -0
  261. {mloda-0.4.1/mloda_plugins/function_extender/base_implementations/otel → mloda-0.4.3/mloda_plugins/feature_group/input_data/read_files}/__init__.py +0 -0
  262. {mloda-0.4.1 → mloda-0.4.3}/mloda_plugins/function_extender/base_implementations/otel/otel_extender.py +0 -0
  263. {mloda-0.4.1 → mloda-0.4.3}/setup.cfg +0 -0
  264. {mloda-0.4.1 → mloda-0.4.3}/setup.py +0 -0
@@ -0,0 +1,12 @@
1
+ global-exclude __pycache__/
2
+ global-exclude *.pyc
3
+ prune **/__pycache__
4
+ include README.md
5
+ include LICENSE.TXT
6
+ include NOTICE.md
7
+ include mloda/core/py.typed
8
+ include mloda/provider/py.typed
9
+ include mloda/steward/py.typed
10
+ include mloda/user/py.typed
11
+ include mloda_plugins/py.typed
12
+ prune tests*
mloda-0.4.3/PKG-INFO ADDED
@@ -0,0 +1,314 @@
1
+ Metadata-Version: 2.4
2
+ Name: mloda
3
+ Version: 0.4.3
4
+ Summary: mloda: One Data Access for ML and AI
5
+ Author-email: Tom Kaltofen <info@mloda.ai>
6
+ License: Apache-2.0
7
+ Project-URL: Bug Tracker, https://github.com/mloda-ai/mloda/issues
8
+ Project-URL: Documentation, https://mloda-ai.github.io/mloda/
9
+ Project-URL: Source Code, https://github.com/mloda-ai/mloda
10
+ Project-URL: PyPI, https://pypi.org/project/mloda/
11
+ Project-URL: Homepage, https://mloda.ai
12
+ Classifier: Programming Language :: Python :: 3
13
+ Requires-Python: <3.14,>=3.8
14
+ Description-Content-Type: text/markdown
15
+ License-File: LICENSE.TXT
16
+ License-File: NOTICE.md
17
+ Requires-Dist: pyarrow
18
+ Dynamic: license-file
19
+
20
+ # [mloda.ai](https://mloda.ai): Open Data Access for ML & AI
21
+
22
+ [![Website](https://img.shields.io/badge/website-mloda.ai-blue.svg)](https://mloda.ai)
23
+ [![Documentation](https://img.shields.io/badge/docs-github.io-blue.svg)](https://mloda-ai.github.io/mloda/)
24
+ [![PyPI version](https://badge.fury.io/py/mloda.svg)](https://badge.fury.io/py/mloda)
25
+ [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/mloda-ai/mloda/blob/main/LICENSE.TXT)
26
+ [![Tests](https://img.shields.io/badge/tests-1500%2B-green.svg)](https://github.com/mloda-ai/mloda)
27
+
28
+ > **Declarative data access for AI agents. Describe what you need - mloda delivers it.**
29
+
30
+ ```bash
31
+ pip install mloda
32
+ ```
33
+
34
+ ## 30-Second Example
35
+
36
+ Your AI describes what it needs. mloda figures out how to get it:
37
+
38
+ ```python
39
+ from mloda.user import PluginLoader, mloda
40
+ PluginLoader.all()
41
+
42
+ result = mloda.run_all(
43
+ features=["customer_id", "income", "income__sum_aggr", "age__avg_aggr"],
44
+ compute_frameworks=["PandasDataFrame"],
45
+ api_data={"SampleData": {
46
+ "customer_id": ["C001", "C002", "C003", "C004", "C005"],
47
+ "age": [25, 35, 45, 30, 50],
48
+ "income": [50000, 75000, 90000, 60000, 85000]
49
+ }}
50
+ )
51
+ ```
52
+
53
+ Copy, paste, run. mloda resolves dependencies, chains plugins, delivers data.
54
+
55
+ ---
56
+
57
+ ## What mloda Does
58
+
59
+ ```
60
+ ┌─────────────────────────────────────────────────────────────────┐
61
+ │ DATA USERS │
62
+ │ AI Agents • ML Pipelines • Data Science • Analytics │
63
+ └───────────────────────────┬─────────────────────────────────────┘
64
+ │ describe what they need
65
+
66
+ ┌───────────────┐
67
+ │ mloda │ ← resolves HOW from WHAT
68
+ │ [Plugins] │
69
+ └───────────────┘
70
+ │ delivers trusted data
71
+
72
+ ┌─────────────────────────────────────────────────────────────────┐
73
+ │ DATA SOURCES │
74
+ │ Databases • APIs • Files • Any source via plugins │
75
+ └─────────────────────────────────────────────────────────────────┘
76
+ ```
77
+
78
+ ---
79
+
80
+ ## Why mloda?
81
+
82
+ | You want to... | mloda gives you... |
83
+ |----------------|-------------------|
84
+ | Give AI agents data access | Declarative API - agents describe WHAT, not HOW |
85
+ | Trace every result | Built-in lineage back to source |
86
+ | Reuse across projects | Plugins work anywhere - notebook to production |
87
+ | Mix data sources | One interface for DBs, APIs, files, anything |
88
+
89
+ ---
90
+
91
+ ## AI Use Case: LLM Tool Function
92
+
93
+ Let LLMs request data without writing code:
94
+
95
+ ```python
96
+ # LLM generates this JSON
97
+ llm_request = '["customer_id", {"name": "income__sum_aggr"}]'
98
+
99
+ # mloda executes it
100
+ from mloda.user import load_features_from_config
101
+ features = load_features_from_config(llm_request, format="json")
102
+ result = mloda.run_all(
103
+ features=features,
104
+ compute_frameworks=["PandasDataFrame"],
105
+ api_data={"SampleData": {"customer_id": ["C001", "C002"], "income": [50000, 75000]}}
106
+ )
107
+ ```
108
+
109
+ More patterns: [Context Window Assembly](#2-context-window-assembly) • [RAG Pipelines](#3-rag-with-feature-chaining)
110
+
111
+ ---
112
+
113
+ ## How mloda is Different
114
+
115
+ mloda separates **WHAT** you need from **HOW** to get it - through plugins. Existing tools solve parts of this, but none bridge the full gap:
116
+
117
+ | Category | Products | What it does | Why it's not enough |
118
+ |----------|----------|--------------|---------------------|
119
+ | Feature Stores | Feast, Tecton, Featureform | Store + serve features | Infrastructure-tied, storage-only |
120
+ | Semantic Layers | dbt Semantic Layer, Cube | Declarative metrics | SQL-only, centralized |
121
+ | DAG Frameworks | Hamilton, Kedro | Dataflows as code | Function-first, no plugin abstraction |
122
+ | Data Catalogs | DataHub, Atlan | Metadata & discovery | No execution, no contracts |
123
+ | ORMs | SQLAlchemy, Django ORM | Database abstraction | Single database, no ML lifecycle |
124
+
125
+ **mloda is the connection layer** - separating WHAT you compute from HOW you compute it. Plugins define transformations. Users describe requirements. mloda resolves the pipeline.
126
+
127
+ ---
128
+
129
+ ## Plugins: The Building Blocks
130
+
131
+ mloda's architecture follows three roles: **providers** (define plugins), **users** (access data), and **stewards** (govern execution). The module structure reflects this: `mloda.provider`, `mloda.user`, `mloda.steward`.
132
+
133
+ mloda uses three types of plugins:
134
+
135
+ | Type | What it does |
136
+ |------|--------------|
137
+ | **FeatureGroup** | Defines data transformations |
138
+ | **ComputeFramework** | Execution backend (Pandas, Spark, etc.) |
139
+ | **Extender** | Hooks for logging, validation, monitoring |
140
+
141
+ Most of the time, you'll work with **FeatureGroups** - Python classes that define how to access and transform data (see Quick Example above).
142
+
143
+ **Why plugins?**
144
+ - **Steps, not pipelines** - Build transformations. mloda wires them together.
145
+ - **Small and testable** - Each plugin is a focused unit. Easy to test, easy to debug.
146
+ - **AI-friendly** - Small, template-like structures. Let AI generate plugins for you.
147
+ - **Share what isn't secret** - Your pipeline runs steps a,b,c,d. Steps b,c,d have no proprietary logic? Share them across projects, teams, even organizations.
148
+ - **Experiment to production** - Same plugins in your notebook and your cluster. No rewrite.
149
+ - **Stand on shoulders** - Combine community plugins with your own. Build on what exists.
150
+
151
+ ---
152
+
153
+ ## AI Use Case Patterns
154
+
155
+ ### 1. LLM Tool Function
156
+
157
+ Give LLMs deterministic data access - they declare what, mloda handles how:
158
+
159
+ ```python
160
+ from mloda.user import PluginLoader, load_features_from_config, mloda
161
+ PluginLoader.all()
162
+
163
+ # LLM generates this JSON (no Python code needed)
164
+ llm_output = '''
165
+ [
166
+ "customer_id",
167
+ {"name": "income__sum_aggr"},
168
+ {"name": "age__avg_aggr"},
169
+ {"name": "total_spend", "options": {"aggregation_type": "sum", "in_features": "income"}}
170
+ ]
171
+ '''
172
+
173
+ # mloda parses JSON into Feature objects
174
+ features = load_features_from_config(llm_output, format="json")
175
+
176
+ result = mloda.run_all(
177
+ features=features,
178
+ compute_frameworks=["PandasDataFrame"],
179
+ api_data={"SampleData": {
180
+ "customer_id": ["C001", "C002", "C003"],
181
+ "income": [50000, 75000, 90000],
182
+ "age": [25, 35, 45]
183
+ }}
184
+ )
185
+ ```
186
+
187
+ **LLM-friendly:** The agent only declares what it needs - mloda handles the rest.
188
+
189
+ ### 2. Context Window Assembly
190
+
191
+ Gather context from multiple sources declaratively - mloda validates and delivers. Why not let an AI agent do it?
192
+
193
+ *Example: This shows the API pattern. Requires custom FeatureGroup implementations for your data sources.*
194
+
195
+ ```python
196
+ from mloda.user import Feature, mloda
197
+
198
+ # Build complete context from multiple sources
199
+ features = [
200
+ Feature(name="system_instructions", options={"template": "support_agent"}),
201
+ Feature(name="user_profile", options={"user_id": user_id, "include_preferences": True}),
202
+ Feature(name="knowledge_base", options={"query": user_query, "top_k": 5}),
203
+ Feature(name="conversation_history", options={"limit": 20, "summarize_old": True}),
204
+ Feature(name="available_tools", options={"category": "customer_service"}),
205
+ Feature(name="output_format", options={"format": "markdown", "max_length": 500}),
206
+ ]
207
+
208
+ result = mloda.run_all(
209
+ features=features,
210
+ compute_frameworks=["PythonDictFramework"],
211
+ api_data={"UserQuery": {"query": [user_query]}}
212
+ )
213
+
214
+ # Each feature resolved via its plugin, validated
215
+ ```
216
+
217
+ ### 3. RAG with Feature Chaining
218
+
219
+ Build RAG pipelines declaratively - mloda chains the steps for you.
220
+
221
+ *Example: This shows the chaining syntax. Requires custom FeatureGroup implementations for retrieval and processing.*
222
+
223
+ ```python
224
+ # String-based chaining: query -> validate -> retrieve -> redact
225
+ Feature(name="user_query__injection_checked__retrieved__pii_redacted")
226
+
227
+ # Configuration-based chaining: explicit pipeline
228
+ Feature(
229
+ name="safe_context",
230
+ options=Options(context={
231
+ "in_features": "documents__retrieved__pii_redacted",
232
+ "redact_types": ["email", "phone", "ssn"]
233
+ })
234
+ )
235
+ ```
236
+
237
+ mloda resolves the full chain - you declare the end result, not the steps.
238
+
239
+ **Automatic dependency resolution:** You only declare what you need. If `pii_redacted` depends on `retrieved` which depends on `documents`, just ask for `pii_redacted` - mloda traces back and resolves the full chain.
240
+
241
+ ---
242
+
243
+ ## Compute Frameworks
244
+
245
+ Mix multiple backends in a single pipeline - mloda routes each feature to the right framework:
246
+
247
+ ```python
248
+ result = mloda.run_all(
249
+ features=[...],
250
+ compute_frameworks=["PandasDataFrame", "PolarsDataFrame", "SparkFramework"]
251
+ )
252
+
253
+ # Results may come from different frameworks based on plugin compatibility
254
+ ```
255
+
256
+ Add your own frameworks - mloda is extensible.
257
+
258
+ ---
259
+
260
+ ## Extenders
261
+
262
+ Wrap plugin execution for logging, validation, or lineage tracking:
263
+
264
+ ```python
265
+ import time
266
+ from mloda.steward import Extender, ExtenderHook
267
+
268
+ class LogExecutionTime(Extender):
269
+ def wraps(self):
270
+ return {ExtenderHook.FEATURE_GROUP_CALCULATE_FEATURE}
271
+
272
+ def __call__(self, func, *args, **kwargs):
273
+ start = time.time()
274
+ result = func(*args, **kwargs)
275
+ print(f"Took {time.time() - start:.2f}s")
276
+ return result
277
+
278
+ # Use it
279
+ result = mloda.run_all(features, function_extender={LogExecutionTime()})
280
+ ```
281
+
282
+ Built-in and custom extenders give you full lineage - trace any result back to its source.
283
+
284
+ ---
285
+
286
+ ## When to Use mloda
287
+
288
+ **Use mloda when:**
289
+ - Your agents need data from multiple sources
290
+ - You want consistent, validated data access
291
+ - You need traceability (audit, debugging)
292
+ - Multiple agents share the same data patterns
293
+
294
+ **Don't use mloda for:**
295
+ - Single database, simple queries → use an ORM
296
+ - One-off scripts → just write the code
297
+ - Real-time streaming (<5ms) → use Kafka/Flink
298
+
299
+ ---
300
+
301
+ ## Documentation
302
+
303
+ - **[Getting Started](https://mloda-ai.github.io/mloda/chapter1/installation/)** - Installation and first steps
304
+ - **[Plugin Development](https://mloda-ai.github.io/mloda/chapter1/feature-groups/)** - Build your own plugins
305
+ - **[API Reference](https://mloda-ai.github.io/mloda/in_depth/mloda-api/)** - Complete API docs
306
+
307
+ ---
308
+
309
+ ## Contributing
310
+
311
+ We welcome contributions! Build plugins, improve docs, or add features.
312
+
313
+ - **[GitHub Issues](https://github.com/mloda-ai/mloda/issues/)** - Report bugs or request features
314
+ - **[Development Guide](https://mloda-ai.github.io/mloda/development/)** - How to contribute
mloda-0.4.3/README.md ADDED
@@ -0,0 +1,295 @@
1
+ # [mloda.ai](https://mloda.ai): Open Data Access for ML & AI
2
+
3
+ [![Website](https://img.shields.io/badge/website-mloda.ai-blue.svg)](https://mloda.ai)
4
+ [![Documentation](https://img.shields.io/badge/docs-github.io-blue.svg)](https://mloda-ai.github.io/mloda/)
5
+ [![PyPI version](https://badge.fury.io/py/mloda.svg)](https://badge.fury.io/py/mloda)
6
+ [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/mloda-ai/mloda/blob/main/LICENSE.TXT)
7
+ [![Tests](https://img.shields.io/badge/tests-1500%2B-green.svg)](https://github.com/mloda-ai/mloda)
8
+
9
+ > **Declarative data access for AI agents. Describe what you need - mloda delivers it.**
10
+
11
+ ```bash
12
+ pip install mloda
13
+ ```
14
+
15
+ ## 30-Second Example
16
+
17
+ Your AI describes what it needs. mloda figures out how to get it:
18
+
19
+ ```python
20
+ from mloda.user import PluginLoader, mloda
21
+ PluginLoader.all()
22
+
23
+ result = mloda.run_all(
24
+ features=["customer_id", "income", "income__sum_aggr", "age__avg_aggr"],
25
+ compute_frameworks=["PandasDataFrame"],
26
+ api_data={"SampleData": {
27
+ "customer_id": ["C001", "C002", "C003", "C004", "C005"],
28
+ "age": [25, 35, 45, 30, 50],
29
+ "income": [50000, 75000, 90000, 60000, 85000]
30
+ }}
31
+ )
32
+ ```
33
+
34
+ Copy, paste, run. mloda resolves dependencies, chains plugins, delivers data.
35
+
36
+ ---
37
+
38
+ ## What mloda Does
39
+
40
+ ```
41
+ ┌─────────────────────────────────────────────────────────────────┐
42
+ │ DATA USERS │
43
+ │ AI Agents • ML Pipelines • Data Science • Analytics │
44
+ └───────────────────────────┬─────────────────────────────────────┘
45
+ │ describe what they need
46
+
47
+ ┌───────────────┐
48
+ │ mloda │ ← resolves HOW from WHAT
49
+ │ [Plugins] │
50
+ └───────────────┘
51
+ │ delivers trusted data
52
+
53
+ ┌─────────────────────────────────────────────────────────────────┐
54
+ │ DATA SOURCES │
55
+ │ Databases • APIs • Files • Any source via plugins │
56
+ └─────────────────────────────────────────────────────────────────┘
57
+ ```
58
+
59
+ ---
60
+
61
+ ## Why mloda?
62
+
63
+ | You want to... | mloda gives you... |
64
+ |----------------|-------------------|
65
+ | Give AI agents data access | Declarative API - agents describe WHAT, not HOW |
66
+ | Trace every result | Built-in lineage back to source |
67
+ | Reuse across projects | Plugins work anywhere - notebook to production |
68
+ | Mix data sources | One interface for DBs, APIs, files, anything |
69
+
70
+ ---
71
+
72
+ ## AI Use Case: LLM Tool Function
73
+
74
+ Let LLMs request data without writing code:
75
+
76
+ ```python
77
+ # LLM generates this JSON
78
+ llm_request = '["customer_id", {"name": "income__sum_aggr"}]'
79
+
80
+ # mloda executes it
81
+ from mloda.user import load_features_from_config
82
+ features = load_features_from_config(llm_request, format="json")
83
+ result = mloda.run_all(
84
+ features=features,
85
+ compute_frameworks=["PandasDataFrame"],
86
+ api_data={"SampleData": {"customer_id": ["C001", "C002"], "income": [50000, 75000]}}
87
+ )
88
+ ```
89
+
90
+ More patterns: [Context Window Assembly](#2-context-window-assembly) • [RAG Pipelines](#3-rag-with-feature-chaining)
91
+
92
+ ---
93
+
94
+ ## How mloda is Different
95
+
96
+ mloda separates **WHAT** you need from **HOW** to get it - through plugins. Existing tools solve parts of this, but none bridge the full gap:
97
+
98
+ | Category | Products | What it does | Why it's not enough |
99
+ |----------|----------|--------------|---------------------|
100
+ | Feature Stores | Feast, Tecton, Featureform | Store + serve features | Infrastructure-tied, storage-only |
101
+ | Semantic Layers | dbt Semantic Layer, Cube | Declarative metrics | SQL-only, centralized |
102
+ | DAG Frameworks | Hamilton, Kedro | Dataflows as code | Function-first, no plugin abstraction |
103
+ | Data Catalogs | DataHub, Atlan | Metadata & discovery | No execution, no contracts |
104
+ | ORMs | SQLAlchemy, Django ORM | Database abstraction | Single database, no ML lifecycle |
105
+
106
+ **mloda is the connection layer** - separating WHAT you compute from HOW you compute it. Plugins define transformations. Users describe requirements. mloda resolves the pipeline.
107
+
108
+ ---
109
+
110
+ ## Plugins: The Building Blocks
111
+
112
+ mloda's architecture follows three roles: **providers** (define plugins), **users** (access data), and **stewards** (govern execution). The module structure reflects this: `mloda.provider`, `mloda.user`, `mloda.steward`.
113
+
114
+ mloda uses three types of plugins:
115
+
116
+ | Type | What it does |
117
+ |------|--------------|
118
+ | **FeatureGroup** | Defines data transformations |
119
+ | **ComputeFramework** | Execution backend (Pandas, Spark, etc.) |
120
+ | **Extender** | Hooks for logging, validation, monitoring |
121
+
122
+ Most of the time, you'll work with **FeatureGroups** - Python classes that define how to access and transform data (see Quick Example above).
123
+
124
+ **Why plugins?**
125
+ - **Steps, not pipelines** - Build transformations. mloda wires them together.
126
+ - **Small and testable** - Each plugin is a focused unit. Easy to test, easy to debug.
127
+ - **AI-friendly** - Small, template-like structures. Let AI generate plugins for you.
128
+ - **Share what isn't secret** - Your pipeline runs steps a,b,c,d. Steps b,c,d have no proprietary logic? Share them across projects, teams, even organizations.
129
+ - **Experiment to production** - Same plugins in your notebook and your cluster. No rewrite.
130
+ - **Stand on shoulders** - Combine community plugins with your own. Build on what exists.
131
+
132
+ ---
133
+
134
+ ## AI Use Case Patterns
135
+
136
+ ### 1. LLM Tool Function
137
+
138
+ Give LLMs deterministic data access - they declare what, mloda handles how:
139
+
140
+ ```python
141
+ from mloda.user import PluginLoader, load_features_from_config, mloda
142
+ PluginLoader.all()
143
+
144
+ # LLM generates this JSON (no Python code needed)
145
+ llm_output = '''
146
+ [
147
+ "customer_id",
148
+ {"name": "income__sum_aggr"},
149
+ {"name": "age__avg_aggr"},
150
+ {"name": "total_spend", "options": {"aggregation_type": "sum", "in_features": "income"}}
151
+ ]
152
+ '''
153
+
154
+ # mloda parses JSON into Feature objects
155
+ features = load_features_from_config(llm_output, format="json")
156
+
157
+ result = mloda.run_all(
158
+ features=features,
159
+ compute_frameworks=["PandasDataFrame"],
160
+ api_data={"SampleData": {
161
+ "customer_id": ["C001", "C002", "C003"],
162
+ "income": [50000, 75000, 90000],
163
+ "age": [25, 35, 45]
164
+ }}
165
+ )
166
+ ```
167
+
168
+ **LLM-friendly:** The agent only declares what it needs - mloda handles the rest.
169
+
170
+ ### 2. Context Window Assembly
171
+
172
+ Gather context from multiple sources declaratively - mloda validates and delivers. Why not let an AI agent do it?
173
+
174
+ *Example: This shows the API pattern. Requires custom FeatureGroup implementations for your data sources.*
175
+
176
+ ```python
177
+ from mloda.user import Feature, mloda
178
+
179
+ # Build complete context from multiple sources
180
+ features = [
181
+ Feature(name="system_instructions", options={"template": "support_agent"}),
182
+ Feature(name="user_profile", options={"user_id": user_id, "include_preferences": True}),
183
+ Feature(name="knowledge_base", options={"query": user_query, "top_k": 5}),
184
+ Feature(name="conversation_history", options={"limit": 20, "summarize_old": True}),
185
+ Feature(name="available_tools", options={"category": "customer_service"}),
186
+ Feature(name="output_format", options={"format": "markdown", "max_length": 500}),
187
+ ]
188
+
189
+ result = mloda.run_all(
190
+ features=features,
191
+ compute_frameworks=["PythonDictFramework"],
192
+ api_data={"UserQuery": {"query": [user_query]}}
193
+ )
194
+
195
+ # Each feature resolved via its plugin, validated
196
+ ```
197
+
198
+ ### 3. RAG with Feature Chaining
199
+
200
+ Build RAG pipelines declaratively - mloda chains the steps for you.
201
+
202
+ *Example: This shows the chaining syntax. Requires custom FeatureGroup implementations for retrieval and processing.*
203
+
204
+ ```python
205
+ # String-based chaining: query -> validate -> retrieve -> redact
206
+ Feature(name="user_query__injection_checked__retrieved__pii_redacted")
207
+
208
+ # Configuration-based chaining: explicit pipeline
209
+ Feature(
210
+ name="safe_context",
211
+ options=Options(context={
212
+ "in_features": "documents__retrieved__pii_redacted",
213
+ "redact_types": ["email", "phone", "ssn"]
214
+ })
215
+ )
216
+ ```
217
+
218
+ mloda resolves the full chain - you declare the end result, not the steps.
219
+
220
+ **Automatic dependency resolution:** You only declare what you need. If `pii_redacted` depends on `retrieved` which depends on `documents`, just ask for `pii_redacted` - mloda traces back and resolves the full chain.
221
+
222
+ ---
223
+
224
+ ## Compute Frameworks
225
+
226
+ Mix multiple backends in a single pipeline - mloda routes each feature to the right framework:
227
+
228
+ ```python
229
+ result = mloda.run_all(
230
+ features=[...],
231
+ compute_frameworks=["PandasDataFrame", "PolarsDataFrame", "SparkFramework"]
232
+ )
233
+
234
+ # Results may come from different frameworks based on plugin compatibility
235
+ ```
236
+
237
+ Add your own frameworks - mloda is extensible.
238
+
239
+ ---
240
+
241
+ ## Extenders
242
+
243
+ Wrap plugin execution for logging, validation, or lineage tracking:
244
+
245
+ ```python
246
+ import time
247
+ from mloda.steward import Extender, ExtenderHook
248
+
249
+ class LogExecutionTime(Extender):
250
+ def wraps(self):
251
+ return {ExtenderHook.FEATURE_GROUP_CALCULATE_FEATURE}
252
+
253
+ def __call__(self, func, *args, **kwargs):
254
+ start = time.time()
255
+ result = func(*args, **kwargs)
256
+ print(f"Took {time.time() - start:.2f}s")
257
+ return result
258
+
259
+ # Use it
260
+ result = mloda.run_all(features, function_extender={LogExecutionTime()})
261
+ ```
262
+
263
+ Built-in and custom extenders give you full lineage - trace any result back to its source.
264
+
265
+ ---
266
+
267
+ ## When to Use mloda
268
+
269
+ **Use mloda when:**
270
+ - Your agents need data from multiple sources
271
+ - You want consistent, validated data access
272
+ - You need traceability (audit, debugging)
273
+ - Multiple agents share the same data patterns
274
+
275
+ **Don't use mloda for:**
276
+ - Single database, simple queries → use an ORM
277
+ - One-off scripts → just write the code
278
+ - Real-time streaming (<5ms) → use Kafka/Flink
279
+
280
+ ---
281
+
282
+ ## Documentation
283
+
284
+ - **[Getting Started](https://mloda-ai.github.io/mloda/chapter1/installation/)** - Installation and first steps
285
+ - **[Plugin Development](https://mloda-ai.github.io/mloda/chapter1/feature-groups/)** - Build your own plugins
286
+ - **[API Reference](https://mloda-ai.github.io/mloda/in_depth/mloda-api/)** - Complete API docs
287
+
288
+ ---
289
+
290
+ ## Contributing
291
+
292
+ We welcome contributions! Build plugins, improve docs, or add features.
293
+
294
+ - **[GitHub Issues](https://github.com/mloda-ai/mloda/issues/)** - Report bugs or request features
295
+ - **[Development Guide](https://mloda-ai.github.io/mloda/development/)** - How to contribute
@@ -7,7 +7,7 @@ from typing import Any, Type
7
7
  from abc import ABC
8
8
 
9
9
 
10
- class FeatureGroupVersion(ABC):
10
+ class BaseFeatureGroupVersion(ABC):
11
11
  @classmethod
12
12
  def mloda_version(cls) -> str:
13
13
  """
@@ -383,7 +383,7 @@ Example:
383
383
  )
384
384
  }}
385
385
 
386
- mlodaAPI.run_all(
386
+ mlodamloda.run_all(
387
387
  features=[Feature.int32_of("{feature_name}")],
388
388
  links=links,
389
389
  ...
@@ -8,7 +8,7 @@ from mloda.core.abstract_plugins.components.data_access_collection import DataAc
8
8
  from mloda.core.abstract_plugins.components.data_types import DataType
9
9
 
10
10
  from mloda.core.abstract_plugins.components.domain import Domain
11
- from mloda.core.abstract_plugins.components.feature_group_version import FeatureGroupVersion
11
+ from mloda.core.abstract_plugins.components.base_feature_group_version import BaseFeatureGroupVersion
12
12
  from mloda.core.abstract_plugins.components.feature_name import FeatureName
13
13
  from mloda.core.abstract_plugins.components.input_data.api.api_input_data import ApiInputData
14
14
  from mloda.core.abstract_plugins.components.input_data.base_input_data import BaseInputData
@@ -68,9 +68,9 @@ class FeatureGroup(ABC):
68
68
  making it easier to detect changes, manage compatibility, and debug issues.
69
69
 
70
70
  If you need to change the version of the feature group, you can do so by subclassing
71
- FeatureGroupVersion and overriding the version method. This allows you to create a new version system.
71
+ BaseFeatureGroupVersion and overriding the version method. This allows you to create a new version system.
72
72
  """
73
- return FeatureGroupVersion.version(cls)
73
+ return BaseFeatureGroupVersion.version(cls)
74
74
 
75
75
  @classmethod
76
76
  def input_data(cls) -> Optional[BaseInputData]:
@@ -0,0 +1,15 @@
1
+ """Feature configuration loading from JSON.
2
+
3
+ This module provides utilities for loading feature configurations from JSON files.
4
+ """
5
+
6
+ from mloda.core.api.feature_config.loader import load_features_from_config
7
+ from mloda.core.api.feature_config.models import FeatureConfig, feature_config_schema
8
+ from mloda.core.api.feature_config.parser import parse_json
9
+
10
+ __all__ = [
11
+ "load_features_from_config",
12
+ "FeatureConfig",
13
+ "feature_config_schema",
14
+ "parse_json",
15
+ ]