modal 0.66.39__py3-none-any.whl → 0.66.44__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.
modal/io_streams.py CHANGED
@@ -66,9 +66,10 @@ T = TypeVar("T", str, bytes)
66
66
 
67
67
 
68
68
  class _StreamReader(Generic[T]):
69
- """Provides an interface to buffer and fetch logs from a stream (`stdout` or `stderr`).
69
+ """Retrieve logs from a stream (`stdout` or `stderr`).
70
70
 
71
- As an asynchronous iterable, the object supports the async for statement.
71
+ As an asynchronous iterable, the object supports the `for` and `async for`
72
+ statements. Just loop over the object to read in chunks.
72
73
 
73
74
  **Usage**
74
75
 
@@ -140,12 +141,12 @@ class _StreamReader(Generic[T]):
140
141
  self._consume_container_process_task = asyncio.create_task(self._consume_container_process_stream())
141
142
 
142
143
  @property
143
- def file_descriptor(self):
144
+ def file_descriptor(self) -> int:
145
+ """Possible values are `1` for stdout and `2` for stderr."""
144
146
  return self._file_descriptor
145
147
 
146
148
  async def read(self) -> T:
147
- """Fetch and return contents of the entire stream. If EOF was received,
148
- return an empty string.
149
+ """Fetch the entire contents of the stream until EOF.
149
150
 
150
151
  **Usage**
151
152
 
@@ -157,7 +158,6 @@ class _StreamReader(Generic[T]):
157
158
 
158
159
  print(sandbox.stdout.read())
