modal 1.0.6.dev58__py3-none-any.whl → 1.2.3.dev7__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.

Files changed (147) hide show
  1. modal/__main__.py +3 -4
  2. modal/_billing.py +80 -0
  3. modal/_clustered_functions.py +7 -3
  4. modal/_clustered_functions.pyi +4 -2
  5. modal/_container_entrypoint.py +41 -49
  6. modal/_functions.py +424 -195
  7. modal/_grpc_client.py +171 -0
  8. modal/_load_context.py +105 -0
  9. modal/_object.py +68 -20
  10. modal/_output.py +58 -45
  11. modal/_partial_function.py +36 -11
  12. modal/_pty.py +7 -3
  13. modal/_resolver.py +21 -35
  14. modal/_runtime/asgi.py +4 -3
  15. modal/_runtime/container_io_manager.py +301 -186
  16. modal/_runtime/container_io_manager.pyi +70 -61
  17. modal/_runtime/execution_context.py +18 -2
  18. modal/_runtime/execution_context.pyi +4 -1
  19. modal/_runtime/gpu_memory_snapshot.py +170 -63
  20. modal/_runtime/user_code_imports.py +28 -58
  21. modal/_serialization.py +57 -1
  22. modal/_utils/async_utils.py +33 -12
  23. modal/_utils/auth_token_manager.py +2 -5
  24. modal/_utils/blob_utils.py +110 -53
  25. modal/_utils/function_utils.py +49 -42
  26. modal/_utils/grpc_utils.py +80 -50
  27. modal/_utils/mount_utils.py +26 -1
  28. modal/_utils/name_utils.py +17 -3
  29. modal/_utils/task_command_router_client.py +536 -0
  30. modal/_utils/time_utils.py +34 -6
  31. modal/app.py +219 -83
  32. modal/app.pyi +229 -56
  33. modal/billing.py +5 -0
  34. modal/{requirements → builder}/2025.06.txt +1 -0
  35. modal/{requirements → builder}/PREVIEW.txt +1 -0
  36. modal/cli/_download.py +19 -3
  37. modal/cli/_traceback.py +3 -2
  38. modal/cli/app.py +4 -4
  39. modal/cli/cluster.py +15 -7
  40. modal/cli/config.py +5 -3
  41. modal/cli/container.py +7 -6
  42. modal/cli/dict.py +22 -16
  43. modal/cli/entry_point.py +12 -5
  44. modal/cli/environment.py +5 -4
  45. modal/cli/import_refs.py +3 -3
  46. modal/cli/launch.py +102 -5
  47. modal/cli/network_file_system.py +9 -13
  48. modal/cli/profile.py +3 -2
  49. modal/cli/programs/launch_instance_ssh.py +94 -0
  50. modal/cli/programs/run_jupyter.py +1 -1
  51. modal/cli/programs/run_marimo.py +95 -0
  52. modal/cli/programs/vscode.py +1 -1
  53. modal/cli/queues.py +57 -26
  54. modal/cli/run.py +58 -16
  55. modal/cli/secret.py +48 -22
  56. modal/cli/utils.py +3 -4
  57. modal/cli/volume.py +28 -25
  58. modal/client.py +13 -116
  59. modal/client.pyi +9 -91
  60. modal/cloud_bucket_mount.py +5 -3
  61. modal/cloud_bucket_mount.pyi +5 -1
  62. modal/cls.py +130 -102
  63. modal/cls.pyi +45 -85
  64. modal/config.py +29 -10
  65. modal/container_process.py +291 -13
  66. modal/container_process.pyi +95 -32
  67. modal/dict.py +282 -63
  68. modal/dict.pyi +423 -73
  69. modal/environments.py +15 -27
  70. modal/environments.pyi +5 -15
  71. modal/exception.py +8 -0
  72. modal/experimental/__init__.py +143 -38
  73. modal/experimental/flash.py +247 -78
  74. modal/experimental/flash.pyi +137 -9
  75. modal/file_io.py +14 -28
  76. modal/file_io.pyi +2 -2
  77. modal/file_pattern_matcher.py +25 -16
  78. modal/functions.pyi +134 -61
  79. modal/image.py +255 -86
  80. modal/image.pyi +300 -62
  81. modal/io_streams.py +436 -126
  82. modal/io_streams.pyi +236 -171
  83. modal/mount.py +62 -157
  84. modal/mount.pyi +45 -172
  85. modal/network_file_system.py +30 -53
  86. modal/network_file_system.pyi +16 -76
  87. modal/object.pyi +42 -8
  88. modal/parallel_map.py +821 -113
  89. modal/parallel_map.pyi +134 -0
  90. modal/partial_function.pyi +4 -1
  91. modal/proxy.py +16 -7
  92. modal/proxy.pyi +10 -2
  93. modal/queue.py +263 -61
  94. modal/queue.pyi +409 -66
  95. modal/runner.py +112 -92
  96. modal/runner.pyi +45 -27
  97. modal/sandbox.py +451 -124
  98. modal/sandbox.pyi +513 -67
  99. modal/secret.py +291 -67
  100. modal/secret.pyi +425 -19
  101. modal/serving.py +7 -11
  102. modal/serving.pyi +7 -8
  103. modal/snapshot.py +11 -8
  104. modal/token_flow.py +4 -4
  105. modal/volume.py +344 -98
  106. modal/volume.pyi +464 -68
  107. {modal-1.0.6.dev58.dist-info → modal-1.2.3.dev7.dist-info}/METADATA +9 -8
  108. modal-1.2.3.dev7.dist-info/RECORD +195 -0
  109. modal_docs/mdmd/mdmd.py +11 -1
  110. modal_proto/api.proto +399 -67
  111. modal_proto/api_grpc.py +241 -1
  112. modal_proto/api_pb2.py +1395 -1000
  113. modal_proto/api_pb2.pyi +1239 -79
  114. modal_proto/api_pb2_grpc.py +499 -4
  115. modal_proto/api_pb2_grpc.pyi +162 -14
  116. modal_proto/modal_api_grpc.py +175 -160
  117. modal_proto/sandbox_router.proto +145 -0
  118. modal_proto/sandbox_router_grpc.py +105 -0
  119. modal_proto/sandbox_router_pb2.py +149 -0
  120. modal_proto/sandbox_router_pb2.pyi +333 -0
  121. modal_proto/sandbox_router_pb2_grpc.py +203 -0
  122. modal_proto/sandbox_router_pb2_grpc.pyi +75 -0
  123. modal_proto/task_command_router.proto +144 -0
  124. modal_proto/task_command_router_grpc.py +105 -0
  125. modal_proto/task_command_router_pb2.py +149 -0
  126. modal_proto/task_command_router_pb2.pyi +333 -0
  127. modal_proto/task_command_router_pb2_grpc.py +203 -0
  128. modal_proto/task_command_router_pb2_grpc.pyi +75 -0
  129. modal_version/__init__.py +1 -1
  130. modal-1.0.6.dev58.dist-info/RECORD +0 -183
  131. modal_proto/modal_options_grpc.py +0 -3
  132. modal_proto/options.proto +0 -19
  133. modal_proto/options_grpc.py +0 -3
  134. modal_proto/options_pb2.py +0 -35
  135. modal_proto/options_pb2.pyi +0 -20
  136. modal_proto/options_pb2_grpc.py +0 -4
  137. modal_proto/options_pb2_grpc.pyi +0 -7
  138. /modal/{requirements → builder}/2023.12.312.txt +0 -0
  139. /modal/{requirements → builder}/2023.12.txt +0 -0
  140. /modal/{requirements → builder}/2024.04.txt +0 -0
  141. /modal/{requirements → builder}/2024.10.txt +0 -0
  142. /modal/{requirements → builder}/README.md +0 -0
  143. /modal/{requirements → builder}/base-images.json +0 -0
  144. {modal-1.0.6.dev58.dist-info → modal-1.2.3.dev7.dist-info}/WHEEL +0 -0
  145. {modal-1.0.6.dev58.dist-info → modal-1.2.3.dev7.dist-info}/entry_points.txt +0 -0
  146. {modal-1.0.6.dev58.dist-info → modal-1.2.3.dev7.dist-info}/licenses/LICENSE +0 -0
  147. {modal-1.0.6.dev58.dist-info → modal-1.2.3.dev7.dist-info}/top_level.txt +0 -0
