modal 0.62.16__py3-none-any.whl → 0.72.11__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 (220) hide show
  1. modal/__init__.py +17 -13
  2. modal/__main__.py +41 -3
  3. modal/_clustered_functions.py +80 -0
  4. modal/_clustered_functions.pyi +22 -0
  5. modal/_container_entrypoint.py +420 -937
  6. modal/_ipython.py +3 -13
  7. modal/_location.py +17 -10
  8. modal/_output.py +243 -99
  9. modal/_pty.py +2 -2
  10. modal/_resolver.py +55 -59
  11. modal/_resources.py +51 -0
  12. modal/_runtime/__init__.py +1 -0
  13. modal/_runtime/asgi.py +519 -0
  14. modal/_runtime/container_io_manager.py +1036 -0
  15. modal/_runtime/execution_context.py +89 -0
  16. modal/_runtime/telemetry.py +169 -0
  17. modal/_runtime/user_code_imports.py +356 -0
  18. modal/_serialization.py +134 -9
  19. modal/_traceback.py +47 -187
  20. modal/_tunnel.py +52 -16
  21. modal/_tunnel.pyi +19 -36
  22. modal/_utils/app_utils.py +3 -17
  23. modal/_utils/async_utils.py +479 -100
  24. modal/_utils/blob_utils.py +157 -186
  25. modal/_utils/bytes_io_segment_payload.py +97 -0
  26. modal/_utils/deprecation.py +89 -0
  27. modal/_utils/docker_utils.py +98 -0
  28. modal/_utils/function_utils.py +460 -171
  29. modal/_utils/grpc_testing.py +47 -31
  30. modal/_utils/grpc_utils.py +62 -109
  31. modal/_utils/hash_utils.py +61 -19
  32. modal/_utils/http_utils.py +39 -9
  33. modal/_utils/logger.py +2 -1
  34. modal/_utils/mount_utils.py +34 -16
  35. modal/_utils/name_utils.py +58 -0
  36. modal/_utils/package_utils.py +14 -1
  37. modal/_utils/pattern_utils.py +205 -0
  38. modal/_utils/rand_pb_testing.py +5 -7
  39. modal/_utils/shell_utils.py +15 -49
  40. modal/_vendor/a2wsgi_wsgi.py +62 -72
  41. modal/_vendor/cloudpickle.py +1 -1
  42. modal/_watcher.py +14 -12
  43. modal/app.py +1003 -314
  44. modal/app.pyi +540 -264
  45. modal/call_graph.py +7 -6
  46. modal/cli/_download.py +63 -53
  47. modal/cli/_traceback.py +200 -0
  48. modal/cli/app.py +205 -45
  49. modal/cli/config.py +12 -5
  50. modal/cli/container.py +62 -14
  51. modal/cli/dict.py +128 -0
  52. modal/cli/entry_point.py +26 -13
  53. modal/cli/environment.py +40 -9
  54. modal/cli/import_refs.py +64 -58
  55. modal/cli/launch.py +32 -18
  56. modal/cli/network_file_system.py +64 -83
  57. modal/cli/profile.py +1 -1
  58. modal/cli/programs/run_jupyter.py +35 -10
  59. modal/cli/programs/vscode.py +60 -10
  60. modal/cli/queues.py +131 -0
  61. modal/cli/run.py +234 -131
  62. modal/cli/secret.py +8 -7
  63. modal/cli/token.py +7 -2
  64. modal/cli/utils.py +79 -10
  65. modal/cli/volume.py +110 -109
  66. modal/client.py +250 -144
  67. modal/client.pyi +157 -118
  68. modal/cloud_bucket_mount.py +108 -34
  69. modal/cloud_bucket_mount.pyi +32 -38
  70. modal/cls.py +535 -148
  71. modal/cls.pyi +190 -146
  72. modal/config.py +41 -19
  73. modal/container_process.py +177 -0
  74. modal/container_process.pyi +82 -0
  75. modal/dict.py +111 -65
  76. modal/dict.pyi +136 -131
  77. modal/environments.py +106 -5
  78. modal/environments.pyi +77 -25
  79. modal/exception.py +34 -43
  80. modal/experimental.py +61 -2
  81. modal/extensions/ipython.py +5 -5
  82. modal/file_io.py +537 -0
  83. modal/file_io.pyi +235 -0
  84. modal/file_pattern_matcher.py +197 -0
  85. modal/functions.py +906 -911
  86. modal/functions.pyi +466 -430
  87. modal/gpu.py +57 -44
  88. modal/image.py +1089 -479
  89. modal/image.pyi +584 -228
  90. modal/io_streams.py +434 -0
  91. modal/io_streams.pyi +122 -0
  92. modal/mount.py +314 -101
  93. modal/mount.pyi +241 -235
  94. modal/network_file_system.py +92 -92
  95. modal/network_file_system.pyi +152 -110
  96. modal/object.py +67 -36
  97. modal/object.pyi +166 -143
  98. modal/output.py +63 -0
  99. modal/parallel_map.py +434 -0
  100. modal/parallel_map.pyi +75 -0
  101. modal/partial_function.py +282 -117
  102. modal/partial_function.pyi +222 -129
  103. modal/proxy.py +15 -12
  104. modal/proxy.pyi +3 -8
  105. modal/queue.py +182 -65
  106. modal/queue.pyi +218 -118
  107. modal/requirements/2024.04.txt +29 -0
  108. modal/requirements/2024.10.txt +16 -0
  109. modal/requirements/README.md +21 -0
  110. modal/requirements/base-images.json +22 -0
  111. modal/retries.py +48 -7
  112. modal/runner.py +459 -156
  113. modal/runner.pyi +135 -71
  114. modal/running_app.py +38 -0
  115. modal/sandbox.py +514 -236
  116. modal/sandbox.pyi +397 -169
  117. modal/schedule.py +4 -4
  118. modal/scheduler_placement.py +20 -3
  119. modal/secret.py +56 -31
  120. modal/secret.pyi +62 -42
  121. modal/serving.py +51 -56
  122. modal/serving.pyi +44 -36
  123. modal/stream_type.py +15 -0
  124. modal/token_flow.py +5 -3
  125. modal/token_flow.pyi +37 -32
  126. modal/volume.py +285 -157
  127. modal/volume.pyi +249 -184
  128. {modal-0.62.16.dist-info → modal-0.72.11.dist-info}/METADATA +7 -7
  129. modal-0.72.11.dist-info/RECORD +174 -0
  130. {modal-0.62.16.dist-info → modal-0.72.11.dist-info}/top_level.txt +0 -1
  131. modal_docs/gen_reference_docs.py +3 -1
  132. modal_docs/mdmd/mdmd.py +0 -1
  133. modal_docs/mdmd/signatures.py +5 -2
  134. modal_global_objects/images/base_images.py +28 -0
  135. modal_global_objects/mounts/python_standalone.py +2 -2
  136. modal_proto/__init__.py +1 -1
  137. modal_proto/api.proto +1288 -533
  138. modal_proto/api_grpc.py +856 -456
  139. modal_proto/api_pb2.py +2165 -1157
  140. modal_proto/api_pb2.pyi +8859 -0
  141. modal_proto/api_pb2_grpc.py +1674 -855
  142. modal_proto/api_pb2_grpc.pyi +1416 -0
  143. modal_proto/modal_api_grpc.py +149 -0
  144. modal_proto/modal_options_grpc.py +3 -0
  145. modal_proto/options_pb2.pyi +20 -0
  146. modal_proto/options_pb2_grpc.pyi +7 -0
  147. modal_proto/py.typed +0 -0
  148. modal_version/__init__.py +1 -1
  149. modal_version/_version_generated.py +2 -2
  150. modal/_asgi.py +0 -370
  151. modal/_container_entrypoint.pyi +0 -378
  152. modal/_container_exec.py +0 -128
  153. modal/_sandbox_shell.py +0 -49
  154. modal/shared_volume.py +0 -23
  155. modal/shared_volume.pyi +0 -24
  156. modal/stub.py +0 -783
  157. modal/stub.pyi +0 -332
  158. modal-0.62.16.dist-info/RECORD +0 -198
  159. modal_global_objects/images/conda.py +0 -15
  160. modal_global_objects/images/debian_slim.py +0 -15
  161. modal_global_objects/images/micromamba.py +0 -15
  162. test/__init__.py +0 -1
  163. test/aio_test.py +0 -12
  164. test/async_utils_test.py +0 -262
  165. test/blob_test.py +0 -67
  166. test/cli_imports_test.py +0 -149
  167. test/cli_test.py +0 -659
  168. test/client_test.py +0 -194
  169. test/cls_test.py +0 -630
  170. test/config_test.py +0 -137
  171. test/conftest.py +0 -1420
  172. test/container_app_test.py +0 -32
  173. test/container_test.py +0 -1389
  174. test/cpu_test.py +0 -23
  175. test/decorator_test.py +0 -85
  176. test/deprecation_test.py +0 -34
  177. test/dict_test.py +0 -33
  178. test/e2e_test.py +0 -68
  179. test/error_test.py +0 -7
  180. test/function_serialization_test.py +0 -32
  181. test/function_test.py +0 -653
  182. test/function_utils_test.py +0 -101
  183. test/gpu_test.py +0 -159
  184. test/grpc_utils_test.py +0 -141
  185. test/helpers.py +0 -42
  186. test/image_test.py +0 -669
  187. test/live_reload_test.py +0 -80
  188. test/lookup_test.py +0 -70
  189. test/mdmd_test.py +0 -329
  190. test/mount_test.py +0 -162
  191. test/mounted_files_test.py +0 -329
  192. test/network_file_system_test.py +0 -181
  193. test/notebook_test.py +0 -66
  194. test/object_test.py +0 -41
  195. test/package_utils_test.py +0 -25
  196. test/queue_test.py +0 -97
  197. test/resolver_test.py +0 -58
  198. test/retries_test.py +0 -67
  199. test/runner_test.py +0 -85
  200. test/sandbox_test.py +0 -191
  201. test/schedule_test.py +0 -15
  202. test/scheduler_placement_test.py +0 -29
  203. test/secret_test.py +0 -78
  204. test/serialization_test.py +0 -42
  205. test/stub_composition_test.py +0 -10
  206. test/stub_test.py +0 -360
  207. test/test_asgi_wrapper.py +0 -234
  208. test/token_flow_test.py +0 -18
  209. test/traceback_test.py +0 -135
  210. test/tunnel_test.py +0 -29
  211. test/utils_test.py +0 -88
  212. test/version_test.py +0 -14
  213. test/volume_test.py +0 -341
  214. test/watcher_test.py +0 -30
  215. test/webhook_test.py +0 -146
  216. /modal/{requirements.312.txt → requirements/2023.12.312.txt} +0 -0
  217. /modal/{requirements.txt → requirements/2023.12.txt} +0 -0
  218. {modal-0.62.16.dist-info → modal-0.72.11.dist-info}/LICENSE +0 -0
  219. {modal-0.62.16.dist-info → modal-0.72.11.dist-info}/WHEEL +0 -0
  220. {modal-0.62.16.dist-info → modal-0.72.11.dist-info}/entry_points.txt +0 -0
modal_proto/api.proto CHANGED
@@ -18,6 +18,7 @@ enum AppDisconnectReason {
18
18
  APP_DISCONNECT_REASON_KEYBOARD_INTERRUPT = 2;
19
19
  APP_DISCONNECT_REASON_ENTRYPOINT_COMPLETED = 3;
20
20
  APP_DISCONNECT_REASON_DEPLOYMENT_EXCEPTION = 4;
21
+ APP_DISCONNECT_REASON_REMOTE_EXCEPTION = 5;
21
22
  }
22
23
 
23
24
  // NOTE: make sure to update the frontend if we add a new state here
@@ -49,7 +50,7 @@ enum AppState {
49
50
  APP_STATE_DETACHED_DISCONNECTED = 8;
50
51
 
51
52
  // App is derived from another workspace. Acts as a static, immutable group of functions.
52
- APP_STATE_DERIVED = 9;
53
+ APP_STATE_DERIVED = 9 [deprecated=true];
53
54
  }
54
55
 
