ob-metaflow-extensions 1.4.33__py2.py3-none-any.whl → 1.6.2__py2.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 (38) hide show
  1. metaflow_extensions/outerbounds/plugins/__init__.py +8 -1
  2. metaflow_extensions/outerbounds/plugins/apps/core/__init__.py +8 -2
  3. metaflow_extensions/outerbounds/plugins/apps/core/_state_machine.py +6 -6
  4. metaflow_extensions/outerbounds/plugins/apps/core/app_config.py +1 -19
  5. metaflow_extensions/outerbounds/plugins/apps/core/app_deploy_decorator.py +333 -0
  6. metaflow_extensions/outerbounds/plugins/apps/core/capsule.py +150 -79
  7. metaflow_extensions/outerbounds/plugins/apps/core/config/__init__.py +4 -1
  8. metaflow_extensions/outerbounds/plugins/apps/core/config/cli_generator.py +4 -0
  9. metaflow_extensions/outerbounds/plugins/apps/core/config/config_utils.py +103 -5
  10. metaflow_extensions/outerbounds/plugins/apps/core/config/schema_export.py +12 -1
  11. metaflow_extensions/outerbounds/plugins/apps/core/config/typed_configs.py +100 -6
  12. metaflow_extensions/outerbounds/plugins/apps/core/config/typed_init_generator.py +141 -2
  13. metaflow_extensions/outerbounds/plugins/apps/core/config/unified_config.py +74 -37
  14. metaflow_extensions/outerbounds/plugins/apps/core/config_schema.yaml +6 -6
  15. metaflow_extensions/outerbounds/plugins/apps/core/dependencies.py +2 -2
  16. metaflow_extensions/outerbounds/plugins/apps/core/deployer.py +1102 -105
  17. metaflow_extensions/outerbounds/plugins/apps/core/exceptions.py +341 -0
  18. metaflow_extensions/outerbounds/plugins/apps/core/perimeters.py +42 -6
  19. metaflow_extensions/outerbounds/plugins/aws/assume_role_decorator.py +43 -3
  20. metaflow_extensions/outerbounds/plugins/fast_bakery/baker.py +10 -1
  21. metaflow_extensions/outerbounds/plugins/optuna/__init__.py +2 -1
  22. metaflow_extensions/outerbounds/plugins/snowflake/snowflake.py +37 -7
  23. metaflow_extensions/outerbounds/plugins/snowpark/snowpark.py +18 -8
  24. metaflow_extensions/outerbounds/plugins/snowpark/snowpark_cli.py +6 -0
  25. metaflow_extensions/outerbounds/plugins/snowpark/snowpark_client.py +39 -15
  26. metaflow_extensions/outerbounds/plugins/snowpark/snowpark_decorator.py +5 -2
  27. metaflow_extensions/outerbounds/plugins/snowpark/snowpark_job.py +2 -2
  28. metaflow_extensions/outerbounds/remote_config.py +20 -7
  29. metaflow_extensions/outerbounds/toplevel/apps/__init__.py +9 -0
  30. metaflow_extensions/outerbounds/toplevel/apps/exceptions.py +11 -0
  31. metaflow_extensions/outerbounds/toplevel/global_aliases_for_metaflow_package.py +1 -1
  32. metaflow_extensions/outerbounds/toplevel/ob_internal.py +1 -1
  33. {ob_metaflow_extensions-1.4.33.dist-info → ob_metaflow_extensions-1.6.2.dist-info}/METADATA +2 -2
  34. {ob_metaflow_extensions-1.4.33.dist-info → ob_metaflow_extensions-1.6.2.dist-info}/RECORD +36 -34
  35. metaflow_extensions/outerbounds/plugins/apps/app_deploy_decorator.py +0 -146
  36. metaflow_extensions/outerbounds/plugins/apps/core/app_cli.py +0 -1200
  37. {ob_metaflow_extensions-1.4.33.dist-info → ob_metaflow_extensions-1.6.2.dist-info}/WHEEL +0 -0
  38. {ob_metaflow_extensions-1.4.33.dist-info → ob_metaflow_extensions-1.6.2.dist-info}/top_level.txt +0 -0
@@ -15,6 +15,7 @@ from typing import Any, Dict, List, Optional, Union, Type
15
15
  import re
16
16
 