159
160
  ```
160
-
161
161
  """
162
162
  data_str = ""
163
163
  data_bytes = b""
@@ -175,9 +175,7 @@ class _StreamReader(Generic[T]):
175
175
  return cast(T, data_bytes)
176
176
 
177
177
  async def _consume_container_process_stream(self):
178
- """
179
- Consumes the container process stream and stores the messages in the buffer.
180
- """
178
+ """Consume the container process stream and store messages in the buffer."""
181
179
  if self._stream_type == StreamType.DEVNULL:
182
180
  return
183
181
 
@@ -211,9 +209,7 @@ class _StreamReader(Generic[T]):
211
209
  raise exc
212
210
 
213
211
  async def _stream_container_process(self) -> AsyncGenerator[Tuple[Optional[bytes], str], None]:
214
- """mdmd:hidden
215
- Streams the container process buffer to the reader.
216
- """
212
+ """Streams the container process buffer to the reader."""
217
213
  entry_id = 0
218
214
  if self._last_entry_id:
219
215
  entry_id = int(self._last_entry_id) + 1
@@ -232,8 +228,7 @@ class _StreamReader(Generic[T]):
232
228
  entry_id += 1
233
229
 
234
230
  async def _get_logs(self) -> AsyncGenerator[Optional[bytes], None]:
235
- """mdmd:hidden
236
- Streams sandbox or process logs from the server to the reader.
231
+ """Streams sandbox or process logs from the server to the reader.
237
232
 
238
233
  Logs returned by this method may contain partial or multiple lines at a time.
239
234
 
@@ -278,9 +273,7 @@ class _StreamReader(Generic[T]):
278
273
  raise
279
274
 
280
275
  async def _get_logs_by_line(self) -> AsyncGenerator[Optional[bytes], None]:
281
- """mdmd:hidden
282
- Processes logs from the server and yields complete lines only.
283
- """
276
+ """Process logs from the server and yield complete lines only."""
284
277
  async for message in self._get_logs():
285
278
  if message is None:
286
279
  if self._line_buffer:
@@ -325,7 +318,8 @@ MAX_BUFFER_SIZE = 2 * 1024 * 1024
325
318
  class _StreamWriter:
326
319
  """Provides an interface to buffer and write logs to a sandbox or container process stream (`stdin`)."""
327
320
 
328
- def __init__(self, object_id: str, object_type: Literal["sandbox", "container_process"], client: _Client):
321
+ def __init__(self, object_id: str, object_type: Literal["sandbox", "container_process"], client: _Client) -> None:
322
+ """mdmd:hidden"""
329
323
  self._index = 1
330
324
  self._object_id = object_id
331
325
  self._object_type = object_type
@@ -333,17 +327,16 @@ class _StreamWriter:
333
327
  self._is_closed = False
334
328
  self._buffer = bytearray()
335
329
 
336
- def get_next_index(self):
337
- """mdmd:hidden"""
330
+ def _get_next_index(self) -> int:
338
331
  index = self._index
339
332
  self._index += 1
340
333
  return index
341
334
 
342
- def write(self, data: Union[bytes, bytearray, memoryview, str]):
343
- """
344
- Writes data to stream's internal buffer, but does not drain/flush the write.
335
+ def write(self, data: Union[bytes, bytearray, memoryview, str]) -> None:
336
+ """Write data to the stream but does not send it immediately.
345
337
 
346
- This method needs to be used along with the `drain()` method which flushes the buffer.
338
+ This is non-blocking and queues the data to an internal buffer. Must be
339
+ used along with the `drain()` method, which flushes the buffer.
347
340
 
348
341
  **Usage**
349
342
 
@@ -375,22 +368,36 @@ class _StreamWriter:
375
368
  else:
376
369
  raise TypeError(f"data argument must be a bytes-like object, not {type(data).__name__}")
377
370
 
378
- def write_eof(self):
379
- """
380
- Closes the write end of the stream after the buffered write data is drained.
381
- If the process was blocked on input, it will become unblocked after `write_eof()`.
371
+ def write_eof(self) -> None:
372
+ """Close the write end of the stream after the buffered data is drained.
382
373
 
383
- This method needs to be used along with the `drain()` method which flushes the EOF to the process.
374
+ If the process was blocked on input, it will become unblocked after
375
+ `write_eof()`. This method needs to be used along with the `drain()`
376
+ method, which flushes the EOF to the process.
384
377
  """
385
378
  self._is_closed = True
386
379
 
387
- async def drain(self):
388
- """
389
- Flushes the write buffer to the running process. Flushes the EOF if the writer is closed.
380
+ async def drain(self) -> None:
381
+ """Flush the write buffer and send data to the running process.
382
+
383
+ This is a flow control method that blocks until data is sent. It returns
384
+ when it is appropriate to continue writing data to the stream.
385
+
386
+ **Usage**
387
+
388
+ ```python
389
+ # Synchronous
390
+ writer.write(data)
391
+ writer.drain()
392
+
393
+ # Async
394
+ writer.write(data)
395
+ await writer.drain.aio()
396
+ ```
390
397
  """
391
398
  data = bytes(self._buffer)
392
399
  self._buffer.clear()
393
- index = self.get_next_index()
400
+ index = self._get_next_index()
394
401
 
395
402
  try:
396
403
  if self._object_type == "sandbox":
modal/io_streams.pyi CHANGED
@@ -26,7 +26,7 @@ class _StreamReader(typing.Generic[T]):
26
26
  by_line: bool = False,
27
27
  ) -> None: ...
28
28
  @property
29
- def file_descriptor(self): ...
29
+ def file_descriptor(self) -> int: ...
30
30
  async def read(self) -> T: ...
31
31
  async def _consume_container_process_stream(self): ...
32
32
  def _stream_container_process(self) -> typing.AsyncGenerator[typing.Tuple[typing.Optional[bytes], str], None]: ...
@@ -38,11 +38,11 @@ class _StreamReader(typing.Generic[T]):
38
38
  class _StreamWriter:
39
39
  def __init__(
40
40
  self, object_id: str, object_type: typing.Literal["sandbox", "container_process"], client: modal.client._Client
41
- ): ...
42
- def get_next_index(self): ...
43
- def write(self, data: typing.Union[bytes, bytearray, memoryview, str]): ...
44
- def write_eof(self): ...
45
- async def drain(self): ...
41
+ ) -> None: ...
42
+ def _get_next_index(self) -> int: ...
43
+ def write(self, data: typing.Union[bytes, bytearray, memoryview, str]) -> None: ...
44
+ def write_eof(self) -> None: ...
45
+ async def drain(self) -> None: ...
46
46
 
47
47
  T_INNER = typing.TypeVar("T_INNER", covariant=True)
48
48
 
@@ -60,7 +60,7 @@ class StreamReader(typing.Generic[T]):
60
60
  by_line: bool = False,
61
61
  ) -> None: ...
62
62
  @property
63
- def file_descriptor(self): ...
63
+ def file_descriptor(self) -> int: ...
64
64
 
65
65
  class __read_spec(typing_extensions.Protocol[T_INNER]):
66
66
  def __call__(self) -> T_INNER: ...
@@ -100,13 +100,13 @@ class StreamReader(typing.Generic[T]):
100
100
  class StreamWriter:
101
101
  def __init__(
102
102
  self, object_id: str, object_type: typing.Literal["sandbox", "container_process"], client: modal.client.Client
103
- ): ...
104
- def get_next_index(self): ...
105
- def write(self, data: typing.Union[bytes, bytearray, memoryview, str]): ...
106
- def write_eof(self): ...
103
+ ) -> None: ...
104
+ def _get_next_index(self) -> int: ...
105
+ def write(self, data: typing.Union[bytes, bytearray, memoryview, str]) -> None: ...
106
+ def write_eof(self) -> None: ...
107
107
 
108
108
  class __drain_spec(typing_extensions.Protocol):
109
- def __call__(self): ...
110
- async def aio(self): ...
109
+ def __call__(self) -> None: ...
110
+ async def aio(self) -> None: ...
111
111
 
112
112
  drain: __drain_spec
modal/mount.py CHANGED
@@ -377,7 +377,9 @@ class _Mount(_Object, type_prefix="mo"):
377
377
  )
378
378
 
379
379
  def add_local_file(
380
- self, local_path: Union[str, Path], remote_path: Union[str, PurePosixPath, None] = None
380
+ self,
381
+ local_path: Union[str, Path],
382
+ remote_path: Union[str, PurePosixPath, None] = None,
381
383
  ) -> "_Mount":
382
384
  """
383
385
  Add a local file to the `Mount` object.
modal/partial_function.py CHANGED
@@ -91,7 +91,7 @@ class _PartialFunction(typing.Generic[P, ReturnType, OriginalReturnType]):
91
91
  if obj: # accessing the method on an instance of a class, e.g. `MyClass().fun``