55
56
  enum AppStopSource {
@@ -77,37 +78,29 @@ enum CheckpointStatus {
77
78
  enum ClientType {
78
79
  CLIENT_TYPE_UNSPECIFIED = 0;
79
80
  CLIENT_TYPE_CLIENT = 1;
80
- CLIENT_TYPE_WORKER = 2 [deprecated=true];
81
+ CLIENT_TYPE_WORKER = 2;
81
82
  CLIENT_TYPE_CONTAINER = 3;
82
- CLIENT_TYPE_SERVER = 4 [deprecated=true];
83
83
  CLIENT_TYPE_WEB_SERVER = 5;
84
84
  }
85
85
 
86
- message CloudBucketMount {
87
- string bucket_name = 1;
88
- string mount_path = 2;
89
- string credentials_secret_id = 3;
90
- bool read_only = 4;
91
- bool requester_pays = 6;
92
-
93
- enum BucketType {
94
- UNSPECIFIED = 0;
95
- S3 = 1;
96
- }
97
- BucketType bucket_type = 5;
98
- }
99
-
100
86
  enum CloudProvider {
101
87
  CLOUD_PROVIDER_UNSPECIFIED = 0;
102
88
  CLOUD_PROVIDER_AWS = 1;
103
89
  CLOUD_PROVIDER_GCP = 2;
104
90
  CLOUD_PROVIDER_AUTO = 3;
105
91
  CLOUD_PROVIDER_OCI = 4;
92
+ reserved 5, 6, 7, 8; // now unused internal experimental values
93
+ }
94
+
95
+ enum DNSRecordType {
96
+ DNS_RECORD_TYPE_A = 0;
97
+ DNS_RECORD_TYPE_TXT = 1;
98
+ DNS_RECORD_TYPE_CNAME = 2;
106
99
  }
107
100
 
108
101
  // Which data format a binary message is encoded with.
109
102
  enum DataFormat {
110
- DATA_FORMAT_UNSPECIFIED = 0; // Equivalent to PICKLE in client version 0.52 and earlier.
103
+ DATA_FORMAT_UNSPECIFIED = 0;
111
104
  DATA_FORMAT_PICKLE = 1; // Cloudpickle
112
105
  DATA_FORMAT_ASGI = 2; // "Asgi" protobuf message
113
106
  DATA_FORMAT_GENERATOR_DONE = 3; // "GeneratorDone" protobuf message
@@ -119,10 +112,11 @@ enum DeploymentNamespace {
119
112
  DEPLOYMENT_NAMESPACE_GLOBAL = 3;
120
113
  }
121
114
 
122
- enum DNSRecordType {
123
- DNS_RECORD_TYPE_A = 0;
124
- DNS_RECORD_TYPE_TXT = 1;
125
- DNS_RECORD_TYPE_CNAME = 2;
115
+ enum ExecOutputOption {
116
+ EXEC_OUTPUT_OPTION_UNSPECIFIED = 0;
117
+ EXEC_OUTPUT_OPTION_DEVNULL = 1;
118
+ EXEC_OUTPUT_OPTION_PIPE = 2;
119
+ EXEC_OUTPUT_OPTION_STDOUT = 3;
126
120
  }
127
121
 
128
122
  enum FileDescriptor {
@@ -132,6 +126,14 @@ enum FileDescriptor {
132
126
  FILE_DESCRIPTOR_INFO = 3;
133
127
  }
134
128
 
129
+ enum FunctionCallInvocationType {
130
+ FUNCTION_CALL_INVOCATION_TYPE_UNSPECIFIED = 0;
131
+ FUNCTION_CALL_INVOCATION_TYPE_SYNC_LEGACY = 1;
132
+ FUNCTION_CALL_INVOCATION_TYPE_ASYNC_LEGACY = 2;
133
+ FUNCTION_CALL_INVOCATION_TYPE_ASYNC = 3;
134
+ FUNCTION_CALL_INVOCATION_TYPE_SYNC = 4;
135
+ }
136
+
135
137
  enum FunctionCallType {
136
138
  FUNCTION_CALL_TYPE_UNSPECIFIED = 0;
137
139
  FUNCTION_CALL_TYPE_UNARY = 1;
@@ -144,12 +146,11 @@ enum GPUType {
144
146
  GPU_TYPE_A100 = 2;
145
147
  GPU_TYPE_A10G = 3;
146
148
  GPU_TYPE_ANY = 4;
147
- GPU_TYPE_A100_20G = 5 [deprecated=true];
148
- GPU_TYPE_A100_40GB_MANY = 6 [deprecated=true];
149
- GPU_TYPE_INFERENTIA2 = 7 [deprecated=true];
150
149
  GPU_TYPE_A100_80GB = 8;
151
150
  GPU_TYPE_L4 = 9;
152
151
  GPU_TYPE_H100 = 10;
152
+ GPU_TYPE_L40S = 11;
153
+ GPU_TYPE_H200 = 12;
153
154
  }
154
155
 
155
156
  enum ObjectCreationType {
@@ -161,11 +162,31 @@ enum ObjectCreationType {
161
162
  OBJECT_CREATION_TYPE_EPHEMERAL = 5;
162
163
  }
163
164
 
165
+ enum ParameterType {
166
+ PARAM_TYPE_UNSPECIFIED = 0;
167
+ PARAM_TYPE_STRING = 1;
168
+ PARAM_TYPE_INT = 2;
169
+ }
170
+
164
171
  enum ProgressType {
165
172
  IMAGE_SNAPSHOT_UPLOAD = 0; // TODO(erikbern): shouldn't be zero, and needs prefix
166
173
  FUNCTION_QUEUED = 1; // TODO(erikbern): needs_prefix
167
174
  }
168
175
 
176
+ enum ProxyIpStatus {
177
+ PROXY_IP_STATUS_UNSPECIFIED = 0;
178
+ PROXY_IP_STATUS_CREATING = 1;
179
+ PROXY_IP_STATUS_ONLINE = 2;
180
+ PROXY_IP_STATUS_TERMINATED = 3;
181
+ PROXY_IP_STATUS_UNHEALTHY = 4;
182
+ }
183
+
184
+ enum ProxyType {
185
+ PROXY_TYPE_UNSPECIFIED = 0;
186
+ PROXY_TYPE_LEGACY = 1;
187
+ PROXY_TYPE_VPROX = 2;
188
+ }
189
+
169
190
  enum RateLimitInterval {
170
191
  RATE_LIMIT_INTERVAL_UNSPECIFIED = 0;
171
192
  RATE_LIMIT_INTERVAL_SECOND = 1;
@@ -180,6 +201,29 @@ enum RegistryAuthType {
180
201
  REGISTRY_AUTH_TYPE_STATIC_CREDS = 4;
181
202
  }
182
203
 
204
+ enum SeekWhence {
205
+ SEEK_SET = 0;
206
+ SEEK_CUR = 1;
207
+ SEEK_END = 2;
208
+ }
209
+
210
+ enum SystemErrorCode {
211
+ SYSTEM_ERROR_CODE_UNSPECIFIED = 0;
212
+ SYSTEM_ERROR_CODE_PERM = 1; // EPERM: Operation not permitted
213
+ SYSTEM_ERROR_CODE_NOENT = 2; // ENOENT: No such file or directory
214
+ SYSTEM_ERROR_CODE_IO = 5; // EIO: Input/output error
215
+ SYSTEM_ERROR_CODE_NXIO = 6; // ENXIO: No such device or address
216
+ SYSTEM_ERROR_CODE_NOMEM = 12; // ENOMEM: Out of memory
217
+ SYSTEM_ERROR_CODE_ACCES = 13; // EACCES: Permission denied
218
+ SYSTEM_ERROR_CODE_EXIST = 17; // EEXIST: File exists
219
+ SYSTEM_ERROR_CODE_NOTDIR = 20; // ENOTDIR: Not a directory
220
+ SYSTEM_ERROR_CODE_ISDIR = 21; // EISDIR: Is a directory
221
+ SYSTEM_ERROR_CODE_INVAL = 22; // EINVAL: Invalid argument
222
+ SYSTEM_ERROR_CODE_MFILE = 24; // EMFILE: Too many open files
223
+ SYSTEM_ERROR_CODE_FBIG = 27; // EFBIG: File too large
224
+ SYSTEM_ERROR_CODE_NOSPC = 28; // ENOSPC: No space left on device
225
+ }
226
+
183
227
  enum TaskState {
184
228
  TASK_STATE_UNSPECIFIED = 0;
185
229
  TASK_STATE_CREATED = 6;
@@ -195,6 +239,20 @@ enum TaskState {
195
239
  TASK_STATE_LOADING_CHECKPOINT_IMAGE = 11;
196
240
  }
197
241
 
242
+ enum VolumeFsVersion {
243
+ VOLUME_FS_VERSION_UNSPECIFIED = 0;
244
+ VOLUME_FS_VERSION_V1 = 1;
245
+ VOLUME_FS_VERSION_V2 = 2;
246
+ }
247
+
248
+ enum WebhookAsyncMode {
249
+ WEBHOOK_ASYNC_MODE_UNSPECIFIED = 0;
250
+ reserved 1; // unused REDIRECT mode
251
+ WEBHOOK_ASYNC_MODE_DISABLED = 2; // No longer used by client
252
+ WEBHOOK_ASYNC_MODE_TRIGGER = 3; // No longer used by client (previously used when wait_for_response=False)
253
+ WEBHOOK_ASYNC_MODE_AUTO = 4; // The default
254
+ }
255
+
198
256
  enum WebhookType {
199
257
  WEBHOOK_TYPE_UNSPECIFIED = 0;
200
258
  WEBHOOK_TYPE_ASGI_APP = 1;
@@ -203,14 +261,6 @@ enum WebhookType {
203
261
  WEBHOOK_TYPE_WEB_SERVER = 4;
204
262
  }
205
263
 
206
- enum WebhookAsyncMode {
207
- WEBHOOK_ASYNC_MODE_UNSPECIFIED = 0;
208
- reserved 1; // unused REDIRECT mode
209
- WEBHOOK_ASYNC_MODE_DISABLED = 2; // no redirect, fail after timeout
210
- WEBHOOK_ASYNC_MODE_TRIGGER = 3; // return immediately, roughly same as old wait_for_response=False
211
- WEBHOOK_ASYNC_MODE_AUTO = 4; // redirect to polling endpoint if execution time nears the http timeout
212
- }
213
-
214
264
  message AppClientDisconnectRequest {
215
265
  string app_id = 1;
216
266
  AppDisconnectReason reason = 2;
@@ -220,46 +270,49 @@ message AppClientDisconnectRequest {
220
270
  message AppCreateRequest {
221
271
  string client_id = 1 [ (modal.options.audit_target_attr) = true ];
222
272
  string description = 2; // Human readable label for the app
223
- bool detach = 3 [deprecated=true]; // replaced by app_state in 0.55.3904
224
- bool initializing = 4 [deprecated=true]; // replaced by app_state in 0.55.3904
225
273
  string environment_name = 5;
226
274
  AppState app_state = 6;
227
275
  }
228
276
 
229
277
  message AppCreateResponse {
230
278
  string app_id = 1;
231
- string app_logs_url = 2;
279
+ string app_page_url = 2;
280
+ string app_logs_url = 3;
232
281
  }
233
282
 
234
- message AppStopRequest {
235
- string app_id = 1 [ (modal.options.audit_target_attr) = true ];
236
- AppStopSource source = 2;
237
- }
238
-
239
-
240
283
  message AppDeployRequest {
241
284
  string app_id = 1 [ (modal.options.audit_target_attr) = true ];
242
285
  DeploymentNamespace namespace = 2;
243
286
  string name = 3;
244
287
  string object_entity = 4;
245
288
  AppDeployVisibility visibility = 5;
289
+ string tag = 6;
246
290
  }
247
291
 
248
292
  message AppDeployResponse {
249
293
  string url = 1;
250
294
  }
251
295
 
252
- message AppDeploySingleObjectRequest {
253
- string name = 1;
254
- DeploymentNamespace namespace = 2;
255
- string environment_name = 3;
256
- string object_id = 4;
296
+ message AppDeploymentHistory {
297
+ string app_id = 1;
298
+ uint32 version = 2;
299
+ string client_version = 3;
300
+ double deployed_at = 4;
301
+ string deployed_by = 5;
302
+ string deployed_by_avatar_url = 9;
303
+ string tag = 6;
304
+ uint32 rollback_version = 7;
305
+ bool rollback_allowed = 8;
257
306
  }
258
307
 
259
- message AppDeploySingleObjectResponse {
308
+ message AppDeploymentHistoryRequest {
260
309
  string app_id = 1;
261
310
  }
262
311
 
312
+ message AppDeploymentHistoryResponse {
313
+ repeated AppDeploymentHistory app_deployment_histories = 1;
314
+ }
315
+
263
316
  message AppGetByDeploymentNameRequest {
264
317
  DeploymentNamespace namespace = 1;
265
318
  string name = 2;
@@ -270,6 +323,14 @@ message AppGetByDeploymentNameResponse {
270
323
  string app_id = 1;
271
324
  }
272
325
 
326
+ message AppGetLayoutRequest {
327
+ string app_id = 1;
328
+ }
329
+
330
+ message AppGetLayoutResponse {
331
+ AppLayout app_layout = 1;
332
+ }
333
+
273
334
  message AppGetLogsRequest {
274
335
  string app_id = 1;
275
336
  float timeout = 2;
@@ -280,44 +341,87 @@ message AppGetLogsRequest {
280
341
  FileDescriptor file_descriptor = 8;
281
342
  }
282
343
 
283
- message AppGetObjectsRequest {
284
- string app_id = 1;
285
- bool include_unindexed = 2;
286
- }
287
-
288
344
  message AppGetObjectsItem {
289
345
  string tag = 1;
290
346
  Object object = 6;
291
347
  }
292
348
 
349
+ message AppGetObjectsRequest {
350
+ string app_id = 1;
351
+ bool include_unindexed = 2;
352
+ bool only_class_function = 3; // True starting with 0.67.x clients, which don't create method placeholder functions
353
+ }
354
+
293
355
  message AppGetObjectsResponse {
294
356
  repeated AppGetObjectsItem items = 2;
295
357
  }
296
358
 
359
+ message AppGetOrCreateRequest {
360
+ string app_name = 1;
361
+ string environment_name = 2;
362
+ ObjectCreationType object_creation_type = 3;
363
+ }
364
+
365
+ message AppGetOrCreateResponse {
366
+ string app_id = 1;
367
+ }
368
+
297
369
  message AppHeartbeatRequest {
298
370
  string app_id = 1;
299
371
  }
300
372
 
373
+ message AppLayout {
374
+ repeated Object objects = 1;
375
+ map<string, string> function_ids = 2; // tag -> function id
376
+ map<string, string> class_ids = 3; // tag -> class id
377
+ }
378
+
301
379
  message AppListRequest {
302
380
  string environment_name = 1;
303
381
  }
304
382
 
305
383
  message AppListResponse {
306
- repeated AppStats apps = 1;
384
+ message AppListItem {
385
+ string app_id = 1;
386
+ string description = 3;
387
+ AppState state = 4;
388
+ double created_at = 5;
389
+ double stopped_at = 6;
390
+ int32 n_running_tasks = 8;
391
+ string name = 10;
392
+ }
393
+ repeated AppListItem apps = 1;
307
394
  }
308
395
 
309
- message AppLookupObjectRequest {
310
- DeploymentNamespace namespace = 2;
311
- string app_name = 3;
312
- string object_tag = 4;
313
- string object_id = 5;
314
- string object_entity = 6;
315
- string environment_name = 7;
396
+ message AppLookupRequest {
397
+ string app_name = 2;
398
+ string environment_name = 3;
316
399
  }
317
400
 
318
- message AppLookupObjectResponse {
319
- Object object = 6;
320
- string app_id = 7;
401
+ message AppLookupResponse {
402
+ string app_id = 1;
403
+ }
404
+
405
+ message AppPublishRequest {
406
+ string app_id = 1 [ (modal.options.audit_target_attr) = true ];
407
+ string name = 2;
408
+ string deployment_tag = 3; // Additional metadata to identify a deployment
409
+ AppState app_state = 4; // Published app will be in this state
410
+ map<string, string> function_ids = 5; // function_name -> function_id
411
+ map<string, string> class_ids = 6; // class_name -> class_id
412
+ map<string, string> definition_ids = 7; // function_id -> definition_id
413
+ uint32 rollback_version = 8; // Unused by client, but used internally
414
+ string client_version = 9; // Unused by client, but used internally
415
+ }
416
+
417
+ message AppPublishResponse {
418
+ string url = 1;
419
+ repeated Warning server_warnings = 3;
420
+ }
421
+
422
+ message AppRollbackRequest {
423
+ string app_id = 1;
424
+ int32 version = 2; // signed as we support negative "roll back n versions" requests
321
425
  }
322
426
 
323
427
  message AppSetObjectsRequest {
@@ -326,19 +430,12 @@ message AppSetObjectsRequest {
326
430
  string client_id = 3;
327
431
  repeated string unindexed_object_ids = 4;
328
432
  AppState new_app_state = 5; // promotes an app from initializing to this new state
329
- string single_object_id = 6;
433
+ reserved 6;
330
434
  }
331
435
 
332
- message AppStats {
333
- string app_id = 1;
334
- string description = 3;
335
- AppState state = 4;
336
- double created_at = 5;
337
- double stopped_at = 6;
338
- int32 n_running_tasks = 8;
339
- string object_entity = 9;
340
- string name = 10;
341
- double deployed_at = 11;
436
+ message AppStopRequest {
437
+ string app_id = 1 [ (modal.options.audit_target_attr) = true ];
438
+ AppStopSource source = 2;
342
439
  }
343
440
 
344
441
  // A web endpoint connection-related message.
@@ -490,16 +587,33 @@ message BlobGetResponse {
490
587
  string download_url = 1;
491
588
  }
492
589
 
590
+ message BuildFunction {
591
+ string definition = 1;
592
+ bytes globals = 2;
593
+ FunctionInput input = 3;
594
+ }
595
+
596
+ message CancelInputEvent {
597
+ repeated string input_ids = 1;
598
+ bool terminate_containers = 2;
599
+ }
600
+
493
601
  message CheckpointInfo {
494
602
  string checksum = 1;
495
603
  CheckpointStatus status = 2;
496
604
  string checkpoint_id = 3;
605
+ string runtime_fingerprint = 4;
606
+ int64 size = 5;
607
+ bool checksum_is_file_index = 6;
608
+ string original_task_id = 7;
497
609
  }
498
610
 
499
611
  message ClassCreateRequest {
500
612
  string app_id = 1 [ (modal.options.audit_target_attr) = true ];
501
613
  string existing_class_id = 2;
502
614
  repeated ClassMethod methods = 3;
615
+ reserved 4; // removed class_function_id
616
+ bool only_class_function = 5; // True starting with 0.67.x clients, which don't create method placeholder functions
503
617
  }
504
618
 
505
619
  message ClassCreateResponse {
@@ -515,15 +629,19 @@ message ClassGetRequest {
515
629
 
516
630
  bool lookup_published = 8; // Lookup class on app published by another workspace
517
631
  string workspace_name = 9;
632
+ bool only_class_function = 10; // True starting with 0.67.x clients, which don't create method placeholder functions
518
633
  }
519
634
 
520
635
  message ClassGetResponse {
521
636
  string class_id = 1;
522
637
  ClassHandleMetadata handle_metadata = 2;
638
+ repeated Warning server_warnings = 3;
523
639
  }
524
640
 
525
641
  message ClassHandleMetadata {
526
642
  repeated ClassMethod methods = 1;
643
+ string class_function_id = 2;
644
+ FunctionHandleMetadata class_function_metadata = 3;
527
645
  }
528
646
 
529
647
  message ClassMethod {
@@ -534,26 +652,67 @@ message ClassMethod {
534
652
  FunctionHandleMetadata function_handle_metadata = 3;
535
653
  }
536
654
 
537
- message ClientCreateRequest {
538
- ClientType client_type = 1 [ (modal.options.audit_target_attr) = true ];
539
- string version = 2;
655
+ message ClassParameterInfo {
656
+ enum ParameterSerializationFormat {
657
+ PARAM_SERIALIZATION_FORMAT_UNSPECIFIED = 0;
658
+ PARAM_SERIALIZATION_FORMAT_PICKLE = 1; // legacy format - pickle of (args, kwargs) tuple
659
+ PARAM_SERIALIZATION_FORMAT_PROTO = 2; // new format using api.FunctionParameterSet
660
+ }
661
+ ParameterSerializationFormat format = 1;
662
+ repeated ClassParameterSpec schema = 2; // only set for PARAM_SERIALIZATION_FORMAT_PROTO
663
+ }
664
+
665
+ message ClassParameterSet {
666
+ // NOTE: adding additional *fields* here can invalidate function lookups
667
+ // since we use the serialized message as the bound function identifier
668
+ // for parameter-bound classes. Modify with *caution*
669
+ repeated ClassParameterValue parameters = 1;
670
+ }
671
+
672
+ message ClassParameterSpec {
673
+ string name = 1;
674
+ ParameterType type = 2;
675
+ bool has_default = 3;
676
+ oneof default_oneof {
677
+ string string_default = 4;
678
+ int64 int_default = 5;
679
+ }
540
680
  }
541
681
 
542
- message ClientCreateResponse {
543
- string client_id = 1;
544
- string error = 2;
545
- string deprecation_warning = 3;
682
+ message ClassParameterValue {
683
+ // NOTE: adding additional *fields* here can invalidate function lookups
684
+ // since we use the serialized message as the bound function identifier
685
+ // for parameter-bound classes. Modify with *caution*
686
+ string name = 1;
687
+ ParameterType type = 2;
688
+ oneof value_oneof {
689
+ string string_value = 3;
690
+ int64 int_value = 4;
691
+ }
546
692
  }
547
693
 
548
694
  message ClientHelloResponse {
549
695
  string warning = 1;
550
- string image_builder_version = 2;
696
+ string image_builder_version = 2; // Deprecated, no longer used in client
697
+ repeated Warning server_warnings = 4;
551
698
  }
552
699
 
553
- message ClientHeartbeatRequest {
554
- string client_id = 1;
555
- string current_input_id = 3;
556
- double current_input_started_at = 4;
700
+ message CloudBucketMount {
701
+ enum BucketType {
702
+ UNSPECIFIED = 0;
703
+ S3 = 1;
704
+ R2 = 2;
705
+ GCP = 3;
706
+ }
707
+
708
+ string bucket_name = 1;
709
+ string mount_path = 2;
710
+ string credentials_secret_id = 3;
711
+ bool read_only = 4;
712
+ BucketType bucket_type = 5;
713
+ bool requester_pays = 6;
714
+ optional string bucket_endpoint_url = 7;
715
+ optional string key_prefix = 8;
557
716
  }
558
717
 
559
718
  message ContainerArguments { // This is used to pass data from the worker to the container
@@ -567,24 +726,25 @@ message ContainerArguments { // This is used to pass data from the worker to th
567
726
  string runtime = 11;
568
727
  string environment_name = 13;
569
728
  optional string checkpoint_id = 14;
729
+ AppLayout app_layout = 15;
570
730
  }
571
731
 
572
- message CancelInputEvent {
573
- repeated string input_ids = 1;
574
- }
575
-
576
- message ContainerHeartbeatResponse {
577
- optional CancelInputEvent cancel_input_event = 1;
732
+ message ContainerCheckpointRequest {
733
+ string checkpoint_id = 1;
578
734
  }
579
735
 
580
- message ContainerHeartbeatRequest {
581
- string current_input_id = 1;
582
- double current_input_started_at = 2;
583
- bool supports_graceful_input_cancellation = 3; // implicitly also means we support long polling. Can be removed once v0.57 is no longer supported
736
+ message ContainerExecGetOutputRequest {
737
+ string exec_id = 1;
738
+ float timeout = 2;
739
+ uint64 last_batch_index = 3;
740
+ FileDescriptor file_descriptor = 4;
741
+ // Old clients (up to 0.65.39) expect string output. Newer clients stream raw bytes
742
+ bool get_raw_bytes = 5;
584
743
  }
585
744
 
586
- message ContainerCheckpointRequest {
587
- string checkpoint_id = 1;
745
+ message ContainerExecPutInputRequest {
746
+ string exec_id = 1;
747
+ RuntimeInputMessage input = 2;
588
748
  }
589
749
 
590
750
  message ContainerExecRequest {
@@ -594,21 +754,145 @@ message ContainerExecRequest {
594
754
  // Send SIGTERM to running container on exit of exec command.
595
755
  bool terminate_container_on_exit = 4;
596
756
  bool runtime_debug = 5; // For internal debugging use only.
757
+ ExecOutputOption stdout_output = 6;
758
+ ExecOutputOption stderr_output = 7;
759
+ uint32 timeout_secs = 8;
760
+ optional string workdir = 9;
761
+ repeated string secret_ids = 10;
597
762
  }
598
763
 
599
- message ContainerExecGetOutputRequest {
764
+ message ContainerExecResponse {
765
+ string exec_id = 1;
766
+ }
767
+
768
+ message ContainerExecWaitRequest {
600
769
  string exec_id = 1;
601
770
  float timeout = 2;
602
- uint64 last_batch_index = 3;
603
771
  }
604
772
 
605
- message ContainerExecPutInputRequest {
773
+ message ContainerExecWaitResponse {
774
+ optional int32 exit_code = 1;
775
+ bool completed = 2;
776
+ }
777
+
778
+ message ContainerFileCloseRequest {
779
+ string file_descriptor = 1;
780
+ }
781
+
782
+ message ContainerFileDeleteBytesRequest {
783
+ string file_descriptor = 1;
784
+ optional uint32 start_inclusive = 2;
785
+ optional uint32 end_exclusive = 3;
786
+ }
787
+
788
+ message ContainerFileFlushRequest {
789
+ string file_descriptor = 1;
790
+ }
791
+
792
+ message ContainerFileLsRequest {
793
+ string path = 1;
794
+ }
795
+
796
+ message ContainerFileMkdirRequest {
797
+ string path = 1;
798
+ bool make_parents = 2;
799
+ }
800
+
801
+ message ContainerFileOpenRequest {
802
+ // file descriptor is hydrated when sent from server -> worker
803
+ optional string file_descriptor = 1;
804
+ string path = 2;
805
+ string mode = 3;
806
+ }
807
+
808
+ message ContainerFileReadLineRequest {
809
+ string file_descriptor = 1;
810
+ }
811
+
812
+ message ContainerFileReadRequest {
813
+ string file_descriptor = 1;
814
+ optional uint32 n = 2;
815
+ }
816
+
817
+ message ContainerFileRmRequest {
818
+ string path = 1;
819
+ bool recursive = 2;
820
+ }
821
+
822
+ message ContainerFileSeekRequest {
823
+ string file_descriptor = 1;
824
+ int32 offset = 2;
825
+ SeekWhence whence = 3;
826
+ }
827
+
828
+ message ContainerFileWatchRequest {
829
+ string path = 1;
830
+ bool recursive = 2;
831
+ optional uint64 timeout_secs = 3;
832
+ }
833
+
834
+ message ContainerFileWriteReplaceBytesRequest {
835
+ string file_descriptor = 1;
836
+ bytes data = 2;
837
+ optional uint32 start_inclusive = 3;
838
+ optional uint32 end_exclusive = 4;
839
+ }
840
+
841
+ message ContainerFileWriteRequest {
842
+ string file_descriptor = 1;
843
+ bytes data = 2;
844
+ }
845
+
846
+ message ContainerFilesystemExecGetOutputRequest {
606
847
  string exec_id = 1;
607
- RuntimeInputMessage input = 2;
848
+ float timeout = 2;
608
849
  }
609
850
 
610
- message ContainerExecResponse {
851
+ message ContainerFilesystemExecRequest {
852
+ oneof file_exec_request_oneof {
853
+ ContainerFileOpenRequest file_open_request = 1;
854
+ ContainerFileWriteRequest file_write_request = 2;
855
+ ContainerFileReadRequest file_read_request = 3;
856
+ ContainerFileFlushRequest file_flush_request = 4;
857
+ ContainerFileReadLineRequest file_read_line_request = 5;
858
+ ContainerFileSeekRequest file_seek_request = 6;
859
+ ContainerFileDeleteBytesRequest file_delete_bytes_request = 7;
860
+ ContainerFileWriteReplaceBytesRequest file_write_replace_bytes_request = 8;
861
+ ContainerFileCloseRequest file_close_request = 9;
862
+ ContainerFileLsRequest file_ls_request = 11;
863
+ ContainerFileMkdirRequest file_mkdir_request = 12;
864
+ ContainerFileRmRequest file_rm_request = 13;
865
+ ContainerFileWatchRequest file_watch_request = 14;
866
+ }
867
+ string task_id = 10;
868
+ }
869
+
870
+ message ContainerFilesystemExecResponse {
611
871
  string exec_id = 1;
872
+ // only set when the request opens a new file, i.e., ContainerFileOpenRequest
873
+ optional string file_descriptor = 2;
874
+ }
875
+
876
+ message ContainerHeartbeatRequest {
877
+ bool canceled_inputs_return_outputs = 4; // Bad client version.
878
+ bool canceled_inputs_return_outputs_v2 = 5;
879
+
880
+ reserved 1, 2, 3;
881
+ }
882
+
883
+ message ContainerHeartbeatResponse {
884
+ optional CancelInputEvent cancel_input_event = 1;
885
+ }
886
+
887
+ message ContainerLogRequest {
888
+ repeated TaskLogs logs = 3;
889
+ }
890
+
891
+ message ContainerStopRequest {
892
+ string task_id = 1 [ (modal.options.audit_target_attr) = true ];
893
+ }
894
+
895
+ message ContainerStopResponse {
612
896
  }
613
897
 
614
898
  message CustomDomainConfig {
@@ -619,6 +903,12 @@ message CustomDomainInfo {
619
903
  string url = 1;
620
904
  }
621
905
 
906
+ message DNSRecord {
907
+ DNSRecordType type = 1;
908
+ string name = 2;
909
+ string value = 3;
910
+ }
911
+
622
912
  // Chunks of data that can be streamed in and out of tasks.
623
913
  message DataChunk {
624
914
  DataFormat data_format = 1;
@@ -642,18 +932,25 @@ message DictContainsResponse {
642
932
  bool found = 1;
643
933
  }
644
934
 
645
- message DictCreateRequest { // Will be superseded by DictGetOrCreateRequest
646
- repeated DictEntry data = 1;
647
- string app_id = 2 [ (modal.options.audit_target_attr) = true ];
648
- string existing_dict_id = 3;
935
+ message DictContentsRequest {
936
+ string dict_id = 1;
937
+ // Setting these to True will populate the corresponding field in the response, otherwise it will be null
938
+ // This lets us support the keys/values/items SDK API through one RPC without unnecessary data transfer
939
+ bool keys = 2;
940
+ bool values = 3;
649
941
  }
650
942
 
651
- message DictCreateResponse { // Will be superseded by DictGetOrCreateResponse
943
+ message DictDeleteRequest {
652
944
  string dict_id = 1;
653
945
  }
654
946
 
947
+ message DictEntry {
948
+ bytes key = 1;
949
+ bytes value = 2;
950
+ }
951
+
655
952
  message DictGetOrCreateRequest {
656
- string deployment_name = 1;
953
+ string deployment_name = 1 [ (modal.options.audit_target_attr) = true ];
657
954
  DeploymentNamespace namespace = 2;
658
955
  string environment_name = 3;
659
956
  ObjectCreationType object_creation_type = 4;
@@ -664,11 +961,6 @@ message DictGetOrCreateResponse {
664
961
  string dict_id = 1;
665
962
  }
666
963
 
667
- message DictEntry {
668
- bytes key = 1;
669
- bytes value = 2;
670
- }
671
-
672
964
  message DictGetRequest {
673
965
  string dict_id = 1;
674
966
  bytes key = 2;
@@ -691,6 +983,19 @@ message DictLenResponse {
691
983
  int32 len = 1;
692
984
  }
693
985
 
986
+ message DictListRequest {
987
+ string environment_name = 1;
988
+ }
989
+
990
+ message DictListResponse {
991
+ message DictInfo {
992
+ string name = 1;
993
+ double created_at = 2;
994
+ }
995
+
996
+ repeated DictInfo dicts = 1;
997
+ }
998
+
694
999
  message DictPopRequest {
695
1000
  string dict_id = 1;
696
1001
  bytes key = 2;
@@ -702,17 +1007,27 @@ message DictPopResponse {
702
1007
  }
703
1008
 
704
1009
  message DictUpdateRequest {
705
- string dict_id = 1;
1010
+ string dict_id = 1 [ (modal.options.audit_target_attr) = true ];
706
1011
  repeated DictEntry updates = 2;
707
1012
  }
708
1013
 
709
1014
  message DictUpdateResponse {
710
1015
  }
711
1016
 
712
- message DNSRecord {
713
- DNSRecordType type = 1;
714
- string name = 2;
715
- string value = 3;
1017
+ message Domain {
1018
+ string domain_id = 1;
1019
+ string domain_name = 2;
1020
+ double created_at = 3;
1021
+ CertificateStatus certificate_status = 4;
1022
+ repeated DNSRecord dns_records = 5;
1023
+ };
1024
+
1025
+ message DomainCertificateVerifyRequest {
1026
+ string domain_id = 1;
1027
+ }
1028
+
1029
+ message DomainCertificateVerifyResponse {
1030
+ Domain domain = 1;
716
1031
  }
717
1032
 
718
1033
  message DomainCreateRequest {
@@ -727,57 +1042,76 @@ message DomainCreateResponse {
727
1042
  message DomainListRequest {
728
1043
  }
729
1044
 
730
- message Domain {
731
- string domain_id = 1;
732
- string domain_name = 2;
733
- double created_at = 3;
734
- CertificateStatus certificate_status = 4;
735
- repeated DNSRecord dns_records = 5;
736
- };
737
-
738
1045
  message DomainListResponse {
739
1046
  repeated Domain domains = 1;
740
1047
  }
741
1048
 
742
- message DomainCertificateVerifyRequest {
743
- string domain_id = 1;
1049
+ message EnvironmentCreateRequest {
1050
+ string name = 1 [ (modal.options.audit_target_attr) = true ];
744
1051
  }
745
1052
 
746
- message DomainCertificateVerifyResponse {
747
- Domain domain = 1;
1053
+ message EnvironmentDeleteRequest {
1054
+ string name = 1 [ (modal.options.audit_target_attr) = true ];
748
1055
  }
749
-
750
- message EnvironmentCreateRequest {
751
- string name = 1;
1056
+ message EnvironmentGetOrCreateRequest {
1057
+ string deployment_name = 1 [ (modal.options.audit_target_attr) = true ];
1058
+ ObjectCreationType object_creation_type = 2;
752
1059
  }
753
1060
 
754
- message EnvironmentDeleteRequest {
755
- string name = 1;
1061
+ message EnvironmentGetOrCreateResponse {
1062
+ string environment_id = 1;
1063
+ EnvironmentMetadata metadata = 2;
756
1064
  }
757
1065
 
758
1066
  message EnvironmentListItem {
759
1067
  string name = 1;
760
1068
  string webhook_suffix = 2;
1069
+ double created_at = 3;
1070
+ bool default = 4;
761
1071
  }
762
1072
 
763
1073
  message EnvironmentListResponse {
764
1074
  repeated EnvironmentListItem items = 2;
765
1075
  }
766
1076
 
1077
+ message EnvironmentMetadata{
1078
+ string name = 1;
1079
+ EnvironmentSettings settings = 2;
1080
+ }
1081
+
1082
+ // Environment-scoped settings, with workspace-level defaults.
1083
+ // Note that we use MergeFrom to combine workspace / environment settings,
1084
+ // which will *append* any `repeated` fields!
1085
+ message EnvironmentSettings {
1086
+ string image_builder_version = 1;
1087
+ string webhook_suffix = 2;
1088
+ }
1089
+
767
1090
  message EnvironmentUpdateRequest {
768
- string current_name = 1;
1091
+ string current_name = 1 [ (modal.options.audit_target_attr) = true ];
769
1092
  google.protobuf.StringValue name = 2;
770
1093
  google.protobuf.StringValue web_suffix = 3;
771
1094
  }
772
1095
 
773
- message FunctionCallPutDataRequest {
774
- string function_call_id = 1;
775
- repeated DataChunk data_chunks = 2;
1096
+ // A file entry when listing files in a volume or network file system.
1097
+ message FileEntry {
1098
+ enum FileType {
1099
+ UNSPECIFIED = 0;
1100
+ FILE = 1;
1101
+ DIRECTORY = 2;
1102
+ SYMLINK = 3;
1103
+ }
1104
+ string path = 1;
1105
+ FileType type = 2;
1106
+ uint64 mtime = 3;
1107
+ uint64 size = 4;
776
1108
  }
777
1109
 
778
- message FunctionCallGetDataRequest {
779
- string function_call_id = 1;
780
- uint64 last_index = 2;
1110
+ message FilesystemRuntimeOutputBatch {
1111
+ repeated bytes output = 1;
1112
+ optional SystemErrorMessage error = 2;
1113
+ uint64 batch_index = 3;
1114
+ bool eof = 4;
781
1115
  }
782
1116
 
783
1117
  message Function {
@@ -815,7 +1149,7 @@ message Function {
815
1149
 
816
1150
  uint32 concurrency_limit = 19;
817
1151
 
818
- bool keep_warm = 20;
1152
+ reserved 20; // old fields
819
1153
 
820
1154
  uint32 timeout_secs = 21;
821
1155
 
@@ -834,11 +1168,11 @@ message Function {
834
1168
  // If set, overrides the runtime used by the function, either "runc" or "gvisor".
835
1169
  string runtime = 30;
836
1170
 
837
- string stub_name = 31;
1171
+ string app_name = 31; // Formerly stub_name
838
1172
 
839
1173
  repeated VolumeMount volume_mounts = 33;
840
1174
 
841
- uint32 allow_concurrent_inputs = 34;
1175
+ uint32 target_concurrent_inputs = 34;
842
1176
 
843
1177
  repeated CustomDomainInfo custom_domain_info = 35;
844
1178
 
@@ -866,69 +1200,69 @@ message Function {
866
1200
  repeated S3Mount s3_mounts = 47;
867
1201
  repeated CloudBucketMount cloud_bucket_mounts = 51;
868
1202
 
869
- bool _experimental_boost = 48;
1203
+ reserved 48; // _experimental_boost
870
1204
 
871
1205
  // If set, tasks will be scheduled using the new scheduler, which also knows
872
1206
  // to look at fine-grained placement constraints.
873
- bool _experimental_scheduler = 49;
874
- optional SchedulerPlacement _experimental_scheduler_placement = 50;
875
- }
1207
+ reserved 49; // _experimental_scheduler
1208
+ optional SchedulerPlacement scheduler_placement = 50;
1209
+ reserved 52; // _experimental_scheduler_placement
876
1210
 
877
- message SchedulerPlacement {
878
- // TODO(irfansharif):
879
- // - Fold in cloud, resource needs here too.
880
- // - Allow specifying list of regions, zones, cloud, fallback and alternative
881
- // GPU types.
882
- optional string _region = 1;
883
- optional string _zone = 2;
884
- optional string _lifecycle = 3; // "on-demand" or "spot", else ignored
885
- }
1211
+ bool is_class = 53; // if "Function" is actually a class grouping multiple methods
886
1212
 
887
- message FunctionHandleMetadata {
888
- // contains all the info about a function that is needed to trigger the right
889
- // behaviour when using a FunctionHandler. Notably excludes things purely
890
- // used for *executing* the function in a container entrypoint
1213
+ string use_function_id = 54; // for class methods use this function id instead for invocations - the *referenced* function should have is_class=True
1214
+ string use_method_name = 55; // for class methods - this method name needs to be included in the FunctionInput
891
1215
 
892
- // Should be a subset and use IDs/types from `Function` above
893
- string function_name = 2;
894
- Function.FunctionType function_type = 8;
895
- string web_url = 28;
896
- bool is_method = 39;
897
- }
1216
+ ClassParameterInfo class_parameter_info = 56;
898
1217
 
899
- message FunctionCreateRequest {
900
- Function function = 1;
901
- string app_id = 2 [ (modal.options.audit_target_attr) = true ];
902
- Schedule schedule = 6;
903
- string existing_function_id = 7;
904
- }
1218
+ reserved 57; // _experimental_resources
1219
+ reserved 58;
1220
+ reserved 59;
1221
+ uint32 batch_max_size = 60; // Maximum number of inputs to fetch at once
1222
+ uint64 batch_linger_ms = 61; // Miliseconds to block before a response is needed
1223
+ bool i6pn_enabled = 62;
1224
+ bool _experimental_concurrent_cancellations = 63;
1225
+ uint32 max_concurrent_inputs = 64;
905
1226
 
906
- message FunctionOptions {
907
- repeated string secret_ids = 1;
908
- repeated string mount_ids = 2; // Currently not supported
909
- optional Resources resources = 3;
910
- optional FunctionRetryPolicy retry_policy = 4;
911
- optional uint32 concurrency_limit = 5;
912
- optional uint32 timeout_secs = 6;
913
- optional uint32 task_idle_timeout_secs = 7;
914
- optional uint32 warm_pool_size = 8;
915
- repeated VolumeMount volume_mounts = 9;
916
- optional uint32 allow_concurrent_inputs = 10;
917
- bool replace_volume_mounts = 11;
918
- bool replace_secret_ids = 12;
919
- }
1227
+ // TODO(irfansharif): Remove, once https://github.com/modal-labs/modal/pull/15645 lands.
1228
+ bool _experimental_task_templates_enabled = 65; // forces going through the new gpu-fallbacks integration path, even if no fallback options are specified
1229
+ repeated TaskTemplate _experimental_task_templates = 66; // for fallback options, where the first/most-preferred "template" is derived from fields above
920
1230
 
921
- message FunctionPrecreateRequest {
922
- string app_id = 1;
923
- string function_name = 2 [ (modal.options.audit_target_attr) = true ];
924
- string existing_function_id = 3;
925
- Function.FunctionType function_type = 4;
926
- WebhookConfig webhook_config = 5;
1231
+ // When the function is a "grouped" one, this records the # of tasks we want
1232
+ // to schedule in tandem.
1233
+ uint32 _experimental_group_size = 67;
1234
+
1235
+ // If set, the function will be run in an untrusted environment.
1236
+ bool untrusted = 68;
1237
+
1238
+ uint32 _experimental_buffer_containers = 69;
1239
+
1240
+ // _experimental_proxy_ip -> ProxyInfo
1241
+ // TODO: deprecate.
1242
+ optional string _experimental_proxy_ip = 70;
1243
+
1244
+ bool runtime_perf_record = 71; // For internal debugging use only.
1245
+
1246
+ Schedule schedule = 72;
1247
+
1248
+ bool snapshot_debug = 73; // For internal debugging use only.
1249
+
1250
+ // Mapping of method names to method definitions, only non-empty for class service functions
1251
+ map<string, MethodDefinition> method_definitions = 74;
1252
+ bool method_definitions_set = 75;
1253
+
1254
+ bool _experimental_custom_scaling = 76;
927
1255
  }
928
1256
 
929
- message FunctionPrecreateResponse {
1257
+ message FunctionAsyncInvokeRequest {
930
1258
  string function_id = 1;
931
- FunctionHandleMetadata handle_metadata = 2;
1259
+ string parent_input_id = 2;
1260
+ FunctionInput input = 3;
1261
+ }
1262
+
1263
+ message FunctionAsyncInvokeResponse {
1264
+ bool retry_with_blob_upload = 1;
1265
+ string function_call_id = 2;
932
1266
  }
933
1267
 
934
1268
  message FunctionBindParamsRequest {
@@ -943,33 +1277,167 @@ message FunctionBindParamsResponse {
943
1277
  FunctionHandleMetadata handle_metadata = 2;
944
1278
  }
945
1279
 
1280
+ message FunctionCallCallGraphInfo {
1281
+ string function_call_id = 1;
1282
+ string parent_input_id = 2;
1283
+ string function_name = 3;
1284
+ string module_name = 4;
1285
+ }
1286
+
1287
+ message FunctionCallCancelRequest {
1288
+ string function_call_id = 1;
1289
+ bool terminate_containers = 2;
1290
+ }
1291
+
1292
+ message FunctionCallGetDataRequest {
1293
+ string function_call_id = 1;
1294
+ uint64 last_index = 2;
1295
+ }
1296
+
1297
+ message FunctionCallInfo {
1298
+ string function_call_id = 1;
1299
+ int32 idx = 2;
1300
+ reserved 3, 4, 5; // old fields
1301
+ double created_at = 6; // when the call was created
1302
+ double scheduled_at = 7; // if cron job, when run was scheduled
1303
+ reserved 8, 9, 10, 11; // old fields
1304
+ InputCategoryInfo pending_inputs = 12;
1305
+ InputCategoryInfo failed_inputs = 13;
1306
+ InputCategoryInfo succeeded_inputs = 14;
1307
+ InputCategoryInfo timeout_inputs = 15;
1308
+ InputCategoryInfo cancelled_inputs = 16;
1309
+ int32 total_inputs = 17;
1310
+ }
1311
+
1312
+ message FunctionCallListRequest {
1313
+ string function_id = 1;
1314
+ }
1315
+
1316
+ message FunctionCallListResponse {
1317
+ repeated FunctionCallInfo function_calls = 1;
1318
+ }
1319
+
1320
+ message FunctionCallPutDataRequest {
1321
+ string function_call_id = 1;
1322
+ repeated DataChunk data_chunks = 2;
1323
+ }
1324
+
1325
+ message FunctionCreateRequest {
1326
+ Function function = 1;
1327
+ string app_id = 2 [ (modal.options.audit_target_attr) = true ];
1328
+ Schedule schedule = 6 [deprecated=true]; // Deprecated: now passed in the Function definition
1329
+ string existing_function_id = 7;
1330
+ // This flag tells the server to avoid doing updates in FunctionCreate that should now
1331
+ // be done in AppPublish. Provides a smoother migration onto atomic deployments with 0.64,
1332
+ // and can be deprecated once we no longer support ealier versions.
1333
+ bool defer_updates = 8;
1334
+ FunctionData function_data = 9; // supersedes 'function' field above
1335
+ }
1336
+
946
1337
  message FunctionCreateResponse {
947
1338
  string function_id = 1;
948
- string web_url = 2; // Deprecated - needed until 0.51 is the minimum version
949
- WebUrlInfo web_url_info = 3; // Deprecated - needed until 0.51 is the minimum version
1339
+ string __deprecated_web_url = 2 [ deprecated = true]; // Used up until 0.62.212
950
1340
  Function function = 4;
951
1341
  FunctionHandleMetadata handle_metadata = 5;
952
1342
  }
953
1343
 
954
- message FunctionGetRequest {
955
- string app_name = 1;
956
- string object_tag = 2;
957
- DeploymentNamespace namespace = 3;
958
- string environment_name = 4;
1344
+ message FunctionData {
1345
+ // Note: FunctionData pulls "up" a subset of fields from Function message that
1346
+ // will get deprecated there and made authoritative here, at the top-level.
1347
+ // All remaining fields will stay within the Function message itself and a
1348
+ // single FunctionData will contain a list of such (ranked) Functions. The
1349
+ // top-level fields capture data not specific to any particular underlying
1350
+ // task (like warm-pool-size, applicable across all tasks), while fields
1351
+ // specific to the task (like the resource request) will exist at the bottom
1352
+ // level.
1353
+
1354
+ string module_name = 1;
1355
+ string function_name = 2;
1356
+
1357
+ Function.FunctionType function_type = 3;
1358
+
1359
+ // Scheduling related fields.
1360
+ uint32 warm_pool_size = 4;
1361
+ uint32 concurrency_limit = 5;
1362
+ uint32 task_idle_timeout_secs = 6;
1363
+ // When the function is a "grouped" one, this records the # of tasks we want
1364
+ // to schedule in tandem.
1365
+ uint32 _experimental_group_size = 19;
1366
+ uint32 _experimental_buffer_containers = 22;
1367
+ bool _experimental_custom_scaling = 23;
1368
+ string worker_id = 7; // for internal debugging use only
1369
+
1370
+ uint32 timeout_secs = 8;
1371
+
1372
+ string web_url = 9;
1373
+ WebUrlInfo web_url_info = 10;
1374
+ WebhookConfig webhook_config = 11;
1375
+ repeated CustomDomainInfo custom_domain_info = 12;
1376
+ // _experimental_proxy_ip -> ProxyInfo
1377
+ // TODO: deprecate.
1378
+ optional string _experimental_proxy_ip = 24;
1379
+ // Mapping of method names to method definitions, only non-empty for class service functions
1380
+ map<string, MethodDefinition> method_definitions = 25;
1381
+ bool method_definitions_set = 26;
1382
+
1383
+ bool is_class = 13; // if "Function" is actually a class grouping multiple methods - applies across all underlying tasks
1384
+ ClassParameterInfo class_parameter_info = 14;
1385
+
1386
+ bool is_method = 15;
1387
+ string use_function_id = 16; // used for methods
1388
+ string use_method_name = 17; // used for methods
1389
+
1390
+ message RankedFunction {
1391
+ uint32 rank = 1;
1392
+ Function function = 2;
1393
+ }
1394
+ repeated RankedFunction ranked_functions = 18;
1395
+
1396
+ Schedule schedule = 20;
1397
+
1398
+ reserved 21;
1399
+
1400
+ bool untrusted = 27; // If set, the function will be run in an untrusted environment.
1401
+ bool snapshot_debug = 28; // For internal debugging use only.
1402
+ bool runtime_perf_record = 29; // For internal debugging use only.
959
1403
  }
960
1404
 
961
- message FunctionGetResponse {
1405
+ message FunctionExtended {
1406
+ uint32 type_identifier = 1;
1407
+ // FunctionExtended is a union type that exists while we migrate between
1408
+ // storage of FunctionData vs. Functions, internally. Once migrated at the
1409
+ // storage level, we can get rid of this union type and replace with access
1410
+ // that expects FunctionData only.
1411
+ oneof function_extended {
1412
+ Function function_singleton = 2;
1413
+ FunctionData function_data = 3;
1414
+ }
1415
+ }
1416
+
1417
+
1418
+ message FunctionGetCallGraphRequest {
1419
+ // TODO: use input_id once we switch client submit API to return those.
1420
+ string function_call_id = 2;
1421
+ }
1422
+
1423
+ message FunctionGetCallGraphResponse {
1424
+ repeated InputCallGraphInfo inputs = 1;
1425
+ repeated FunctionCallCallGraphInfo function_calls = 2;
1426
+ }
1427
+
1428
+ message FunctionGetCurrentStatsRequest {
962
1429
  string function_id = 1;
963
- FunctionHandleMetadata handle_metadata = 2;
964
1430
  }
965
1431
 
966
-
967
- message FunctionUpdateSchedulingParamsRequest {
1432
+ message FunctionGetDynamicConcurrencyRequest{
968
1433
  string function_id = 1;
969
- uint32 warm_pool_size_override = 2;
1434
+ uint32 target_concurrency = 2;
1435
+ uint32 max_concurrency = 3;
970
1436
  }
971
1437
 
972
- message FunctionUpdateSchedulingParamsResponse {}
1438
+ message FunctionGetDynamicConcurrencyResponse {
1439
+ uint32 concurrency = 1;
1440
+ }
973
1441
 
974
1442
  message FunctionGetInputsItem {
975
1443
  string input_id = 1;
@@ -977,6 +1445,7 @@ message FunctionGetInputsItem {
977
1445
  bool kill_switch = 3;
978
1446
  reserved 4; // previously used
979
1447
  string function_call_id = 5;
1448
+ FunctionCallInvocationType function_call_invocation_type = 6;
980
1449
  }
981
1450
 
982
1451
  message FunctionGetInputsRequest {
@@ -984,6 +1453,10 @@ message FunctionGetInputsRequest {
984
1453
  int32 max_values = 3;
985
1454
  float average_call_time = 5;
986
1455
  int32 input_concurrency = 6; // Container aims to fetch multiple inputs at the same time
1456
+ reserved 9;
1457
+ reserved 10;
1458
+ uint32 batch_max_size = 11; // Maximum number of inputs to fetch at once
1459
+ uint64 batch_linger_ms = 12; // Miliseconds to block before a response is needed
987
1460
  }
988
1461
 
989
1462
  message FunctionGetInputsResponse {
@@ -995,8 +1468,10 @@ message FunctionGetOutputsItem {
995
1468
  GenericResult result = 1;
996
1469
  int32 idx = 2;
997
1470
  string input_id = 3;
998
- int32 gen_index = 4; // Deprecated, only used in client version <0.57
999
1471
  DataFormat data_format = 5; // for result.data_oneof
1472
+ string task_id = 6;
1473
+ double input_started_at = 7;
1474
+ double output_created_at = 8;
1000
1475
  }
1001
1476
 
1002
1477
  message FunctionGetOutputsRequest {
@@ -1005,12 +1480,29 @@ message FunctionGetOutputsRequest {
1005
1480
  float timeout = 3;
1006
1481
  string last_entry_id = 6;
1007
1482
  bool clear_on_success = 7; // expires *any* remaining outputs soon after this call, not just the returned ones
1483
+ double requested_at = 8; // Used for waypoints.
1484
+ // The jwts the client expects the server to be processing. This is optional and used for sync inputs only.
1485
+ repeated string input_jwts = 9;
1008
1486
  }
1009
1487
 
1010
1488
  message FunctionGetOutputsResponse {
1011
1489
  repeated int32 idxs = 3;
1012
1490
  repeated FunctionGetOutputsItem outputs = 4;
1013
1491
  string last_entry_id = 5;
1492
+ int32 num_unfinished_inputs = 6;
1493
+ }
1494
+
1495
+ message FunctionGetRequest {
1496
+ string app_name = 1;
1497
+ string object_tag = 2;
1498
+ DeploymentNamespace namespace = 3;
1499
+ string environment_name = 4;
1500
+ }
1501
+
1502
+ message FunctionGetResponse {
1503
+ string function_id = 1;
1504
+ FunctionHandleMetadata handle_metadata = 2;
1505
+ repeated Warning server_warnings = 4;
1014
1506
  }
1015
1507
 
1016
1508
  message FunctionGetSerializedRequest {
@@ -1022,6 +1514,24 @@ message FunctionGetSerializedResponse {
1022
1514
  bytes class_serialized = 2;
1023
1515
  }
1024
1516
 
1517
+ message FunctionHandleMetadata {
1518
+ // contains all the info about a function that is needed to trigger the right
1519
+ // behaviour when using a FunctionHandler. Notably excludes things purely
1520
+ // used for *executing* the function in a container entrypoint
1521
+
1522
+ // Should be a subset and use IDs/types from `Function` above
1523
+ string function_name = 2;
1524
+ Function.FunctionType function_type = 8;
1525
+ string web_url = 28;
1526
+ bool is_method = 39;
1527
+ string use_function_id = 40; // used for methods
1528
+ string use_method_name = 41; // used for methods
1529
+ string definition_id = 42;
1530
+ ClassParameterInfo class_parameter_info = 43;
1531
+ // Mapping of method names to their metadata, only non-empty for class service functions
1532
+ map<string, FunctionHandleMetadata> method_handle_metadata = 44;
1533
+ }
1534
+
1025
1535
  message FunctionInput {
1026
1536
  // serialized (args, kwargs).
1027
1537
  oneof args_oneof {
@@ -1030,6 +1540,7 @@ message FunctionInput {
1030
1540
  }
1031
1541
  bool final_input = 9;
1032
1542
  DataFormat data_format = 10; // For args_oneof.
1543
+ optional string method_name = 11; // specifies which method to call when calling a class/object function
1033
1544
  }
1034
1545
 
1035
1546
  message FunctionMapRequest {
@@ -1038,11 +1549,46 @@ message FunctionMapRequest {
1038
1549
  bool return_exceptions = 3;
1039
1550
  FunctionCallType function_call_type = 4;
1040
1551
  repeated FunctionPutInputsItem pipelined_inputs = 5;
1552
+ FunctionCallInvocationType function_call_invocation_type = 6;
1041
1553
  }
1042
1554
 
1043
1555
  message FunctionMapResponse {
1044
1556
  string function_call_id = 1;
1045
1557
  repeated FunctionPutInputsResponseItem pipelined_inputs = 2;
1558
+ FunctionRetryPolicy retry_policy = 3;
1559
+ string function_call_jwt = 4;
1560
+ }
1561
+
1562
+ message FunctionOptions {
1563
+ repeated string secret_ids = 1;
1564
+ repeated string mount_ids = 2; // Currently not supported
1565
+ optional Resources resources = 3;
1566
+ optional FunctionRetryPolicy retry_policy = 4;
1567
+ optional uint32 concurrency_limit = 5;
1568
+ optional uint32 timeout_secs = 6;
1569
+ optional uint32 task_idle_timeout_secs = 7;
1570
+ optional uint32 warm_pool_size = 8;
1571
+ repeated VolumeMount volume_mounts = 9;
1572
+ optional uint32 target_concurrent_inputs = 10;
1573
+ bool replace_volume_mounts = 11;
1574
+ bool replace_secret_ids = 12;
1575
+ }
1576
+
1577
+ message FunctionPrecreateRequest {
1578
+ string app_id = 1;
1579
+ string function_name = 2 [ (modal.options.audit_target_attr) = true ];
1580
+ string existing_function_id = 3;
1581
+ Function.FunctionType function_type = 4;
1582
+ WebhookConfig webhook_config = 5;
1583
+ string use_function_id = 6; // for class methods - use this function id instead for invocations - the *referenced* function should have is_class=True
1584
+ string use_method_name = 7; // for class methods - this method name needs to be included in the FunctionInput
1585
+ // Mapping of method names to method definitions, only non-empty for class service functions
1586
+ map<string, MethodDefinition> method_definitions = 8;
1587
+ }
1588
+
1589
+ message FunctionPrecreateResponse {
1590
+ string function_id = 1;
1591
+ FunctionHandleMetadata handle_metadata = 2;
1046
1592
  }
1047
1593
 
1048
1594
  message FunctionPutInputsItem {
@@ -1056,92 +1602,50 @@ message FunctionPutInputsRequest {
1056
1602
  repeated FunctionPutInputsItem inputs = 4;
1057
1603
  }
1058
1604
 
1059
- message FunctionPutInputsResponseItem {
1060
- int32 idx = 1;
1061
- string input_id = 2;
1062
- }
1063
-
1064
1605
  message FunctionPutInputsResponse {
1065
1606
  repeated FunctionPutInputsResponseItem inputs = 1;
1066
1607
  }
1067
1608
 
1068
- message FunctionPutOutputsItem {
1069
- string input_id = 1;
1070
- GenericResult result = 2;
1071
- double input_started_at = 3;
1072
- double output_created_at = 4;
1073
- int32 gen_index = 6; // Deprecated, only used in client version <0.57
1074
- DataFormat data_format = 7; // for result.data_oneof
1075
- }
1076
-
1077
- message FunctionPutOutputsRequest {
1078
- repeated FunctionPutOutputsItem outputs = 4;
1079
- }
1080
-
1081
- message FunctionRetryPolicy {
1082
- float backoff_coefficient = 1;
1083
- uint32 initial_delay_ms = 2;
1084
- uint32 max_delay_ms = 3;
1085
- // NOTE: two-byte field number not used for special reason. copy-paste error. Ref: PR #2542
1086
- uint32 retries = 18;
1087
- }
1088
-
1089
- message FunctionGetCallGraphRequest {
1090
- // TODO: use input_id once we switch client submit API to return those.
1091
- string function_call_id = 2;
1092
- }
1093
-
1094
-
1095
-
1096
- message InputCallGraphInfo {
1097
- string input_id = 1;
1098
- GenericResult.GenericStatus status = 2;
1099
- string function_call_id = 3;
1100
- string task_id = 4;
1101
- }
1102
-
1103
- message FunctionCallCallGraphInfo {
1104
- string function_call_id = 1;
1105
- string parent_input_id = 2;
1106
- string function_name = 3;
1107
- string module_name = 4;
1108
- }
1109
-
1110
- message FunctionGetCallGraphResponse {
1111
- repeated InputCallGraphInfo inputs = 1;
1112
- repeated FunctionCallCallGraphInfo function_calls = 2;
1113
- }
1114
-
1115
- message FunctionCallCancelRequest {
1116
- string function_call_id = 1;
1117
- }
1118
-
1119
- message FunctionCallListRequest {
1120
- string function_id = 1;
1609
+ message FunctionPutInputsResponseItem {
1610
+ int32 idx = 1;
1611
+ string input_id = 2;
1612
+ string input_jwt = 3;
1121
1613
  }
1122
1614
 
1123
- message FunctionCallInfo {
1124
- string function_call_id = 1;
1125
- int32 idx = 2;
1126
- reserved 3, 4, 5; // old fields
1127
- double created_at = 6; // when the call was created
1128
- double scheduled_at = 7; // if cron job, when run was scheduled
1129
- reserved 8, 9, 10, 11; // old fields
1130
- InputCategoryInfo pending_inputs = 12;
1131
- InputCategoryInfo failed_inputs = 13;
1132
- InputCategoryInfo succeeded_inputs = 14;
1133
- InputCategoryInfo timeout_inputs = 15;
1134
- InputCategoryInfo cancelled_inputs = 16;
1135
- int32 total_inputs = 17;
1615
+ message FunctionPutOutputsItem {
1616
+ string input_id = 1;
1617
+ GenericResult result = 2;
1618
+ double input_started_at = 3;
1619
+ double output_created_at = 4;
1620
+ DataFormat data_format = 7; // for result.data_oneof
1136
1621
  }
1137
1622
 
1138
- message FunctionCallListResponse {
1139
- repeated FunctionCallInfo function_calls = 1;
1623
+ message FunctionPutOutputsRequest {
1624
+ repeated FunctionPutOutputsItem outputs = 4;
1625
+ double requested_at = 5; // Used for waypoints.
1140
1626
  }
1141
1627
 
1628
+ message FunctionRetryInputsItem {
1629
+ string input_jwt = 1;
1630
+ FunctionInput input = 2;
1631
+ }
1142
1632
 
1143
- message FunctionGetCurrentStatsRequest {
1144
- string function_id = 1;
1633
+ message FunctionRetryInputsRequest {
1634
+ string function_call_jwt = 1;
1635
+ repeated FunctionRetryInputsItem inputs = 2;
1636
+ }
1637
+
1638
+ message FunctionRetryInputsResponse {
1639
+ // TODO(ryan): Eventually this will return entry ids, which client
1640
+ // will send back to server to check for lost inputs.
1641
+ }
1642
+
1643
+ message FunctionRetryPolicy {
1644
+ float backoff_coefficient = 1;
1645
+ uint32 initial_delay_ms = 2;
1646
+ uint32 max_delay_ms = 3;
1647
+ // NOTE: two-byte field number not used for special reason. copy-paste error. Ref: PR #2542
1648
+ uint32 retries = 18;
1145
1649
  }
1146
1650
 
1147
1651
  message FunctionStats {
@@ -1150,6 +1654,19 @@ message FunctionStats {
1150
1654
  uint32 num_total_tasks = 3;
1151
1655
  }
1152
1656
 
1657
+ message FunctionUpdateSchedulingParamsRequest {
1658
+ string function_id = 1;
1659
+ uint32 warm_pool_size_override = 2;
1660
+ }
1661
+
1662
+ message FunctionUpdateSchedulingParamsResponse {}
1663
+
1664
+ message GPUConfig {
1665
+ GPUType type = 1;
1666
+ uint32 count = 2;
1667
+ uint32 memory = 3;
1668
+ }
1669
+
1153
1670
  message GeneratorDone { // Sent as the output when a generator finishes running.
1154
1671
  uint64 items_total = 1;
1155
1672
  }
@@ -1165,6 +1682,7 @@ message GenericResult { // Used for both tasks and function outputs
1165
1682
  // Used when the user's function fails to initialize (ex. S3 mount failed due to invalid credentials).
1166
1683
  // Terminates the function and all remaining inputs.
1167
1684
  GENERIC_STATUS_INIT_FAILURE = 5;
1685
+ GENERIC_STATUS_INTERNAL_FAILURE = 6;
1168
1686
  }
1169
1687
 
1170
1688
  GenericStatus status = 1; // Status of the task or function output.
@@ -1180,28 +1698,9 @@ message GenericResult { // Used for both tasks and function outputs
1180
1698
  string data_blob_id = 10; // Blob ID for large data.
1181
1699
  }
1182
1700
 
1183
- enum GeneratorStatus {
1184
- GENERATOR_STATUS_UNSPECIFIED = 0;
1185
- GENERATOR_STATUS_INCOMPLETE = 1;
1186
- GENERATOR_STATUS_COMPLETE = 2;
1187
- }
1188
- GeneratorStatus gen_status = 7; // Deprecated, only used in client version <0.57
1189
-
1190
1701
  string propagation_reason = 13; // (?)
1191
1702
  }
1192
1703
 
1193
- message GPUConfig {
1194
- GPUType type = 1;
1195
- uint32 count = 2;
1196
- uint32 memory = 3;
1197
- }
1198
-
1199
- message BuildFunction {
1200
- string definition = 1;
1201
- bytes globals = 2;
1202
- FunctionInput input = 3;
1203
- }
1204
-
1205
1704
  message Image {
1206
1705
  repeated BaseImage base_images = 5;
1207
1706
  repeated string dockerfile_commands = 6;
@@ -1233,6 +1732,15 @@ message ImageContextFile {
1233
1732
  bytes data = 2;
1234
1733
  }
1235
1734
 
1735
+ message ImageFromIdRequest {
1736
+ string image_id = 1;
1737
+ }
1738
+
1739
+ message ImageFromIdResponse {
1740
+ string image_id = 1;
1741
+ ImageMetadata metadata = 2;
1742
+ }
1743
+
1236
1744
  message ImageGetOrCreateRequest {
1237
1745
  Image image = 2;
1238
1746
  string app_id = 4 [ (modal.options.audit_target_attr) = true ];
@@ -1241,16 +1749,24 @@ message ImageGetOrCreateRequest {
1241
1749
  bool force_build = 7;
1242
1750
  DeploymentNamespace namespace = 8;
1243
1751
  string builder_version = 9;
1752
+ // Only admins can publish global images, but this provides an extra failsafe
1753
+ bool allow_global_deployment = 10;
1244
1754
  }
1245
1755
 
1246
1756
  message ImageGetOrCreateResponse {
1757
+ // image_id is set regardless if the image is built (use ImageJoinStreaming to wait for build)
1247
1758
  string image_id = 1;
1759
+ // result of build - only set if the image has finished building (regardless if success or not)
1760
+ GenericResult result = 2;
1761
+ // image metadata - only set if the image has built successfully
1762
+ ImageMetadata metadata = 3;
1248
1763
  }
1249
1764
 
1250
1765
  message ImageJoinStreamingRequest {
1251
1766
  string image_id = 1;
1252
1767
  float timeout = 2;
1253
1768
  string last_entry_id = 3;
1769
+ bool include_logs_for_finished = 4;
1254
1770
  }
1255
1771
 
1256
1772
  message ImageJoinStreamingResponse {
@@ -1258,6 +1774,18 @@ message ImageJoinStreamingResponse {
1258
1774
  repeated TaskLogs task_logs = 2;
1259
1775
  string entry_id = 3;
1260
1776
  bool eof = 4;
1777
+ ImageMetadata metadata = 5; // set on success
1778
+ }
1779
+
1780
+
1781
+ message ImageMetadata {
1782
+ // The output of `python -VV. Not set if missing
1783
+ optional string python_version_info = 1;
1784
+ // Installed python packages, as listed by by `pip list`.
1785
+ // package name -> version. Empty if missing
1786
+ map<string, string> python_packages = 2;
1787
+ // The work directory of the image, defaulting to "/". Not set if missing
1788
+ optional string workdir = 3;
1261
1789
  }
1262
1790
 
1263
1791
 
@@ -1266,6 +1794,18 @@ message ImageRegistryConfig {
1266
1794
  string secret_id = 2;
1267
1795
  }
1268
1796
 
1797
+ message InputCallGraphInfo {
1798
+ string input_id = 1;
1799
+ GenericResult.GenericStatus status = 2;
1800
+ string function_call_id = 3;
1801
+ string task_id = 4;
1802
+ }
1803
+
1804
+ message InputCategoryInfo {
1805
+ int32 total = 1;
1806
+ repeated InputInfo latest = 2;
1807
+ }
1808
+
1269
1809
  message InputInfo {
1270
1810
  string input_id = 1;
1271
1811
  int32 idx = 2;
@@ -1276,20 +1816,20 @@ message InputInfo {
1276
1816
  bool task_first_input = 7;
1277
1817
  }
1278
1818
 
1279
- message InputCategoryInfo {
1280
- int32 total = 1;
1281
- repeated InputInfo latest = 2;
1282
- }
1283
-
1284
- message MountBuildRequest {
1285
- string app_id = 2 [ (modal.options.audit_target_attr) = true ];
1286
- string existing_mount_id = 3;
1287
- repeated MountFile files = 4;
1819
+ message MethodDefinition {
1820
+ string function_name = 1;
1821
+ Function.FunctionType function_type = 2;
1822
+ WebhookConfig webhook_config = 3;
1823
+ string web_url = 4;
1824
+ WebUrlInfo web_url_info = 5;
1825
+ repeated CustomDomainInfo custom_domain_info = 6;
1288
1826
  }
1289
1827
 
1290
- message MountBuildResponse {
1291
- string mount_id = 1;
1292
- MountHandleMetadata handle_metadata = 2;
1828
+ message MountFile {
1829
+ string filename = 1;
1830
+ string sha256_hex = 3; // SHA-256 checksum of the file.
1831
+ optional uint64 size = 4; // Size of the file in bytes — ignored in MountBuild().
1832
+ optional uint32 mode = 5; // Unix file permission bits `st_mode`.
1293
1833
  }
1294
1834
 
1295
1835
  message MountGetOrCreateRequest {
@@ -1310,13 +1850,6 @@ message MountHandleMetadata {
1310
1850
  string content_checksum_sha256_hex = 1;
1311
1851
  }
1312
1852
 
1313
- message MountFile {
1314
- string filename = 1;
1315
- string sha256_hex = 3; // SHA-256 checksum of the file.
1316
- optional uint64 size = 4; // Size of the file in bytes — ignored in MountBuild().
1317
- optional uint32 mode = 5; // Unix file permission bits `st_mode`.
1318
- }
1319
-
1320
1853
  message MountPutFileRequest {
1321
1854
  string sha256_hex = 2;
1322
1855
 
@@ -1336,6 +1869,17 @@ message MultiPartUpload {
1336
1869
  string completion_url = 3;
1337
1870
  }
1338
1871
 
1872
+ message NetworkAccess {
1873
+ enum NetworkAccessType {
1874
+ UNSPECIFIED = 0;
1875
+ OPEN = 1;
1876
+ BLOCKED = 2;
1877
+ ALLOWLIST = 3;
1878
+ }
1879
+ NetworkAccessType network_access_type = 1;
1880
+ repeated string allowed_cidrs = 2;
1881
+ }
1882
+
1339
1883
  message Object {
1340
1884
  string object_id = 1;
1341
1885
  oneof handle_metadata_oneof {
@@ -1350,8 +1894,53 @@ message ObjectDependency {
1350
1894
  string object_id = 1;
1351
1895
  }
1352
1896
 
1897
+ message PTYInfo {
1898
+ bool enabled = 1; // Soon deprecated
1899
+ uint32 winsz_rows = 2;
1900
+ uint32 winsz_cols = 3;
1901
+ string env_term = 4;
1902
+ string env_colorterm = 5;
1903
+ string env_term_program = 6;
1904
+ enum PTYType {
1905
+ PTY_TYPE_UNSPECIFIED = 0; // Nothing
1906
+ PTY_TYPE_FUNCTION = 1; // Run function in PTY
1907
+ PTY_TYPE_SHELL = 2; // Replace function with shell
1908
+ }
1909
+ PTYType pty_type = 7;
1910
+ }
1911
+
1912
+ message PortSpec {
1913
+ uint32 port = 1;
1914
+ bool unencrypted = 2;
1915
+ }
1916
+
1917
+ message PortSpecs {
1918
+ repeated PortSpec ports = 1;
1919
+ }
1920
+
1921
+ message Proxy {
1922
+ string name = 1;
1923
+ double created_at = 2;
1924
+ string environment_name = 3;
1925
+ string proxy_id = 5;
1926
+ repeated ProxyIp proxy_ips = 4;
1927
+ }
1928
+
1929
+ message ProxyCreateRequest {
1930
+ string name = 1 [ (modal.options.audit_target_attr) = true ];
1931
+ string environment_name = 2;
1932
+ }
1933
+
1934
+ message ProxyCreateResponse {
1935
+ Proxy proxy = 1;
1936
+ }
1937
+
1938
+ message ProxyDeleteRequest {
1939
+ string proxy_id = 1 [ (modal.options.audit_target_attr) = true ];
1940
+ }
1941
+
1353
1942
  message ProxyGetOrCreateRequest {
1354
- string deployment_name = 1;
1943
+ string deployment_name = 1 [ (modal.options.audit_target_attr) = true ];
1355
1944
  DeploymentNamespace namespace = 2;
1356
1945
  string environment_name = 3;
1357
1946
  ObjectCreationType object_creation_type = 4; // must be UNSPECIFIED
@@ -1361,35 +1950,42 @@ message ProxyGetOrCreateResponse {
1361
1950
  string proxy_id = 1;
1362
1951
  }
1363
1952
 
1953
+ message ProxyGetRequest {
1954
+ string name = 1 [ (modal.options.audit_target_attr) = true ];
1955
+ string environment_name = 2;
1956
+ }
1957
+
1958
+ message ProxyGetResponse {
1959
+ Proxy proxy = 1;
1960
+ }
1961
+
1364
1962
  message ProxyInfo {
1365
1963
  string elastic_ip = 1;
1366
1964
  string proxy_key = 2;
1367
1965
  string remote_addr = 3;
1368
1966
  int32 remote_port = 4;
1967
+ ProxyType proxy_type = 5;
1369
1968
  }
1370
1969
 
1371
- message PTYInfo {
1372
- bool enabled = 1; // Soon deprecated
1373
- uint32 winsz_rows = 2;
1374
- uint32 winsz_cols = 3;
1375
- string env_term = 4;
1376
- string env_colorterm = 5;
1377
- string env_term_program = 6;
1378
- enum PTYType {
1379
- PTY_TYPE_UNSPECIFIED = 0; // Nothing
1380
- PTY_TYPE_FUNCTION = 1; // Run function in PTY
1381
- PTY_TYPE_SHELL = 2; // Replace function with shell
1382
- }
1383
- PTYType pty_type = 7;
1970
+ message ProxyIp {
1971
+ string proxy_ip = 1;
1972
+ ProxyIpStatus status = 2;
1973
+ double created_at = 3;
1974
+ string environment_name = 4;
1384
1975
  }
1385
1976
 
1386
- message QueueCreateRequest {
1387
- string app_id = 1;
1388
- string existing_queue_id = 2;
1977
+ message ProxyListResponse {
1978
+ repeated Proxy proxies = 1;
1389
1979
  }
1390
1980
 
1391
- message QueueCreateResponse {
1981
+ message QueueClearRequest {
1392
1982
  string queue_id = 1;
1983
+ bytes partition_key = 2;
1984
+ bool all_partitions = 3;
1985
+ }
1986
+
1987
+ message QueueDeleteRequest {
1988
+ string queue_id = 1 [ (modal.options.audit_target_attr) = true ];
1393
1989
  }
1394
1990
 
1395
1991
  message QueueGetOrCreateRequest {
@@ -1418,30 +2014,93 @@ message QueueHeartbeatRequest {
1418
2014
  string queue_id = 1;
1419
2015
  }
1420
2016
 
1421
- message QueuePutRequest {
1422
- string queue_id = 1;
1423
- repeated bytes values = 4;
1424
- bytes partition_key = 5;
2017
+ message QueueItem {
2018
+ bytes value = 1;
2019
+ string entry_id = 2;
1425
2020
  }
1426
2021
 
1427
2022
  message QueueLenRequest {
1428
2023
  string queue_id = 1;
1429
2024
  bytes partition_key = 2;
2025
+ bool total = 3;
1430
2026
  }
1431
2027
 
1432
2028
  message QueueLenResponse {
1433
2029
  int32 len = 1;
1434
2030
  }
1435
2031
 
2032
+ message QueueListRequest {
2033
+ string environment_name = 1;
2034
+ // Allow client to report a bounded total size to reduce the number of partitions that need to be checked
2035
+ int32 total_size_limit = 2;
2036
+ }
2037
+
2038
+ message QueueListResponse {
2039
+ message QueueInfo {
2040
+ string name = 1;
2041
+ double created_at = 2;
2042
+ int32 num_partitions = 3;
2043
+ int32 total_size = 4;
2044
+ }
2045
+
2046
+ repeated QueueInfo queues = 1;
2047
+ }
2048
+
2049
+ message QueueNextItemsRequest {
2050
+ string queue_id = 1;
2051
+ bytes partition_key = 2;
2052
+ string last_entry_id = 3;
2053
+ float item_poll_timeout = 4; // seconds
2054
+ }
2055
+
2056
+ message QueueNextItemsResponse {
2057
+ repeated QueueItem items = 1;
2058
+ }
2059
+
2060
+ message QueuePutRequest {
2061
+ string queue_id = 1;
2062
+ repeated bytes values = 4;
2063
+ bytes partition_key = 5;
2064
+ int32 partition_ttl_seconds = 6;
2065
+ }
2066
+
2067
+
1436
2068
  message RateLimit {
1437
2069
  int32 limit = 1;
1438
2070
  RateLimitInterval interval = 2;
1439
2071
  }
1440
2072
 
1441
2073
  message Resources {
1442
- uint32 memory_mb = 2;
1443
- uint32 milli_cpu = 3;
2074
+ uint32 memory_mb = 2; // MiB
2075
+ uint32 milli_cpu = 3; // milli CPU cores
1444
2076
  GPUConfig gpu_config = 4;
2077
+ uint32 memory_mb_max = 5; // MiB
2078
+ uint32 ephemeral_disk_mb = 6; // MiB
2079
+ uint32 milli_cpu_max = 7; // milli CPU cores
2080
+ }
2081
+
2082
+ message RuntimeInputMessage {
2083
+ bytes message = 1;
2084
+ uint64 message_index = 2;
2085
+ bool eof = 3;
2086
+ }
2087
+
2088
+ message RuntimeOutputBatch {
2089
+ repeated RuntimeOutputMessage items = 1;
2090
+ uint64 batch_index = 2;
2091
+ // if an exit code is given, this is the final message that will be sent.
2092
+ optional int32 exit_code = 3;
2093
+ repeated RuntimeOutputMessage stdout = 4;
2094
+ repeated RuntimeOutputMessage stderr = 5;
2095
+ repeated RuntimeOutputMessage info = 6;
2096
+ }
2097
+
2098
+ // Used for `modal container exec`, `modal shell`, and Sandboxes
2099
+ message RuntimeOutputMessage {
2100
+ // only stdout / stderr is used
2101
+ FileDescriptor file_descriptor = 1;
2102
+ string message = 2;
2103
+ bytes message_bytes = 3;
1445
2104
  }
1446
2105
 
1447
2106
  message S3Mount {
@@ -1476,17 +2135,43 @@ message Sandbox {
1476
2135
  repeated VolumeMount volume_mounts = 13;
1477
2136
 
1478
2137
  PTYInfo pty_info = 15;
2138
+
2139
+ // If set, tasks will be scheduled using the new scheduler, which also knows
2140
+ // to look at fine-grained placement constraints.
2141
+ reserved 16; // _experimental_scheduler
2142
+ optional SchedulerPlacement scheduler_placement = 17;
2143
+ reserved 18; // _experimental_resources
2144
+
2145
+ string worker_id = 19; // for internal debugging use only
2146
+ oneof open_ports_oneof {
2147
+ PortSpecs open_ports = 20;
2148
+ }
2149
+
2150
+ bool i6pn_enabled = 21;
2151
+
2152
+ // Network access configuration beyond simple allow/block.
2153
+ NetworkAccess network_access = 22;
2154
+
2155
+ optional string proxy_id = 23;
1479
2156
  }
1480
2157
 
1481
2158
  message SandboxCreateRequest {
1482
2159
  string app_id = 1 [ (modal.options.audit_target_attr) = true ];
1483
2160
  Sandbox definition = 2;
2161
+ string environment_name = 3;
1484
2162
  }
1485
2163
 
1486
2164
  message SandboxCreateResponse {
1487
2165
  string sandbox_id = 1;
1488
2166
  }
1489
2167
 
2168
+ message SandboxGetLogsRequest {
2169
+ string sandbox_id = 1;
2170
+ FileDescriptor file_descriptor = 2;
2171
+ float timeout = 3;
2172
+ string last_entry_id = 4;
2173
+ }
2174
+
1490
2175
  message SandboxGetTaskIdRequest {
1491
2176
  string sandbox_id = 1;
1492
2177
  }
@@ -1495,21 +2180,14 @@ message SandboxGetTaskIdResponse {
1495
2180
  string task_id = 1;
1496
2181
  }
1497
2182
 
1498
- message SandboxGetLogsRequest {
1499
- string sandbox_id = 1;
1500
- FileDescriptor file_descriptor = 2;
1501
- float timeout = 3;
1502
- string last_entry_id = 4;
1503
- }
1504
-
1505
- message SandboxStdinWriteRequest {
2183
+ message SandboxGetTunnelsRequest {
1506
2184
  string sandbox_id = 1;
1507
- bytes input = 2;
1508
- uint32 index = 3;
1509
- bool eof = 4;
2185
+ float timeout = 2;
1510
2186
  }
1511
2187
 
1512
- message SandboxStdinWriteResponse {
2188
+ message SandboxGetTunnelsResponse {
2189
+ GenericResult result = 1;
2190
+ repeated TunnelData tunnels = 2;
1513
2191
  }
1514
2192
 
1515
2193
  message SandboxHandleMetadata {
@@ -1518,20 +2196,57 @@ message SandboxHandleMetadata {
1518
2196
 
1519
2197
  message SandboxInfo {
1520
2198
  string id = 1;
1521
- modal.client.Sandbox definition = 2;
1522
2199
  double created_at = 3;
1523
2200
  TaskInfo task_info = 4;
2201
+
2202
+ reserved 2; // modal.client.Sandbox definition
1524
2203
  }
1525
2204
 
1526
2205
  message SandboxListRequest {
1527
2206
  string app_id = 1;
1528
2207
  double before_timestamp = 2;
2208
+ string environment_name = 3;
2209
+ bool include_finished = 4;
2210
+ repeated SandboxTag tags = 5;
1529
2211
  }
1530
2212
 
1531
2213
  message SandboxListResponse {
1532
2214
  repeated SandboxInfo sandboxes = 1;
1533
2215
  }
1534
2216
 
2217
+ message SandboxSnapshotFsRequest {
2218
+ string sandbox_id = 1;
2219
+ float timeout = 2;
2220
+ }
2221
+
2222
+ message SandboxSnapshotFsResponse {
2223
+ string image_id = 1;
2224
+ GenericResult result = 2;
2225
+ // Metadata may be empty since we may skip it for performance reasons.
2226
+ ImageMetadata image_metadata = 3;
2227
+ }
2228
+
2229
+ message SandboxStdinWriteRequest {
2230
+ string sandbox_id = 1;
2231
+ bytes input = 2;
2232
+ uint32 index = 3;
2233
+ bool eof = 4;
2234
+ }
2235
+
2236
+ message SandboxStdinWriteResponse {
2237
+ }
2238
+
2239
+ message SandboxTag {
2240
+ string tag_name = 1;
2241
+ string tag_value = 2;
2242
+ }
2243
+
2244
+ message SandboxTagsSetRequest {
2245
+ string environment_name = 1;
2246
+ string sandbox_id = 2;
2247
+ repeated SandboxTag tags = 3;
2248
+ }
2249
+
1535
2250
  message SandboxTerminateRequest {
1536
2251
  string sandbox_id = 1;
1537
2252
  }
@@ -1568,6 +2283,21 @@ message Schedule {
1568
2283
  }
1569
2284
  }
1570
2285
 
2286
+ message SchedulerPlacement {
2287
+ // TODO(irfansharif):
2288
+ // - Fold in cloud, resource needs here too.
2289
+ // - Allow specifying list of zones, cloud, fallback and alternative
2290
+ // GPU types.
2291
+
2292
+ repeated string regions = 4;
2293
+ // TODO(irfansharif): Make these two repeated.
2294
+ optional string _zone = 2; // admin-only
2295
+ optional string _lifecycle = 3; // admin-only, "on-demand" or "spot", else ignored
2296
+ repeated string _instance_types = 5; // admin-only
2297
+
2298
+ reserved 1;
2299
+ }
2300
+
1571
2301
  message SecretCreateRequest { // Not used by client anymore
1572
2302
  map<string, string> env_dict = 1;
1573
2303
  string app_id = 2 [ (modal.options.audit_target_attr) = true ];
@@ -1579,13 +2309,18 @@ message SecretCreateResponse { // Not used by client anymore
1579
2309
  string secret_id = 1;
1580
2310
  }
1581
2311
 
2312
+ message SecretDeleteRequest {
2313
+ string secret_id = 1;
2314
+ }
2315
+
1582
2316
  message SecretGetOrCreateRequest {
1583
- string deployment_name = 1;
2317
+ string deployment_name = 1 [ (modal.options.audit_target_attr) = true ];
1584
2318
  DeploymentNamespace namespace = 2;
1585
2319
  string environment_name = 3;
1586
2320
  ObjectCreationType object_creation_type = 4; // Not used atm
1587
2321
  map<string, string> env_dict = 5;
1588
2322
  string app_id = 6; // only used with OBJECT_CREATION_TYPE_ANONYMOUS_OWNED_BY_APP
2323
+ repeated string required_keys = 7;
1589
2324
  }
1590
2325
 
1591
2326
  message SecretGetOrCreateResponse {
@@ -1597,6 +2332,7 @@ message SecretListItem {
1597
2332
  double created_at = 2;
1598
2333
  double last_used_at = 3;
1599
2334
  string environment_name = 4;
2335
+ string secret_id = 5;
1600
2336
  }
1601
2337
 
1602
2338
  message SecretListRequest {
@@ -1608,8 +2344,24 @@ message SecretListResponse {
1608
2344
  string environment_name = 2; // the environment that was listed (useful when relying on "default" logic)
1609
2345
  }
1610
2346
 
2347
+ message SharedVolumeDeleteRequest {
2348
+ string shared_volume_id = 1;
2349
+ }
2350
+
2351
+ message SharedVolumeGetFileRequest {
2352
+ string shared_volume_id = 1;
2353
+ string path = 2;
2354
+ }
2355
+
2356
+ message SharedVolumeGetFileResponse {
2357
+ oneof data_oneof {
2358
+ bytes data = 1;
2359
+ string data_blob_id = 2;
2360
+ }
2361
+ }
2362
+
1611
2363
  message SharedVolumeGetOrCreateRequest {
1612
- string deployment_name = 1;
2364
+ string deployment_name = 1 [ (modal.options.audit_target_attr) = true ];
1613
2365
  DeploymentNamespace namespace = 2;
1614
2366
  string environment_name = 3;
1615
2367
  ObjectCreationType object_creation_type = 4;
@@ -1624,13 +2376,13 @@ message SharedVolumeHeartbeatRequest {
1624
2376
  string shared_volume_id = 1;
1625
2377
  }
1626
2378
 
1627
- message SharedVolumeCreateRequest {
1628
- string app_id = 1 [ (modal.options.audit_target_attr) = true ];
1629
- CloudProvider cloud_provider = 2;
2379
+ message SharedVolumeListFilesRequest {
2380
+ string shared_volume_id = 1;
2381
+ string path = 2;
1630
2382
  }
1631
2383
 
1632
- message SharedVolumeCreateResponse {
1633
- string shared_volume_id = 1;
2384
+ message SharedVolumeListFilesResponse {
2385
+ repeated FileEntry entries = 1;
1634
2386
  }
1635
2387
 
1636
2388
  message SharedVolumeListItem {
@@ -1649,9 +2401,11 @@ message SharedVolumeListResponse {
1649
2401
  string environment_name = 2;
1650
2402
  }
1651
2403
 
1652
- message SharedVolumeListFilesRequest {
1653
- string shared_volume_id = 1;
1654
- string path = 2;
2404
+ message SharedVolumeMount {
2405
+ string mount_path = 1;
2406
+ string shared_volume_id = 2;
2407
+ CloudProvider cloud_provider = 3;
2408
+ bool allow_cross_region = 4;
1655
2409
  }
1656
2410
 
1657
2411
  message SharedVolumePutFileRequest {
@@ -1669,46 +2423,29 @@ message SharedVolumePutFileResponse {
1669
2423
  bool exists = 1;
1670
2424
  }
1671
2425
 
1672
- message SharedVolumeGetFileRequest {
1673
- string shared_volume_id = 1;
1674
- string path = 2;
1675
- }
1676
-
1677
- message SharedVolumeGetFileResponse {
1678
- oneof data_oneof {
1679
- bytes data = 1;
1680
- string data_blob_id = 2;
1681
- }
1682
- }
1683
-
1684
2426
  message SharedVolumeRemoveFileRequest {
1685
2427
  string shared_volume_id = 1 [ (modal.options.audit_target_attr) = true ];
1686
2428
  string path = 2;
1687
2429
  bool recursive = 3;
1688
2430
  }
1689
2431
 
1690
- message SharedVolumeListFilesEntry {
1691
- enum FileType {
1692
- UNSPECIFIED = 0;
1693
- FILE = 1;
1694
- DIRECTORY = 2;
1695
- }
1696
- string path = 1;
1697
- FileType type = 2;
2432
+ message SystemErrorMessage {
2433
+ SystemErrorCode error_code = 1;
2434
+ string error_message = 2;
1698
2435
  }
1699
2436
 
1700
- message SharedVolumeListFilesResponse {
1701
- repeated SharedVolumeListFilesEntry entries = 1;
2437
+ message TaskClusterHelloRequest {
2438
+ string task_id = 1;
2439
+ string container_ip = 2;
1702
2440
  }
1703
2441
 
1704
- message SharedVolumeMount {
1705
- string mount_path = 1;
1706
- string shared_volume_id = 2;
1707
- CloudProvider cloud_provider = 3;
1708
- bool allow_cross_region = 4;
2442
+ message TaskClusterHelloResponse {
2443
+ string cluster_id = 1;
2444
+ uint32 cluster_rank = 2;
2445
+ // All IP addresses in cluster, ordered by cluster rank
2446
+ repeated string container_ips = 3;
1709
2447
  }
1710
2448
 
1711
-
1712
2449
  message TaskCurrentInputsResponse {
1713
2450
  repeated string input_ids = 1;
1714
2451
  }
@@ -1718,6 +2455,15 @@ message TaskInfo {
1718
2455
  double started_at = 2;
1719
2456
  double finished_at = 3;
1720
2457
  modal.client.GenericResult result = 4;
2458
+ double enqueued_at = 5;
2459
+ }
2460
+
2461
+ message TaskListRequest {
2462
+ string environment_name = 1;
2463
+ }
2464
+
2465
+ message TaskListResponse {
2466
+ repeated TaskStats tasks = 1;
1721
2467
  }
1722
2468
 
1723
2469
  message TaskLogs {
@@ -1730,12 +2476,6 @@ message TaskLogs {
1730
2476
  string input_id = 11;
1731
2477
  }
1732
2478
 
1733
- message TaskListRequest {}
1734
-
1735
- message TaskListResponse {
1736
- repeated TaskStats tasks = 1;
1737
- }
1738
-
1739
2479
  message TaskLogsBatch {
1740
2480
  string task_id = 1;
1741
2481
  repeated TaskLogs items = 2;
@@ -1756,7 +2496,7 @@ message TaskProgress {
1756
2496
  }
1757
2497
 
1758
2498
  message TaskResultRequest {
1759
- modal.client.GenericResult result = 2;
2499
+ GenericResult result = 2;
1760
2500
  }
1761
2501
 
1762
2502
  message TaskStats {
@@ -1766,6 +2506,16 @@ message TaskStats {
1766
2506
  double started_at = 4;
1767
2507
  }
1768
2508
 
2509
+ message TaskTemplate {
2510
+ uint32 rank = 1;
2511
+ Resources resources = 2;
2512
+ uint32 target_concurrent_inputs = 3;
2513
+ uint32 max_concurrent_inputs = 4;
2514
+
2515
+ // TODO(irfansharif): Just move this into a column in the task table instead?
2516
+ // Deprecate all above fields and get rid of this message altogether
2517
+ uint32 index = 5; // pointer into FunctionData, if using that as the underlying definition type
2518
+ }
1769
2519
 
1770
2520
  message TokenFlowCreateRequest {
1771
2521
  string utm_source = 3;
@@ -1793,6 +2543,14 @@ message TokenFlowWaitResponse {
1793
2543
  string workspace_username = 4;
1794
2544
  }
1795
2545
 
2546
+ message TunnelData {
2547
+ string host = 1;
2548
+ uint32 port = 2;
2549
+ optional string unencrypted_host = 3;
2550
+ optional uint32 unencrypted_port = 4;
2551
+ uint32 container_port = 5;
2552
+ }
2553
+
1796
2554
  message TunnelStartRequest {
1797
2555
  uint32 port = 1;
1798
2556
  bool unencrypted = 2;
@@ -1813,30 +2571,6 @@ message TunnelStopResponse {
1813
2571
  bool exists = 1;
1814
2572
  }
1815
2573
 
1816
- message VolumeGetOrCreateRequest {
1817
- string deployment_name = 1;
1818
- DeploymentNamespace namespace = 2;
1819
- string environment_name = 3;
1820
- ObjectCreationType object_creation_type = 4;
1821
- string app_id = 5; // only used with OBJECT_CREATION_TYPE_ANONYMOUS_OWNED_BY_APP
1822
- }
1823
-
1824
- message VolumeGetOrCreateResponse {
1825
- string volume_id = 1;
1826
- }
1827
-
1828
- message VolumeHeartbeatRequest {
1829
- string volume_id = 1;
1830
- }
1831
-
1832
- message VolumeCreateRequest {
1833
- string app_id = 1 [ (modal.options.audit_target_attr) = true ];
1834
- }
1835
-
1836
- message VolumeCreateResponse {
1837
- string volume_id = 1;
1838
- }
1839
-
1840
2574
  message VolumeCommitRequest {
1841
2575
  // NOTE(staffan): Mounting a volume in multiple locations is not supported, so volume_id alone uniquely identifies
1842
2576
  // a volume mount.
@@ -1847,6 +2581,13 @@ message VolumeCommitResponse {
1847
2581
  bool skip_reload = 1;
1848
2582
  }
1849
2583
 
2584
+ message VolumeCopyFilesRequest {
2585
+ string volume_id = 1;
2586
+ repeated string src_paths = 2;
2587
+ string dst_path = 3;
2588
+ bool recursive = 4;
2589
+ }
2590
+
1850
2591
  message VolumeDeleteRequest {
1851
2592
  string volume_id = 1;
1852
2593
  string environment_name = 2 [deprecated=true];
@@ -1854,7 +2595,7 @@ message VolumeDeleteRequest {
1854
2595
 
1855
2596
  message VolumeGetFileRequest {
1856
2597
  string volume_id = 1;
1857
- bytes path = 2;
2598
+ string path = 2;
1858
2599
  uint64 start = 3;
1859
2600
  uint64 len = 4; // 0 is interpreted as 'read to end'
1860
2601
  }
@@ -1869,27 +2610,33 @@ message VolumeGetFileResponse {
1869
2610
  uint64 len = 5; // number of bytes returned
1870
2611
  }
1871
2612
 
1872
- message VolumeListFilesEntry {
1873
- enum FileType {
1874
- UNSPECIFIED = 0;
1875
- FILE = 1;
1876
- DIRECTORY = 2;
1877
- SYMLINK = 3;
1878
- }
1879
- string path = 1;
1880
- FileType type = 2;
1881
- uint64 mtime = 3;
1882
- uint64 size = 4;
2613
+ message VolumeGetOrCreateRequest {
2614
+ string deployment_name = 1 [ (modal.options.audit_target_attr) = true ];
2615
+ DeploymentNamespace namespace = 2;
2616
+ string environment_name = 3;
2617
+ ObjectCreationType object_creation_type = 4;
2618
+ string app_id = 5; // only used with OBJECT_CREATION_TYPE_ANONYMOUS_OWNED_BY_APP
2619
+ VolumeFsVersion version = 6;
2620
+ }
2621
+
2622
+ message VolumeGetOrCreateResponse {
2623
+ string volume_id = 1;
2624
+ VolumeFsVersion version = 2;
2625
+ }
2626
+
2627
+ message VolumeHeartbeatRequest {
2628
+ string volume_id = 1;
1883
2629
  }
1884
2630
 
1885
2631
  message VolumeListFilesRequest {
1886
2632
  string volume_id = 1;
1887
2633
  string path = 2;
1888
- optional int32 max_entries = 3;
2634
+ bool recursive = 4;
2635
+ optional uint32 max_entries = 3;
1889
2636
  }
1890
2637
 
1891
2638
  message VolumeListFilesResponse {
1892
- repeated VolumeListFilesEntry entries = 1;
2639
+ repeated FileEntry entries = 1;
1893
2640
  }
1894
2641
 
1895
2642
  message VolumeListItem {
@@ -1907,10 +2654,10 @@ message VolumeListResponse {
1907
2654
  string environment_name = 2;
1908
2655
  }
1909
2656
 
1910
- message VolumeReloadRequest {
1911
- // NOTE(staffan): Mounting a volume in multiple locations is not supported, so volume_id alone uniquely identifies
1912
- // a volume mount.
2657
+ message VolumeMount {
1913
2658
  string volume_id = 1;
2659
+ string mount_path = 2;
2660
+ bool allow_background_commits = 3;
1914
2661
  }
1915
2662
 
1916
2663
  message VolumePutFilesRequest {
@@ -1922,23 +2669,37 @@ message VolumePutFilesRequest {
1922
2669
  bool disallow_overwrite_existing_files = 3;
1923
2670
  }
1924
2671
 
2672
+ message VolumeReloadRequest {
2673
+ // NOTE(staffan): Mounting a volume in multiple locations is not supported, so volume_id alone uniquely identifies
2674
+ // a volume mount.
2675
+ string volume_id = 1;
2676
+ }
2677
+
1925
2678
  message VolumeRemoveFileRequest {
1926
2679
  string volume_id = 1 [ (modal.options.audit_target_attr) = true ];
1927
- bytes path = 2;
2680
+ string path = 2;
1928
2681
  bool recursive = 3;
1929
2682
  }
1930
2683
 
1931
- message VolumeCopyFilesRequest {
1932
- string volume_id = 1;
1933
- repeated bytes src_paths = 2;
1934
- bytes dst_path = 3;
1935
- bool recursive = 4;
2684
+ message VolumeRenameRequest {
2685
+ string volume_id = 1 [ (modal.options.audit_target_attr) = true ];
2686
+ string name = 2;
1936
2687
  }
1937
2688
 
1938
- message VolumeMount {
1939
- string volume_id = 1;
1940
- string mount_path = 2;
1941
- bool allow_background_commits = 3;
2689
+ message Warning {
2690
+ enum WarningType {
2691
+ WARNING_TYPE_UNSPECIFIED = 0;
2692
+ WARNING_TYPE_CLIENT_DEPRECATION = 1;
2693
+ WARNING_TYPE_RESOURCE_LIMIT = 2;
2694
+ }
2695
+ WarningType type = 1;
2696
+ string message = 2;
2697
+ }
2698
+
2699
+ message WebUrlInfo {
2700
+ bool truncated = 1;
2701
+ bool has_unique_hash = 2 [deprecated=true];
2702
+ bool label_stolen = 3;
1942
2703
  }
1943
2704
 
1944
2705
  message WebhookConfig {
@@ -1949,53 +2710,34 @@ message WebhookConfig {
1949
2710
  repeated CustomDomainConfig custom_domains = 6;
1950
2711
  uint32 web_server_port = 7;
1951
2712
  float web_server_startup_timeout = 8;
1952
- }
1953
-
1954
- message WebUrlInfo {
1955
- bool truncated = 1;
1956
- bool has_unique_hash = 2;
1957
- bool label_stolen = 3;
2713
+ bool web_endpoint_docs = 9;
2714
+ bool requires_proxy_auth = 10;
1958
2715
  }
1959
2716
 
1960
2717
  message WorkspaceNameLookupResponse {
1961
- string workspace_name = 1;
2718
+ string workspace_name = 1 [deprecated=true];
1962
2719
  string username = 2;
1963
2720
  }
1964
2721
 
1965
- // Used for `modal container exec`
1966
- message RuntimeOutputMessage {
1967
- // only stdout / stderr is used
1968
- FileDescriptor file_descriptor = 1;
1969
- string message = 2;
1970
- }
1971
-
1972
- message RuntimeOutputBatch {
1973
- repeated RuntimeOutputMessage items = 1;
1974
- uint64 batch_index = 2;
1975
- // if an exit code is given, this is the final message that will be sent.
1976
- optional int32 exit_code = 3;
1977
- }
1978
-
1979
- message RuntimeInputMessage {
1980
- bytes message = 1;
1981
- uint64 message_index = 2;
1982
- }
1983
-
1984
2722
 
1985
2723
  service ModalClient {
1986
2724
  // Apps
1987
- rpc AppCreate(AppCreateRequest) returns (AppCreateResponse);
1988
2725
  rpc AppClientDisconnect(AppClientDisconnectRequest) returns (google.protobuf.Empty);
2726
+ rpc AppCreate(AppCreateRequest) returns (AppCreateResponse);
2727
+ rpc AppDeploy(AppDeployRequest) returns (AppDeployResponse);
2728
+ rpc AppDeploymentHistory(AppDeploymentHistoryRequest) returns (AppDeploymentHistoryResponse);
2729
+ rpc AppGetByDeploymentName(AppGetByDeploymentNameRequest) returns (AppGetByDeploymentNameResponse);
2730
+ rpc AppGetLayout(AppGetLayoutRequest) returns (AppGetLayoutResponse);
1989
2731
  rpc AppGetLogs(AppGetLogsRequest) returns (stream TaskLogsBatch);
1990
- rpc AppSetObjects(AppSetObjectsRequest) returns (google.protobuf.Empty);
1991
2732
  rpc AppGetObjects(AppGetObjectsRequest) returns (AppGetObjectsResponse);
2733
+ rpc AppGetOrCreate(AppGetOrCreateRequest) returns (AppGetOrCreateResponse);
2734
+ rpc AppHeartbeat(AppHeartbeatRequest) returns (google.protobuf.Empty);
1992
2735
  rpc AppList(AppListRequest) returns (AppListResponse);
1993
- rpc AppLookupObject(AppLookupObjectRequest) returns (AppLookupObjectResponse);
1994
- rpc AppDeploy(AppDeployRequest) returns (AppDeployResponse);
1995
- rpc AppDeploySingleObject(AppDeploySingleObjectRequest) returns (AppDeploySingleObjectResponse);
1996
- rpc AppGetByDeploymentName(AppGetByDeploymentNameRequest) returns (AppGetByDeploymentNameResponse);
2736
+ rpc AppLookup(AppLookupRequest) returns (AppLookupResponse);
2737
+ rpc AppPublish(AppPublishRequest) returns (AppPublishResponse);
2738
+ rpc AppRollback(AppRollbackRequest) returns (google.protobuf.Empty);
2739
+ rpc AppSetObjects(AppSetObjectsRequest) returns (google.protobuf.Empty);
1997
2740
  rpc AppStop(AppStopRequest) returns (google.protobuf.Empty);
1998
- rpc AppHeartbeat(AppHeartbeatRequest) returns (google.protobuf.Empty);
1999
2741
 
2000
2742
  // Blobs
2001
2743
  rpc BlobCreate(BlobCreateRequest) returns (BlobCreateResponse);
@@ -2006,47 +2748,59 @@ service ModalClient {
2006
2748
  rpc ClassGet(ClassGetRequest) returns (ClassGetResponse);
2007
2749
 
2008
2750
  // Clients
2009
- rpc ClientCreate(ClientCreateRequest) returns (ClientCreateResponse);
2010
2751
  rpc ClientHello(google.protobuf.Empty) returns (ClientHelloResponse);
2011
- rpc ClientHeartbeat(ClientHeartbeatRequest) returns (google.protobuf.Empty);
2012
2752
 
2013
2753
  // Container
2014
- rpc ContainerHeartbeat(ContainerHeartbeatRequest) returns (ContainerHeartbeatResponse);
2754
+ rpc ContainerCheckpoint(ContainerCheckpointRequest) returns (google.protobuf.Empty);
2015
2755
  rpc ContainerExec(ContainerExecRequest) returns (ContainerExecResponse);
2016
2756
  rpc ContainerExecGetOutput(ContainerExecGetOutputRequest) returns (stream RuntimeOutputBatch);
2017
2757
  rpc ContainerExecPutInput(ContainerExecPutInputRequest) returns (google.protobuf.Empty);
2018
-
2019
- // Checkpointing
2020
- rpc ContainerCheckpoint(ContainerCheckpointRequest) returns (google.protobuf.Empty);
2758
+ rpc ContainerExecWait(ContainerExecWaitRequest) returns (ContainerExecWaitResponse);
2759
+ rpc ContainerFilesystemExec(ContainerFilesystemExecRequest) returns (ContainerFilesystemExecResponse);
2760
+ rpc ContainerFilesystemExecGetOutput(ContainerFilesystemExecGetOutputRequest) returns (stream FilesystemRuntimeOutputBatch);
2761
+ rpc ContainerHeartbeat(ContainerHeartbeatRequest) returns (ContainerHeartbeatResponse);
2762
+ rpc ContainerHello(google.protobuf.Empty) returns (google.protobuf.Empty);
2763
+ rpc ContainerLog(ContainerLogRequest) returns (google.protobuf.Empty);
2764
+ rpc ContainerStop(ContainerStopRequest) returns (ContainerStopResponse);
2021
2765
 
2022
2766
  // Dicts
2023
2767
  rpc DictClear(DictClearRequest) returns (google.protobuf.Empty);
2024
- rpc DictCreate(DictCreateRequest) returns (DictCreateResponse); // Will be superseded by DictGetOrCreate
2768
+ rpc DictContains(DictContainsRequest) returns (DictContainsResponse);
2769
+ rpc DictContents(DictContentsRequest) returns (stream DictEntry);
2770
+ rpc DictDelete(DictDeleteRequest) returns (google.protobuf.Empty);
2771
+ rpc DictGet(DictGetRequest) returns (DictGetResponse);
2025
2772
  rpc DictGetOrCreate(DictGetOrCreateRequest) returns (DictGetOrCreateResponse);
2026
2773
  rpc DictHeartbeat(DictHeartbeatRequest) returns (google.protobuf.Empty);
2027
- rpc DictUpdate(DictUpdateRequest) returns (DictUpdateResponse);
2028
- rpc DictGet(DictGetRequest) returns (DictGetResponse);
2029
- rpc DictPop(DictPopRequest) returns (DictPopResponse);
2030
- rpc DictContains(DictContainsRequest) returns (DictContainsResponse);
2031
2774
  rpc DictLen(DictLenRequest) returns (DictLenResponse);
2775
+ rpc DictList(DictListRequest) returns (DictListResponse);
2776
+ rpc DictPop(DictPopRequest) returns (DictPopResponse);
2777
+ rpc DictUpdate(DictUpdateRequest) returns (DictUpdateResponse);
2032
2778
 
2033
2779
  // Domains
2780
+ rpc DomainCertificateVerify(DomainCertificateVerifyRequest) returns (DomainCertificateVerifyResponse);
2034
2781
  rpc DomainCreate(DomainCreateRequest) returns (DomainCreateResponse);
2035
2782
  rpc DomainList(DomainListRequest) returns (DomainListResponse);
2036
- rpc DomainCertificateVerify(DomainCertificateVerifyRequest) returns (DomainCertificateVerifyResponse);
2037
2783
 
2038
2784
  // Environments
2039
2785
  rpc EnvironmentCreate(EnvironmentCreateRequest) returns (google.protobuf.Empty);
2040
- rpc EnvironmentList(google.protobuf.Empty) returns (EnvironmentListResponse);
2041
2786
  rpc EnvironmentDelete(EnvironmentDeleteRequest) returns (google.protobuf.Empty);
2787
+ rpc EnvironmentGetOrCreate(EnvironmentGetOrCreateRequest) returns (EnvironmentGetOrCreateResponse);
2788
+ rpc EnvironmentList(google.protobuf.Empty) returns (EnvironmentListResponse);
2042
2789
  rpc EnvironmentUpdate(EnvironmentUpdateRequest) returns (EnvironmentListItem);
2043
2790
 
2044
2791
  // Functions
2792
+ rpc FunctionAsyncInvoke(FunctionAsyncInvokeRequest) returns (FunctionAsyncInvokeResponse);
2045
2793
  rpc FunctionBindParams(FunctionBindParamsRequest) returns (FunctionBindParamsResponse);
2794
+ rpc FunctionCallCancel(FunctionCallCancelRequest) returns (google.protobuf.Empty);
2795
+ rpc FunctionCallGetDataIn(FunctionCallGetDataRequest) returns (stream DataChunk);
2796
+ rpc FunctionCallGetDataOut(FunctionCallGetDataRequest) returns (stream DataChunk);
2797
+ rpc FunctionCallList(FunctionCallListRequest) returns (FunctionCallListResponse);
2798
+ rpc FunctionCallPutDataOut(FunctionCallPutDataRequest) returns (google.protobuf.Empty);
2046
2799
  rpc FunctionCreate(FunctionCreateRequest) returns (FunctionCreateResponse);
2047
2800
  rpc FunctionGet(FunctionGetRequest) returns (FunctionGetResponse);
2048
2801
  rpc FunctionGetCallGraph(FunctionGetCallGraphRequest) returns (FunctionGetCallGraphResponse);
2049
2802
  rpc FunctionGetCurrentStats(FunctionGetCurrentStatsRequest) returns (FunctionStats);
2803
+ rpc FunctionGetDynamicConcurrency(FunctionGetDynamicConcurrencyRequest) returns (FunctionGetDynamicConcurrencyResponse);
2050
2804
  rpc FunctionGetInputs(FunctionGetInputsRequest) returns (FunctionGetInputsResponse); // For containers to request next call
2051
2805
  rpc FunctionGetOutputs(FunctionGetOutputsRequest) returns (FunctionGetOutputsResponse); // Returns the next result(s) for an entire function call (FunctionMap)
2052
2806
  rpc FunctionGetSerialized(FunctionGetSerializedRequest) returns (FunctionGetSerializedResponse);
@@ -2054,69 +2808,70 @@ service ModalClient {
2054
2808
  rpc FunctionPrecreate(FunctionPrecreateRequest) returns (FunctionPrecreateResponse);
2055
2809
  rpc FunctionPutInputs(FunctionPutInputsRequest) returns (FunctionPutInputsResponse);
2056
2810
  rpc FunctionPutOutputs(FunctionPutOutputsRequest) returns (google.protobuf.Empty); // For containers to return result
2057
- rpc FunctionUpdateSchedulingParams(FunctionUpdateSchedulingParamsRequest) returns (FunctionUpdateSchedulingParamsResponse);
2058
-
2059
- // Function calls
2060
- rpc FunctionCallCancel(FunctionCallCancelRequest) returns (google.protobuf.Empty);
2061
- rpc FunctionCallList(FunctionCallListRequest) returns (FunctionCallListResponse);
2062
- rpc FunctionCallGetDataIn(FunctionCallGetDataRequest) returns (stream DataChunk);
2063
- rpc FunctionCallGetDataOut(FunctionCallGetDataRequest) returns (stream DataChunk);
2064
- rpc FunctionCallPutDataOut(FunctionCallPutDataRequest) returns (google.protobuf.Empty);
2065
-
2066
- // Interactive functions
2811
+ rpc FunctionRetryInputs(FunctionRetryInputsRequest) returns (FunctionRetryInputsResponse);
2067
2812
  rpc FunctionStartPtyShell(google.protobuf.Empty) returns (google.protobuf.Empty);
2813
+ rpc FunctionUpdateSchedulingParams(FunctionUpdateSchedulingParamsRequest) returns (FunctionUpdateSchedulingParamsResponse);
2068
2814
 
2069
2815
  // Images
2816
+ rpc ImageFromId(ImageFromIdRequest) returns (ImageFromIdResponse);
2070
2817
  rpc ImageGetOrCreate(ImageGetOrCreateRequest) returns (ImageGetOrCreateResponse);
2071
2818
  rpc ImageJoinStreaming(ImageJoinStreamingRequest) returns (stream ImageJoinStreamingResponse);
2072
2819
 
2073
2820
  // Mounts
2074
- rpc MountPutFile(MountPutFileRequest) returns (MountPutFileResponse);
2075
- rpc MountBuild(MountBuildRequest) returns (MountBuildResponse);
2076
2821
  rpc MountGetOrCreate(MountGetOrCreateRequest) returns (MountGetOrCreateResponse);
2822
+ rpc MountPutFile(MountPutFileRequest) returns (MountPutFileResponse);
2077
2823
 
2078
2824
  // Proxies
2825
+ rpc ProxyCreate(ProxyCreateRequest) returns (ProxyCreateResponse);
2826
+ rpc ProxyDelete(ProxyDeleteRequest) returns (google.protobuf.Empty);
2827
+ rpc ProxyGet(ProxyGetRequest) returns (ProxyGetResponse);
2079
2828
  rpc ProxyGetOrCreate(ProxyGetOrCreateRequest) returns (ProxyGetOrCreateResponse);
2829
+ rpc ProxyList(google.protobuf.Empty) returns (ProxyListResponse);
2080
2830
 
2081
2831
  // Queues
2082
- rpc QueueCreate(QueueCreateRequest) returns (QueueCreateResponse);
2083
- rpc QueueGetOrCreate(QueueGetOrCreateRequest) returns (QueueGetOrCreateResponse);
2832
+ rpc QueueClear(QueueClearRequest) returns (google.protobuf.Empty);
2833
+ rpc QueueDelete(QueueDeleteRequest) returns (google.protobuf.Empty);
2084
2834
  rpc QueueGet(QueueGetRequest) returns (QueueGetResponse);
2835
+ rpc QueueGetOrCreate(QueueGetOrCreateRequest) returns (QueueGetOrCreateResponse);
2085
2836
  rpc QueueHeartbeat(QueueHeartbeatRequest) returns (google.protobuf.Empty);
2086
- rpc QueuePut(QueuePutRequest) returns (google.protobuf.Empty);
2087
2837
  rpc QueueLen(QueueLenRequest) returns (QueueLenResponse);
2838
+ rpc QueueList(QueueListRequest) returns (QueueListResponse);
2839
+ rpc QueueNextItems(QueueNextItemsRequest) returns (QueueNextItemsResponse);
2840
+ rpc QueuePut(QueuePutRequest) returns (google.protobuf.Empty);
2088
2841
 
2089
2842
  // Sandboxes
2090
2843
  rpc SandboxCreate(SandboxCreateRequest) returns (SandboxCreateResponse);
2091
- rpc SandboxGetTaskId(SandboxGetTaskIdRequest) returns (SandboxGetTaskIdResponse); // needed for modal container exec
2092
2844
  rpc SandboxGetLogs(SandboxGetLogsRequest) returns (stream TaskLogsBatch);
2093
- rpc SandboxWait(SandboxWaitRequest) returns (SandboxWaitResponse);
2845
+ rpc SandboxGetTaskId(SandboxGetTaskIdRequest) returns (SandboxGetTaskIdResponse); // needed for modal container exec
2846
+ rpc SandboxGetTunnels(SandboxGetTunnelsRequest) returns (SandboxGetTunnelsResponse);
2094
2847
  rpc SandboxList(SandboxListRequest) returns (SandboxListResponse);
2095
- rpc SandboxTerminate(SandboxTerminateRequest) returns (SandboxTerminateResponse);
2848
+ rpc SandboxSnapshotFs(SandboxSnapshotFsRequest) returns (SandboxSnapshotFsResponse);
2096
2849
  rpc SandboxStdinWrite(SandboxStdinWriteRequest) returns (SandboxStdinWriteResponse);
2850
+ rpc SandboxTagsSet(SandboxTagsSetRequest) returns (google.protobuf.Empty);
2851
+ rpc SandboxTerminate(SandboxTerminateRequest) returns (SandboxTerminateResponse);
2852
+ rpc SandboxWait(SandboxWaitRequest) returns (SandboxWaitResponse);
2097
2853
 
2098
2854
  // Secrets
2099
- rpc SecretCreate(SecretCreateRequest) returns (SecretCreateResponse); // Not used by client anymore
2855
+ rpc SecretDelete(SecretDeleteRequest) returns (google.protobuf.Empty);
2100
2856
  rpc SecretGetOrCreate(SecretGetOrCreateRequest) returns (SecretGetOrCreateResponse);
2101
2857
  rpc SecretList(SecretListRequest) returns (SecretListResponse);
2102
2858
 
2103
2859
  // SharedVolumes
2860
+ rpc SharedVolumeDelete(SharedVolumeDeleteRequest) returns (google.protobuf.Empty);
2861
+ rpc SharedVolumeGetFile(SharedVolumeGetFileRequest) returns (SharedVolumeGetFileResponse);
2104
2862
  rpc SharedVolumeGetOrCreate(SharedVolumeGetOrCreateRequest) returns (SharedVolumeGetOrCreateResponse);
2105
- rpc SharedVolumeCreate(SharedVolumeCreateRequest) returns (SharedVolumeCreateResponse);
2106
2863
  rpc SharedVolumeHeartbeat(SharedVolumeHeartbeatRequest) returns (google.protobuf.Empty);
2107
2864
  rpc SharedVolumeList(SharedVolumeListRequest) returns (SharedVolumeListResponse);
2108
2865
  rpc SharedVolumeListFiles(SharedVolumeListFilesRequest) returns (SharedVolumeListFilesResponse);
2109
2866
  rpc SharedVolumeListFilesStream(SharedVolumeListFilesRequest) returns (stream SharedVolumeListFilesResponse);
2110
2867
  rpc SharedVolumePutFile(SharedVolumePutFileRequest) returns (SharedVolumePutFileResponse);
2111
- rpc SharedVolumeGetFile(SharedVolumeGetFileRequest) returns (SharedVolumeGetFileResponse);
2112
2868
  rpc SharedVolumeRemoveFile(SharedVolumeRemoveFileRequest) returns (google.protobuf.Empty);
2113
2869
 
2114
2870
  // Tasks
2115
- rpc TaskResult(TaskResultRequest) returns (google.protobuf.Empty);
2116
- rpc TaskList(TaskListRequest) returns (TaskListResponse);
2117
-
2118
- // Gets the inputs currently assigned to the requesting task, requires task metadata for auth
2871
+ rpc TaskClusterHello(TaskClusterHelloRequest) returns (TaskClusterHelloResponse);
2119
2872
  rpc TaskCurrentInputs(google.protobuf.Empty) returns (TaskCurrentInputsResponse);
2873
+ rpc TaskList(TaskListRequest) returns (TaskListResponse);
2874
+ rpc TaskResult(TaskResultRequest) returns (google.protobuf.Empty);
2120
2875
 
2121
2876
  // Tokens (web auth flow)
2122
2877
  rpc TokenFlowCreate(TokenFlowCreateRequest) returns (TokenFlowCreateResponse);
@@ -2127,18 +2882,18 @@ service ModalClient {
2127
2882
  rpc TunnelStop(TunnelStopRequest) returns (TunnelStopResponse);
2128
2883
 
2129
2884
  // Volumes
2130
- rpc VolumeGetOrCreate(VolumeGetOrCreateRequest) returns (VolumeGetOrCreateResponse);
2131
- rpc VolumeCreate(VolumeCreateRequest) returns (VolumeCreateResponse);
2132
- rpc VolumeHeartbeat(VolumeHeartbeatRequest) returns (google.protobuf.Empty);
2133
2885
  rpc VolumeCommit(VolumeCommitRequest) returns (VolumeCommitResponse);
2886
+ rpc VolumeCopyFiles(VolumeCopyFilesRequest) returns (google.protobuf.Empty);
2134
2887
  rpc VolumeDelete(VolumeDeleteRequest) returns (google.protobuf.Empty);
2135
2888
  rpc VolumeGetFile(VolumeGetFileRequest) returns (VolumeGetFileResponse);
2889
+ rpc VolumeGetOrCreate(VolumeGetOrCreateRequest) returns (VolumeGetOrCreateResponse);
2890
+ rpc VolumeHeartbeat(VolumeHeartbeatRequest) returns (google.protobuf.Empty);
2136
2891
  rpc VolumeList(VolumeListRequest) returns (VolumeListResponse);
2137
2892
  rpc VolumeListFiles(VolumeListFilesRequest) returns (stream VolumeListFilesResponse);
2138
2893
  rpc VolumePutFiles(VolumePutFilesRequest) returns (google.protobuf.Empty);
2139
2894
  rpc VolumeReload(VolumeReloadRequest) returns (google.protobuf.Empty);
2140
2895
  rpc VolumeRemoveFile(VolumeRemoveFileRequest) returns (google.protobuf.Empty);
2141
- rpc VolumeCopyFiles(VolumeCopyFilesRequest) returns (google.protobuf.Empty);
2896
+ rpc VolumeRename(VolumeRenameRequest) returns (google.protobuf.Empty);
2142
2897
 
2143
2898
  // Workspaces
2144
2899
  rpc WorkspaceNameLookup(google.protobuf.Empty) returns (WorkspaceNameLookupResponse);