17
17
  from .config_utils import (
18
+ ConfigFieldContext,
18
19
  ConfigField,
19
20
  ConfigMeta,
20
21
  JsonFriendlyKeyValuePairType,
@@ -32,12 +33,38 @@ from .config_utils import (
32
33
  commit_owner_names_across_tree,
33
34
  )
34
35
 
36
+ from collections import namedtuple
37
+
38
+
39
+ # Result of image baking operation
40
+ # - image: The fully qualified Docker image URL
41
+ # - python_path: Path to the Python executable in the baked image
42
+ BakedImage = namedtuple("BakedImage", ["image", "python_path"])
43
+
44
+ # Result of code packaging operation
45
+ # - url: The package URL in object storage
46
+ # - key: Unique content-addressed key identifying this package
47
+ PackagedCode = namedtuple("PackagedCode", ["url", "key"])
48
+
49
+
50
+ class classproperty(property):
51
+ def __get__(self, owner_self, owner_cls):
52
+ return self.fget(owner_cls)
53
+
35
54
 
36
55
  class AuthType:
37
56
  BROWSER = "Browser"
38
57
  API = "API"
39
58
  BROWSER_AND_API = "BrowserAndApi"
40
59
 
60
+ @classmethod
61
+ def enums(cls):
62
+ return [cls.BROWSER, cls.API, cls.BROWSER_AND_API]
63
+
64
+ @classproperty
65
+ def default(cls):
66
+ return cls.BROWSER
67
+
41
68
  @classmethod
42
69
  def choices(cls):
43
70
  return [cls.BROWSER, cls.API, cls.BROWSER_AND_API]
@@ -180,9 +207,9 @@ class ResourceConfig(metaclass=ConfigMeta):
180
207
  cli_meta=CLIOption(
181
208
  name="cpu",
182
209
  cli_option_str="--cpu",
183
- help="CPU resource request and limit.",
184
210
  ),
185
211
  field_type=str,
212
+ help="CPU requests",
186
213
  example="500m",
187
214
  validation_fn=UnitParser.validation_wrapper_fn("cpu"),
188
215
  parsing_fn=UnitParser("cpu").parse,
@@ -192,9 +219,9 @@ class ResourceConfig(metaclass=ConfigMeta):
192
219
  cli_meta=CLIOption(
193
220
  name="memory",
194
221
  cli_option_str="--memory",
195
- help="Memory resource request and limit.",
196
222
  ),
197
223
  field_type=str,
224
+ help="Memory requests",
198
225
  example="512Mi",
199
226
  validation_fn=UnitParser.validation_wrapper_fn("memory"),
200
227
  parsing_fn=UnitParser("memory").parse,
@@ -203,9 +230,9 @@ class ResourceConfig(metaclass=ConfigMeta):
203
230
  cli_meta=CLIOption(
204
231
  name="gpu",
205
232
  cli_option_str="--gpu",
206
- help="GPU resource request and limit.",
207
233
  ),
208
234
  field_type=str,
235
+ help="GPU requests",
209
236
  example="1",
210
237
  validation_fn=UnitParser.validation_wrapper_fn("gpu"),
211
238
  parsing_fn=UnitParser("gpu").parse,
@@ -215,9 +242,9 @@ class ResourceConfig(metaclass=ConfigMeta):
215
242
  cli_meta=CLIOption(
216
243
  name="disk",
217
244
  cli_option_str="--disk",
218
- help="Storage resource request and limit.",
219
245
  ),
220
246
  field_type=str,
247
+ help="Storage disk size.",
221
248
  example="1Gi",
222
249
  validation_fn=UnitParser.validation_wrapper_fn("disk"),
223
250
  parsing_fn=UnitParser("disk").parse,
@@ -227,9 +254,9 @@ class ResourceConfig(metaclass=ConfigMeta):
227
254
  cli_meta=CLIOption(
228
255
  name="shared_memory",
229
256
  cli_option_str="--shared-memory",
230
- help="Shared memory resource request and limit.",
231
257
  ),
232
258
  field_type=str,
259
+ help="Shared memory",
233
260
  example="1Gi",
234
261
  validation_fn=UnitParser.validation_wrapper_fn("memory"),
235
262
  parsing_fn=UnitParser("memory").parse,
@@ -244,37 +271,37 @@ class HealthCheckConfig(metaclass=ConfigMeta):
244
271
  cli_meta=CLIOption(
245
272
  name="health_check_enabled",
246
273
  cli_option_str="--health-check-enabled",
247
- help="Whether to enable health checks.",
248
274
  is_flag=True,
249
275
  ),
250
276
  field_type=bool,
277
+ help="Whether to enable health checks.",
251
278
  example=True,
252
279
  )
