modal 1.2.5.dev10__tar.gz → 1.2.5.dev12__tar.gz

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 (202) hide show
  1. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/PKG-INFO +1 -1
  2. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/client.pyi +2 -2
  3. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/dict.py +31 -6
  4. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/dict.pyi +2 -0
  5. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/functions.pyi +6 -6
  6. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal.egg-info/PKG-INFO +1 -1
  7. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_version/__init__.py +1 -1
  8. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/LICENSE +0 -0
  9. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/README.md +0 -0
  10. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/__init__.py +0 -0
  11. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/__main__.py +0 -0
  12. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_billing.py +0 -0
  13. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_clustered_functions.py +0 -0
  14. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_clustered_functions.pyi +0 -0
  15. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_container_entrypoint.py +0 -0
  16. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_functions.py +0 -0
  17. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_grpc_client.py +0 -0
  18. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_ipython.py +0 -0
  19. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_load_context.py +0 -0
  20. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_location.py +0 -0
  21. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_object.py +0 -0
  22. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_output.py +0 -0
  23. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_partial_function.py +0 -0
  24. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_pty.py +0 -0
  25. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_resolver.py +0 -0
  26. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_resources.py +0 -0
  27. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_runtime/__init__.py +0 -0
  28. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_runtime/asgi.py +0 -0
  29. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_runtime/container_io_manager.py +0 -0
  30. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_runtime/container_io_manager.pyi +0 -0
  31. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_runtime/execution_context.py +0 -0
  32. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_runtime/execution_context.pyi +0 -0
  33. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  34. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_runtime/telemetry.py +0 -0
  35. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_runtime/user_code_event_loop.py +0 -0
  36. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_runtime/user_code_imports.py +0 -0
  37. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_serialization.py +0 -0
  38. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_traceback.py +0 -0
  39. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_tunnel.py +0 -0
  40. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_tunnel.pyi +0 -0
  41. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_type_manager.py +0 -0
  42. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_utils/__init__.py +0 -0
  43. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_utils/app_utils.py +0 -0
  44. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_utils/async_utils.py +0 -0
  45. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_utils/auth_token_manager.py +0 -0
  46. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_utils/blob_utils.py +0 -0
  47. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_utils/bytes_io_segment_payload.py +0 -0
  48. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_utils/deprecation.py +0 -0
  49. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_utils/docker_utils.py +0 -0
  50. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_utils/function_utils.py +0 -0
  51. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_utils/git_utils.py +0 -0
  52. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_utils/grpc_testing.py +0 -0
  53. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_utils/grpc_utils.py +0 -0
  54. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_utils/hash_utils.py +0 -0
  55. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_utils/http_utils.py +0 -0
  56. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_utils/jwt_utils.py +0 -0
  57. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_utils/logger.py +0 -0
  58. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_utils/mount_utils.py +0 -0
  59. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_utils/name_utils.py +0 -0
  60. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_utils/package_utils.py +0 -0
  61. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_utils/pattern_utils.py +0 -0
  62. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_utils/rand_pb_testing.py +0 -0
  63. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_utils/shell_utils.py +0 -0
  64. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_utils/task_command_router_client.py +0 -0
  65. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_utils/time_utils.py +0 -0
  66. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_vendor/__init__.py +0 -0
  67. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  68. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_vendor/cloudpickle.py +0 -0
  69. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_vendor/tblib.py +0 -0
  70. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/_watcher.py +0 -0
  71. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/app.py +0 -0
  72. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/app.pyi +0 -0
  73. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/billing.py +0 -0
  74. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/builder/2023.12.312.txt +0 -0
  75. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/builder/2023.12.txt +0 -0
  76. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/builder/2024.04.txt +0 -0
  77. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/builder/2024.10.txt +0 -0
  78. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/builder/2025.06.txt +0 -0
  79. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/builder/PREVIEW.txt +0 -0
  80. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/builder/README.md +0 -0
  81. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/builder/base-images.json +0 -0
  82. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/call_graph.py +0 -0
  83. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cli/__init__.py +0 -0
  84. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cli/_download.py +0 -0
  85. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cli/_traceback.py +0 -0
  86. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cli/app.py +0 -0
  87. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cli/cluster.py +0 -0
  88. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cli/config.py +0 -0
  89. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cli/container.py +0 -0
  90. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cli/dict.py +0 -0
  91. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cli/entry_point.py +0 -0
  92. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cli/environment.py +0 -0
  93. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cli/import_refs.py +0 -0
  94. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cli/launch.py +0 -0
  95. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cli/network_file_system.py +0 -0
  96. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cli/profile.py +0 -0
  97. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cli/programs/__init__.py +0 -0
  98. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cli/programs/launch_instance_ssh.py +0 -0
  99. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cli/programs/run_jupyter.py +0 -0
  100. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cli/programs/run_marimo.py +0 -0
  101. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cli/programs/vscode.py +0 -0
  102. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cli/queues.py +0 -0
  103. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cli/run.py +0 -0
  104. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cli/secret.py +0 -0
  105. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cli/shell.py +0 -0
  106. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cli/token.py +0 -0
  107. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cli/utils.py +0 -0
  108. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cli/volume.py +0 -0
  109. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/client.py +0 -0
  110. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cloud_bucket_mount.py +0 -0
  111. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cloud_bucket_mount.pyi +0 -0
  112. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cls.py +0 -0
  113. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/cls.pyi +0 -0
  114. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/config.py +0 -0
  115. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/container_process.py +0 -0
  116. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/container_process.pyi +0 -0
  117. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/environments.py +0 -0
  118. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/environments.pyi +0 -0
  119. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/exception.py +0 -0
  120. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/experimental/__init__.py +0 -0
  121. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/experimental/flash.py +0 -0
  122. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/experimental/flash.pyi +0 -0
  123. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/experimental/ipython.py +0 -0
  124. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/file_io.py +0 -0
  125. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/file_io.pyi +0 -0
  126. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/file_pattern_matcher.py +0 -0
  127. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/functions.py +0 -0
  128. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/gpu.py +0 -0
  129. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/image.py +0 -0
  130. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/image.pyi +0 -0
  131. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/io_streams.py +0 -0
  132. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/io_streams.pyi +0 -0
  133. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/mount.py +0 -0
  134. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/mount.pyi +0 -0
  135. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/network_file_system.py +0 -0
  136. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/network_file_system.pyi +0 -0
  137. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/object.py +0 -0
  138. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/object.pyi +0 -0
  139. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/output.py +0 -0
  140. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/parallel_map.py +0 -0
  141. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/parallel_map.pyi +0 -0
  142. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/partial_function.py +0 -0
  143. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/partial_function.pyi +0 -0
  144. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/proxy.py +0 -0
  145. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/proxy.pyi +0 -0
  146. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/py.typed +0 -0
  147. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/queue.py +0 -0
  148. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/queue.pyi +0 -0
  149. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/retries.py +0 -0
  150. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/runner.py +0 -0
  151. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/runner.pyi +0 -0
  152. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/running_app.py +0 -0
  153. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/sandbox.py +0 -0
  154. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/sandbox.pyi +0 -0
  155. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/schedule.py +0 -0
  156. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/scheduler_placement.py +0 -0
  157. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/secret.py +0 -0
  158. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/secret.pyi +0 -0
  159. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/serving.py +0 -0
  160. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/serving.pyi +0 -0
  161. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/snapshot.py +0 -0
  162. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/snapshot.pyi +0 -0
  163. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/stream_type.py +0 -0
  164. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/token_flow.py +0 -0
  165. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/token_flow.pyi +0 -0
  166. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/volume.py +0 -0
  167. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal/volume.pyi +0 -0
  168. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal.egg-info/SOURCES.txt +0 -0
  169. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal.egg-info/dependency_links.txt +0 -0
  170. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal.egg-info/entry_points.txt +0 -0
  171. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal.egg-info/requires.txt +0 -0
  172. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal.egg-info/top_level.txt +0 -0
  173. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_docs/__init__.py +0 -0
  174. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_docs/gen_cli_docs.py +0 -0
  175. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_docs/gen_reference_docs.py +0 -0
  176. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_docs/mdmd/__init__.py +0 -0
  177. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_docs/mdmd/mdmd.py +0 -0
  178. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_docs/mdmd/signatures.py +0 -0
  179. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_proto/__init__.py +0 -0
  180. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_proto/api.proto +0 -0
  181. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_proto/api_grpc.py +0 -0
  182. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_proto/api_pb2.py +0 -0
  183. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_proto/api_pb2.pyi +0 -0
  184. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_proto/api_pb2_grpc.py +0 -0
  185. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_proto/api_pb2_grpc.pyi +0 -0
  186. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_proto/modal_api_grpc.py +0 -0
  187. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_proto/py.typed +0 -0
  188. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_proto/sandbox_router.proto +0 -0
  189. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_proto/sandbox_router_grpc.py +0 -0
  190. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_proto/sandbox_router_pb2.py +0 -0
  191. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_proto/sandbox_router_pb2.pyi +0 -0
  192. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_proto/sandbox_router_pb2_grpc.py +0 -0
  193. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_proto/sandbox_router_pb2_grpc.pyi +0 -0
  194. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_proto/task_command_router.proto +0 -0
  195. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_proto/task_command_router_grpc.py +0 -0
  196. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_proto/task_command_router_pb2.py +0 -0
  197. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_proto/task_command_router_pb2.pyi +0 -0
  198. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  199. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  200. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/modal_version/__main__.py +0 -0
  201. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/pyproject.toml +0 -0
  202. {modal-1.2.5.dev10 → modal-1.2.5.dev12}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.2.5.dev10
