frogml-cli 0.0.1__py3-none-any.whl

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 (287) hide show
  1. frogml_cli/__init__.py +10 -0
  2. frogml_cli/cli.py +40 -0
  3. frogml_cli/commands/__init__.py +0 -0
  4. frogml_cli/commands/_logic/__init__.py +0 -0
  5. frogml_cli/commands/_logic/tools.py +6 -0
  6. frogml_cli/commands/alerts/__init__.py +0 -0
  7. frogml_cli/commands/alerts/alerts_commnad_group.py +18 -0
  8. frogml_cli/commands/alerts/delete/__init__.py +0 -0
  9. frogml_cli/commands/alerts/delete/_logic.py +5 -0
  10. frogml_cli/commands/alerts/delete/ui.py +10 -0
  11. frogml_cli/commands/alerts/list/__init__.py +0 -0
  12. frogml_cli/commands/alerts/list/_logic.py +23 -0
  13. frogml_cli/commands/alerts/list/ui.py +17 -0
  14. frogml_cli/commands/alerts/register/__init__.py +0 -0
  15. frogml_cli/commands/alerts/register/_logic.py +72 -0
  16. frogml_cli/commands/alerts/register/ui.py +30 -0
  17. frogml_cli/commands/audience/__init__.py +0 -0
  18. frogml_cli/commands/audience/_logic/__init__.py +0 -0
  19. frogml_cli/commands/audience/_logic/config/__init__.py +0 -0
  20. frogml_cli/commands/audience/_logic/config/config_base.py +15 -0
  21. frogml_cli/commands/audience/_logic/config/parser.py +30 -0
  22. frogml_cli/commands/audience/_logic/config/v1/__init__.py +0 -0
  23. frogml_cli/commands/audience/_logic/config/v1/audience_config.py +25 -0
  24. frogml_cli/commands/audience/_logic/config/v1/conditions_config.py +59 -0
  25. frogml_cli/commands/audience/_logic/config/v1/config_v1.py +23 -0
  26. frogml_cli/commands/audience/_logic/config/v1/route_config.py +15 -0
  27. frogml_cli/commands/audience/_logic/config/v1/spec.py +9 -0
  28. frogml_cli/commands/audience/audience_api_dump.py +86 -0
  29. frogml_cli/commands/audience/audience_commands_group.py +30 -0
  30. frogml_cli/commands/audience/create/__init__.py +0 -0
  31. frogml_cli/commands/audience/create/logic.py +41 -0
  32. frogml_cli/commands/audience/create/ui.py +21 -0
  33. frogml_cli/commands/audience/delete/__init__.py +0 -0
  34. frogml_cli/commands/audience/delete/logic.py +13 -0
  35. frogml_cli/commands/audience/delete/ui.py +17 -0
  36. frogml_cli/commands/audience/get/__init__.py +0 -0
  37. frogml_cli/commands/audience/get/logic.py +14 -0
  38. frogml_cli/commands/audience/get/ui.py +25 -0
  39. frogml_cli/commands/audience/list/__init__.py +0 -0
  40. frogml_cli/commands/audience/list/logic.py +16 -0
  41. frogml_cli/commands/audience/list/ui.py +26 -0
  42. frogml_cli/commands/audience/update/__init__.py +0 -0
  43. frogml_cli/commands/audience/update/logic.py +37 -0
  44. frogml_cli/commands/audience/update/ui.py +26 -0
  45. frogml_cli/commands/auto_scalling/__init__.py +0 -0
  46. frogml_cli/commands/auto_scalling/_logic/__init__.py +0 -0
  47. frogml_cli/commands/auto_scalling/_logic/config/__init__.py +3 -0
  48. frogml_cli/commands/auto_scalling/_logic/config/config.py +152 -0
  49. frogml_cli/commands/auto_scalling/_logic/config/parser.py +21 -0
  50. frogml_cli/commands/auto_scalling/attach/__init__.py +0 -0
  51. frogml_cli/commands/auto_scalling/attach/_logic.py +43 -0
  52. frogml_cli/commands/auto_scalling/attach/ui.py +21 -0
  53. frogml_cli/commands/auto_scalling/autoscaling_commands_group.py +15 -0
  54. frogml_cli/commands/automations/__init__.py +0 -0
  55. frogml_cli/commands/automations/automations_commands_group.py +30 -0
  56. frogml_cli/commands/automations/delete/__init__.py +0 -0
  57. frogml_cli/commands/automations/delete/_logic.py +6 -0
  58. frogml_cli/commands/automations/delete/ui.py +23 -0
  59. frogml_cli/commands/automations/executions/__init__.py +0 -0
  60. frogml_cli/commands/automations/executions/executions_commands_group.py +14 -0
  61. frogml_cli/commands/automations/executions/list/__init__.py +0 -0
  62. frogml_cli/commands/automations/executions/list/_logic.py +8 -0
  63. frogml_cli/commands/automations/executions/list/ui.py +27 -0
  64. frogml_cli/commands/automations/list/__init__.py +0 -0
  65. frogml_cli/commands/automations/list/_logic.py +36 -0
  66. frogml_cli/commands/automations/list/ui.py +21 -0
  67. frogml_cli/commands/automations/register/__init__.py +0 -0
  68. frogml_cli/commands/automations/register/_logic.py +43 -0
  69. frogml_cli/commands/automations/register/ui.py +44 -0
  70. frogml_cli/commands/config/__init__.py +0 -0
  71. frogml_cli/commands/config/add/__init__.py +0 -0
  72. frogml_cli/commands/config/add/ui.py +62 -0
  73. frogml_cli/commands/config/config_commands_group.py +11 -0
  74. frogml_cli/commands/feature_store/__init__.py +0 -0
  75. frogml_cli/commands/feature_store/backfill/__init__.py +0 -0
  76. frogml_cli/commands/feature_store/backfill/_logic.py +140 -0
  77. frogml_cli/commands/feature_store/backfill/ui.py +129 -0
  78. frogml_cli/commands/feature_store/delete/__init__.py +0 -0
  79. frogml_cli/commands/feature_store/delete/_logic.py +107 -0
  80. frogml_cli/commands/feature_store/delete/ui.py +40 -0
  81. frogml_cli/commands/feature_store/execution/__init__.py +0 -0
  82. frogml_cli/commands/feature_store/execution/ui.py +19 -0
  83. frogml_cli/commands/feature_store/feature_store_command_group.py +29 -0
  84. frogml_cli/commands/feature_store/list/__init__.py +0 -0
  85. frogml_cli/commands/feature_store/list/ui.py +140 -0
  86. frogml_cli/commands/feature_store/pause/__init__.py +0 -0
  87. frogml_cli/commands/feature_store/pause/ui.py +18 -0
  88. frogml_cli/commands/feature_store/register/__init__.py +0 -0
  89. frogml_cli/commands/feature_store/register/_logic.py +369 -0
  90. frogml_cli/commands/feature_store/register/ui.py +111 -0
  91. frogml_cli/commands/feature_store/resume/__init__.py +0 -0
  92. frogml_cli/commands/feature_store/resume/ui.py +18 -0
  93. frogml_cli/commands/feature_store/trigger/__init__.py +0 -0
  94. frogml_cli/commands/feature_store/trigger/ui.py +39 -0
  95. frogml_cli/commands/models/__init__.py +0 -0
  96. frogml_cli/commands/models/build/__init__.py +0 -0
  97. frogml_cli/commands/models/build/_logic/__init__.py +0 -0
  98. frogml_cli/commands/models/build/_logic/build_steps.py +42 -0
  99. frogml_cli/commands/models/build/_logic/client_logs/__init__.py +0 -0
  100. frogml_cli/commands/models/build/_logic/client_logs/cli_phase_run_handler.py +123 -0
  101. frogml_cli/commands/models/build/_logic/client_logs/cli_trigger_build_logger.py +19 -0
  102. frogml_cli/commands/models/build/_logic/client_logs/logger.py +88 -0
  103. frogml_cli/commands/models/build/_logic/client_logs/messages.py +36 -0
  104. frogml_cli/commands/models/build/_logic/client_logs/spinner.py +14 -0
  105. frogml_cli/commands/models/build/_logic/client_logs/trigger_build_logger.py +54 -0
  106. frogml_cli/commands/models/build/_logic/client_logs/utils.py +12 -0
  107. frogml_cli/commands/models/build/_logic/phase/__init__.py +0 -0
  108. frogml_cli/commands/models/build/_logic/phase/a_fetch_model_code/__init__.py +20 -0
  109. frogml_cli/commands/models/build/_logic/phase/a_fetch_model_code/get_sdk_version_step.py +15 -0
  110. frogml_cli/commands/models/build/_logic/phase/b_remote_register_frogml_build/__init__.py +16 -0
  111. frogml_cli/commands/models/build/_logic/phase/c_deploy/__init__.py +6 -0
  112. frogml_cli/commands/models/build/_logic/phase/c_deploy/build_polling_status.py +55 -0
  113. frogml_cli/commands/models/build/_logic/phase/c_deploy/deploy_build.py +61 -0
  114. frogml_cli/commands/models/build/_logic/util/__init__.py +0 -0
  115. frogml_cli/commands/models/build/_logic/util/protobuf_factory.py +45 -0
  116. frogml_cli/commands/models/build/_logic/util/step_decorator.py +60 -0
  117. frogml_cli/commands/models/build/_logic/util/text.py +9 -0
  118. frogml_cli/commands/models/build/_logic/wait_until_finished.py +27 -0
  119. frogml_cli/commands/models/build/ui.py +337 -0
  120. frogml_cli/commands/models/builds/__init__.py +0 -0
  121. frogml_cli/commands/models/builds/builds_commands_group.py +16 -0
  122. frogml_cli/commands/models/builds/cancel/__init__.py +0 -0
  123. frogml_cli/commands/models/builds/cancel/_logic.py +5 -0
  124. frogml_cli/commands/models/builds/cancel/ui.py +15 -0
  125. frogml_cli/commands/models/builds/logs/__init__.py +0 -0
  126. frogml_cli/commands/models/builds/logs/ui.py +35 -0
  127. frogml_cli/commands/models/builds/status/__init__.py +0 -0
  128. frogml_cli/commands/models/builds/status/_logic.py +6 -0
  129. frogml_cli/commands/models/builds/status/ui.py +39 -0
  130. frogml_cli/commands/models/create/__init__.py +0 -0
  131. frogml_cli/commands/models/create/_logic.py +40 -0
  132. frogml_cli/commands/models/create/ui.py +46 -0
  133. frogml_cli/commands/models/delete/__init__.py +0 -0
  134. frogml_cli/commands/models/delete/_logic.py +18 -0
  135. frogml_cli/commands/models/delete/ui.py +25 -0
  136. frogml_cli/commands/models/deployments/__init__.py +0 -0
  137. frogml_cli/commands/models/deployments/deploy/__init__.py +0 -0
  138. frogml_cli/commands/models/deployments/deploy/_logic/__init__.py +0 -0
  139. frogml_cli/commands/models/deployments/deploy/_logic/advance_deployment_options_handler.py +31 -0
  140. frogml_cli/commands/models/deployments/deploy/_logic/base_deploy_executor.py +70 -0
  141. frogml_cli/commands/models/deployments/deploy/_logic/deploy_config.py +261 -0
  142. frogml_cli/commands/models/deployments/deploy/_logic/deployment.py +407 -0
  143. frogml_cli/commands/models/deployments/deploy/_logic/deployment_message_helpers.py +116 -0
  144. frogml_cli/commands/models/deployments/deploy/_logic/deployment_response_handler.py +156 -0
  145. frogml_cli/commands/models/deployments/deploy/_logic/deployment_size_mapper.py +98 -0
  146. frogml_cli/commands/models/deployments/deploy/_logic/get_latest_successful_build.py +28 -0
  147. frogml_cli/commands/models/deployments/deploy/_logic/local_deployment.py +193 -0
  148. frogml_cli/commands/models/deployments/deploy/batch/__init__.py +0 -0
  149. frogml_cli/commands/models/deployments/deploy/batch/_logic/__init__.py +0 -0
  150. frogml_cli/commands/models/deployments/deploy/batch/_logic/advanced_deployment_mapper.py +15 -0
  151. frogml_cli/commands/models/deployments/deploy/batch/_logic/deploy_executor.py +24 -0
  152. frogml_cli/commands/models/deployments/deploy/batch/ui.py +119 -0
  153. frogml_cli/commands/models/deployments/deploy/deploy_commands_group.py +19 -0
  154. frogml_cli/commands/models/deployments/deploy/realtime/__init__.py +0 -0
  155. frogml_cli/commands/models/deployments/deploy/realtime/_logic/__init__.py +0 -0
  156. frogml_cli/commands/models/deployments/deploy/realtime/_logic/advanced_deployment_mapper.py +21 -0
  157. frogml_cli/commands/models/deployments/deploy/realtime/_logic/deploy_executor.py +24 -0
  158. frogml_cli/commands/models/deployments/deploy/realtime/_logic/serving_strategy_mapper.py +75 -0
  159. frogml_cli/commands/models/deployments/deploy/realtime/ui.py +202 -0
  160. frogml_cli/commands/models/deployments/deploy/streaming/__init__.py +0 -0
  161. frogml_cli/commands/models/deployments/deploy/streaming/_logic/__init__.py +0 -0
  162. frogml_cli/commands/models/deployments/deploy/streaming/_logic/deploy_executor.py +24 -0
  163. frogml_cli/commands/models/deployments/deploy/streaming/_logic/serving_strategy_mapper.py +38 -0
  164. frogml_cli/commands/models/deployments/deploy/streaming/ui.py +206 -0
  165. frogml_cli/commands/models/deployments/undeploy/__init__.py +0 -0
  166. frogml_cli/commands/models/deployments/undeploy/_logic/__init__.py +0 -0
  167. frogml_cli/commands/models/deployments/undeploy/_logic/request_undeploy.py +249 -0
  168. frogml_cli/commands/models/deployments/undeploy/ui.py +61 -0
  169. frogml_cli/commands/models/describe/__init__.py +0 -0
  170. frogml_cli/commands/models/describe/_logic.py +169 -0
  171. frogml_cli/commands/models/describe/ui.py +35 -0
  172. frogml_cli/commands/models/executions/__init__.py +0 -0
  173. frogml_cli/commands/models/executions/cancel/__init__.py +0 -0
  174. frogml_cli/commands/models/executions/cancel/_logic.py +9 -0
  175. frogml_cli/commands/models/executions/cancel/ui.py +27 -0
  176. frogml_cli/commands/models/executions/execution_commands_group.py +24 -0
  177. frogml_cli/commands/models/executions/report/__init__.py +0 -0
  178. frogml_cli/commands/models/executions/report/_logic.py +14 -0
  179. frogml_cli/commands/models/executions/report/ui.py +43 -0
  180. frogml_cli/commands/models/executions/start/__init__.py +0 -0
  181. frogml_cli/commands/models/executions/start/_logic.py +83 -0
  182. frogml_cli/commands/models/executions/start/ui.py +208 -0
  183. frogml_cli/commands/models/executions/status/__init__.py +0 -0
  184. frogml_cli/commands/models/executions/status/_logic.py +13 -0
  185. frogml_cli/commands/models/executions/status/ui.py +27 -0
  186. frogml_cli/commands/models/init/__init__.py +0 -0
  187. frogml_cli/commands/models/init/_logic/__init__.py +0 -0
  188. frogml_cli/commands/models/init/_logic/initialize_model_structure.py +40 -0
  189. frogml_cli/commands/models/init/_logic/template/__init__.py +0 -0
  190. frogml_cli/commands/models/init/_logic/template/churn/__init__.py +0 -0
  191. frogml_cli/commands/models/init/_logic/template/churn/cookiecutter.json +3 -0
  192. frogml_cli/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/__init__.py +0 -0
  193. frogml_cli/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/main/__init__.py +5 -0
  194. frogml_cli/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/main/conda.yml +10 -0
  195. frogml_cli/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/main/data.csv +1001 -0
  196. frogml_cli/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/main/model.py +99 -0
  197. frogml_cli/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/tests/__init__.py +0 -0
  198. frogml_cli/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/tests/it/__init__.py +0 -0
  199. frogml_cli/commands/models/init/_logic/template/churn/{{cookiecutter.model_directory}}/tests/it/test_churn.py +32 -0
  200. frogml_cli/commands/models/init/_logic/template/credit_risk/__init__.py +0 -0
  201. frogml_cli/commands/models/init/_logic/template/credit_risk/cookiecutter.json +3 -0
  202. frogml_cli/commands/models/init/_logic/template/credit_risk/{{cookiecutter.model_directory}}/__init__.py +0 -0
  203. frogml_cli/commands/models/init/_logic/template/credit_risk/{{cookiecutter.model_directory}}/main/__init__.py +5 -0
  204. frogml_cli/commands/models/init/_logic/template/credit_risk/{{cookiecutter.model_directory}}/main/conda.yml +11 -0
  205. frogml_cli/commands/models/init/_logic/template/credit_risk/{{cookiecutter.model_directory}}/main/data.csv +1001 -0
  206. frogml_cli/commands/models/init/_logic/template/credit_risk/{{cookiecutter.model_directory}}/main/model.py +108 -0
  207. frogml_cli/commands/models/init/_logic/template/general/__init__.py +0 -0
  208. frogml_cli/commands/models/init/_logic/template/general/cookiecutter.json +6 -0
  209. frogml_cli/commands/models/init/_logic/template/general/{{cookiecutter.model_directory}}/__init__.py +0 -0
  210. frogml_cli/commands/models/init/_logic/template/general/{{cookiecutter.model_directory}}/{{cookiecutter.main_directory}}/__init__.py +5 -0
  211. frogml_cli/commands/models/init/_logic/template/general/{{cookiecutter.model_directory}}/{{cookiecutter.main_directory}}/conda.yml +8 -0
  212. frogml_cli/commands/models/init/_logic/template/general/{{cookiecutter.model_directory}}/{{cookiecutter.main_directory}}/model.py +66 -0
  213. frogml_cli/commands/models/init/_logic/template/general/{{cookiecutter.model_directory}}/{{cookiecutter.test_directory}}/__init__.py +0 -0
  214. frogml_cli/commands/models/init/_logic/template/general/{{cookiecutter.model_directory}}/{{cookiecutter.test_directory}}/test_qwak_model.py +5 -0
  215. frogml_cli/commands/models/init/_logic/template/titanic/__init__.py +0 -0
  216. frogml_cli/commands/models/init/_logic/template/titanic/cookiecutter.json +3 -0
  217. frogml_cli/commands/models/init/_logic/template/titanic/{{cookiecutter.model_directory}}/__init__.py +0 -0
  218. frogml_cli/commands/models/init/_logic/template/titanic/{{cookiecutter.model_directory}}/main/__init__.py +5 -0
  219. frogml_cli/commands/models/init/_logic/template/titanic/{{cookiecutter.model_directory}}/main/conda.yml +11 -0
  220. frogml_cli/commands/models/init/_logic/template/titanic/{{cookiecutter.model_directory}}/main/model.py +98 -0
  221. frogml_cli/commands/models/init/_logic/template/titanic/{{cookiecutter.model_directory}}/tests/__init__.py +0 -0
  222. frogml_cli/commands/models/init/_logic/template/titanic/{{cookiecutter.model_directory}}/tests/it/__init__.py +0 -0
  223. frogml_cli/commands/models/init/_logic/template/titanic/{{cookiecutter.model_directory}}/tests/it/test_titanic.py +24 -0
  224. frogml_cli/commands/models/init/_logic/template/titanic_poetry/__init__.py +0 -0
  225. frogml_cli/commands/models/init/_logic/template/titanic_poetry/cookiecutter.json +3 -0
  226. frogml_cli/commands/models/init/_logic/template/titanic_poetry/{{cookiecutter.model_directory}}/__init__.py +0 -0
  227. frogml_cli/commands/models/init/_logic/template/titanic_poetry/{{cookiecutter.model_directory}}/main/__init__.py +5 -0
  228. frogml_cli/commands/models/init/_logic/template/titanic_poetry/{{cookiecutter.model_directory}}/main/model.py +98 -0
  229. frogml_cli/commands/models/init/_logic/template/titanic_poetry/{{cookiecutter.model_directory}}/main/pyproject.toml +20 -0
  230. frogml_cli/commands/models/init/_logic/template/titanic_poetry/{{cookiecutter.model_directory}}/tests/__init__.py +0 -0
  231. frogml_cli/commands/models/init/_logic/template/titanic_poetry/{{cookiecutter.model_directory}}/tests/it/__init__.py +0 -0
  232. frogml_cli/commands/models/init/_logic/template/titanic_poetry/{{cookiecutter.model_directory}}/tests/it/test_titanic.py +25 -0
  233. frogml_cli/commands/models/init/ui.py +61 -0
  234. frogml_cli/commands/models/list/__init__.py +0 -0
  235. frogml_cli/commands/models/list/_logic.py +5 -0
  236. frogml_cli/commands/models/list/ui.py +41 -0
  237. frogml_cli/commands/models/list_models/__init__.py +0 -0
  238. frogml_cli/commands/models/list_models/_logic.py +11 -0
  239. frogml_cli/commands/models/list_models/ui.py +60 -0
  240. frogml_cli/commands/models/metadata/__init__.py +0 -0
  241. frogml_cli/commands/models/metadata/_logic.py +12 -0
  242. frogml_cli/commands/models/metadata/ui.py +60 -0
  243. frogml_cli/commands/models/models_command_group.py +44 -0
  244. frogml_cli/commands/models/runtime/__init__.py +0 -0
  245. frogml_cli/commands/models/runtime/logs/__init__.py +0 -0
  246. frogml_cli/commands/models/runtime/logs/ui.py +63 -0
  247. frogml_cli/commands/models/runtime/runtime_commands_group.py +17 -0
  248. frogml_cli/commands/models/runtime/update/__init__.py +0 -0
  249. frogml_cli/commands/models/runtime/update/_logic.py +9 -0
  250. frogml_cli/commands/models/runtime/update/ui.py +17 -0
  251. frogml_cli/commands/secrets/__init__.py +0 -0
  252. frogml_cli/commands/secrets/delete/__init__.py +0 -0
  253. frogml_cli/commands/secrets/delete/_logic.py +5 -0
  254. frogml_cli/commands/secrets/delete/ui.py +21 -0
  255. frogml_cli/commands/secrets/get/__init__.py +0 -0
  256. frogml_cli/commands/secrets/get/_logic.py +5 -0
  257. frogml_cli/commands/secrets/get/ui.py +17 -0
  258. frogml_cli/commands/secrets/secrets_commands_group.py +19 -0
  259. frogml_cli/commands/secrets/set/__init__.py +0 -0
  260. frogml_cli/commands/secrets/set/_logic.py +5 -0
  261. frogml_cli/commands/secrets/set/ui.py +16 -0
  262. frogml_cli/commands/ui_tools.py +18 -0
  263. frogml_cli/exceptions/__init__.py +14 -0
  264. frogml_cli/exceptions/frogml_command_exception.py +2 -0
  265. frogml_cli/exceptions/frogml_deploy_new_build_failed.py +5 -0
  266. frogml_cli/exceptions/frogml_resource_not_found.py +2 -0
  267. frogml_cli/inner/__init__.py +0 -0
  268. frogml_cli/inner/file_registry.py +98 -0
  269. frogml_cli/inner/tools/__init__.py +0 -0
  270. frogml_cli/inner/tools/cli_tools.py +179 -0
  271. frogml_cli/inner/tools/config_handler.py +29 -0
  272. frogml_cli/inner/tools/dataclasses_utils.py +21 -0
  273. frogml_cli/inner/tools/logger/__init__.py +3 -0
  274. frogml_cli/inner/tools/logger/logger.py +278 -0
  275. frogml_cli/inner/tools/logger/logging.yml +79 -0
  276. frogml_cli/inner/tools/tracking.py +47 -0
  277. frogml_cli/main.py +9 -0
  278. frogml_cli/tools/__init__.py +0 -0
  279. frogml_cli/tools/colors.py +13 -0
  280. frogml_cli/tools/const.py +3 -0
  281. frogml_cli/tools/files.py +63 -0
  282. frogml_cli/tools/log_handling.py +159 -0
  283. frogml_cli/tools/utils.py +45 -0
  284. frogml_cli-0.0.1.dist-info/METADATA +51 -0
  285. frogml_cli-0.0.1.dist-info/RECORD +287 -0
  286. frogml_cli-0.0.1.dist-info/WHEEL +4 -0
  287. frogml_cli-0.0.1.dist-info/entry_points.txt +3 -0