253
280
  path = ConfigField(
254
281
  cli_meta=CLIOption(
255
282
  name="health_check_path",
256
283
  cli_option_str="--health-check-path",
257
- help="The path for health checks.",
258
284
  ),
259
285
  field_type=str,
286
+ help="The path for health checks.",
260
287
  example="/health",
261
288
  )
262
289
  initial_delay_seconds = ConfigField(
263
290
  cli_meta=CLIOption(
264
291
  name="health_check_initial_delay",
265
292
  cli_option_str="--health-check-initial-delay",
266
- help="Number of seconds to wait before performing the first health check.",
267
293
  ),
268
294
  field_type=int,
295
+ help="Number of seconds to wait before performing the first health check.",
269
296
  example=10,
270
297
  )
271
298
  period_seconds = ConfigField(
272
299
  cli_meta=CLIOption(
273
300
  name="health_check_period",
274
301
  cli_option_str="--health-check-period",
275
- help="How often to perform the health check.",
276
302
  ),
277
303
  field_type=int,
304
+ help="How often to perform the health check.",
278
305
  example=30,
279
306
  )
280
307
 
@@ -287,10 +314,10 @@ class AuthConfig(metaclass=ConfigMeta):
287
314
  cli_meta=CLIOption(
288
315
  name="auth_type",
289
316
  cli_option_str="--auth-type",
290
- help="The type of authentication to use for the app.",
291
317
  choices=AuthType.choices(),
292
318
  ),
293
319
  field_type=str,
320
+ help="The type of authentication to use for the app.",
294
321
  example="Browser",
295
322
  )
296
323
  public = ConfigField(
@@ -298,10 +325,10 @@ class AuthConfig(metaclass=ConfigMeta):
298
325
  cli_meta=CLIOption(
299
326
  name="auth_public",
300
327
  cli_option_str="--public-access/--private-access",
301
- help="Whether the app is public or not.",
302
328
  is_flag=True,
303
329
  ),
304
330
  field_type=bool,
331
+ help="Whether the app is public or not.",
305
332
  example=True,
306
333
  )
307
334
 
@@ -323,15 +350,14 @@ class ScalingPolicyConfig(metaclass=ConfigMeta):
323
350
  # TODO Change the defaulting if we have more autoscaling policies.
324
351
  rpm = ConfigField(
325
352
  field_type=int,
326
- # TODO: Add a little more to the docstring where we explain the behavior.
327
353
  cli_meta=CLIOption(
328
354
  name="scaling_rpm",
329
355
  cli_option_str="--scaling-rpm",
330
- help=(
331
- "Scale up replicas when the requests per minute crosses this threshold. "
332
- "If nothing is provided and the replicas.max and replicas.min is set then "
333
- "the default rpm would be 60."
334
- ),
356
+ ),
357
+ help=(
358
+ "Scale up replicas when the requests per minute crosses this threshold. "
359
+ "If nothing is provided and the replicas.max and replicas.min is set then "
360
+ "the default rpm would be 60."
335
361
  ),
336
362
  default=60,
337
363
  )
@@ -344,9 +370,9 @@ class ReplicaConfig(metaclass=ConfigMeta):
344
370
  cli_meta=CLIOption(
345
371
  name="fixed_replicas",
346
372
  cli_option_str="--fixed-replicas",
347
- help="The fixed number of replicas to deploy the app with. If min and max are set, this will raise an error.",
348
373
  ),
349
374
  field_type=int,
375
+ help="The fixed number of replicas to deploy the app with. If min and max are set, this will raise an error.",
350
376
  example=1,
351
377
  )
352
378
 
@@ -354,18 +380,18 @@ class ReplicaConfig(metaclass=ConfigMeta):
354
380
  cli_meta=CLIOption(
355
381
  name="min_replicas",
356
382
  cli_option_str="--min-replicas",
357
- help="The minimum number of replicas to deploy the app with.",
358
383
  ),
359
384
  field_type=int,
385
+ help="The minimum number of replicas to deploy the app with.",
360
386
  example=1,
361
387
  )