3
+ Version: 1.2.5.dev12
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -32,7 +32,7 @@ class _Client:
32
32
  server_url: str,
33
33
  client_type: int,
34
34
  credentials: typing.Optional[tuple[str, str]],
35
- version: str = "1.2.5.dev10",
35
+ version: str = "1.2.5.dev12",
36
36
  ):
37
37
  """mdmd:hidden
38
38
  The Modal client object is not intended to be instantiated directly by users.
@@ -163,7 +163,7 @@ class Client:
163
163
  server_url: str,
164
164
  client_type: int,
165
165
  credentials: typing.Optional[tuple[str, str]],
166
- version: str = "1.2.5.dev10",
166
+ version: str = "1.2.5.dev12",
167
167
  ):
168
168
  """mdmd:hidden
169
169
  The Modal client object is not intended to be instantiated directly by users.
@@ -28,7 +28,7 @@ from ._utils.name_utils import check_object_name
28
28
  from ._utils.time_utils import as_timestamp, timestamp_to_localized_dt
29
29
  from .client import _Client
30
30
  from .config import logger
31
- from .exception import AlreadyExistsError, InvalidError, NotFoundError, RequestSizeError
31
+ from .exception import AlreadyExistsError, DeserializationError, InvalidError, NotFoundError, RequestSizeError
32
32
 