92
92
  if hasattr(obj, "_modal_functions"):
93
93
  # This happens inside "local" user methods when they refer to other methods,
94
- # e.g. Foo().parent_method() doing self.local.other_method()
94
+ # e.g. Foo().parent_method.remote() calling self.other_method.remote()
95
95
  return getattr(obj, "_modal_functions")[k]
96
96
  else:
97
97
  # special edge case: referencing a method of an instance of an
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: modal
3
- Version: 0.66.39
3
+ Version: 0.66.44
4
4
  Summary: Python client library for Modal
5
5
  Author: Modal Labs
6
6
  Author-email: support@modal.com
@@ -2,7 +2,7 @@ modal/__init__.py,sha256=Yn8zS7Jxl5uZjPM331Pc4FdSmp9Rt6VdE7TiE4ZKRc8,2151
2
2
  modal/__main__.py,sha256=scYhGFqh8OJcVDo-VOxIT6CCwxOgzgflYWMnIZiMRqE,2871
3
3
  modal/_clustered_functions.py,sha256=58spAmCbOk8eyjFKW-H21W-FGyYiJmfpEMK4BnTEUrk,2706
4
4
  modal/_clustered_functions.pyi,sha256=UQ7DHiQFI3A2Z8kC3gltNHJkQfvgvPuSbFsse9lSPkw,785
5
- modal/_container_entrypoint.py,sha256=T0Ql-oxgmj7PRVtdF4wYEGq-_a1ZACuCxe6u2XYj0nk,28671
5
+ modal/_container_entrypoint.py,sha256=qP7TRT92_wKlxR-XuLg1FzJ7w4oknlrWDlp68XE0CwQ,28670
6
6
  modal/_ipython.py,sha256=HF_DYy0e0qM9WnGDmTY30s1RxzGya9GeORCauCEpRaE,450
7
7
  modal/_location.py,sha256=S3lSxIU3h9HkWpkJ3Pwo0pqjIOSB1fjeSgUsY3x7eec,1202
8
8
  modal/_output.py,sha256=SMaLrf1btBzHTV_tH5NzA8ZTWNJh5J0b31iG3sQU8_4,25494
@@ -19,11 +19,11 @@ modal/app.py,sha256=QEBK8qYSrux36oi3iS3msBQmcUOS1r4s2nengzzynjQ,44658
19
19
  modal/app.pyi,sha256=wHwBIDqkUb2CQzYVhxZafJ8xZ17TZ-8y-cRyOeZsEm0,25182
20
20
  modal/call_graph.py,sha256=l-Wi6vM8aosCdHTWegcCyGeVJGFdZ_fzlCmbRVPBXFI,2593
21
21
  modal/client.py,sha256=4SpWb4n0nolITR36kADZl1tYLOg6avukmzZU56UQjCo,16385