362
388
  max = ConfigField(
363
389
  cli_meta=CLIOption(
364
390
  name="max_replicas",
365
391
  cli_option_str="--max-replicas",
366
- help="The maximum number of replicas to deploy the app with.",
367
392
  ),
368
393
  field_type=int,
394
+ help="The maximum number of replicas to deploy the app with.",
369
395
  example=10,
370
396
  )
371
397
 
@@ -470,9 +496,9 @@ class DependencyConfig(metaclass=ConfigMeta):
470
496
  cli_meta=CLIOption(
471
497
  name="dep_from_requirements",
472
498
  cli_option_str="--dep-from-requirements",
473
- help="The path to the requirements.txt file to attach to the app.",
474
499
  ),
475
500
  field_type=str,
501
+ help="The path to the requirements.txt file to attach to the app.",
476
502
  behavior=FieldBehavior.NOT_ALLOWED,
477
503
  example="requirements.txt",
478
504
  )
@@ -480,9 +506,9 @@ class DependencyConfig(metaclass=ConfigMeta):
480
506
  cli_meta=CLIOption(
481
507
  name="dep_from_pyproject",
482
508
  cli_option_str="--dep-from-pyproject",
483
- help="The path to the pyproject.toml file to attach to the app.",
484
509
  ),
485
510
  field_type=str,
511
+ help="The path to the pyproject.toml file to attach to the app.",
486
512
  behavior=FieldBehavior.NOT_ALLOWED,
487
513
  example="pyproject.toml",
488
514
  )
@@ -490,9 +516,9 @@ class DependencyConfig(metaclass=ConfigMeta):
490
516
  cli_meta=CLIOption(
491
517
  name="python",
492
518
  cli_option_str="--python",
493
- help="The Python version to use for the app.",
494
519
  ),
495
520
  field_type=str,
521
+ help="The Python version to use for the app.",
496
522
  behavior=FieldBehavior.UNION,
497
523
  example="3.10",
498
524
  )
@@ -500,10 +526,10 @@ class DependencyConfig(metaclass=ConfigMeta):
500
526
  cli_meta=CLIOption(
501
527
  name="pypi", # TODO: Can set CLI meta to None
502
528
  cli_option_str="--pypi",
503
- help="A dictionary of pypi dependencies to attach to the app. The key is the package name and the value is the version.",
504
529
  hidden=True, # Complex structure, better handled in config file
505
530
  ),
506
531
  field_type=dict,
532
+ help="A dictionary of pypi dependencies to attach to the app. The key is the package name and the value is the version.",
507
533
  behavior=FieldBehavior.NOT_ALLOWED,
508
534
  example={"numpy": "1.23.0", "pandas": ""},
509
535
  )
@@ -511,10 +537,10 @@ class DependencyConfig(metaclass=ConfigMeta):
511
537
  cli_meta=CLIOption( # TODO: Can set CLI meta to None
512
538
  name="conda",
513
539
  cli_option_str="--conda",
514
- help="A dictionary of conda dependencies to attach to the app. The key is the package name and the value is the version.",
515
540
  hidden=True, # Complex structure, better handled in config file
516
541
  ),
517
542
  field_type=dict,
543
+ help="A dictionary of conda dependencies to attach to the app. The key is the package name and the value is the version.",
518
544
  behavior=FieldBehavior.NOT_ALLOWED,
519
545
  example={"numpy": "1.23.0", "pandas": ""},
520
546
  )
@@ -559,19 +585,19 @@ class PackageConfig(metaclass=ConfigMeta):
559
585
  name="package_src_path",
560
586
  cli_option_str="--package-src-path",
561
587
  multiple=True,
562
- help="The path to the source code to deploy with the App.",
563
588
  click_type=str,
564
589
  ),
565
590
  field_type=list,
591
+ help="The path to the source code to deploy with the App.",
566
592
  example=["./"],
567
593
  )
568
594
  suffixes = ConfigField(
569
595
  cli_meta=CLIOption(
570
596
  name="package_suffixes",
571
597
  cli_option_str="--package-suffixes",
572
- help="A list of suffixes to add to the source code to deploy with the App.",
573
598
  ),
574
599
  field_type=list,
600
+ help="A list of suffixes to add to the source code to deploy with the App.",
575
601
  example=[".py", ".ipynb"],
576
602
  )
577
603
 