@@ -0,0 +1,108 @@
1
+ import os
2
+
3
+ import frogml
4
+ import numpy as np
5
+ import pandas as pd
6
+ from catboost import CatBoostClassifier, Pool, cv
7
+ from frogml import FrogMlModel
8
+ from frogml.sdk.model.schema import ExplicitFeature, InferenceOutput, ModelSchema
9
+ from sklearn.model_selection import train_test_split
10
+
11
+ RUNNING_FILE_ABSOLUTE_PATH = os.path.dirname(os.path.abspath(__file__))
12
+
13
+
14
+ class CreditRisk(FrogMlModel):
15
+ """The Model class inherit FrogMlModel base class"""
16
+
17
+ def __init__(self):
18
+ self.params = {
19
+ "iterations": int(os.getenv("iterations", 1000)),
20
+ "learning_rate": float(os.getenv("learning_rate", 0.1)),
21
+ "eval_metric": "Accuracy",
22
+ "random_seed": int(os.getenv("random_seed", 7)),
23
+ "logging_level": "Silent",
24
+ "loss_function": os.getenv("loss_fn", "Logloss"),
25
+ "use_best_model": True,
26
+ }
27
+ self.model = CatBoostClassifier(**self.params)
28
+
29
+ frogml.log_param(self.params)
30
+
31
+ def build(self):
32
+ df_credit = pd.read_csv(f"{RUNNING_FILE_ABSOLUTE_PATH}/data.csv", index_col=0)
33
+
34
+ # Creating an categorical variable to handle with the Age variable
35
+ interval = (18, 25, 35, 60, 120)
36
+ cats = ["Student", "Young", "Adult", "Senior"]
37
+ df_credit["Age_cat"] = pd.cut(df_credit.Age, interval, labels=cats).astype(
38
+ object
39
+ )
40
+
41
+ df_credit["Saving accounts"] = df_credit["Saving accounts"].fillna("no_inf")
42
+ df_credit["Checking account"] = df_credit["Checking account"].fillna("no_inf")
43
+
44
+ df_credit = df_credit.merge(
45
+ pd.get_dummies(df_credit.Risk, prefix="Risk"),
46
+ left_index=True,
47
+ right_index=True,
48
+ )
49
+
50
+ # Excluding the missing columns
51
+ del df_credit["Risk"]
52
+ del df_credit["Risk_good"]
53
+
54
+ df_credit["Credit amount"] = np.log(df_credit["Credit amount"])
55
+
56
+ # Creating the X and y variables
57
+ X = df_credit.drop(["Risk_bad"], axis=1)
58
+ y = df_credit["Risk_bad"]
59
+ categorical_features_indices = np.where(X.dtypes == object)[0]
60
+
61
+ # Spliting X and y into train and test version
62
+ X_train, X_test, y_train, y_test = train_test_split(
63
+ X, y, test_size=0.25, random_state=self.params["random_seed"]
64
+ )
65
+ self.model.fit(
66
+ X_train,
67
+ y_train,
68
+ cat_features=categorical_features_indices,
69
+ eval_set=(X_test, y_test),
70
+ )
71
+
72
+ # Cross validating the model (5-fold)
73
+ cv_data = cv(
74
+ Pool(X_train, y_train, cat_features=categorical_features_indices),
75
+ self.model.get_params(),
76
+ fold_count=5,
77
+ )
78
+ print(
79
+ "the best cross validation accuracy is :{}".format(
80
+ np.max(cv_data["test-Accuracy-mean"])
81
+ )
82
+ )
83
+ frogml.log_metric({"val_accuracy": np.max(cv_data["test-Accuracy-mean"])})
84
+
85
+ def schema(self):
86
+ return ModelSchema(
87
+ inputs=[
88
+ ExplicitFeature(name="UserId", type=str),
89
+ ExplicitFeature(name="Age", type=int),
90
+ ExplicitFeature(name="Sex", type=str),
91
+ ExplicitFeature(name="Job", type=int),
92
+ ExplicitFeature(name="Housing", type=str),
93
+ ExplicitFeature(name="Saving accounts", type=str),
94
+ ExplicitFeature(name="Checking account", type=str),
95
+ ExplicitFeature(name="Credit amount", type=float),
96
+ ExplicitFeature(name="Duration", type=int),
97
+ ExplicitFeature(name="Purpose", type=str),
98
+ ExplicitFeature(name="Age_cat", type=str),
99
+ ],
100
+ outputs=[InferenceOutput(name="Default_Probability", type=float)],
101
+ )
102
+
103
+ @frogml.api()
104
+ def predict(self, df: pd.DataFrame) -> pd.DataFrame:
105
+ df = df.drop(["UserId"], axis=1)
106
+ return pd.DataFrame(
107
+ self.model.predict_proba(df[self.model.feature_names_])[:, 1], columns=["Default_Probability"]
108
+ )
@@ -0,0 +1,6 @@
1
+ {
2
+ "model_directory": "model",
3
+ "main_directory": "main",
4
+ "test_directory": "tests",
5
+ "model_class_name": "modelPrediction"
6
+ }
@@ -0,0 +1,5 @@
1
+ from .model import {{cookiecutter.model_class_name}}
2
+
3
+
4
+ def load_model():
5
+ return {{cookiecutter.model_class_name}}()
@@ -0,0 +1,8 @@
1
+ name: {{cookiecutter.model_class_name}}
2
+ channels:
3
+ - defaults
4
+ - conda-forge
5
+ dependencies:
6
+ - python=3.8
7
+ - pip=22.2.2
8
+ - pandas=1.1.5
@@ -0,0 +1,66 @@
1
+ import frogml
2
+ import pandas as pd
3
+ from frogml import FrogMlModel
4
+
5
+
6
+ class {{cookiecutter.model_class_name}}(FrogMlModel):
7
+ """ The Model class inherit FrogMlModel base class
8
+ """
9
+
10
+ def __init__(self):
11
+ pass
12
+
13
+ def build(self):
14
+ """ Responsible for loading the model. This method is invoked during build time (frogml build command)
15
+
16
+ Example:
17
+ >>> def build(self):
18
+ >>> ...
19
+ >>> train_pool = Pool(X_train, y_train, cat_features=categorical_features_indices)
20
+ >>> validate_pool = Pool(X_validation, y_validation, cat_features=categorical_features_indices)
21
+ >>> self.catboost.fit(train_pool, eval_set=validate_pool)
22
+ """
23
+ pass
24
+
25
+ def schema(self):
26
+ """ Specification of the model inputs and outputs. Optional method
27
+
28
+ Example:
29
+ >>> from frogml.sdk.model.schema import ModelSchema, InferenceOutput, ExplicitFeature
30
+ >>>
31
+ >>> def schema(self) -> ModelSchema:
32
+ >>> model_schema = ModelSchema(
33
+ >>> inputs=[
34
+ >>> ExplicitFeature(name="State", type=str),
35
+ >>> ],
36
+ >>> outputs=[
37
+ >>> InferenceOutput(name="score", type=float)
38
+ >>> ])
39
+ >>> return model_schema
40
+
41
+ Returns: a model schema specification
42
+ """
43
+ pass
44
+
45
+ def initialize_model(self):
46
+ """
47
+ Invoked when a model is loaded at serving time. Called once per model instance initialization. Can be used for
48
+ loading and storing values that should only be available in a serving setting or loading pretrained models. Optional method
49
+
50
+ Example usage:
51
+
52
+ >>> def initialize_model(self):
53
+ >>> with open('model.pkl', 'rb') as infile:
54
+ >>> self.model = pickle.load(infile)
55
+ """
56
+ pass
57
+
58
+ @frogml.api()
59
+ def predict(self, df: pd.DataFrame) -> pd.DataFrame:
60
+ """ Invoked on every API inference request.
61
+ Args:
62
+ pd (DataFrame): the inference vector, as a pandas dataframe
63
+
64
+ Returns: model output (inference results), as a pandas dataframe
65
+ """
66
+ pass
@@ -0,0 +1,5 @@
1
+ def test_model():
2
+ """
3
+ Skeleton for a test that will run as part of the build process
4
+ """
5
+ assert True
@@ -0,0 +1,3 @@
1
+ {
2
+ "model_directory": "titanic_survival_classification"
3
+ }
@@ -0,0 +1,5 @@
1
+ from .model import TitanicSurvivalPrediction
2
+
3
+
4
+ def load_model():
5
+ return TitanicSurvivalPrediction()
@@ -0,0 +1,11 @@
1
+ name: titanic-survival-classification
2
+ channels:
3
+ - defaults
4
+ - conda-forge
5
+ dependencies:
6
+ - python=3.9
7
+ - pip=22.2.2
8
+ - pandas=1.1.5
9
+ - scikit-learn=0.24.1
10
+ - catboost=0.26.1
11
+ - numpy=1.24.0
@@ -0,0 +1,98 @@
1
+ import os
2
+
3
+ import frogml
4
+ import numpy as np
5
+ import pandas as pd
6
+ from catboost import CatBoostClassifier, Pool, cv
7
+ from catboost.datasets import titanic
8
+ from frogml import FrogMlModel
9
+ from frogml.sdk.model.schema import ExplicitFeature, InferenceOutput, ModelSchema
10
+ from sklearn.model_selection import train_test_split
11
+
12
+
13
+ class TitanicSurvivalPrediction(FrogMlModel):
14
+ def __init__(self):
15
+ loss_function = os.getenv("loss_fn", "Logloss")
16
+ learning_rate = os.getenv("learning_rate", None)
17
+ if learning_rate:
18
+ learning_rate = int(learning_rate)
19
+ iterations = int(os.getenv("iterations", 1000))
20
+
21
+ custom_loss = "Accuracy"
22
+ self.model = CatBoostClassifier(
23
+ iterations=iterations,
24
+ custom_loss=[custom_loss],
25
+ loss_function=loss_function,
26
+ learning_rate=learning_rate,
27
+ )
28
+
29
+ frogml.log_param(
30
+ {
31
+ "loss_function": loss_function,
32
+ "learning_rate": learning_rate,
33
+ "iterations": iterations,
34
+ "custom_loss": custom_loss,
35
+ }
36
+ )
37
+
38
+ def build(self):
39
+ titanic_train, _ = titanic()
40
+
41
+ # for the train data ,the age ,fare and embarked has null value,so just make it -999 for it
42
+ # and the catboost will distinguish it
43
+ titanic_train.fillna(-999, inplace=True)
44
+
45
+ x = titanic_train.drop(["Survived", "PassengerId"], axis=1)
46
+ y = titanic_train.Survived
47
+
48
+ x_train, x_test, y_train, y_test = train_test_split(
49
+ x, y, train_size=0.85, random_state=42
50
+ )
51
+
52
+ # mark categorical features
53
+ cate_features_index = np.where(x_train.dtypes != float)[0]
54
+
55
+ self.model.fit(
56
+ x_train,
57
+ y_train,
58
+ cat_features=cate_features_index,
59
+ eval_set=(x_test, y_test),
60
+ )
61
+
62
+ # Cross validating the model (5-fold)
63
+ cv_data = cv(
64
+ Pool(x, y, cat_features=cate_features_index),
65
+ self.model.get_params(),
66
+ fold_count=5,
67
+ )
68
+ print(
69
+ "the best cross validation accuracy is :{}".format(
70
+ np.max(cv_data["test-Accuracy-mean"])
71
+ )
72
+ )
73
+ frogml.log_metric({"val_accuracy": np.max(cv_data["test-Accuracy-mean"])})
74
+
75
+ def schema(self):
76
+ return ModelSchema(
77
+ inputs=[
78
+ ExplicitFeature(name="PassengerId", type=int),
79
+ ExplicitFeature(name="Pclass", type=int),
80
+ ExplicitFeature(name="Name", type=str),
81
+ ExplicitFeature(name="Sex", type=str),
82
+ ExplicitFeature(name="Age", type=int),
83
+ ExplicitFeature(name="SibSp", type=int),
84
+ ExplicitFeature(name="Parch", type=int),
85
+ ExplicitFeature(name="Ticket", type=str),
86
+ ExplicitFeature(name="Fare", type=float),
87
+ ExplicitFeature(name="Cabin", type=str),
88
+ ExplicitFeature(name="Embarked", type=str),
89
+ ],
90
+ outputs=[InferenceOutput(name="Survived_Probability", type=float)],
91
+ )
92
+
93
+ @frogml.api()
94
+ def predict(self, df: pd.DataFrame) -> pd.DataFrame:
95
+ df = df.drop(["PassengerId"], axis=1)
96
+ return pd.DataFrame(
97
+ self.model.predict_proba(df)[:, 1], columns=["Survived_Probability"]
98
+ )
@@ -0,0 +1,24 @@
1
+ import pandas as pd
2
+ from frogml.core.testing.fixtures import real_time_client
3
+ from frogml_inference.realtime_client.client import InferenceOutputFormat
4
+
5
+
6
+ def test_realtime_api(real_time_client):
7
+ feature_vector = [
8
+ {
9
+ "PassengerId": 762,
10
+ "Pclass": 3,
11
+ "Name": "Nirva, Mr. Iisakki Antino Aijo ",
12
+ "Sex": "female",
13
+ "Age": 34,
14
+ "SibSp": 4,
15
+ "Parch": 3,
16
+ "Ticket": "a",
17
+ "Fare": 1.0,
18
+ "Cabin": "A",
19
+ "Embarked": "A",
20
+ }
21
+ ]
22
+
23
+ survived_probability: pd.DataFrame = real_time_client.predict(feature_vector, output_format=InferenceOutputFormat.PANDAS)
24
+ assert survived_probability["Survived_Probability"].values[0] > 0
@@ -0,0 +1,3 @@
1
+ {
2
+ "model_directory": "titanic_poetry_survival_classification"
3
+ }
@@ -0,0 +1,5 @@
1
+ from .model import TitanicSurvivalPrediction
2
+
3
+
4
+ def load_model():
5
+ return TitanicSurvivalPrediction()
@@ -0,0 +1,98 @@
1
+ import os
2
+
3
+ import frogml
4
+ import numpy as np
5
+ import pandas as pd
6
+ from catboost import CatBoostClassifier, Pool, cv
7
+ from catboost.datasets import titanic
8
+ from frogml import FrogMlModel
9
+ from frogml.sdk.model.schema import ExplicitFeature, InferenceOutput, ModelSchema
10
+ from sklearn.model_selection import train_test_split
11
+
12
+
13
+ class TitanicSurvivalPrediction(FrogMlModel):
14
+ def __init__(self):
15
+ loss_function = os.getenv("loss_fn", "Logloss")
16
+ learning_rate = os.getenv("learning_rate", None)
17
+ if learning_rate:
18
+ learning_rate = int(learning_rate)
19
+ iterations = int(os.getenv("iterations", 1000))
20
+
21
+ custom_loss = "Accuracy"
22
+ self.model = CatBoostClassifier(
23
+ iterations=iterations,
24
+ custom_loss=[custom_loss],
25
+ loss_function=loss_function,
26
+ learning_rate=learning_rate,
27
+ )
28
+
29
+ frogml.log_param(
30
+ {
31
+ "loss_function": loss_function,
32
+ "learning_rate": learning_rate,
33
+ "iterations": iterations,
34
+ "custom_loss": custom_loss,
35
+ }
36
+ )
37
+
38
+ def build(self):
39
+ titanic_train, _ = titanic()
40
+
41
+ # for the train data ,the age ,fare and embarked has null value,so just make it -999 for it
42
+ # and the catboost will distinguish it
43
+ titanic_train.fillna(-999, inplace=True)
44
+
45
+ x = titanic_train.drop(["Survived", "PassengerId"], axis=1)
46
+ y = titanic_train.Survived
47
+
48
+ x_train, x_test, y_train, y_test = train_test_split(
49
+ x, y, train_size=0.85, random_state=42
50
+ )
51
+
52
+ # mark categorical features
53
+ cate_features_index = np.where(x_train.dtypes != float)[0]
54
+
55
+ self.model.fit(
56
+ x_train,
57
+ y_train,
58
+ cat_features=cate_features_index,
59
+ eval_set=(x_test, y_test),
60
+ )
61
+
62
+ # Cross validating the model (5-fold)
63
+ cv_data = cv(
64
+ Pool(x, y, cat_features=cate_features_index),
65
+ self.model.get_params(),
66
+ fold_count=5,
67
+ )
68
+ print(
69
+ "the best cross validation accuracy is :{}".format(
70
+ np.max(cv_data["test-Accuracy-mean"])
71
+ )
72
+ )
73
+ frogml.log_metric({"val_accuracy": np.max(cv_data["test-Accuracy-mean"])})
74
+
75
+ def schema(self):
76
+ return ModelSchema(
77
+ inputs=[
78
+ ExplicitFeature(name="PassengerId", type=int),
79
+ ExplicitFeature(name="Pclass", type=int),
80
+ ExplicitFeature(name="Name", type=str),
81
+ ExplicitFeature(name="Sex", type=str),
82
+ ExplicitFeature(name="Age", type=int),
83
+ ExplicitFeature(name="SibSp", type=int),
84
+ ExplicitFeature(name="Parch", type=int),
85
+ ExplicitFeature(name="Ticket", type=str),
86
+ ExplicitFeature(name="Fare", type=float),
87
+ ExplicitFeature(name="Cabin", type=str),
88
+ ExplicitFeature(name="Embarked", type=str),
89
+ ],
90
+ outputs=[InferenceOutput(name="Survived_Probability", type=float)],
91
+ )
92
+
93
+ @frogml.api()
94
+ def predict(self, df: pd.DataFrame) -> pd.DataFrame:
95
+ df = df.drop(["PassengerId"], axis=1)
96
+ return pd.DataFrame(
97
+ self.model.predict_proba(df)[:, 1], columns=["Survived_Probability"]
98
+ )
@@ -0,0 +1,20 @@
1
+ [tool.poetry]
2
+ name = "titanic-poetry-survival-classification"
3
+ version = "0.1.0"
4
+ description = "A model to perdict whether a person survived the titanic crash or not."
5
+ authors = ["JFrog Ltd. <contact@jfrog.com>"]
6
+
7
+ [tool.poetry.dependencies]
8
+ python = "^3.9"
9
+
10
+ [tool.poetry.dev-dependencies]
11
+ pip = "22.2.2"
12
+ pandas = "1.1.5"
13
+ scikit-learn = "0.24.1"
14
+ catboost = "0.26.1"
15
+ numpy = "1.23.5"
16
+ setuptools = "70.0.0"
17
+
18
+ [build-system]
19
+ requires = ["poetry-core>=1.0.0"]
20
+ build-backend = "poetry.core.masonry.api"
@@ -0,0 +1,25 @@
1
+ import pandas as pd
2
+ from frogml.core.testing.fixtures import real_time_client
3
+ from frogml_inference.realtime_client.client import InferenceOutputFormat
4
+
5
+
6
+ def test_realtime_api(real_time_client):
7
+ feature_vector = [
8
+ {
9
+ "PassengerId": 762,
10
+ "Pclass": 3,
11
+ "Name": "Nirva, Mr. Iisakki Antino Aijo ",
12
+ "Sex": "female",
13
+ "Age": 34,
14
+ "SibSp": 4,
15
+ "Parch": 3,
16
+ "Ticket": "a",
17
+ "Fare": 1.0,
18
+ "Cabin": "A",
19
+ "Embarked": "A",
20
+ }
21
+ ]
22
+
23
+ survived_probability: pd.DataFrame = real_time_client.predict(feature_vector, output_format=InferenceOutputFormat.PANDAS)
24
+
25
+ assert survived_probability["Survived_Probability"].values[0] > 0
@@ -0,0 +1,61 @@
1
+ import click
2
+ from frogml.core.tools.logger.logger import get_frogml_logger
3
+
4
+ from frogml_cli.commands.models.init._logic.initialize_model_structure import (
5
+ initialize_model_structure,
6
+ )
7
+ from frogml_cli.inner.tools.cli_tools import FrogMLCommand
8
+
9
+ logger = get_frogml_logger()
10
+
11
+
12
+ @click.command("init", cls=FrogMLCommand)
13
+ @click.option(
14
+ "--model-directory", metavar="NAME", required=False, help="folder for model content"
15
+ )
16
+ @click.option(
17
+ "--model-class-name",
18
+ metavar="NAME",
19
+ required=False,
20
+ help="class name of created model",
21
+ )
22
+ @click.option(
23
+ "--example",
24
+ metavar="NAME",
25
+ required=False,
26
+ type=click.Choice(
27
+ ["titanic", "credit_risk", "churn", "titanic_poetry"], case_sensitive=True
28
+ ),
29
+ help="""Generate a fully functioning example of a Qwak based model. Options: titanic / credit_risk / churn""",
30
+ )
31
+ @click.argument("uri", metavar="URI", required=True)
32
+ def model_init(
33
+ uri: str, model_directory: str, model_class_name: str, example: str, **kwargs
34
+ ):
35
+ if example:
36
+ if model_directory or model_class_name:
37
+ logger.warning("--example flag detected. Other options will be overridden.")
38
+
39
+ template = example
40
+ template_args = {}
41
+
42
+ else:
43
+ if model_directory is None:
44
+ model_directory = click.prompt(
45
+ "Please enter the model directory name", type=str
46
+ )
47
+ if model_class_name is None:
48
+ model_class_name = click.prompt(
49
+ "Please enter the model class name", type=str
50
+ )
51
+
52
+ template = "general"
53
+ template_args = {
54
+ "model_class_name": model_class_name,
55
+ "model_directory": model_directory,
56
+ }
57
+ try:
58
+ initialize_model_structure(uri, template, logger, **template_args)
59
+ except Exception as e:
60
+ logger.error(f"Failed to initialize a Qwak model structure. Error reason:\n{e}")
61
+ exit(1)
File without changes
@@ -0,0 +1,5 @@
1
+ from frogml.core.clients.project.client import ProjectsManagementClient
2
+
3
+
4
+ def execute_models_list(project_key: str):
5
+ return ProjectsManagementClient().get_project(project_name=project_key)
@@ -0,0 +1,41 @@
1
+ from datetime import datetime
2
+
3
+ import click
4
+ from frogml._proto.qwak.projects.projects_pb2 import GetProjectResponse
5
+
6
+ from frogml_cli.commands.models.list._logic import execute_models_list
7
+ from frogml_cli.commands.ui_tools import output_as_json, output_as_table
8
+ from frogml_cli.inner.tools.cli_tools import FrogMLCommand
9
+
10
+
11
+ def parse_model(model):
12
+ return [
13
+ model.model_id,
14
+ model.display_name,
15
+ datetime.fromtimestamp(
16
+ model.created_at.seconds + model.created_at.nanos / 1e9
17
+ ).strftime("%A, %B %d, %Y %I:%M:%S"),
18
+ datetime.fromtimestamp(
19
+ model.last_modified_at.seconds + model.last_modified_at.nanos / 1e9
20
+ ).strftime("%A, %B %d, %Y %I:%M:%S"),
21
+ ]
22
+
23
+
24
+ @click.command("list", cls=FrogMLCommand)
25
+ @click.option("--project-key", metavar="NAME", required=True, help="JFrog project key")
26
+ @click.option(
27
+ "--format",
28
+ default="text",
29
+ show_default=True,
30
+ type=click.Choice(["text", "json"], case_sensitive=True),
31
+ metavar="FORMAT",
32
+ required=False,
33
+ help="The formatting style for commands output (choose from text, json)",
34
+ )
35
+ def model_list(project_key: str, format, **kwargs):
36
+ model_list_result: GetProjectResponse = execute_models_list(project_key)
37
+ columns = ["Model id", "Display name", "Creation date", "Last updated"]
38
+ if format == "json":
39
+ output_as_json(model_list_result)
40
+ elif format == "text":
41
+ output_as_table(model_list_result.project.models, parse_model, headers=columns)
File without changes
@@ -0,0 +1,11 @@
1
+ from frogml._proto.qwak.projects.projects_pb2 import GetProjectResponse
2
+ from frogml.core.clients.model_management.client import ModelsManagementClient
3
+ from frogml.core.clients.project.client import ProjectsManagementClient
4
+
5
+
6
+ def list_models(project_key: str):
7
+ project_response: GetProjectResponse = ProjectsManagementClient().get_project(
8
+ project_name=project_key
9
+ )
10
+ project_id: str = project_response.project.spec.project_id
11
+ return ModelsManagementClient().list_models(project_id)