22
- modal/client.pyi,sha256=Ei9L7Pu_SmAb5UB3r6E6GROF3HhJRCcsKYik5sMWG8s,7372
22
+ modal/client.pyi,sha256=G8PEZZNj243tqHX-HnfOm5hyUADo34xQEiOLCpPVVxU,7372
23
23
  modal/cloud_bucket_mount.py,sha256=eWQhCtMIczpokjfTZEgNBCGO_s5ft46PqTSLfKBykq4,5748
24
24
  modal/cloud_bucket_mount.pyi,sha256=tTF7M4FR9bTA30cFkz8qq3ZTlFL19NHU_36e_5GgAGA,1424
25
- modal/cls.py,sha256=Ci7EtMrLm1LExfjZ9K2IXyj-SV9Syq8dAbZCEfddcmY,24234
26
- modal/cls.pyi,sha256=Dr4kgq8cj7YGRf9ayInuogOxs6yHim5_562Om8Avu14,8332
25
+ modal/cls.py,sha256=apKnBOHKYEpBiMC8mRvHtCDJl1g0vP0tG1r8mUZ1yH0,24684
26
+ modal/cls.pyi,sha256=om3xQuHTMu7q_32BDKJjAz4oP_7Z5JWV27kyDKTPFI8,8332
27
27
  modal/config.py,sha256=oVmvclQ2Qlt-VmL3wEp8DgDrnTPh_K5UBEYrSXv4C4s,10928
28
28
  modal/container_process.py,sha256=c_jBPtyPeSxbIcbLfs_FzTrt-1eErtRSnsfxkDozFoY,5589
29
29
  modal/container_process.pyi,sha256=k2kClwaSzz11eci1pzFZgCm-ptXapHAyHTOENorlazA,2594
@@ -33,14 +33,14 @@ modal/environments.py,sha256=KwKdrWfSnz2XF5eYXZyd0kdac1x1PVw2uxPYsGy8cys,6517
33
33
  modal/environments.pyi,sha256=oScvFAclF55-tL9UioLIL_SPBwgy_9O-BBvJ-PLbRgY,3542
34
34
  modal/exception.py,sha256=K-czk1oK8wFvK8snWrytXSByo2WNb9SJAlgBVPGWZBs,6417
35
35
  modal/experimental.py,sha256=jFuNbwrNHos47viMB9q-cHJSvf2RDxDdoEcss9plaZE,2302
36
- modal/functions.py,sha256=3iAonXDZ1OXgtUhL1LuTguNxlJi_PtGu-cBibd6Y464,71837
37
- modal/functions.pyi,sha256=opYVDolZweBVZSfgT4t7OyQj4vBJ82B72IRoS8ZpoYw,24939
36
+ modal/functions.py,sha256=BxccB-3a1migZQ6JA6iiHZJQ7WQ-jYpmg9DEZoTxzcc,71639
37
+ modal/functions.pyi,sha256=5JGM4Mhpm674Ia7h3OTsPBmZA32goyOs2oBCCUG8A3I,24800
38
38
  modal/gpu.py,sha256=r4rL6uH3UJIQthzYvfWauXNyh01WqCPtKZCmmSX1fd4,6881
39
- modal/image.py,sha256=E6UVnhOdfkMnajiSpIm0iUEyE04yclkv9Y0BO6Vplrg,76043
40
- modal/image.pyi,sha256=ZQpSN7XR16aug50sEcDE597CPssekeP1UZBtq0F1lRk,23847
41
- modal/io_streams.py,sha256=kZ5o-aK0lPg4-NezYxpCFmjS2Vf_TbWn49S7c2xUQ6U,14255
42
- modal/io_streams.pyi,sha256=pn6UnOjCUjQwukPYiHHdCv92CH9S9YRb_WekKGoPN94,4350
43
- modal/mount.py,sha256=0BBp4aK2GABTwURlUO823IZ2eCODpz-SGuuNHs6-RUM,27733
39
+ modal/image.py,sha256=j-NH8pLWk4jd5UOGD4y6W7DHWoeb3rG_VR7zPLSqj-Q,78927
40
+ modal/image.pyi,sha256=QEjjnl4ZSmqt7toHww5ZbhL2Re5qaFGgH7qADcJS_vA,24493
41
+ modal/io_streams.py,sha256=XUsNsxRzDrhkjyb2Hx0hugCoOEz266SHQF8wP-VgsfY,14582
42
+ modal/io_streams.pyi,sha256=WJmSI1WvZITUNBO7mnIuJgYdSKdbLaHk10V4GbttAVw,4452
43
+ modal/mount.py,sha256=QZ4nabpbNU9tjLIPCq86rlHor9CXzADMkhJWBYfKKgg,27750
44
44
  modal/mount.pyi,sha256=nywUmeUELLY2OEnAc1NNBHmSxuEylTWBzkh6nuXkkuc,9965