@@ -609,7 +635,7 @@ class BasicAppValidations:
609
635
  return True
610
636
  regex = r"^[a-z0-9-]+$" # Only allow lowercase letters, numbers, and hyphens
611
637
  validator = BasicValidations(CoreConfig, "name")
612
- return validator.length_validation(15, name) and validator.regex_validation(
638
+ return validator.length_validation(150, name) and validator.regex_validation(
613
639
  regex, name
614
640
  )
615
641
 
@@ -778,27 +804,27 @@ How to read this schema:
778
804
  cli_meta=CLIOption(
779
805
  name="description",
780
806
  cli_option_str="--description",
781
- help="The description of the app to deploy.",
782
807
  ),
783
808
  field_type=str,
809
+ help="The description of the app to deploy.",
784
810
  example="This is a description of my app.",
785
811
  )
786
812
  app_type = ConfigField(
787
813
  cli_meta=CLIOption(
788
814
  name="app_type",
789
815
  cli_option_str="--app-type",
790
- help="The User defined type of app to deploy. Its only used for bookkeeping purposes.",
791
816
  ),
792
817
  field_type=str,
818
+ help="The User defined type of app to deploy. Its only used for bookkeeping purposes.",
793
819
  example="MyCustomAgent",
794
820
  )
795
821
  image = ConfigField(
796
822
  cli_meta=CLIOption(
797
823
  name="image",
798
824
  cli_option_str="--image",
799
- help="The Docker image to deploy with the App.",
800
825
  ),
801
826
  field_type=str,
827
+ help="The Docker image to deploy with the App.",
802
828
  example="python:3.10-slim",
803
829
  )
804
830
 
@@ -828,11 +854,11 @@ How to read this schema:
828
854
  cli_meta=CLIOption(
829
855
  name="compute_pools",
830
856
  cli_option_str="--compute-pools",
831
- help="A list of compute pools to deploy the app to.",
832
857
  multiple=True,
833
858
  click_type=str,
834
859
  ),
835
860
  field_type=list,
861
+ help="A list of compute pools to deploy the app to.",
836
862
  example=["default", "large"],
837
863
  )
838
864
  environment = ConfigField(
@@ -883,6 +909,7 @@ How to read this schema:
883
909
  cli_meta=None, # No top-level CLI option, only nested fields have CLI options
884
910
  validation_fn=DependencyConfig.validate,
885
911
  field_type=DependencyConfig,
912
+ available_in=ConfigFieldContext.CLI,
886
913
  help="The dependencies to attach to the app. ",
887
914
  )
888
915
  package = ConfigField(
@@ -890,6 +917,16 @@ How to read this schema:
890
917
  field_type=PackageConfig,
891
918
  help="Configurations associated with packaging the app.",
892
919
  validation_fn=PackageConfig.validate,
920
+ available_in=ConfigFieldContext.CLI,
921
+ )
922
+
923
+ # Programmatic-only field for pre-packaged code
924
+ code_package = ConfigField(
925
+ cli_meta=None,
926
+ field_type=tuple, # PackagedCode is a namedtuple (tuple subclass)
927
+ strict_types=False, # Accept PackagedCode namedtuple from package_code()
928
+ available_in=ConfigFieldContext.PROGRAMMATIC,
929
+ help="Pre-packaged code from package_code(). A PackagedCode namedtuple containing url and key.",
893
930
  )
894
931
 
895
932
  no_deps = ConfigField(
@@ -899,6 +936,7 @@ How to read this schema:
899
936
  help="Do not any dependencies. Directly used the image provided",
900
937
  is_flag=True,
901
938
  ),
939
+ available_in=ConfigFieldContext.CLI,
902
940
  field_type=bool,
903
941
  default=False,
904
942
  help="Do not bake any dependencies. Directly used the image provided",
@@ -925,11 +963,11 @@ How to read this schema:
925
963
  cli_meta=CLIOption(
926
964
  name="persistence",
927
965
  cli_option_str="--persistence",
928
- help="The persistence mode to deploy the app with.",
929
966
  choices=["none", "postgres"],
930
967
  ),
931
968
  validation_fn=BasicAppValidations.persistence,
932
969
  field_type=str,
970
+ help="The persistence mode to deploy the app with.",
933
971
  default="none",
934
972
  example="postgres",
935
973
  is_experimental=True,
