modal 1.1.5.dev24__py3-none-any.whl → 1.1.5.dev26__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.

Potentially problematic release.


This version of modal might be problematic. Click here for more details.

modal/client.pyi CHANGED
@@ -33,7 +33,7 @@ class _Client:
33
33
  server_url: str,
34
34
  client_type: int,
35
35
  credentials: typing.Optional[tuple[str, str]],
36
- version: str = "1.1.5.dev24",
36
+ version: str = "1.1.5.dev26",
37
37
  ):
38
38
  """mdmd:hidden
39
39
  The Modal client object is not intended to be instantiated directly by users.
@@ -164,7 +164,7 @@ class Client:
164
164
  server_url: str,
165
165
  client_type: int,
166
166
  credentials: typing.Optional[tuple[str, str]],
167
- version: str = "1.1.5.dev24",
167
+ version: str = "1.1.5.dev26",
168
168
  ):
169
169
  """mdmd:hidden
170
170
  The Modal client object is not intended to be instantiated directly by users.
modal/functions.pyi CHANGED
@@ -449,7 +449,7 @@ class Function(
449
449
 
450
450
  _call_generator: ___call_generator_spec[typing_extensions.Self]
451
451
 
452
- class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
452
+ class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
453
453
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
454
454
  """Calls the function remotely, executing it with the given arguments and returning the execution's result."""
455
455
  ...
@@ -458,7 +458,7 @@ class Function(
458
458
  """Calls the function remotely, executing it with the given arguments and returning the execution's result."""
459
459
  ...
460
460
 
461
- remote: __remote_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
461
+ remote: __remote_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
462
462
 
463
463
  class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
464
464
  def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
@@ -485,7 +485,7 @@ class Function(
485
485
  """
486
486
  ...
487
487
 
488
- class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
488
+ class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
489
489
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
490
490
  """[Experimental] Calls the function with the given arguments, without waiting for the results.
491
491
 
@@ -509,7 +509,7 @@ class Function(
509
509
  ...
510
510
 
511
511
  _experimental_spawn: ___experimental_spawn_spec[
512
- modal._functions.ReturnType, modal._functions.P, typing_extensions.Self
512
+ modal._functions.P, modal._functions.ReturnType, typing_extensions.Self
513
513
  ]
514
514
 
515
515
  class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER, SUPERSELF]):
@@ -518,7 +518,7 @@ class Function(
518
518
 
519
519
  _spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P, typing_extensions.Self]
520
520
 
521
- class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
521
+ class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
522
522
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
523
523
  """Calls the function with the given arguments, without waiting for the results.
524
524
 
@@ -539,7 +539,7 @@ class Function(
539
539
  """
540
540
  ...
541
541
 
542
- spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
542
+ spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
543
543
 
544
544
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
545
545
  """Return the inner Python object wrapped by this Modal Function."""
modal/image.py CHANGED
@@ -868,6 +868,68 @@ class _Image(_Object, type_prefix="im"):
868
868
 
869
869
  return obj
870
870
 
871
+ async def build(self, app: "modal.app._App") -> "_Image":
872
+ """Eagerly build an image.
873
+
874
+ If your image was previously built, then this method will not rebuild your image
875
+ and your cached image is returned.
876
+
877
+ **Examples**
878
+
879
+ ```python
880
+ image = modal.Image.debian_slim().uv_pip_install("scipy", "numpy")
881
+
882
+ app = modal.App("build-image")
883
+ with modal.enable_output(), app.run():
884
+ image.build(app)
885
+
886
+ # Save the image id
887
+ my_image_id = image.object_id
888
+
889
+ # Reference the image with the id or uses it another context.
890
+ built_image = modal.Image.from_id(my_image_id)
891
+ ```
892
+
893
+ Alternatively, you can pre-build a image and use it in a sandbox.
894
+
895
+ ```python notest
896
+ app = modal.App.lookup("sandbox-example")
897
+
898
+ with modal.enable_output():
899
+ image = modal.Image.debian_slim().uv_pip_install("scipy")
900
+ image.build(app)
901
+
902
+ sb = modal.Sandbox.create("python", "-c", "import scipy; print(scipy)", app=app, image=image)
903
+ print(sb.stdout.read())
904
+ sb.terminate()
905
+ ```
906
+
907
+ **Note**
908
+
909
+ For defining Modal functions, images are built automatically when deploying or running an App.
910
+ You do not need to built the image explicitly:
911
+
912
+ ```python notest
913
+ app = modal.App()
914
+ image = modal.Image.debian_slim()
915
+
916
+ # No need to explicitly build the image for defining a function.
917
+ @app.function(image=image)
918
+ def f():
919
+ ...
920
+ ```
921
+
922
+ """
923
+ if app.app_id is None:
924
+ raise InvalidError("App has not been initialized yet. Use the content manager `app.run()` or `App.lookup`")
925
+
926
+ app_id = app.app_id
927
+ app_client = app._client or await _Client.from_env()
928
+
929
+ resolver = Resolver(app_client, app_id=app_id)
930
+ await resolver.load(self)
931
+ return self
932
+
871
933
  def pip_install(
872
934
  self,
873
935
  *packages: Union[str, list[str]], # A list of Python packages, eg. ["numpy", "matplotlib>=3.5.0"]
modal/image.pyi CHANGED
@@ -2,6 +2,7 @@ import collections.abc
2
2
  import google.protobuf.message
3
3
  import modal._functions
4
4
  import modal._object
5
+ import modal.app
5
6
  import modal.client
6
7
  import modal.cloud_bucket_mount
7
8
  import modal.functions
@@ -318,6 +319,59 @@ class _Image(modal._object._Object):
318
319
  """
319
320
  ...
320
321
 
322
+ async def build(self, app: modal.app._App) -> _Image:
323
+ """Eagerly build an image.
324
+
325
+ If your image was previously built, then this method will not rebuild your image
326
+ and your cached image is returned.
327
+
328
+ **Examples**
329
+
330
+ ```python
331
+ image = modal.Image.debian_slim().uv_pip_install("scipy", "numpy")
332
+
333
+ app = modal.App("build-image")
334
+ with modal.enable_output(), app.run():
335
+ image.build(app)
336
+
337
+ # Save the image id
338
+ my_image_id = image.object_id
339
+
340
+ # Reference the image with the id or uses it another context.
341
+ built_image = modal.Image.from_id(my_image_id)
342
+ ```
343
+
344
+ Alternatively, you can pre-build a image and use it in a sandbox.
345
+
346
+ ```python notest
347
+ app = modal.App.lookup("sandbox-example")
348
+
349
+ with modal.enable_output():
350
+ image = modal.Image.debian_slim().uv_pip_install("scipy")
351
+ image.build(app)
352
+
353
+ sb = modal.Sandbox.create("python", "-c", "import scipy; print(scipy)", app=app, image=image)
354
+ print(sb.stdout.read())
355
+ sb.terminate()
356
+ ```
357
+
358
+ **Note**
359
+
360
+ For defining Modal functions, images are built automatically when deploying or running an App.
361
+ You do not need to built the image explicitly:
362
+
363
+ ```python notest
364
+ app = modal.App()
365
+ image = modal.Image.debian_slim()
366
+
367
+ # No need to explicitly build the image for defining a function.
368
+ @app.function(image=image)
369
+ def f():
370
+ ...
371
+ ```
372
+ """
373
+ ...
374
+
321
375
  def pip_install(
322
376
  self,
323
377
  *packages: typing.Union[str, list[str]],
@@ -1182,6 +1236,115 @@ class Image(modal.object.Object):
1182
1236
 
1183
1237
  from_id: __from_id_spec
1184
1238
 
1239
+ class __build_spec(typing_extensions.Protocol[SUPERSELF]):
1240
+ def __call__(self, /, app: modal.app.App) -> Image:
1241
+ """Eagerly build an image.
1242
+
1243
+ If your image was previously built, then this method will not rebuild your image
1244
+ and your cached image is returned.
1245
+
1246
+ **Examples**
1247
+
1248
+ ```python
1249
+ image = modal.Image.debian_slim().uv_pip_install("scipy", "numpy")
1250
+
1251
+ app = modal.App("build-image")
1252
+ with modal.enable_output(), app.run():
1253
+ image.build(app)
1254
+
1255
+ # Save the image id
1256
+ my_image_id = image.object_id
1257
+
1258
+ # Reference the image with the id or uses it another context.
1259
+ built_image = modal.Image.from_id(my_image_id)
1260
+ ```
1261
+
1262
+ Alternatively, you can pre-build a image and use it in a sandbox.
1263
+
1264
+ ```python notest
1265
+ app = modal.App.lookup("sandbox-example")
1266
+
1267
+ with modal.enable_output():
1268
+ image = modal.Image.debian_slim().uv_pip_install("scipy")
1269
+ image.build(app)
1270
+
1271
+ sb = modal.Sandbox.create("python", "-c", "import scipy; print(scipy)", app=app, image=image)
1272
+ print(sb.stdout.read())
1273
+ sb.terminate()
1274
+ ```
1275
+
1276
+ **Note**
1277
+
1278
+ For defining Modal functions, images are built automatically when deploying or running an App.
1279
+ You do not need to built the image explicitly:
1280
+
1281
+ ```python notest
1282
+ app = modal.App()
1283
+ image = modal.Image.debian_slim()
1284
+
1285
+ # No need to explicitly build the image for defining a function.
1286
+ @app.function(image=image)
1287
+ def f():
1288
+ ...
1289
+ ```
1290
+ """
1291
+ ...
1292
+
1293
+ async def aio(self, /, app: modal.app.App) -> Image:
1294
+ """Eagerly build an image.
1295
+
1296
+ If your image was previously built, then this method will not rebuild your image
1297
+ and your cached image is returned.
1298
+
1299
+ **Examples**
1300
+
1301
+ ```python
1302
+ image = modal.Image.debian_slim().uv_pip_install("scipy", "numpy")
1303
+
1304
+ app = modal.App("build-image")
1305
+ with modal.enable_output(), app.run():
1306
+ image.build(app)
1307
+
1308
+ # Save the image id
1309
+ my_image_id = image.object_id
1310
+
1311
+ # Reference the image with the id or uses it another context.
1312
+ built_image = modal.Image.from_id(my_image_id)
1313
+ ```
1314
+
1315
+ Alternatively, you can pre-build a image and use it in a sandbox.
1316
+
1317
+ ```python notest
1318
+ app = modal.App.lookup("sandbox-example")
1319
+
1320
+ with modal.enable_output():
1321
+ image = modal.Image.debian_slim().uv_pip_install("scipy")
1322
+ image.build(app)
1323
+
1324
+ sb = modal.Sandbox.create("python", "-c", "import scipy; print(scipy)", app=app, image=image)
1325
+ print(sb.stdout.read())
1326
+ sb.terminate()
1327
+ ```
1328
+
1329
+ **Note**
1330
+
1331
+ For defining Modal functions, images are built automatically when deploying or running an App.
1332
+ You do not need to built the image explicitly:
1333
+
1334
+ ```python notest
1335
+ app = modal.App()
1336
+ image = modal.Image.debian_slim()
1337
+
1338
+ # No need to explicitly build the image for defining a function.
1339
+ @app.function(image=image)
1340
+ def f():
1341
+ ...
1342
+ ```
1343
+ """
1344
+ ...
1345
+
1346
+ build: __build_spec[typing_extensions.Self]
1347
+
1185
1348
  def pip_install(
1186
1349
  self,
1187
1350
  *packages: typing.Union[str, list[str]],
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.5.dev24
3
+ Version: 1.1.5.dev26
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -22,7 +22,7 @@ modal/app.py,sha256=OBFaL-8KVMtBMEmspHA76LvblPdnSgdoGioLkQBjhdQ,48851
22
22
  modal/app.pyi,sha256=Cqk3pOeEEroCLejj3yJ3XHDqt0rMzeSA295gMKEx6Ww,43955
23
23
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
24
24
  modal/client.py,sha256=kyAIVB3Ay-XKJizQ_1ufUFB__EagV0MLmHJpyYyJ7J0,18636
25
- modal/client.pyi,sha256=us36PiyarU0FrCAtcpfcLAMUCNlMDWGJOEm-Mbg5LiM,15831
25
+ modal/client.pyi,sha256=RvJVb1syBrkn8pRVX4T-AzyKXP_bCUaHg8Bt0r-648M,15831
26
26
  modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
27
27
  modal/cloud_bucket_mount.pyi,sha256=-qSfYAQvIoO_l2wsCCGTG5ZUwQieNKXdAO00yP1-LYU,7394
28
28
  modal/cls.py,sha256=qb9h_ZKiz2q7fwKQ-5bdkz1x3tdu6sIm-UI09aQjPPc,41101
@@ -39,10 +39,10 @@ modal/file_io.py,sha256=OSKr77TujcXGJW1iikzYiHckLSmv07QBgBHcxxYEkoI,21456
39
39
  modal/file_io.pyi,sha256=xtO6Glf_BFwDE7QiQQo24QqcMf_Vv-iz7WojcGVlLBU,15932
40
40
  modal/file_pattern_matcher.py,sha256=A_Kdkej6q7YQyhM_2-BvpFmPqJ0oHb54B6yf9VqvPVE,8116
41
41
  modal/functions.py,sha256=kcNHvqeGBxPI7Cgd57NIBBghkfbeFJzXO44WW0jSmao,325
42
- modal/functions.pyi,sha256=AKLl2WxKWcC3vDfhCJ2sbkj-JUMWnRkOcNywjy_wsHs,39558
42
+ modal/functions.pyi,sha256=_xKitEUTNQStdZVtYBgWidtyHHsnjXUYgbirM0eMDyM,39558
43
43
  modal/gpu.py,sha256=Fe5ORvVPDIstSq1xjmM6OoNgLYFWvogP9r5BgmD3hYg,6769
44
- modal/image.py,sha256=wlOJ4bQxFLx2PlIIAmqZnFxFeERbZJGLYYWO7wlIZso,105969
45
- modal/image.pyi,sha256=iFC8W6bl3KH_w15pm7B_UqeeGJZ44X7v20Ue_FlxPxw,71695
44
+ modal/image.py,sha256=ioYIpKq4Fi1ojqdIyochyoRU1_Ncto_BSYLKzY88zuw,107883
45
+ modal/image.pyi,sha256=ZNp48mVPzcQ6XNvxin1iO5XrZ89vfEZvU1Bi-V57jq0,76835
46
46
  modal/io_streams.py,sha256=hZOVc5beOAm8S_VQQmmKUbk_BJ9OltN83RY0yMPqUDo,16545
47
47
  modal/io_streams.pyi,sha256=aOun_jUFKHSJyUY6-7gKvNoxzcULsa8_hxdtEO7v-gk,13980
48
48
  modal/mount.py,sha256=3WpYaaCBGLyawW2uhQzB4jXRBQEsuuRMxnCFsXSa9_k,37470
@@ -153,7 +153,7 @@ modal/experimental/__init__.py,sha256=fCqzo_f3vcY750vHtd7CtLs5dvdM_C0ZLLGb3zXuK9
153
153
  modal/experimental/flash.py,sha256=7qRAL2Nrwbb60YKobcnpM0zJ8vw4xGJqabLPFgEzMZE,28295
154
154
  modal/experimental/flash.pyi,sha256=R9VV0UDotiY9BRUjacB-xI4qhR3yBymAvEZFRFHztLs,15143
155
155
  modal/experimental/ipython.py,sha256=TrCfmol9LGsRZMeDoeMPx3Hv3BFqQhYnmD_iH0pqdhk,2904
156
- modal-1.1.5.dev24.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
156
+ modal-1.1.5.dev26.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
157
157
  modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
158
158
  modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
159
159
  modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
@@ -161,10 +161,10 @@ modal_docs/mdmd/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,2
161
161
  modal_docs/mdmd/mdmd.py,sha256=tUTImNd4UMFk1opkaw8J672gX8AkBO5gbY2S_NMxsxs,7140
162
162
  modal_docs/mdmd/signatures.py,sha256=XJaZrK7Mdepk5fdX51A8uENiLFNil85Ud0d4MH8H5f0,3218
163
163
  modal_proto/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
164
- modal_proto/api.proto,sha256=Q2tUGx-aT0ggdXaEsfR0KDUDVP6Wa_6yFtUYckWYFNc,106322
164
+ modal_proto/api.proto,sha256=gHMg2m42_AWoz1cyLFtkIkuCZq1zZS1eD-G8-S7OtjM,107273
165
165
  modal_proto/api_grpc.py,sha256=aGfpsti-PnCuhHhvm-c8fSJyOkU4TWc8x8ydNkBrlec,130453
166
- modal_proto/api_pb2.py,sha256=YkI4l-H-ca-oSrWm0MCtbxW3ASCkhidyGXd4pDiPFQU,372439
167
- modal_proto/api_pb2.pyi,sha256=NxU7mpbogG1yXbLS_dbMLqgVihclDj1Vc6EStRHnC9E,512939
166
+ modal_proto/api_pb2.py,sha256=toZb4hKO6C-20AiXATPULVd2C5FjPWN3YB4-p_0fCWQ,374934
167
+ modal_proto/api_pb2.pyi,sha256=OshgJzsbZZ6SaxFv7AbTxYDr9PS14rzRbiSs3S7ucHA,516654
168
168
  modal_proto/api_pb2_grpc.py,sha256=6QxudogSTZsePhr-pgXB8gIQdr4mkQ9yDKAhBH0G8lQ,281250
169
169
  modal_proto/api_pb2_grpc.pyi,sha256=_jvw6GQVcGKDdxH0pLBDkIX3cQp9xaNYPSRoAq4McSg,65882
170
170
  modal_proto/modal_api_grpc.py,sha256=A2Lpntle2d4zsBSpCQ-oR839lUppW0npyGlxEoGYCuM,19679
@@ -176,10 +176,10 @@ modal_proto/options_pb2.pyi,sha256=l7DBrbLO7q3Ir-XDkWsajm0d0TQqqrfuX54i4BMpdQg,1
176
176
  modal_proto/options_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
177
177
  modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0yJSI,247
178
178
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
179
- modal_version/__init__.py,sha256=BRQ3z_a6RSG8-f9fEnDvMa3yRNG-JxSWmyy5uTbRnvQ,121
179
+ modal_version/__init__.py,sha256=tN2tq4JXmu-ndYTS3TbazzGc_8cfsd2YNHfHWji91Cw,121
180
180
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
181
- modal-1.1.5.dev24.dist-info/METADATA,sha256=abLubH9UXnekHrhffWoQzTIpKyOvq-h_Ix5EIfeYi7Y,2460
182
- modal-1.1.5.dev24.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
183
- modal-1.1.5.dev24.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
184
- modal-1.1.5.dev24.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
185
- modal-1.1.5.dev24.dist-info/RECORD,,
181
+ modal-1.1.5.dev26.dist-info/METADATA,sha256=dS8FpYbRaGbt0F_XpcnL_yu_YwQuu4IERz6x8v8Tuuk,2460
182
+ modal-1.1.5.dev26.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
183
+ modal-1.1.5.dev26.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
184
+ modal-1.1.5.dev26.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
185
+ modal-1.1.5.dev26.dist-info/RECORD,,
modal_proto/api.proto CHANGED
@@ -628,11 +628,26 @@ message AuthTokenGetResponse {
628
628
  string token = 1;
629
629
  }
630
630
 
631
+ // Message representing the current (coalesced) state of the autoscaler configuration
632
+ // As well as the different sources that were used to create it.
633
+ message AutoscalerConfiguration {
634
+ // The settings that are currently in effect.
635
+ AutoscalerSettings settings = 1;
636
+ // For tracking the source of the overridden value; keys correspond to fields in `settings`.
637
+ map<string, UserActionInfo> override_events = 2;
638
+ // The default settings that are used when no static settings are provided and no overrides are in effect.
639
+ AutoscalerSettings default_settings = 3;
640
+ // The static settings that were used to initialize the configuration.
641
+ AutoscalerSettings static_settings = 4;
642
+ // The merge of all overrides that were used to create the current configuration.
643
+ AutoscalerSettings override_settings = 5;
644
+ }
645
+
631
646
  message AutoscalerSettings {
632
647
  // A collection of user-configurable settings for Function autoscaling
633
648
  // These are used for static configuration and for dynamic autoscaler updates
634
649
 
635
- // Minimum containers when scale-to-zero is not deisired; pka "keep_warm" or "warm_pool_size"
650
+ // Minimum containers when scale-to-zero is not desired; pka "keep_warm" or "warm_pool_size"
636
651
  optional uint32 min_containers = 1;
637
652
  // Limit on the number of containers that can be running for each Function; pka "concurrency_limit"
638
653
  optional uint32 max_containers = 2;
@@ -3217,6 +3232,12 @@ message UploadUrlList {
3217
3232
  repeated string items = 1;
3218
3233
  }
3219
3234
 
3235
+ // Used for capturing context about an action performed by a user
3236
+ message UserActionInfo {
3237
+ string user_id = 1;
3238
+ double timestamp = 2;
3239
+ }
3240
+
3220
3241
  message VolumeCommitRequest {
3221
3242
  // NOTE(staffan): Mounting a volume in multiple locations is not supported, so volume_id alone uniquely identifies
3222
3243
  // a volume mount.