45
45
  modal/network_file_system.py,sha256=P_LsILecyda1SRHU76Hk4Lq3M1HSx9shFJbaLThzw0U,14071
46
46
  modal/network_file_system.pyi,sha256=XLyUnDx55ExbJcF_xlKxRax_r06XTvSsQh-a-_EyCOU,7239
@@ -49,7 +49,7 @@ modal/object.pyi,sha256=cwWg93H4rBk9evt1itLZAZXH5wUMyTJBZ_ADazgfjGg,8465
49
49
  modal/output.py,sha256=FtPR7yvjZMgdSKD_KYkIcwYgCOiV9EKYjaj7K55Hjvg,1940
50
50
  modal/parallel_map.py,sha256=lf8Wer6FAf8-dYqPqoL45cz7FYDU66-TF-h5CO2Kf5Q,16052
51
51
  modal/parallel_map.pyi,sha256=pOhT0P3DDYlwLx0fR3PTsecA7DI8uOdXC1N8i-ZkyOY,2328
52
- modal/partial_function.py,sha256=1zAQZAxTaX8Nn7Rzm6fJ3mwybuVUF6OMQte76F0Vxz8,28206
52
+ modal/partial_function.py,sha256=xkEqMPG0rnP_BUDqGikerv6uiWxDkwZdIFSdoHMDm2A,28216
53
53
  modal/partial_function.pyi,sha256=BqKN7It5QLxS2yhhhDX0RgI8EyNMPBD6Duk21kN_fvA,8908
54
54
  modal/proxy.py,sha256=ZrOsuQP7dSZFq1OrIxalNnt0Zvsnp1h86Th679sSL40,1417
55
55
  modal/proxy.pyi,sha256=UvygdOYneLTuoDY6hVaMNCyZ947Tmx93IdLjErUqkvM,368
@@ -78,13 +78,13 @@ modal/_runtime/asgi.py,sha256=WoAwIiGKpk089MOca3_iA73h36v0uBuoPx0-87ajIDY,19843
78
78
  modal/_runtime/container_io_manager.py,sha256=_MEhwyCSYeCaPQnztPxkm0anRXa3CPcwIKi403N53uo,44120
79
79
  modal/_runtime/execution_context.py,sha256=cXEVY4wEK-oZJVJptyj1ZplZvVQ1HDzFsyHxhaY4o8M,2718
80
80
  modal/_runtime/telemetry.py,sha256=3NbrfwYH6mvDckzdTppymmda2lQKX2oHGc2JwdFZdUc,5191
81
- modal/_runtime/user_code_imports.py,sha256=R06r4e5Dwmes0bgmHClotBN_vd5Etss8Ml4vVtfW8wI,14542
81
+ modal/_runtime/user_code_imports.py,sha256=2COhqA77zwbP__-DWiDHEScHM-Go3CmI-AlKvT_oBOU,14545
82
82
  modal/_utils/__init__.py,sha256=waLjl5c6IPDhSsdWAm9Bji4e2PVxamYABKAze6CHVXY,28
83
83
  modal/_utils/app_utils.py,sha256=88BT4TPLWfYAQwKTHcyzNQRHg8n9B-QE2UyJs96iV-0,108
84
84
  modal/_utils/async_utils.py,sha256=3H4pBC4DW6rCA6hgRux6FMxGqPgHM-G-BTs7KXZiWz4,23958
85
85
  modal/_utils/blob_utils.py,sha256=pAY22w0oVc6ujGfI7La7HPUMOf42FehIapuhSDeeqEs,15835
86
86
  modal/_utils/function_utils.py,sha256=28mxgg_-7JF1DDiNnp3iNVsFQkOzMFjORsetdvZZTHU,24475
87
- modal/_utils/grpc_testing.py,sha256=PQyzEjHBveW7vdqu5Tpn-aNWPO5RPPcsRWzGvXDHCxY,7931
87
+ modal/_utils/grpc_testing.py,sha256=LOzWygTdHINzV-o_Ajbl7sOFbUQFoonP0iKpsJjA_nc,8301
88
88
  modal/_utils/grpc_utils.py,sha256=tM1Q32VOU2WG733IfVHTLZdiyCe8Ga0f0Dx0iDLLy_8,7724