modal_proto/api.proto CHANGED
@@ -4,9 +4,9 @@ option go_package = "github.com/modal-labs/modal/go/proto";
4
4
 
5
5
  package modal.client;
6
6
 
7
- import "modal_proto/options.proto";
8
7
  import "google/protobuf/empty.proto";
9
8
  import "google/protobuf/struct.proto";
9
+ import "google/protobuf/timestamp.proto";
10
10
  import "google/protobuf/wrappers.proto";
11
11
 
12
12
  enum AppDeployVisibility {
@@ -111,6 +111,7 @@ enum DataFormat {
111
111
  DATA_FORMAT_PICKLE = 1; // Cloudpickle
112
112
  DATA_FORMAT_ASGI = 2; // "Asgi" protobuf message
113
113
  DATA_FORMAT_GENERATOR_DONE = 3; // "GeneratorDone" protobuf message
114
+ DATA_FORMAT_CBOR = 4;
114
115
  }
115
116
 
116
117
  enum DeploymentNamespace {
@@ -240,6 +241,13 @@ enum SystemErrorCode {
240
241
  SYSTEM_ERROR_CODE_NOSPC = 28; // ENOSPC: No space left on device
241
242
  }
242
243
 
244
+ enum TaskSnapshotBehavior {
245
+ TASK_SNAPSHOT_BEHAVIOR_UNSPECIFIED = 0;
246
+ TASK_SNAPSHOT_BEHAVIOR_SNAPSHOT = 1;
247
+ TASK_SNAPSHOT_BEHAVIOR_RESTORE = 2;
248
+ TASK_SNAPSHOT_BEHAVIOR_NONE = 3;
249
+ }
250
+
243
251
  enum TaskState {
244
252
  TASK_STATE_UNSPECIFIED = 0;
245
253
  TASK_STATE_CREATED = 6;
@@ -289,10 +297,11 @@ message AppClientDisconnectRequest {
289
297
  }
290
298
 
291
299
  message AppCreateRequest {
292
- string client_id = 1 [ (modal.options.audit_target_attr) = true ];
300
+ string client_id = 1;
293
301
  string description = 2; // Human readable label for the app
294
302
  string environment_name = 5;
295
303
  AppState app_state = 6;
304
+ map<string, string> tags = 7; // Additional metadata to attach to the App
296
305
  }
297
306
 
298
307
  message AppCreateResponse {
@@ -302,7 +311,7 @@ message AppCreateResponse {
302
311
  }
303
312
 
304
313
  message AppDeployRequest {
305
- string app_id = 1 [ (modal.options.audit_target_attr) = true ];
314
+ string app_id = 1;
306
315
  reserved 2; // namespace
307
316
  string name = 3;
308
317
  string object_entity = 4;
@@ -358,6 +367,7 @@ message AppGetLogsRequest {
358
367
  float timeout = 2;
359
368
  string last_entry_id = 4;
360
369
  string function_id = 5;
370
+ string parametrized_function_id = 11;
361
371
  string input_id = 6;
362
372
  string task_id = 7;
363
373
  string function_call_id = 9;
@@ -390,6 +400,14 @@ message AppGetOrCreateResponse {
390
400
  string app_id = 1;
391
401
  }
392
402
 
403
+ message AppGetTagsRequest {
404
+ string app_id = 1;
405
+ }
406
+
407
+ message AppGetTagsResponse {
408
+ map<string, string> tags = 1;
409
+ }
410
+
393
411
  message AppHeartbeatRequest {
394
412
  string app_id = 1;
395
413
  }
@@ -427,7 +445,7 @@ message AppLookupResponse {
427
445
  }
428
446
 
429
447
  message AppPublishRequest {
430
- string app_id = 1 [ (modal.options.audit_target_attr) = true ];
448
+ string app_id = 1;
431
449
  string name = 2;
432
450
  string deployment_tag = 3; // Additional metadata to identify a deployment
433
451
  AppState app_state = 4; // Published app will be in this state
@@ -437,6 +455,7 @@ message AppPublishRequest {
437
455
  uint32 rollback_version = 8; // Unused by client, but used internally
438
456
  string client_version = 9; // Unused by client, but used internally
439
457
  CommitInfo commit_info = 10; // Git information for deployment tracking
458
+ map<string, string> tags = 11; // Additional metadata to attach to the App
440
459
  }
441
460
 
442
461
  message AppPublishResponse {
@@ -458,8 +477,14 @@ message AppSetObjectsRequest {
458
477
  reserved 6;
459
478
  }
460
479
 
480
+ message AppSetTagsRequest {
481
+ string app_id = 1;
482
+ map<string, string> tags = 2;
483
+ }
484
+
485
+
461
486
  message AppStopRequest {
462
- string app_id = 1 [ (modal.options.audit_target_attr) = true ];
487
+ string app_id = 1;
463
488
  AppStopSource source = 2;
464
489
  }
465
490
 
@@ -621,11 +646,26 @@ message AuthTokenGetResponse {
621
646
  string token = 1;
622
647
  }
623
648
 
649
+ // Message representing the current (coalesced) state of the autoscaler configuration
650
+ // As well as the different sources that were used to create it.
651
+ message AutoscalerConfiguration {
652
+ // The settings that are currently in effect.
653
+ AutoscalerSettings settings = 1;
654
+ // For tracking the source of the overridden value; keys correspond to fields in `settings`.
655
+ map<string, UserActionInfo> override_events = 2;
656
+ // The default settings that are used when no static settings are provided and no overrides are in effect.
657
+ AutoscalerSettings default_settings = 3;
658
+ // The static settings that were used to initialize the configuration.
659
+ AutoscalerSettings static_settings = 4;
660
+ // The merge of all overrides that were used to create the current configuration.
661
+ AutoscalerSettings override_settings = 5;
662
+ }
663
+
624
664
  message AutoscalerSettings {
625
665
  // A collection of user-configurable settings for Function autoscaling
626
666
  // These are used for static configuration and for dynamic autoscaler updates
627
667
 
628
- // Minimum containers when scale-to-zero is not deisired; pka "keep_warm" or "warm_pool_size"
668
+ // Minimum containers when scale-to-zero is not desired; pka "keep_warm" or "warm_pool_size"
629
669
  optional uint32 min_containers = 1;
630
670
  // Limit on the number of containers that can be running for each Function; pka "concurrency_limit"
631
671
  optional uint32 max_containers = 2;
@@ -635,6 +675,15 @@ message AutoscalerSettings {
635
675
  optional uint32 scaleup_window = 4;
636
676
  // Maximum amount of time a container can be idle before being scaled down, in seconds; pka "container_idle_timeout"
637
677
  optional uint32 scaledown_window = 5;
678
+ reserved 6;
679
+ }
680
+
681
+ // Used for flash autoscaling
682
+ message AutoscalingMetrics {
683
+ double cpu_usage_percent = 1;
684
+ double memory_usage_percent = 2;
685
+ uint32 concurrent_requests = 3;
686
+ double timestamp = 4;
638
687
  }
639
688
 
640
689
  message BaseImage {
@@ -696,7 +745,7 @@ message CheckpointInfo {
696
745
  }
697
746
 
698
747
  message ClassCreateRequest {
699
- string app_id = 1 [ (modal.options.audit_target_attr) = true ];
748
+ string app_id = 1 ;
700
749
  string existing_class_id = 2;
701
750
  repeated ClassMethod methods = 3;
702
751
  reserved 4; // removed class_function_id
@@ -801,6 +850,12 @@ message CloudBucketMount {
801
850
  GCP = 3;
802
851
  }
803
852
 
853
+ enum MetadataTTLType {
854
+ METADATA_TTL_TYPE_UNSPECIFIED = 0;
855
+ METADATA_TTL_TYPE_MINIMAL = 1;
856
+ METADATA_TTL_TYPE_INDEFINITE = 2;
857
+ }
858
+
804
859
  string bucket_name = 1;
805
860
  string mount_path = 2;
806
861
  string credentials_secret_id = 3;
@@ -810,6 +865,11 @@ message CloudBucketMount {
810
865
  optional string bucket_endpoint_url = 7;
811
866
  optional string key_prefix = 8;
812
867
  optional string oidc_auth_role_arn = 9;
868
+ bool force_path_style = 10;
869
+ oneof metadata_ttl_oneof {
870
+ MetadataTTLType metadata_ttl_type = 11;
871
+ uint64 metadata_ttl_seconds = 12;
872
+ }
813
873
  }
814
874
 
815
875
  message ClusterGetRequest {
@@ -858,6 +918,7 @@ message ContainerArguments { // This is used to pass data from the worker to th
858
918
  string environment_name = 13;
859
919
  optional string checkpoint_id = 14;
860
920
  AppLayout app_layout = 15;
921
+ string input_plane_server_url = 16;
861
922
  }
862
923
 
863
924
  message ContainerCheckpointRequest {
@@ -1029,12 +1090,19 @@ message ContainerReloadVolumesRequest {
1029
1090
  message ContainerReloadVolumesResponse { }
1030
1091
 
1031
1092
  message ContainerStopRequest {
1032
- string task_id = 1 [ (modal.options.audit_target_attr) = true ];
1093
+ string task_id = 1;
1033
1094
  }
1034
1095
 
1035
1096
  message ContainerStopResponse {
1036
1097
  }
1037
1098
 
1099
+
1100
+ message CreationInfo {
1101
+ // This message is used in metadata for resource objects like Dict, Queue, Volume, etc.
1102
+ double created_at = 1; // Timestamp of resource creation
1103
+ string created_by = 2; // User name or service name
1104
+ }
1105
+
1038
1106
  message CustomDomainConfig {
1039
1107
  string name = 1;
1040
1108
  }
@@ -1090,7 +1158,7 @@ message DictEntry {
1090
1158
  }
1091
1159
 
1092
1160
  message DictGetOrCreateRequest {
1093
- string deployment_name = 1 [ (modal.options.audit_target_attr) = true ];
1161
+ string deployment_name = 1;
1094
1162
  reserved 2; // removed namespace
1095
1163
  string environment_name = 3;
1096
1164
  ObjectCreationType object_creation_type = 4;
@@ -1099,6 +1167,7 @@ message DictGetOrCreateRequest {
1099
1167
 
1100
1168
  message DictGetOrCreateResponse {
1101
1169
  string dict_id = 1;
1170
+ DictMetadata metadata = 2;
1102
1171
  }
1103
1172
 
1104
1173
  message DictGetRequest {
@@ -1125,15 +1194,24 @@ message DictLenResponse {
1125
1194
 
1126
1195
  message DictListRequest {
1127
1196
  string environment_name = 1;
1197
+ ListPagination pagination = 2;
1128
1198
  }
1129
1199
 
1130
1200
  message DictListResponse {
1131
1201
  message DictInfo {
1132
1202
  string name = 1;
1133
- double created_at = 2;
1203
+ double created_at = 2; // Superseded by metadata, used by clients up to 1.1.2
1204
+ string dict_id = 3;
1205
+ DictMetadata metadata = 4;
1134
1206
  }
1135
1207
 
1136
1208
  repeated DictInfo dicts = 1;
1209
+ string environment_name = 2;
1210
+ }
1211
+
1212
+ message DictMetadata {
1213
+ string name = 1;
1214
+ CreationInfo creation_info = 2;
1137
1215
  }
1138
1216
 
1139
1217
  message DictPopRequest {
@@ -1147,7 +1225,7 @@ message DictPopResponse {
1147
1225
  }
1148
1226
 
1149
1227
  message DictUpdateRequest {
1150
- string dict_id = 1 [ (modal.options.audit_target_attr) = true ];
1228
+ string dict_id = 1;
1151
1229
  repeated DictEntry updates = 2;
1152
1230
  bool if_not_exists = 3;
1153
1231
  }
@@ -1173,7 +1251,7 @@ message DomainCertificateVerifyResponse {
1173
1251
  }
1174
1252
 
1175
1253
  message DomainCreateRequest {
1176
- string domain_name = 1 [ (modal.options.audit_target_attr) = true ];
1254
+ string domain_name = 1 ;
1177
1255
  }
1178
1256
 
1179
1257
  message DomainCreateResponse {
@@ -1189,14 +1267,14 @@ message DomainListResponse {
1189
1267
  }
1190
1268
 
1191
1269
  message EnvironmentCreateRequest {
1192
- string name = 1 [ (modal.options.audit_target_attr) = true ];
1270
+ string name = 1;
1193
1271
  }
1194
1272
 
1195
1273
  message EnvironmentDeleteRequest {
1196
- string name = 1 [ (modal.options.audit_target_attr) = true ];
1274
+ string name = 1;
1197
1275
  }
1198
1276
  message EnvironmentGetOrCreateRequest {
1199
- string deployment_name = 1 [ (modal.options.audit_target_attr) = true ];
1277
+ string deployment_name = 1;
1200
1278
  ObjectCreationType object_creation_type = 2;
1201
1279
  }
1202
1280
 
@@ -1210,6 +1288,12 @@ message EnvironmentListItem {
1210
1288
  string webhook_suffix = 2;
1211
1289
  double created_at = 3;
1212
1290
  bool default = 4;
1291
+ bool is_managed = 5;
1292
+ string environment_id = 6;
1293
+ optional int32 max_concurrent_tasks = 7;
1294
+ optional int32 max_concurrent_gpus = 8;
1295
+ int32 current_concurrent_tasks = 9;
1296
+ int32 current_concurrent_gpus = 10;
1213
1297
  }
1214
1298
 
1215
1299
  message EnvironmentListResponse {
@@ -1230,9 +1314,11 @@ message EnvironmentSettings {
1230
1314
  }
1231
1315
 
1232
1316
  message EnvironmentUpdateRequest {
1233
- string current_name = 1 [ (modal.options.audit_target_attr) = true ];
1317
+ string current_name = 1;
1234
1318
  google.protobuf.StringValue name = 2;
1235
1319
  google.protobuf.StringValue web_suffix = 3;
1320
+ optional int32 max_concurrent_tasks = 4;
1321
+ optional int32 max_concurrent_gpus = 5;
1236
1322
  }
1237
1323
 
1238
1324
  // A file entry when listing files in a volume or network file system.
@@ -1287,6 +1373,19 @@ message FlashContainerRegisterResponse {
1287
1373
  string url = 1;
1288
1374
  }
1289
1375
 
1376
+ message FlashProxyUpstreamRequest {
1377
+ uint32 upstream_requests = 1;
1378
+ double timestamp = 2;
1379
+ }
1380
+
1381
+ message FlashSetTargetSlotsMetricsRequest {
1382
+ // TODO(claudia): add other metrics to use in autoscaling decisions
1383
+ string function_id = 1;
1384
+ uint32 target_slots = 2;
1385
+ }
1386
+
1387
+ message FlashSetTargetSlotsMetricsResponse {}
1388
+
1290
1389
  message Function {
1291
1390
  string module_name = 1;
1292
1391
  string function_name = 2;
@@ -1446,6 +1545,10 @@ message Function {
1446
1545
  string flash_service_label = 84;
1447
1546
 
1448
1547
  bool enable_gpu_snapshot = 85; // GPU memory snapshotting (alpha)
1548
+
1549
+ uint32 startup_timeout_secs = 86;
1550
+ repeated DataFormat supported_input_formats = 87; // can be used as inputs
1551
+ repeated DataFormat supported_output_formats = 88;
1449
1552
  }
1450
1553
 
1451
1554
  message FunctionAsyncInvokeRequest {
@@ -1464,6 +1567,7 @@ message FunctionBindParamsRequest {
1464
1567
  bytes serialized_params = 2;
1465
1568
  FunctionOptions function_options = 3;
1466
1569
  string environment_name = 4;
1570
+ string auth_secret = 5; // Only used for the input plane.
1467
1571
  }
1468
1572
 
1469
1573
  message FunctionBindParamsResponse {
@@ -1484,10 +1588,23 @@ message FunctionCallCancelRequest {
1484
1588
  optional string function_id = 3; // Only provided for sync input cancellation on the input plane. Async input cancellation does not provide this field this.
1485
1589
  }
1486
1590
 
1487
- message FunctionCallGetDataRequest {
1591
+ message FunctionCallFromIdRequest {
1592
+ string function_call_id = 1;
1593
+ }
1594
+
1595
+ // Everything you need to build a FunctionCallHandler.
1596
+ message FunctionCallFromIdResponse {
1488
1597
  string function_call_id = 1;
1598
+ int32 num_inputs = 2;
1599
+ }
1600
+
1601
+ message FunctionCallGetDataRequest {
1602
+ oneof call_info {
1603
+ string function_call_id = 1;
1604
+ string attempt_token = 3;
1605
+ }
1489
1606
  uint64 last_index = 2;
1490
- reserved 3; // attempt_token
1607
+ bool use_gapless_read = 4;
1491
1608
  }
1492
1609
 
1493
1610
  message FunctionCallInfo {
@@ -1514,14 +1631,16 @@ message FunctionCallListResponse {
1514
1631
  }
1515
1632
 
1516
1633
  message FunctionCallPutDataRequest {
1517
- string function_call_id = 1;
1634
+ oneof call_info {
1635
+ string function_call_id = 1;
1636
+ string attempt_token = 3;
1637
+ }
1518
1638
  repeated DataChunk data_chunks = 2;
1519
- reserved 3; // attempt_token
1520
1639
  }
1521
1640
 
1522
1641
  message FunctionCreateRequest {
1523
1642
  Function function = 1;
1524
- string app_id = 2 [ (modal.options.audit_target_attr) = true ];
1643
+ string app_id = 2 ;
1525
1644
  Schedule schedule = 6 [deprecated=true]; // Deprecated: now passed in the Function definition
1526
1645
  string existing_function_id = 7;
1527
1646
  reserved 8; // defer_updates
@@ -1604,6 +1723,10 @@ message FunctionData {
1604
1723
 
1605
1724
  repeated string flash_service_urls = 34;
1606
1725
  string flash_service_label = 35;
1726
+
1727
+ uint32 startup_timeout_secs = 36;
1728
+ repeated DataFormat supported_input_formats = 37;
1729
+ repeated DataFormat supported_output_formats = 38;
1607
1730
  }
1608
1731
 
1609
1732
  message FunctionExtended {
@@ -1618,6 +1741,12 @@ message FunctionExtended {
1618
1741
  }
1619
1742
  }
1620
1743
 
1744
+ message FunctionFinishInputsRequest {
1745
+ string function_id = 1;
1746
+ string function_call_id = 2;
1747
+ uint32 num_inputs = 3;
1748
+ }
1749
+
1621
1750
 
1622
1751
  message FunctionGetCallGraphRequest {
1623
1752
  // TODO: use input_id once we switch client submit API to return those.
@@ -1651,6 +1780,8 @@ message FunctionGetInputsItem {
1651
1780
  string function_call_id = 5;
1652
1781
  FunctionCallInvocationType function_call_invocation_type = 6;
1653
1782
  uint32 retry_count = 7;
1783
+ optional int32 function_map_idx = 8; // intercepted and only used by the worker.
1784
+ string attempt_token = 9;
1654
1785
  }
1655
1786
 
1656
1787
  message FunctionGetInputsRequest {
@@ -1691,6 +1822,7 @@ message FunctionGetOutputsRequest {
1691
1822
  // The jwts the client expects the server to be processing. This is optional and used for sync inputs only.
1692
1823
  repeated string input_jwts = 9;
1693
1824
  optional int32 start_idx = 10; // for async batch requests. this indicates which index to start from.
1825
+ optional int32 end_idx = 11; // for async batch requests. this indicates which index to end at.
1694
1826
  }
1695
1827
 
1696
1828
  message FunctionGetOutputsResponse {
@@ -1743,6 +1875,9 @@ message FunctionHandleMetadata {
1743
1875
  optional string input_plane_region = 47;
1744
1876
  // Use optional to ensure unset values default to None instead of 0
1745
1877
  optional uint64 max_object_size_bytes = 48;
1878
+ repeated string _experimental_flash_urls = 49; // (Optional) urls for flash services
1879
+ repeated DataFormat supported_input_formats = 50;
1880
+ repeated DataFormat supported_output_formats = 51;
1746
1881
  }
1747
1882
 
1748
1883
  message FunctionInput {
@@ -1792,11 +1927,15 @@ message FunctionOptions {
1792
1927
  optional uint32 max_concurrent_inputs = 14;
1793
1928
  optional uint32 batch_max_size = 15;
1794
1929
  optional uint64 batch_linger_ms = 16;
1930
+ optional SchedulerPlacement scheduler_placement = 17;
1931
+ optional string cloud_provider_str = 18;
1932
+ bool replace_cloud_bucket_mounts = 19;
1933
+ repeated CloudBucketMount cloud_bucket_mounts = 20;
1795
1934
  }
1796
1935
 
1797
1936
  message FunctionPrecreateRequest {
1798
1937
  string app_id = 1;
1799
- string function_name = 2 [ (modal.options.audit_target_attr) = true ];
1938
+ string function_name = 2 ;
1800
1939
  string existing_function_id = 3;
1801
1940
  Function.FunctionType function_type = 4;
1802
1941
  WebhookConfig webhook_config = 5;
@@ -1805,6 +1944,8 @@ message FunctionPrecreateRequest {
1805
1944
  // Mapping of method names to method definitions, only non-empty for class service functions
1806
1945
  map<string, MethodDefinition> method_definitions = 8;
1807
1946
  FunctionSchema function_schema = 9;
1947
+ repeated DataFormat supported_input_formats = 10;
1948
+ repeated DataFormat supported_output_formats = 11;
1808
1949
  }
1809
1950
 
1810
1951
  message FunctionPrecreateResponse {
@@ -1816,7 +1957,8 @@ message FunctionPutInputsItem {
1816
1957
  int32 idx = 1;
1817
1958
  FunctionInput input = 2;
1818
1959
  bool r2_failed = 3;
1819
- uint64 r2_latency_ms = 4;
1960
+ reserved 4; // r2_latency_ms
1961
+ uint64 r2_throughput_bytes_s = 5;
1820
1962
  }
1821
1963
 
1822
1964
  message FunctionPutInputsRequest {
@@ -1842,6 +1984,8 @@ message FunctionPutOutputsItem {
1842
1984
  double output_created_at = 4;
1843
1985
  DataFormat data_format = 7; // for result.data_oneof
1844
1986
  uint32 retry_count = 8;
1987
+ string function_call_id = 9; // injected by the worker
1988
+ optional int32 function_map_idx = 10; // injected by the worker
1845
1989
  }
1846
1990
 
1847
1991
  message FunctionPutOutputsRequest {
@@ -1922,6 +2066,8 @@ message GenericResult { // Used for both tasks and function outputs
1922
2066
  // Terminates the function and all remaining inputs.
1923
2067
  GENERIC_STATUS_INIT_FAILURE = 5;
1924
2068
  GENERIC_STATUS_INTERNAL_FAILURE = 6;
2069
+ // Used when sandboxes are terminated due to idle_timeout
2070
+ GENERIC_STATUS_IDLE_TIMEOUT = 7;
1925
2071
  }
1926
2072
 
1927
2073
  GenericStatus status = 1; // Status of the task or function output.
@@ -1964,6 +2110,9 @@ message Image {
1964
2110
 
1965
2111
  // Build arguments for the image (--build-arg) for ARG substitution in Dockerfile.
1966
2112
  map<string, string> build_args = 22;
2113
+
2114
+ // Volume mount for RUN commands
2115
+ repeated VolumeMount volume_mounts = 23;
1967
2116
  }
1968
2117
 
1969
2118
  message ImageContextFile {
@@ -1971,6 +2120,10 @@ message ImageContextFile {
1971
2120
  bytes data = 2;
1972
2121
  }
1973
2122
 
2123
+ message ImageDeleteRequest {
2124
+ string image_id = 1;
2125
+ }
2126
+
1974
2127
  message ImageFromIdRequest {
1975
2128
  string image_id = 1;
1976
2129
  }
@@ -1982,7 +2135,7 @@ message ImageFromIdResponse {
1982
2135
 
1983
2136
  message ImageGetOrCreateRequest {
1984
2137
  Image image = 2;
1985
- string app_id = 4 [ (modal.options.audit_target_attr) = true ];
2138
+ string app_id = 4;
1986
2139
  string existing_image_id = 5; // ignored
1987
2140
  string build_function_id = 6;
1988
2141
  bool force_build = 7;
@@ -2069,6 +2222,63 @@ message InputInfo {
2069
2222
  bool task_first_input = 7;
2070
2223
  }
2071
2224
 
2225
+ message ListPagination {
2226
+ int32 max_objects = 1;
2227
+ double created_before = 2;
2228
+ }
2229
+
2230
+ message MapAwaitRequest {
2231
+ oneof call_info {
2232
+ string function_call_id = 1;
2233
+ string map_token = 5;
2234
+ }
2235
+ string last_entry_id = 2;
2236
+ double requested_at = 3; // Used for waypoints.
2237
+ float timeout = 4;
2238
+ }
2239
+
2240
+ message MapAwaitResponse {
2241
+ repeated FunctionGetOutputsItem outputs = 1;
2242
+ string last_entry_id = 2;
2243
+ }
2244
+
2245
+ message MapCheckInputsRequest {
2246
+ string last_entry_id = 1;
2247
+ float timeout = 2;
2248
+ repeated string attempt_tokens = 3;
2249
+ }
2250
+
2251
+ message MapCheckInputsResponse {
2252
+ repeated bool lost = 1;
2253
+ }
2254
+
2255
+ message MapStartOrContinueItem {
2256
+ FunctionPutInputsItem input = 1;
2257
+ optional string attempt_token = 2; // None if this is a fresh input, otherwise it is the attempt token for a retry.
2258
+ }
2259
+
2260
+ message MapStartOrContinueRequest {
2261
+ string function_id = 1;
2262
+ string parent_input_id = 2;
2263
+ // Clients will send call_info on map continue requests.
2264
+ oneof call_info {
2265
+ string function_call_id = 3;
2266
+ string map_token = 5;
2267
+ }
2268
+ repeated MapStartOrContinueItem items = 4;
2269
+ }
2270
+
2271
+ message MapStartOrContinueResponse {
2272
+ // function_id and function_call_id are not necessary if map_token is provided.
2273
+ // All 3 will be sent until it is safe to only send map_token.
2274
+ string map_token = 6;
2275
+ string function_id = 1;
2276
+ string function_call_id = 2;
2277
+ uint32 max_inputs_outstanding = 3;
2278
+ repeated string attempt_tokens = 4;
2279
+ FunctionRetryPolicy retry_policy = 5;
2280
+ }
2281
+
2072
2282
  message MethodDefinition {
2073
2283
  string function_name = 1;
2074
2284
  Function.FunctionType function_type = 2;
@@ -2077,6 +2287,8 @@ message MethodDefinition {
2077
2287
  WebUrlInfo web_url_info = 5;
2078
2288
  repeated CustomDomainInfo custom_domain_info = 6;
2079
2289
  FunctionSchema function_schema = 7;
2290
+ repeated DataFormat supported_input_formats = 8;
2291
+ repeated DataFormat supported_output_formats = 9;
2080
2292
  }
2081
2293
 
2082
2294
  message MountFile {
@@ -2237,6 +2449,7 @@ message PTYInfo {
2237
2449
  PTY_TYPE_SHELL = 2; // Replace function with shell
2238
2450
  }
2239
2451
  PTYType pty_type = 7;
2452
+ bool no_terminate_on_idle_stdin = 8;
2240
2453
  }
2241
2454
 
2242
2455
  message PortSpec {
@@ -2253,12 +2466,13 @@ message Proxy {
2253
2466
  string name = 1;
2254
2467
  double created_at = 2;
2255
2468
  string environment_name = 3;
2256
- string proxy_id = 5;
2257
2469
  repeated ProxyIp proxy_ips = 4;
2470
+ string proxy_id = 5;
2471
+ string region = 6;
2258
2472
  }
2259
2473
 
2260
2474
  message ProxyAddIpRequest {
2261
- string proxy_id = 1 [ (modal.options.audit_target_attr) = true ];
2475
+ string proxy_id = 1;
2262
2476
  }
2263
2477
 
2264
2478
  message ProxyAddIpResponse {
@@ -2266,8 +2480,9 @@ message ProxyAddIpResponse {
2266
2480
  }
2267
2481
 
2268
2482
  message ProxyCreateRequest {
2269
- string name = 1 [ (modal.options.audit_target_attr) = true ];
2483
+ string name = 1;
2270
2484
  string environment_name = 2;
2485
+ string region = 3;
2271
2486
  }
2272
2487
 
2273
2488
  message ProxyCreateResponse {
@@ -2275,11 +2490,11 @@ message ProxyCreateResponse {
2275
2490
  }
2276
2491
 
2277
2492
  message ProxyDeleteRequest {
2278
- string proxy_id = 1 [ (modal.options.audit_target_attr) = true ];
2493
+ string proxy_id = 1;
2279
2494
  }
2280
2495
 
2281
2496
  message ProxyGetOrCreateRequest {
2282
- string deployment_name = 1 [ (modal.options.audit_target_attr) = true ];
2497
+ string deployment_name = 1;
2283
2498
  reserved 2; // namespace
2284
2499
  string environment_name = 3;
2285
2500
  ObjectCreationType object_creation_type = 4; // must be UNSPECIFIED
@@ -2290,7 +2505,7 @@ message ProxyGetOrCreateResponse {
2290
2505
  }
2291
2506
 
2292
2507
  message ProxyGetRequest {
2293
- string name = 1 [ (modal.options.audit_target_attr) = true ];
2508
+ string name = 1;
2294
2509
  string environment_name = 2;
2295
2510
  }
2296
2511
 
@@ -2318,7 +2533,7 @@ message ProxyListResponse {
2318
2533
  }
2319
2534
 
2320
2535
  message ProxyRemoveIpRequest {
2321
- string proxy_ip = 1 [ (modal.options.audit_target_attr) = true ];
2536
+ string proxy_ip = 1;
2322
2537
  }
2323
2538
 
2324
2539
  message QueueClearRequest {
@@ -2328,7 +2543,7 @@ message QueueClearRequest {
2328
2543
  }
2329
2544
 
2330
2545
  message QueueDeleteRequest {
2331
- string queue_id = 1 [ (modal.options.audit_target_attr) = true ];
2546
+ string queue_id = 1;
2332
2547
  }
2333
2548
 
2334
2549
  message QueueGetOrCreateRequest {
@@ -2340,6 +2555,7 @@ message QueueGetOrCreateRequest {
2340
2555
 
2341
2556
  message QueueGetOrCreateResponse {
2342
2557
  string queue_id = 1;
2558
+ QueueMetadata metadata = 2;
2343
2559
  }
2344
2560
 
2345
2561
  message QueueGetRequest {
@@ -2374,19 +2590,27 @@ message QueueLenResponse {
2374
2590
 
2375
2591
  message QueueListRequest {
2376
2592
  string environment_name = 1;
2377
- // Allow client to report a bounded total size to reduce the number of partitions that need to be checked
2378
- int32 total_size_limit = 2;
2593
+ int32 total_size_limit = 2; // Limit on "number of partitions" reported, since checking them is costly
2594
+ ListPagination pagination = 3;
2379
2595
  }
2380
2596
 
2381
2597
  message QueueListResponse {
2382
2598
  message QueueInfo {
2383
2599
  string name = 1;
2384
- double created_at = 2;
2600
+ double created_at = 2; // Superseded by metadata, used by clients up to 1.1.2
2385
2601
  int32 num_partitions = 3;
2386
2602
  int32 total_size = 4;
2603
+ string queue_id = 5;
2604
+ QueueMetadata metadata = 6;
2387
2605
  }
2388
2606
 
2389
2607
  repeated QueueInfo queues = 1;
2608
+ string environment_name = 2;
2609
+ }
2610
+
2611
+ message QueueMetadata {
2612
+ string name = 1;
2613
+ CreationInfo creation_info = 2;
2390
2614
  }
2391
2615
 
2392
2616
  message QueueNextItemsRequest {
@@ -2463,7 +2687,7 @@ message Sandbox {
2463
2687
  Resources resources = 5;
2464
2688
  CloudProvider cloud_provider = 6; // Deprecated at some point
2465
2689
 
2466
- uint32 timeout_secs = 7;
2690
+ uint32 timeout_secs = 7; // The max lifetime of a sandbox in seconds.
2467
2691
 
2468
2692
  optional string workdir = 8;
2469
2693
 
@@ -2520,10 +2744,33 @@ message Sandbox {
2520
2744
 
2521
2745
  // If set, the sandbox will be created with a name.
2522
2746
  optional string name = 30;
2747
+
2748
+ // Experimental options
2749
+ map<string, bool> experimental_options = 31;
2750
+
2751
+ repeated string preload_path_prefixes = 32; // Internal use only.
2752
+
2753
+ // Optional idle timeout in seconds. If set, the sandbox will be terminated after being idle for this duration.
2754
+ optional uint32 idle_timeout_secs = 33;
2755
+
2756
+ // If set, the sandbox will be created with direct sandbox commands enabled.
2757
+ // Exec commands for the sandbox will be issued directly to the sandbox
2758
+ // command router running on the Modal worker.
2759
+ bool direct_sandbox_commands_enabled = 34;
2760
+ }
2761
+
2762
+ message SandboxCreateConnectTokenRequest {
2763
+ string sandbox_id = 1;
2764
+ string user_metadata = 2;
2765
+ }
2766
+
2767
+ message SandboxCreateConnectTokenResponse {
2768
+ string url = 1;
2769
+ string token = 2;
2523
2770
  }
2524
2771
 
2525
2772
  message SandboxCreateRequest {
2526
- string app_id = 1 [ (modal.options.audit_target_attr) = true ];
2773
+ string app_id = 1;
2527
2774
  Sandbox definition = 2;
2528
2775
  string environment_name = 3; // *DEPRECATED* 7/16/2025
2529
2776
  }
@@ -2624,6 +2871,19 @@ message SandboxRestoreResponse {
2624
2871
  string sandbox_id = 1;
2625
2872
  }
2626
2873
 
2874
+ message SandboxSnapshotFsAsyncGetRequest {
2875
+ string image_id = 1;
2876
+ float timeout = 2;
2877
+ }
2878
+
2879
+ message SandboxSnapshotFsAsyncRequest {
2880
+ string sandbox_id = 1;
2881
+ }
2882
+
2883
+ message SandboxSnapshotFsAsyncResponse {
2884
+ string image_id = 1;
2885
+ }
2886
+
2627
2887
  message SandboxSnapshotFsRequest {
2628
2888
  string sandbox_id = 1;
2629
2889
  float timeout = 2;
@@ -2676,6 +2936,14 @@ message SandboxTag {
2676
2936
  string tag_value = 2;
2677
2937
  }
2678
2938
 
2939
+ message SandboxTagsGetRequest {
2940
+ string sandbox_id = 1;
2941
+ }
2942
+
2943
+ message SandboxTagsGetResponse {
2944
+ repeated SandboxTag tags = 1;
2945
+ }
2946
+
2679
2947
  message SandboxTagsSetRequest {
2680
2948
  string environment_name = 1;
2681
2949
  string sandbox_id = 2;
@@ -2720,23 +2988,18 @@ message Schedule {
2720
2988
  }
2721
2989
 
2722
2990
  message SchedulerPlacement {
2723
- // TODO(irfansharif):
2724
- // - Fold in cloud, resource needs here too.
2725
- // - Allow specifying list of zones, cloud, fallback and alternative
2726
- // GPU types.
2727
-
2728
2991
  repeated string regions = 4;
2729
- // TODO(irfansharif): Make these two repeated.
2730
- optional string _zone = 2; // admin-only
2731
- optional string _lifecycle = 3; // admin-only, "on-demand" or "spot", else ignored
2732
- repeated string _instance_types = 5; // admin-only
2992
+ optional string _zone = 2; // TODO: Deprecate
2993
+ optional string _lifecycle = 3; // TODO: Deprecate
2994
+ repeated string _instance_types = 5; // TODO: Deprecate
2995
+ bool nonpreemptible = 6;
2733
2996
 
2734
2997
  reserved 1;
2735
2998
  }
2736
2999
 
2737
3000
  message SecretCreateRequest { // Not used by client anymore
2738
3001
  map<string, string> env_dict = 1;
2739
- string app_id = 2 [ (modal.options.audit_target_attr) = true ];
3002
+ string app_id = 2;
2740
3003
  string template_type = 3; // todo: not used?
2741
3004
  string existing_secret_id = 4;
2742
3005
  }
@@ -2750,7 +3013,7 @@ message SecretDeleteRequest {
2750
3013
  }
2751
3014
 
2752
3015
  message SecretGetOrCreateRequest {
2753
- string deployment_name = 1 [ (modal.options.audit_target_attr) = true ];
3016
+ string deployment_name = 1;
2754
3017
  reserved 2; // removed namespace
2755
3018
  string environment_name = 3;
2756
3019
  ObjectCreationType object_creation_type = 4; // Not used atm
@@ -2761,25 +3024,35 @@ message SecretGetOrCreateRequest {
2761
3024
 
2762
3025
  message SecretGetOrCreateResponse {
2763
3026
  string secret_id = 1;
3027
+ SecretMetadata metadata = 2;
2764
3028
  }
2765
3029
 
2766
3030
  message SecretListItem {
2767
3031
  string label = 1;
2768
- double created_at = 2;
3032
+ double created_at = 2; // Superseded by metadata, used by clients up to 1.1.2
2769
3033
  double last_used_at = 3;
2770
- string environment_name = 4;
3034
+ string environment_name = 4; // Unused by client
2771
3035
  string secret_id = 5;
3036
+ SecretMetadata metadata = 6;
2772
3037
  }
2773
3038
 
2774
3039
  message SecretListRequest {
2775
- string environment_name = 1; // leaving empty will assume a singular environment
3040
+ string environment_name = 1;
3041
+ ListPagination pagination = 2;
2776
3042
  }
2777
3043
 
2778
3044
  message SecretListResponse {
2779
3045
  repeated SecretListItem items = 1;
2780
- string environment_name = 2; // the environment that was listed (useful when relying on "default" logic)
3046
+ string environment_name = 2;
3047
+ }
3048
+
3049
+ message SecretMetadata {
3050
+ string name = 1;
3051
+ CreationInfo creation_info = 2;
2781
3052
  }
2782
3053
 
3054
+ // SharedVolume in the backend corresponds to NetworkFileSystem in the current API
3055
+
2783
3056
  message SharedVolumeDeleteRequest {
2784
3057
  string shared_volume_id = 1;
2785
3058
  }
@@ -2797,7 +3070,7 @@ message SharedVolumeGetFileResponse {
2797
3070
  }
2798
3071
 
2799
3072
  message SharedVolumeGetOrCreateRequest {
2800
- string deployment_name = 1 [ (modal.options.audit_target_attr) = true ];
3073
+ string deployment_name = 1;
2801
3074
  reserved 2; // removed namespace
2802
3075
  string environment_name = 3;
2803
3076
  ObjectCreationType object_creation_type = 4;
@@ -2841,11 +3114,11 @@ message SharedVolumeMount {
2841
3114
  string mount_path = 1;
2842
3115
  string shared_volume_id = 2;
2843
3116
  CloudProvider cloud_provider = 3;
2844
- bool allow_cross_region = 4;
3117
+ reserved 4; // allow_cross_region
2845
3118
  }
2846
3119
 
2847
3120
  message SharedVolumePutFileRequest {
2848
- string shared_volume_id = 1 [ (modal.options.audit_target_attr) = true ];
3121
+ string shared_volume_id = 1;
2849
3122
  string path = 2;
2850
3123
  string sha256_hex = 3;
2851
3124
  oneof data_oneof {
@@ -2860,7 +3133,7 @@ message SharedVolumePutFileResponse {
2860
3133
  }
2861
3134
 
2862
3135
  message SharedVolumeRemoveFileRequest {
2863
- string shared_volume_id = 1 [ (modal.options.audit_target_attr) = true ];
3136
+ string shared_volume_id = 1;
2864
3137
  string path = 2;
2865
3138
  bool recursive = 3;
2866
3139
  }
@@ -2878,14 +3151,27 @@ message TaskClusterHelloRequest {
2878
3151
  message TaskClusterHelloResponse {
2879
3152
  string cluster_id = 1;
2880
3153
  uint32 cluster_rank = 2;
2881
- // All IP addresses in cluster, ordered by cluster rank
3154
+ // All IPv6 addresses in cluster, ordered by cluster rank
2882
3155
  repeated string container_ips = 3;
3156
+ repeated string container_ipv4_ips = 4;
2883
3157
  }
2884
3158
 
2885
3159
  message TaskCurrentInputsResponse {
2886
3160
  repeated string input_ids = 1;
2887
3161
  }
2888
3162
 
3163
+ // Used to get a JWT and URL for direct access to a task command router
3164
+ // running on the modal-worker, so the client can issue exec commands (and other
3165
+ // operations as they become available) directly to the worker.
3166
+ message TaskGetCommandRouterAccessRequest {
3167
+ string task_id = 1;
3168
+ }
3169
+
3170
+ message TaskGetCommandRouterAccessResponse {
3171
+ string jwt = 1;
3172
+ string url = 2;
3173
+ }
3174
+
2889
3175
  message TaskInfo {
2890
3176
  string id = 1;
2891
3177
  double started_at = 2;
@@ -2894,6 +3180,8 @@ message TaskInfo {
2894
3180
  double enqueued_at = 5;
2895
3181
  string gpu_type = 6;
2896
3182
  string sandbox_id = 7;
3183
+ TaskSnapshotBehavior snapshot_behavior = 8;
3184
+ GPUConfig gpu_config = 9;
2897
3185
  }
2898
3186
 
2899
3187
  message TaskListRequest {
@@ -2926,6 +3214,7 @@ message TaskLogsBatch {
2926
3214
  bool eof = 14;
2927
3215
  string pty_exec_id = 15; // Used for interactive functions
2928
3216
  string root_function_id = 16;
3217
+ uint32 ttl_days = 17;
2929
3218
  }
2930
3219
 
2931
3220
  message TaskProgress {
@@ -3016,10 +3305,16 @@ message UploadUrlList {
3016
3305
  repeated string items = 1;
3017
3306
  }
3018
3307
 
3308
+ // Used for capturing context about an action performed by a user
3309
+ message UserActionInfo {
3310
+ string user_id = 1;
3311
+ double timestamp = 2;
3312
+ }
3313
+
3019
3314
  message VolumeCommitRequest {
3020
3315
  // NOTE(staffan): Mounting a volume in multiple locations is not supported, so volume_id alone uniquely identifies
3021
3316
  // a volume mount.
3022
- string volume_id = 1 [ (modal.options.audit_target_attr) = true ];
3317
+ string volume_id = 1;
3023
3318
  }
3024
3319
 
3025
3320
  message VolumeCommitResponse {
@@ -3077,7 +3372,7 @@ message VolumeGetFileResponse {
3077
3372
  }
3078
3373
 
3079
3374
  message VolumeGetOrCreateRequest {
3080
- string deployment_name = 1 [ (modal.options.audit_target_attr) = true ];
3375
+ string deployment_name = 1;
3081
3376
  reserved 2; // removed namespace
3082
3377
  string environment_name = 3;
3083
3378
  ObjectCreationType object_creation_type = 4;
@@ -3087,7 +3382,7 @@ message VolumeGetOrCreateRequest {
3087
3382
 
3088
3383
  message VolumeGetOrCreateResponse {
3089
3384
  string volume_id = 1;
3090
- VolumeFsVersion version = 2;
3385
+ VolumeFsVersion version = 2; // Not used directly; version is part of the metadata
3091
3386
  VolumeMetadata metadata = 3;
3092
3387
  }
3093
3388
 
@@ -3120,11 +3415,13 @@ message VolumeListFilesResponse {
3120
3415
  message VolumeListItem {
3121
3416
  string label = 1; // app name of object entity app
3122
3417
  string volume_id = 2;
3123
- double created_at = 3;
3418
+ double created_at = 3; // Superseded by metadata, used by clients up to 1.1.2
3419
+ VolumeMetadata metadata = 4;
3124
3420
  }
3125
3421
 
3126
3422
  message VolumeListRequest {
3127
3423
  string environment_name = 1;
3424
+ ListPagination pagination = 2;
3128
3425
  }
3129
3426
 
3130
3427
  message VolumeListResponse {
@@ -3134,6 +3431,8 @@ message VolumeListResponse {
3134
3431
 
3135
3432
  message VolumeMetadata {
3136
3433
  VolumeFsVersion version = 1;
3434
+ string name = 2;
3435
+ CreationInfo creation_info = 3;
3137
3436
  }
3138
3437
 
3139
3438
  message VolumeMount {
@@ -3225,19 +3524,19 @@ message VolumeReloadRequest {
3225
3524
  }
3226
3525
 
3227
3526
  message VolumeRemoveFile2Request {
3228
- string volume_id = 1 [ (modal.options.audit_target_attr) = true ];
3527
+ string volume_id = 1;
3229
3528
  string path = 2;
3230
3529
  bool recursive = 3;
3231
3530
  }
3232
3531
 
3233
3532
  message VolumeRemoveFileRequest {
3234
- string volume_id = 1 [ (modal.options.audit_target_attr) = true ];
3533
+ string volume_id = 1;
3235
3534
  string path = 2;
3236
3535
  bool recursive = 3;
3237
3536
  }
3238
3537
 
3239
3538
  message VolumeRenameRequest {
3240
- string volume_id = 1 [ (modal.options.audit_target_attr) = true ];
3539
+ string volume_id = 1;
3241
3540
  string name = 2;
3242
3541
  }
3243
3542
 
@@ -3261,13 +3560,31 @@ message WebUrlInfo {
3261
3560
  message WebhookConfig {
3262
3561
  WebhookType type = 1;
3263
3562
  string method = 2;
3264
- string requested_suffix = 4;
3563
+ string requested_suffix = 4; // User-supplied "label" component of URL
3265
3564
  WebhookAsyncMode async_mode = 5;
3266
3565
  repeated CustomDomainConfig custom_domains = 6;
3267
3566
  uint32 web_server_port = 7;
3268
3567
  float web_server_startup_timeout = 8;
3269
3568
  bool web_endpoint_docs = 9;
3270
3569
  bool requires_proxy_auth = 10;
3570
+ string ephemeral_suffix = 11; // Additional URL suffix added for ephemeral Apps
3571
+ }
3572
+
3573
+ message WorkspaceBillingReportItem {
3574
+ string object_id = 1;
3575
+ string description = 2;
3576
+ string environment_name = 3;
3577
+ google.protobuf.Timestamp interval = 4;
3578
+ string cost = 5;
3579
+ map<string, string> tags = 6;
3580
+ }
3581
+
3582
+ message WorkspaceBillingReportRequest {
3583
+ // Workspace ID will be implicit in the request metadata
3584
+ google.protobuf.Timestamp start_timestamp = 1;
3585
+ google.protobuf.Timestamp end_timestamp = 2;
3586
+ string resolution = 3; // e.g. 'd' or 'h'; server defines what we accept
3587
+ repeated string tag_names = 4;
3271
3588
  }
3272
3589
 
3273
3590
  message WorkspaceNameLookupResponse {
@@ -3287,17 +3604,17 @@ service ModalClient {
3287
3604
  rpc AppGetLogs(AppGetLogsRequest) returns (stream TaskLogsBatch);
3288
3605
  rpc AppGetObjects(AppGetObjectsRequest) returns (AppGetObjectsResponse);
3289
3606
  rpc AppGetOrCreate(AppGetOrCreateRequest) returns (AppGetOrCreateResponse);
3607
+ rpc AppGetTags(AppGetTagsRequest) returns (AppGetTagsResponse);
3290
3608
  rpc AppHeartbeat(AppHeartbeatRequest) returns (google.protobuf.Empty);
3291
3609
  rpc AppList(AppListRequest) returns (AppListResponse);
3292
3610
  rpc AppLookup(AppLookupRequest) returns (AppLookupResponse);
3293
3611
  rpc AppPublish(AppPublishRequest) returns (AppPublishResponse);
3294
3612
  rpc AppRollback(AppRollbackRequest) returns (google.protobuf.Empty);
3295
3613
  rpc AppSetObjects(AppSetObjectsRequest) returns (google.protobuf.Empty);
3614
+ rpc AppSetTags(AppSetTagsRequest) returns (google.protobuf.Empty);
3296
3615
  rpc AppStop(AppStopRequest) returns (google.protobuf.Empty);
3297
3616
 
3298
3617
  // Input Plane
3299
- // These RPCs are experimental, not deployed to production, and can be changed / removed
3300
- // without needing to worry about backwards compatibility.
3301
3618
  rpc AttemptAwait(AttemptAwaitRequest) returns (AttemptAwaitResponse);
3302
3619
  rpc AttemptRetry(AttemptRetryRequest) returns (AttemptRetryResponse);
3303
3620
  rpc AttemptStart(AttemptStartRequest) returns (AttemptStartResponse);
@@ -3363,16 +3680,19 @@ service ModalClient {
3363
3680
  rpc FlashContainerDeregister(FlashContainerDeregisterRequest) returns (google.protobuf.Empty);
3364
3681
  rpc FlashContainerList(FlashContainerListRequest) returns (FlashContainerListResponse);
3365
3682
  rpc FlashContainerRegister(FlashContainerRegisterRequest) returns (FlashContainerRegisterResponse);
3683
+ rpc FlashSetTargetSlotsMetrics(FlashSetTargetSlotsMetricsRequest) returns (FlashSetTargetSlotsMetricsResponse);
3366
3684
 
3367
3685
  // Functions
3368
3686
  rpc FunctionAsyncInvoke(FunctionAsyncInvokeRequest) returns (FunctionAsyncInvokeResponse);
3369
3687
  rpc FunctionBindParams(FunctionBindParamsRequest) returns (FunctionBindParamsResponse);
3370
3688
  rpc FunctionCallCancel(FunctionCallCancelRequest) returns (google.protobuf.Empty);
3689
+ rpc FunctionCallFromId(FunctionCallFromIdRequest) returns (FunctionCallFromIdResponse);
3371
3690
  rpc FunctionCallGetDataIn(FunctionCallGetDataRequest) returns (stream DataChunk);
3372
3691
  rpc FunctionCallGetDataOut(FunctionCallGetDataRequest) returns (stream DataChunk);
3373
3692
  rpc FunctionCallList(FunctionCallListRequest) returns (FunctionCallListResponse);
3374
3693
  rpc FunctionCallPutDataOut(FunctionCallPutDataRequest) returns (google.protobuf.Empty);
3375
3694
  rpc FunctionCreate(FunctionCreateRequest) returns (FunctionCreateResponse);
3695
+ rpc FunctionFinishInputs(FunctionFinishInputsRequest) returns (google.protobuf.Empty); // For map RPCs, to signal that all inputs have been sent
3376
3696
  rpc FunctionGet(FunctionGetRequest) returns (FunctionGetResponse);
3377
3697
  rpc FunctionGetCallGraph(FunctionGetCallGraphRequest) returns (FunctionGetCallGraphResponse);
3378
3698
  rpc FunctionGetCurrentStats(FunctionGetCurrentStatsRequest) returns (FunctionStats);
@@ -3389,10 +3709,16 @@ service ModalClient {
3389
3709
  rpc FunctionUpdateSchedulingParams(FunctionUpdateSchedulingParamsRequest) returns (FunctionUpdateSchedulingParamsResponse);
3390
3710
 
3391
3711
  // Images
3712
+ rpc ImageDelete(ImageDeleteRequest) returns (google.protobuf.Empty);
3392
3713
  rpc ImageFromId(ImageFromIdRequest) returns (ImageFromIdResponse);
3393
3714
  rpc ImageGetOrCreate(ImageGetOrCreateRequest) returns (ImageGetOrCreateResponse);
3394
3715
  rpc ImageJoinStreaming(ImageJoinStreamingRequest) returns (stream ImageJoinStreamingResponse);
3395
3716
 
3717
+ // Input Plane Map
3718
+ rpc MapAwait(MapAwaitRequest) returns (MapAwaitResponse);
3719
+ rpc MapCheckInputs(MapCheckInputsRequest) returns (MapCheckInputsResponse);
3720
+ rpc MapStartOrContinue(MapStartOrContinueRequest) returns (MapStartOrContinueResponse);
3721
+
3396
3722
  // Mounts
3397
3723
  rpc MountGetOrCreate(MountGetOrCreateRequest) returns (MountGetOrCreateResponse);
3398
3724
  rpc MountPutFile(MountPutFileRequest) returns (MountPutFileResponse);
@@ -3422,6 +3748,7 @@ service ModalClient {
3422
3748
 
3423
3749
  // Sandboxes
3424
3750
  rpc SandboxCreate(SandboxCreateRequest) returns (SandboxCreateResponse);
3751
+ rpc SandboxCreateConnectToken(SandboxCreateConnectTokenRequest) returns (SandboxCreateConnectTokenResponse);
3425
3752
  rpc SandboxGetFromName(SandboxGetFromNameRequest) returns (SandboxGetFromNameResponse);
3426
3753
  rpc SandboxGetLogs(SandboxGetLogsRequest) returns (stream TaskLogsBatch);
3427
3754
  rpc SandboxGetResourceUsage(SandboxGetResourceUsageRequest) returns (SandboxGetResourceUsageResponse);
@@ -3431,9 +3758,12 @@ service ModalClient {
3431
3758
  rpc SandboxRestore(SandboxRestoreRequest) returns (SandboxRestoreResponse);
3432
3759
  rpc SandboxSnapshot(SandboxSnapshotRequest) returns (SandboxSnapshotResponse);
3433
3760
  rpc SandboxSnapshotFs(SandboxSnapshotFsRequest) returns (SandboxSnapshotFsResponse);
3761
+ rpc SandboxSnapshotFsAsync(SandboxSnapshotFsAsyncRequest) returns (SandboxSnapshotFsAsyncResponse);
3762
+ rpc SandboxSnapshotFsAsyncGet(SandboxSnapshotFsAsyncGetRequest) returns (SandboxSnapshotFsResponse);
3434
3763
  rpc SandboxSnapshotGet(SandboxSnapshotGetRequest) returns (SandboxSnapshotGetResponse);
3435
3764
  rpc SandboxSnapshotWait(SandboxSnapshotWaitRequest) returns (SandboxSnapshotWaitResponse);
3436
3765
  rpc SandboxStdinWrite(SandboxStdinWriteRequest) returns (SandboxStdinWriteResponse);
3766
+ rpc SandboxTagsGet(SandboxTagsGetRequest) returns (SandboxTagsGetResponse);
3437
3767
  rpc SandboxTagsSet(SandboxTagsSetRequest) returns (google.protobuf.Empty);
3438
3768
  rpc SandboxTerminate(SandboxTerminateRequest) returns (SandboxTerminateResponse);
3439
3769
  rpc SandboxWait(SandboxWaitRequest) returns (SandboxWaitResponse);
@@ -3457,6 +3787,7 @@ service ModalClient {
3457
3787
  // Tasks
3458
3788
  rpc TaskClusterHello(TaskClusterHelloRequest) returns (TaskClusterHelloResponse);
3459
3789
  rpc TaskCurrentInputs(google.protobuf.Empty) returns (TaskCurrentInputsResponse);
3790
+ rpc TaskGetCommandRouterAccess(TaskGetCommandRouterAccessRequest) returns (TaskGetCommandRouterAccessResponse);
3460
3791
  rpc TaskList(TaskListRequest) returns (TaskListResponse);
3461
3792
  rpc TaskResult(TaskResultRequest) returns (google.protobuf.Empty);
3462
3793
 
@@ -3488,5 +3819,6 @@ service ModalClient {
3488
3819
  rpc VolumeRename(VolumeRenameRequest) returns (google.protobuf.Empty);
3489
3820
 
3490
3821
  // Workspaces
3822
+ rpc WorkspaceBillingReport(WorkspaceBillingReportRequest) returns (stream WorkspaceBillingReportItem);
3491
3823
  rpc WorkspaceNameLookup(google.protobuf.Empty) returns (WorkspaceNameLookupResponse);
3492
3824
  }