@@ -939,9 +977,9 @@ How to read this schema:
939
977
  cli_meta=CLIOption(
940
978
  name="project",
941
979
  cli_option_str="--project",
942
- help="The project name to deploy the app to.",
943
980
  ),
944
981
  field_type=str,
982
+ help="The project name to deploy the app to.",
945
983
  is_experimental=True,
946
984
  example="my-project",
947
985
  )
@@ -949,9 +987,9 @@ How to read this schema:
949
987
  cli_meta=CLIOption(
950
988
  name="branch",
951
989
  cli_option_str="--branch",
952
- help="The branch name to deploy the app to.",
953
990
  ),
954
991
  field_type=str,
992
+ help="The branch name to deploy the app to.",
955
993
  is_experimental=True,
956
994
  example="main",
957
995
  )
@@ -971,12 +1009,11 @@ How to read this schema:
971
1009
  cli_meta=CLIOption(
972
1010
  name="generate_static_url",
973
1011
  cli_option_str="--generate-static-url",
974
- help="Generate a static URL for the app based on its name.",
975
1012
  is_flag=True,
976
1013
  ),
977
1014
  field_type=bool,
978
- default=False,
979
1015
  help="Generate a static URL for the app based on its name.",
1016
+ default=False,
980
1017
  )
981
1018
  # ------- /Experimental -------------
982
1019
 
@@ -103,34 +103,34 @@ properties:
103
103
  required: []
104
104
  properties:
105
105
  cpu:
106
- description: CPU resource request and limit. (validation applied)
106
+ description: CPU requests (validation applied)
107
107
  type: string
108
108
  default: '1'
109
109
  example: 500m
110
110
  mutation_behavior: union
111
111
  cli_option: --cpu
112
112
  memory:
113
- description: Memory resource request and limit. (validation applied)
113
+ description: Memory requests (validation applied)
114
114
  type: string
115
115
  default: 4Gi
116
116
  example: 512Mi
117
117
  mutation_behavior: union
118
118
  cli_option: --memory
119
119
  gpu:
120
- description: GPU resource request and limit. (validation applied)
120
+ description: GPU requests (validation applied)
121
121
  type: string
122
122
  example: '1'
123
123
  mutation_behavior: union
124
124
  cli_option: --gpu
125
125
  disk:
126
- description: Storage resource request and limit. (validation applied)
126
+ description: Storage disk size. (validation applied)
127
127
  type: string
128
128
  default: 20Gi
129
129
  example: 1Gi
130
130
  mutation_behavior: union
131
131
  cli_option: --disk
132
132
  shared_memory:
133
- description: Shared memory resource request and limit. (validation applied)
133
+ description: Shared memory (validation applied)
134
134
  type: string
135
135
  example: 1Gi
136
136
  mutation_behavior: union
@@ -196,7 +196,7 @@ properties:
196
196
  properties:
197
197
  rpm:
198
198
  description: |-
199
- Scale up replicas when the requests per minute crosses this threshold. If nothing is provided and the replicas.max and replicas.min is set then the default rpm would be 60.
199
+ Scale up replicas when the requests per minute crosses this threshold. If nothing is provided and the replicas.max and replicas.min is set then the default rpm would be 60.
200
200
  type: integer
201
201
  default: 60
202
202
  mutation_behavior: union
@@ -43,7 +43,7 @@ def bake_deployment_image(
43
43
  # 1. When the user has specified something like `pypi`/`conda`
44
44
  # 2, When the user has specified something like `from_requirements`/ `from_pyproject`
45
45
  # TODO: add parsers for the pyproject/requirements stuff.
46
- from metaflow.ob_internal import bake_image # type: ignore
46
+ from metaflow.ob_internal import internal_bake_image # type: ignore
47
47
  from metaflow.plugins.pypi.parsers import (
48
48
  requirements_txt_parser,
49
49
  pyproject_toml_parser,
@@ -96,7 +96,7 @@ def bake_deployment_image(
96
96
  pypi_packages.update(pinned_conda_libs)
97
97
  _reference = app_config.get("name", "default")
98
98
  # `image` cannot be None. If by chance it is none, FB will fart.
99
- fb_response = bake_image(
99
+ fb_response = internal_bake_image(
100
100
  cache_file_path=cache_file_path,
101
101
  pypi_packages=pypi_packages,
102
102
  conda_packages=conda_packages,