89
89
  modal/_utils/hash_utils.py,sha256=HefF7zPQPxFxyx3fpz-AdSm4QsHZNNvgL9-iQHY-_F4,1790
90
90
  modal/_utils/http_utils.py,sha256=VKXYNPJtrSwZ1ttcXVGQUWmn8cLAXiOTv05g2ac3GbU,2179
@@ -142,10 +142,10 @@ modal_global_objects/mounts/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0
142
142
  modal_global_objects/mounts/modal_client_package.py,sha256=W0E_yShsRojPzWm6LtIQqNVolapdnrZkm2hVEQuZK_4,767
143
143
  modal_global_objects/mounts/python_standalone.py,sha256=_vTEX3PECUsatzhDs8lyJmDK0LbFetT1sJB6MIDfFAo,1870
144
144
  modal_proto/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
145
- modal_proto/api.proto,sha256=5MPLgs49i-i_BcP19GyOUJ7hcpWuoegTKkjXJG0Eujg,77352
145
+ modal_proto/api.proto,sha256=hc-xY5jmYeimEP0X-nKoiz8pZpMMKidUoNR2IOeebeI,77386
146
146
  modal_proto/api_grpc.py,sha256=S7h8xe-msb3-Q8oSd7DUoB46z-dcRhsXGb6LjFCLNFI,99013
147
- modal_proto/api_pb2.py,sha256=I8lNXEGFRHCPfpozfs2-7aVIG9edTokoJYv-wjYcmpg,282733
148
- modal_proto/api_pb2.pyi,sha256=q6T8rJYt-V4UQ_Dr8xuqUMwJCMjs-iC1rHhycZrHUpo,377728
147
+ modal_proto/api_pb2.py,sha256=PLRmPloiKDiiziRzbZrzF3Cr-Cn5uCv9USwc7nC_eeg,282809
148
+ modal_proto/api_pb2.pyi,sha256=XHVPoCf60XtqCJrj7hIpu3d5ncdk3792ugyNq9XS-f4,378110
149
149
  modal_proto/api_pb2_grpc.py,sha256=g7EfCSir3xStPPjJOU2U668zz6cGdN6u7SxvTTwU9aU,214126
150
150
  modal_proto/api_pb2_grpc.pyi,sha256=9GhLZVRm69Qhyj_jmGqEGv1rD37Tzj6E6hGzKV08u48,49961
151
151
  modal_proto/modal_api_grpc.py,sha256=en48QTR5fwA7x0twtlsqLKRjjDEAKVoh6EeSznQfQ3U,13236
@@ -159,10 +159,10 @@ modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0y
159
159
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
160
160
  modal_version/__init__.py,sha256=UnAuHBPuPSstqgdCOx0SBVdfhpeJnMlY_oxEbu44Izg,470
161
161
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
162
- modal_version/_version_generated.py,sha256=j1V8Em7PkypU_C92aeQH09lcTrvTj7EoeGH3SVtpfko,149
163
- modal-0.66.39.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
164
- modal-0.66.39.dist-info/METADATA,sha256=FSsdTyIIgZRS1iFneAJ15DH63G6YD8m0WcPScqiI6x8,2329
165
- modal-0.66.39.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
166
- modal-0.66.39.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
167
- modal-0.66.39.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
168
- modal-0.66.39.dist-info/RECORD,,
162
+ modal_version/_version_generated.py,sha256=K3KTopYH17C5MMGzy3fUGtpOXRNNR7V0OY19WIBopyw,149
163
+ modal-0.66.44.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
164
+ modal-0.66.44.dist-info/METADATA,sha256=YzAinNyCi4yGXbE_WKgrgchbMkTiWxI0ttvOlgIDkYE,2329
165
+ modal-0.66.44.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
166
+ modal-0.66.44.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
167
+ modal-0.66.44.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
168
+ modal-0.66.44.dist-info/RECORD,,
modal_proto/api.proto CHANGED
@@ -2083,6 +2083,8 @@ message Sandbox {
2083
2083
 
2084
2084
  // Network access configuration beyond simple allow/block.
2085
2085
  NetworkAccess network_access = 22;
2086
+
2087
+ optional string proxy_id = 23;
2086
2088
  }
2087
2089
 
2088
2090
  message SandboxCreateRequest {