33
33
 
34
34
  class _NoDefaultSentinel:
@@ -43,6 +43,25 @@ def _serialize_dict(data):
43
43
  return [api_pb2.DictEntry(key=serialize(k), value=serialize(v)) for k, v in data.items()]
44
44
 
45
45
 
46
+ def _deserialize_dict_key(dict: "_Dict", data: bytes) -> Any:
47
+ try:
48
+ return deserialize(data, dict._client)
49
+ except DeserializationError as exc:
50
+ dict_identifier = f"Dict '{dict.name}'" if dict.name else f"ephemeral Dict {dict.object_id}"
51
+ raise DeserializationError(f"Failed to deserialize a key from {dict_identifier}: {exc}") from exc
52
+
53
+
54
+ def _deserialize_dict_value(dict: "_Dict", data: bytes, key: Any = _NO_DEFAULT) -> Any:
55
+ try:
56
+ return deserialize(data, dict._client)
57
+ except DeserializationError as exc:
58
+ key_identifier = "" if key is _NO_DEFAULT else f" for key {key!r}"
59
+ dict_identifier = f"Dict '{dict.name}'" if dict.name else f"ephemeral Dict {dict.object_id}"
60
+ raise DeserializationError(
61
+ f"Failed to deserialize value{key_identifier} from {dict_identifier}: {exc}"
62
+ ) from exc
63
+
64
+
46
65
  @dataclass
47
66
  class DictInfo:
48
67
  """Information about a Dict object."""
@@ -439,7 +458,7 @@ class _Dict(_Object, type_prefix="di"):
439
458
  resp = await self._client.stub.DictGet(req)
440
459
  if not resp.found:
441
460
  return default
442
- return deserialize(resp.value, self._client)
461
+ return _deserialize_dict_value(self, resp.value, key)
443
462
 
444
463
  @live_method
445
464
  async def contains(self, key: Any) -> bool:
@@ -530,7 +549,7 @@ class _Dict(_Object, type_prefix="di"):
530
549
  if default is not _NO_DEFAULT:
531
550
  return default
532
551
  raise KeyError(f"{key} not in dict {self.object_id}")
533
- return deserialize(resp.value, self._client)
552
+ return _deserialize_dict_value(self, resp.value, key)
534
553
 
535
554
  @live_method
536
555
  async def __delitem__(self, key: Any) -> Any:
@@ -557,7 +576,7 @@ class _Dict(_Object, type_prefix="di"):
557
576
  """
558
577
  req = api_pb2.DictContentsRequest(dict_id=self.object_id, keys=True)
559
578
  async for resp in self._client.stub.DictContents.unary_stream(req):
560
- yield deserialize(resp.key, self._client)
579
+ yield _deserialize_dict_key(self, resp.key)
561
580
 
562
581
  @live_method_gen
563
582
  async def values(self) -> AsyncIterator[Any]:
@@ -568,7 +587,11 @@ class _Dict(_Object, type_prefix="di"):
568
587
  """
569
588
  req = api_pb2.DictContentsRequest(dict_id=self.object_id, values=True)
570
589
  async for resp in self._client.stub.DictContents.unary_stream(req):
571
- yield deserialize(resp.value, self._client)
590
+ try:
591
+ key_deser = _deserialize_dict_key(self, resp.key)
592
+ except DeserializationError:
593
+ key_deser = _NO_DEFAULT
594
+ yield _deserialize_dict_value(self, resp.value, key_deser)
572
595
 
573
596
  @live_method_gen
574
597
  async def items(self) -> AsyncIterator[tuple[Any, Any]]:
@@ -579,7 +602,9 @@ class _Dict(_Object, type_prefix="di"):
579
602
  """
580
603
  req = api_pb2.DictContentsRequest(dict_id=self.object_id, keys=True, values=True)
581
604
  async for resp in self._client.stub.DictContents.unary_stream(req):
582
- yield (deserialize(resp.key, self._client), deserialize(resp.value, self._client))
605
+ key_deser = _deserialize_dict_key(self, resp.key)
606
+ value_deser = _deserialize_dict_value(self, resp.value, key_deser)
607
+ yield (key_deser, value_deser)
583
608
 
584
609
 
585
610
  Dict = synchronize_api(_Dict)
@@ -18,6 +18,8 @@ class _NoDefaultSentinel:
18
18
  _NO_DEFAULT: _NoDefaultSentinel
19
19
 
20
20
  def _serialize_dict(data): ...
21
+ def _deserialize_dict_key(dict: _Dict, data: bytes) -> typing.Any: ...
22
+ def _deserialize_dict_value(dict: _Dict, data: bytes, key: typing.Any = ...) -> typing.Any: ...
21
23
 
22
24
  class DictInfo:
23
25
  """Information about a Dict object."""
@@ -409,7 +409,7 @@ class Function(
409
409
 
410
410
  _call_generator: ___call_generator_spec[typing_extensions.Self]
411
411
 
412
- class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
412
+ class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
413
413
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
414
414
  """Calls the function remotely, executing it with the given arguments and returning the execution's result."""
415
415
  ...
@@ -418,7 +418,7 @@ class Function(
418
418
  """Calls the function remotely, executing it with the given arguments and returning the execution's result."""
419
419
  ...
420
420
 
421
- remote: __remote_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
421
+ remote: __remote_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
422
422
 
423
423
  class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
424
424
  def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
@@ -445,7 +445,7 @@ class Function(
445
445
  """
446
446
  ...
447
447
 
448
- class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
448
+ class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
449
449
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
450
450
  """[Experimental] Calls the function with the given arguments, without waiting for the results.
451
451
 
@@ -469,7 +469,7 @@ class Function(
469
469
  ...
470
470
 
471
471
  _experimental_spawn: ___experimental_spawn_spec[
472
- modal._functions.ReturnType, modal._functions.P, typing_extensions.Self
472
+ modal._functions.P, modal._functions.ReturnType, typing_extensions.Self
473
473
  ]
474
474
 
475
475
  class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER, SUPERSELF]):
@@ -478,7 +478,7 @@ class Function(
478
478
 
479
479
  _spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P, typing_extensions.Self]
480
480
 
481
- class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
481
+ class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
482
482
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
483
483
  """Calls the function with the given arguments, without waiting for the results.
484
484
 
@@ -499,7 +499,7 @@ class Function(
499
499
  """
500
500
  ...
501
501
 
502
- spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
502
+ spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
503
503
 
504
504
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
505
505
  """Return the inner Python object wrapped by this Modal Function."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.2.5.dev10
3
+ Version: 1.2.5.dev12
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2025
2
2
  """Supplies the current version of the modal client library."""
3
3
 
4
- __version__ = "1.2.5.dev10"
4
+ __version__ = "1.2.5.dev12"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes