modal 1.6.4.dev9__tar.gz → 1.6.4.dev10__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 (254) hide show
  1. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/PKG-INFO +1 -1
  2. modal-1.6.4.dev10/modal/_audit_logs/__init__.py +1 -0
  3. modal-1.6.4.dev10/modal/_audit_logs/_rpcs.py +66 -0
  4. modal-1.6.4.dev10/modal/_audit_logs/count.py +17 -0
  5. modal-1.6.4.dev10/modal/_audit_logs/list.py +83 -0
  6. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_image.py +3 -6
  7. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/shell.py +1 -1
  8. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/client.pyi +2 -2
  9. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/functions.pyi +6 -6
  10. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal.egg-info/PKG-INFO +1 -1
  11. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal.egg-info/SOURCES.txt +4 -0
  12. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_proto/api_grpc.py +32 -0
  13. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_proto/api_pb2.py +1493 -1440
  14. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_proto/api_pb2.pyi +137 -14
  15. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_proto/api_pb2_grpc.py +68 -0
  16. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_proto/api_pb2_grpc.pyi +24 -0
  17. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_proto/modal_api_grpc.py +2 -0
  18. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_version/__init__.py +1 -1
  19. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/LICENSE +0 -0
  20. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/README.md +0 -0
  21. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/__init__.py +0 -0
  22. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/__main__.py +0 -0
  23. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_billing.py +0 -0
  24. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_cluster.py +0 -0
  25. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_cluster.pyi +0 -0
  26. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_container_entrypoint.py +0 -0
  27. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_environments.py +0 -0
  28. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_function_variants.py +0 -0
  29. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_functions.py +0 -0
  30. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_grpc_client.py +0 -0
  31. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_ipython.py +0 -0
  32. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_load_context.py +0 -0
  33. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_location.py +0 -0
  34. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_logs.py +0 -0
  35. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_logs_manager.py +0 -0
  36. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_logs_manager.pyi +0 -0
  37. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_metrics.py +0 -0
  38. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_metrics.pyi +0 -0
  39. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_object.py +0 -0
  40. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_outbound_policy.py +0 -0
  41. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_outbound_policy.pyi +0 -0
  42. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_output/__init__.py +0 -0
  43. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_output/manager.py +0 -0
  44. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_output/pty.py +0 -0
  45. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_output/rich.py +0 -0
  46. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_output/status.py +0 -0
  47. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_partial_function.py +0 -0
  48. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_resolver.py +0 -0
  49. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_resources.py +0 -0
  50. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_runtime/__init__.py +0 -0
  51. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_runtime/asgi.py +0 -0
  52. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_runtime/container_io_manager.py +0 -0
  53. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_runtime/container_io_manager.pyi +0 -0
  54. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_runtime/execution_context.py +0 -0
  55. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_runtime/execution_context.pyi +0 -0
  56. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  57. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_runtime/task_lifecycle_manager.py +0 -0
  58. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
  59. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_runtime/telemetry.py +0 -0
  60. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_runtime/user_code_event_loop.py +0 -0
  61. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_runtime/user_code_imports.py +0 -0
  62. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_serialization.py +0 -0
  63. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_server.py +0 -0
  64. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_server.pyi +0 -0
  65. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_supports_logs.py +0 -0
  66. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_traceback.py +0 -0
  67. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_tunnel.py +0 -0
  68. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_tunnel.pyi +0 -0
  69. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_type_manager.py +0 -0
  70. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/__init__.py +0 -0
  71. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/app_utils.py +0 -0
  72. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/async_utils.py +0 -0
  73. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/auth_token_manager.py +0 -0
  74. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/blob_utils.py +0 -0
  75. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/browser_utils.py +0 -0
  76. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/bytes_io_segment_payload.py +0 -0
  77. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/curl_utils.py +0 -0
  78. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/deprecation.py +0 -0
  79. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/display_utils.py +0 -0
  80. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/docker_utils.py +0 -0
  81. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/function_utils.py +0 -0
  82. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/git_utils.py +0 -0
  83. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/grpc_testing.py +0 -0
  84. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/grpc_utils.py +0 -0
  85. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/hash_utils.py +0 -0
  86. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/http_utils.py +0 -0
  87. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/idle_countdown.py +0 -0
  88. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/jwt_utils.py +0 -0
  89. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/logger.py +0 -0
  90. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/mount_utils.py +0 -0
  91. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/name_utils.py +0 -0
  92. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/oauth.py +0 -0
  93. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/package_utils.py +0 -0
  94. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/pattern_utils.py +0 -0
  95. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/proxy_support.py +0 -0
  96. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/rand_pb_testing.py +0 -0
  97. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/sandbox_fs_utils.py +0 -0
  98. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/shell_utils.py +0 -0
  99. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/time_utils.py +0 -0
  100. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_vendor/__init__.py +0 -0
  101. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  102. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_vendor/cloudpickle.py +0 -0
  103. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_vendor/tblib.py +0 -0
  104. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_vendor/version.py +0 -0
  105. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_watcher.py +0 -0
  106. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_workspace.py +0 -0
  107. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/app.py +0 -0
  108. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/app.pyi +0 -0
  109. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/billing.py +0 -0
  110. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/billing.pyi +0 -0
  111. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/builder/2023.12.312.txt +0 -0
  112. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/builder/2023.12.txt +0 -0
  113. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/builder/2024.04.txt +0 -0
  114. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/builder/2024.10.txt +0 -0
  115. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/builder/2025.06.txt +0 -0
  116. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/builder/2026.10.txt +0 -0
  117. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/builder/PREVIEW.txt +0 -0
  118. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/builder/README.md +0 -0
  119. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/builder/base-images.json +0 -0
  120. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/call_graph.py +0 -0
  121. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/__init__.py +0 -0
  122. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/_download.py +0 -0
  123. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/_help.py +0 -0
  124. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/_logs.py +0 -0
  125. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/_stats.py +0 -0
  126. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/_traceback.py +0 -0
  127. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/app.py +0 -0
  128. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/billing.py +0 -0
  129. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/changelog.py +0 -0
  130. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/config.py +0 -0
  131. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/container.py +0 -0
  132. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/curl.py +0 -0
  133. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/dashboard.py +0 -0
  134. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/dict.py +0 -0
  135. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/endpoint.py +0 -0
  136. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/entry_point.py +0 -0
  137. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/environment.py +0 -0
  138. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/function.py +0 -0
  139. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/image.py +0 -0
  140. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/import_refs.py +0 -0
  141. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/logo.py +0 -0
  142. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/network_file_system.py +0 -0
  143. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/profile.py +0 -0
  144. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/queues.py +0 -0
  145. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/run.py +0 -0
  146. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/secret.py +0 -0
  147. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/selector.py +0 -0
  148. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/server.py +0 -0
  149. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/skills.py +0 -0
  150. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/token.py +0 -0
  151. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/utils.py +0 -0
  152. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/volume.py +0 -0
  153. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/workspace.py +0 -0
  154. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/client.py +0 -0
  155. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cloud_bucket_mount.py +0 -0
  156. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cloud_bucket_mount.pyi +0 -0
  157. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cls.py +0 -0
  158. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cls.pyi +0 -0
  159. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cluster.py +0 -0
  160. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cluster.pyi +0 -0
  161. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/config.py +0 -0
  162. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/container_process.py +0 -0
  163. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/container_process.pyi +0 -0
  164. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/dict.py +0 -0
  165. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/dict.pyi +0 -0
  166. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/environments.py +0 -0
  167. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/environments.pyi +0 -0
  168. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/exception.py +0 -0
  169. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/experimental/__init__.py +0 -0
  170. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/experimental/_flash_container_entry.py +0 -0
  171. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/experimental/flash.py +0 -0
  172. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/experimental/flash.pyi +0 -0
  173. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/experimental/flash_server.py +0 -0
  174. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/experimental/flash_server.pyi +0 -0
  175. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/experimental/ipython.py +0 -0
  176. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/file_pattern_matcher.py +0 -0
  177. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/functions.py +0 -0
  178. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/image.py +0 -0
  179. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/image.pyi +0 -0
  180. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/io_streams.py +0 -0
  181. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/io_streams.pyi +0 -0
  182. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/mount.py +0 -0
  183. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/mount.pyi +0 -0
  184. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/network_file_system.py +0 -0
  185. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/network_file_system.pyi +0 -0
  186. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/object.py +0 -0
  187. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/object.pyi +0 -0
  188. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/output.py +0 -0
  189. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/parallel_map.py +0 -0
  190. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/parallel_map.pyi +0 -0
  191. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/partial_function.py +0 -0
  192. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/partial_function.pyi +0 -0
  193. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/proxy.py +0 -0
  194. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/proxy.pyi +0 -0
  195. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/py.typed +0 -0
  196. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/queue.py +0 -0
  197. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/queue.pyi +0 -0
  198. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/retries.py +0 -0
  199. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/runner.py +0 -0
  200. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/runner.pyi +0 -0
  201. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/running_app.py +0 -0
  202. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/sandbox/__init__.py +0 -0
  203. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/sandbox/_common.py +0 -0
  204. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/sandbox/_filesystem.py +0 -0
  205. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/sandbox/_impl_persistent.py +0 -0
  206. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/sandbox/_impl_v1.py +0 -0
  207. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/sandbox/_impl_v2.py +0 -0
  208. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/sandbox/_sandbox.py +0 -0
  209. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/sandbox/_sidecar.py +0 -0
  210. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/sandbox/_snapshot.py +0 -0
  211. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/sandbox/_task_command_router_client.py +0 -0
  212. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/sandbox/sandbox.py +0 -0
  213. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/sandbox/sandbox.pyi +0 -0
  214. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/schedule.py +0 -0
  215. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/scheduler_placement.py +0 -0
  216. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/secret.py +0 -0
  217. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/secret.pyi +0 -0
  218. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/server.py +0 -0
  219. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/server.pyi +0 -0
  220. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/serving.py +0 -0
  221. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/serving.pyi +0 -0
  222. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/skills/modal/SKILL.md +0 -0
  223. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/stream_type.py +0 -0
  224. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/token_flow.py +0 -0
  225. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/token_flow.pyi +0 -0
  226. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/types.py +0 -0
  227. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/volume.py +0 -0
  228. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/volume.pyi +0 -0
  229. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/workspace.py +0 -0
  230. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/workspace.pyi +0 -0
  231. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal.egg-info/dependency_links.txt +0 -0
  232. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal.egg-info/entry_points.txt +0 -0
  233. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal.egg-info/requires.txt +0 -0
  234. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal.egg-info/top_level.txt +0 -0
  235. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_docs/__init__.py +0 -0
  236. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_docs/gen_cli_docs.py +0 -0
  237. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_docs/gen_cli_docs_main.py +0 -0
  238. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_docs/gen_reference_docs.py +0 -0
  239. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_docs/gen_reference_docs_main.py +0 -0
  240. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_docs/mdmd/__init__.py +0 -0
  241. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_docs/mdmd/mdmd.py +0 -0
  242. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_docs/mdmd/signatures.py +0 -0
  243. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_docs/mdmd/types.py +0 -0
  244. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_docs/reference_intro.md +0 -0
  245. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_proto/__init__.py +0 -0
  246. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_proto/py.typed +0 -0
  247. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_proto/task_command_router_grpc.py +0 -0
  248. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_proto/task_command_router_pb2.py +0 -0
  249. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_proto/task_command_router_pb2.pyi +0 -0
  250. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  251. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  252. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_version/__main__.py +0 -0
  253. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/pyproject.toml +0 -0
  254. {modal-1.6.4.dev9 → modal-1.6.4.dev10}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.6.4.dev9
3
+ Version: 1.6.4.dev10
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -0,0 +1 @@
1
+ # Copyright Modal Labs 2026
@@ -0,0 +1,66 @@
1
+ # Copyright Modal Labs 2026
2
+ """The audit log RPCs, one call each, retried with backoff. Ordering and batching live in list.py."""
3
+
4
+ from __future__ import annotations
5
+
6
+ from collections.abc import Awaitable, Callable
7
+ from typing import TYPE_CHECKING, TypeVar
8
+
9
+ from modal._utils.grpc_utils import Retry
10
+ from modal_proto import api_pb2
11
+
12
+ if TYPE_CHECKING:
13
+ from modal.client import _Client
14
+
15
+
16
+ _Resp = TypeVar("_Resp")
17
+
18
+
19
+ _MAX_RETRIES = 4
20
+ _PLAN_MAX_RETRIES = 2
21
+
22
+
23
+ async def _call(
24
+ rpc: Callable[..., Awaitable[_Resp]], req: object, *, timeout: float, max_retries: int = _MAX_RETRIES
25
+ ) -> _Resp:
26
+ """Call with backoff on timeouts and transient errors; rate and resource limits wait as the server says."""
27
+ retry = Retry(base_delay=1.0, delay_factor=2.0, max_delay=8.0, max_retries=max_retries, attempt_timeout=timeout)
28
+ return await rpc(req, retry=retry)
29
+
30
+
31
+ async def get_settings(client: _Client) -> api_pb2.AuditLogSettingsGetResponse:
32
+ return await client._stub.AuditLogSettingsGet(api_pb2.AuditLogSettingsGetRequest())
33
+
34
+
35
+ async def count_entries(
36
+ client: _Client, q: str, oldest_ms: int, newest_ms: int, config: api_pb2.AuditLogSettingsGetResponse
37
+ ) -> int:
38
+ req = api_pb2.AuditLogCountRequest(q=q, oldest_ms=oldest_ms, newest_ms=newest_ms)
39
+ resp = await _call(client._stub.AuditLogCount, req, timeout=config.request_timeout_secs)
40
+ return resp.count
41
+
42
+
43
+ async def list_page(
44
+ client: _Client,
45
+ q: str,
46
+ oldest_ms: int,
47
+ newest_ms: int,
48
+ limit: int,
49
+ config: api_pb2.AuditLogSettingsGetResponse,
50
+ newest_cursor: api_pb2.AuditLogCursor | None = None,
51
+ oldest_cursor: api_pb2.AuditLogCursor | None = None,
52
+ ) -> api_pb2.AuditLogListResponse:
53
+ req = api_pb2.AuditLogListRequest(q=q, oldest_ms=oldest_ms, newest_ms=newest_ms, limit=limit)
54
+ if newest_cursor is not None:
55
+ req.newest_cursor.CopyFrom(newest_cursor)
56
+ if oldest_cursor is not None:
57
+ req.oldest_cursor.CopyFrom(oldest_cursor)
58
+ return await _call(client._stub.AuditLogList, req, timeout=config.request_timeout_secs)
59
+
60
+
61
+ async def plan_buckets(
62
+ client: _Client, q: str, oldest_ms: int, newest_ms: int, config: api_pb2.AuditLogSettingsGetResponse
63
+ ) -> list[api_pb2.AuditLogCursor]:
64
+ req = api_pb2.AuditLogBucketsRequest(q=q, oldest_ms=oldest_ms, newest_ms=newest_ms, bucket_size=config.bucket_size)
65
+ resp = await _call(client._stub.AuditLogPlan, req, timeout=config.plan_timeout_secs, max_retries=_PLAN_MAX_RETRIES)
66
+ return list(resp.cursors)
@@ -0,0 +1,17 @@
1
+ # Copyright Modal Labs 2026
2
+ from __future__ import annotations
3
+
4
+ from typing import TYPE_CHECKING
5
+
6
+ from modal._audit_logs import _rpcs
7
+ from modal_proto import api_pb2
8
+
9
+ if TYPE_CHECKING:
10
+ from modal.client import _Client
11
+
12
+
13
+ async def count_audit_logs(
14
+ client: _Client, q: str, oldest_ms: int, newest_ms: int, config: api_pb2.AuditLogSettingsGetResponse
15
+ ) -> int:
16
+ """Count the entries in [oldest_ms, newest_ms) that match the query."""
17
+ return await _rpcs.count_entries(client, q, oldest_ms, newest_ms, config)
@@ -0,0 +1,83 @@
1
+ # Copyright Modal Labs 2026
2
+ from __future__ import annotations
3
+
4
+ from collections.abc import AsyncGenerator
5
+ from contextlib import aclosing
6
+
7
+ from modal._audit_logs import _rpcs
8
+ from modal._utils.async_utils import async_map_ordered
9
+ from modal.client import _Client
10
+ from modal_proto import api_pb2
11
+
12
+ # (newest_cursor, oldest_cursor); None where the bucket is open-ended.
13
+ Bucket = tuple[api_pb2.AuditLogCursor | None, api_pb2.AuditLogCursor | None]
14
+
15
+
16
+ async def get_bucket_cursors(
17
+ client: _Client, q: str, oldest_ms: int, newest_ms: int, config: api_pb2.AuditLogSettingsGetResponse
18
+ ) -> list[Bucket]:
19
+ """Split the range into buckets, as (newest_cursor, oldest_cursor) pairs ordered oldest to newest.
20
+
21
+ The first bucket has no oldest cursor and the last has no newest cursor.
22
+ """
23
+ cursors = await _rpcs.plan_buckets(client, q, oldest_ms, newest_ms, config)
24
+ return list(zip([None, *cursors], [*cursors, None]))[::-1]
25
+
26
+
27
+ async def _fetch_bucket(
28
+ client: _Client,
29
+ q: str,
30
+ oldest_ms: int,
31
+ newest_ms: int,
32
+ config: api_pb2.AuditLogSettingsGetResponse,
33
+ bucket: Bucket,
34
+ ) -> list[api_pb2.AuditLogEntry]:
35
+ """Read one bucket's entries, oldest to newest, using pagination"""
36
+ newest_cursor, oldest_cursor = bucket
37
+ entries: list[api_pb2.AuditLogEntry] = []
38
+ while True:
39
+ resp = await _rpcs.list_page(
40
+ client, q, oldest_ms, newest_ms, config.page_size, config, newest_cursor, oldest_cursor
41
+ )
42
+ entries.extend(resp.items)
43
+ # Skips the empty request a full last page would otherwise trigger; an unset next_cursor also ends the loop.
44
+ if oldest_cursor is not None and resp.items and resp.items[-1].id == oldest_cursor.id:
45
+ break
46
+ if not resp.HasField("next_cursor"):
47
+ break
48
+ newest_cursor = resp.next_cursor
49
+ entries.reverse()
50
+ return entries
51
+
52
+
53
+ async def fetch_audit_logs(
54
+ q: str,
55
+ oldest_ms: int,
56
+ newest_ms: int,
57
+ *,
58
+ client: _Client | None = None,
59
+ config: api_pb2.AuditLogSettingsGetResponse,
60
+ ) -> AsyncGenerator[api_pb2.AuditLogEntry]:
61
+ """Yield the range's entries from the oldest to the newest, one bucket at a time.
62
+
63
+ At most `max_concurrent_requests` buckets are fetched at once, and at most `max_buffered_buckets` are fetched
64
+ or held at once. A new bucket is admitted only after the consumer has taken all of a bucket's entries, so a slow
65
+ consumer or a stalled request cannot grow memory.
66
+ If any request fails after its attempts, the remaining requests are cancelled and the error is raised.
67
+ """
68
+ if client is None:
69
+ client = await _Client.from_env()
70
+ buckets = await get_bucket_cursors(client, q, oldest_ms, newest_ms, config)
71
+
72
+ async def bucket_stream() -> AsyncGenerator[Bucket]:
73
+ for bucket in buckets:
74
+ yield bucket
75
+
76
+ async def fetch(bucket: Bucket) -> list[api_pb2.AuditLogEntry]:
77
+ return await _fetch_bucket(client, q, oldest_ms, newest_ms, config, bucket)
78
+
79
+ fetched = async_map_ordered(bucket_stream(), fetch, config.max_concurrent_requests, config.max_buffered_buckets)
80
+ async with aclosing(fetched) as stream:
81
+ async for entries in stream:
82
+ for entry in entries:
83
+ yield entry
@@ -2064,8 +2064,7 @@ class _Image(_Object, type_prefix="im"):
2064
2064
  if not isinstance(entrypoint_commands, list) or not all(isinstance(x, str) for x in entrypoint_commands):
2065
2065
  raise InvalidError("entrypoint_commands must be a list of strings.")
2066
2066
  args = _flatten_str_args("entrypoint", "entrypoint_commands", entrypoint_commands)
2067
- args_str = '"' + '", "'.join(args) + '"' if args else ""
2068
- dockerfile_cmd = f"ENTRYPOINT [{args_str}]"
2067
+ dockerfile_cmd = f"ENTRYPOINT {json.dumps(args, ensure_ascii=False)}"
2069
2068
 
2070
2069
  return self.dockerfile_commands(dockerfile_cmd)
2071
2070
 
@@ -2085,8 +2084,7 @@ class _Image(_Object, type_prefix="im"):
2085
2084
  if not isinstance(shell_commands, list) or not all(isinstance(x, str) for x in shell_commands):
2086
2085
  raise InvalidError("shell_commands must be a list of strings.")
2087
2086
  args = _flatten_str_args("shell", "shell_commands", shell_commands)
2088
- args_str = '"' + '", "'.join(args) + '"' if args else ""
2089
- dockerfile_cmd = f"SHELL [{args_str}]"
2087
+ dockerfile_cmd = f"SHELL {json.dumps(args, ensure_ascii=False)}"
2090
2088
 
2091
2089
  return self.dockerfile_commands(dockerfile_cmd)
2092
2090
 
@@ -3076,8 +3074,7 @@ class _Image(_Object, type_prefix="im"):
3076
3074
  raise InvalidError("Image CMD must be a list of strings.")
3077
3075
 
3078
3076
  cmd_args = _flatten_str_args("cmd", "cmd", cmd)
3079
- cmd_str = '"' + '", "'.join(cmd_args) + '"' if cmd_args else ""
3080
- dockerfile_cmd = f"CMD [{cmd_str}]"
3077
+ dockerfile_cmd = f"CMD {json.dumps(cmd_args, ensure_ascii=False)}"
3081
3078
 
3082
3079
  return self.dockerfile_commands(dockerfile_cmd)
3083
3080
 
@@ -448,7 +448,7 @@ def shell(
448
448
  app = App("modal shell")
449
449
 
450
450
  # NB: invoking under bash makes --cmd a lot more flexible.
451
- cmds = shlex.split(f'/bin/bash -c "{cmd}"')
451
+ cmds = ["/bin/bash", "-c", cmd]
452
452
  timeout = 3600
453
453
  parsed_experimental_options = _parse_experimental_options(experimental_options)
454
454
 
@@ -87,7 +87,7 @@ class _Client:
87
87
  server_url: str,
88
88
  client_type: int,
89
89
  credentials: typing.Optional[tuple[str, str]],
90
- version: str = "1.6.4.dev9",
90
+ version: str = "1.6.4.dev10",
91
91
  *,
92
92
  oauth_credentials: typing.Optional[_OAuthCredentials] = None,
93
93
  ):
@@ -304,7 +304,7 @@ class Client:
304
304
  server_url: str,
305
305
  client_type: int,
306
306
  credentials: typing.Optional[tuple[str, str]],
307
- version: str = "1.6.4.dev9",
307
+ version: str = "1.6.4.dev10",
308
308
  *,
309
309
  oauth_credentials: typing.Optional[_OAuthCredentials] = None,
310
310
  ):
@@ -619,7 +619,7 @@ class Function(
619
619
 
620
620
  _call_generator: ___call_generator_spec
621
621
 
622
- class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
622
+ class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
623
623
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
624
624
  """Calls the function remotely, executing it with the given arguments and returning the execution's result.
625
625
 
@@ -644,7 +644,7 @@ class Function(
644
644
  """
645
645
  ...
646
646
 
647
- remote: __remote_spec[modal._functions.ReturnType, modal._functions.P]
647
+ remote: __remote_spec[modal._functions.P, modal._functions.ReturnType]
648
648
 
649
649
  class __remote_gen_spec(typing_extensions.Protocol):
650
650
  def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
@@ -694,7 +694,7 @@ class Function(
694
694
  """
695
695
  ...
696
696
 
697
- class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
697
+ class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
698
698
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
699
699
  """[Experimental] Calls the function with the given arguments, without waiting for the results.
700
700
 
@@ -727,7 +727,7 @@ class Function(
727
727
  """
728
728
  ...
729
729
 
730
- _experimental_spawn: ___experimental_spawn_spec[modal._functions.ReturnType, modal._functions.P]
730
+ _experimental_spawn: ___experimental_spawn_spec[modal._functions.P, modal._functions.ReturnType]
731
731
 
732
732
  class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER]):
733
733
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> None: ...
@@ -735,7 +735,7 @@ class Function(
735
735
 
736
736
  _spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P]
737
737
 
738
- class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
738
+ class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
739
739
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
740
740
  """Calls the function with the given arguments, without waiting for the results.
741
741
 
@@ -768,7 +768,7 @@ class Function(
768
768
  """
769
769
  ...
770
770
 
771
- spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P]
771
+ spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType]
772
772
 
773
773
  @property
774
774
  def _raw_f_(self) -> collections.abc.Callable[..., typing.Any]: ...
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.6.4.dev9
3
+ Version: 1.6.4.dev10
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -106,6 +106,10 @@ modal.egg-info/dependency_links.txt
106
106
  modal.egg-info/entry_points.txt
107
107
  modal.egg-info/requires.txt
108
108
  modal.egg-info/top_level.txt
109
+ modal/_audit_logs/__init__.py
110
+ modal/_audit_logs/_rpcs.py
111
+ modal/_audit_logs/count.py
112
+ modal/_audit_logs/list.py
109
113
  modal/_output/__init__.py
110
114
  modal/_output/manager.py
111
115
  modal/_output/pty.py
@@ -163,6 +163,10 @@ class ModalClientBase(abc.ABC):
163
163
  async def ClassGet(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.ClassGetRequest, modal_proto.api_pb2.ClassGetResponse]') -> None:
164
164
  pass
165
165
 
166
+ @abc.abstractmethod
167
+ async def CliCommandSuggest(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.CliCommandSuggestRequest, modal_proto.api_pb2.CliCommandSuggestResponse]') -> None:
168
+ pass
169
+
166
170
  @abc.abstractmethod
167
171
  async def ClientHello(self, stream: 'grpclib.server.Stream[google.protobuf.empty_pb2.Empty, modal_proto.api_pb2.ClientHelloResponse]') -> None:
168
172
  pass
@@ -587,6 +591,10 @@ class ModalClientBase(abc.ABC):
587
591
  async def MountPutFile(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.MountPutFileRequest, modal_proto.api_pb2.MountPutFileResponse]') -> None:
588
592
  pass
589
593
 
594
+ @abc.abstractmethod
595
+ async def ObjectSuggest(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.ObjectSuggestRequest, modal_proto.api_pb2.ObjectSuggestResponse]') -> None:
596
+ pass
597
+
590
598
  @abc.abstractmethod
591
599
  async def PersistentSandboxCreate(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.PersistentSandboxCreateRequest, modal_proto.api_pb2.PersistentSandboxCreateResponse]') -> None:
592
600
  pass
@@ -1349,6 +1357,12 @@ class ModalClientBase(abc.ABC):
1349
1357
  modal_proto.api_pb2.ClassGetRequest,
1350
1358
  modal_proto.api_pb2.ClassGetResponse,
1351
1359
  ),
1360
+ '/modal.client.ModalClient/CliCommandSuggest': grpclib.const.Handler(
1361
+ self.CliCommandSuggest,
1362
+ grpclib.const.Cardinality.UNARY_UNARY,
1363
+ modal_proto.api_pb2.CliCommandSuggestRequest,
1364
+ modal_proto.api_pb2.CliCommandSuggestResponse,
1365
+ ),
1352
1366
  '/modal.client.ModalClient/ClientHello': grpclib.const.Handler(
1353
1367
  self.ClientHello,
1354
1368
  grpclib.const.Cardinality.UNARY_UNARY,
@@ -1985,6 +1999,12 @@ class ModalClientBase(abc.ABC):
1985
1999
  modal_proto.api_pb2.MountPutFileRequest,
1986
2000
  modal_proto.api_pb2.MountPutFileResponse,
1987
2001
  ),
2002
+ '/modal.client.ModalClient/ObjectSuggest': grpclib.const.Handler(
2003
+ self.ObjectSuggest,
2004
+ grpclib.const.Cardinality.UNARY_UNARY,
2005
+ modal_proto.api_pb2.ObjectSuggestRequest,
2006
+ modal_proto.api_pb2.ObjectSuggestResponse,
2007
+ ),
1988
2008
  '/modal.client.ModalClient/PersistentSandboxCreate': grpclib.const.Handler(
1989
2009
  self.PersistentSandboxCreate,
1990
2010
  grpclib.const.Cardinality.UNARY_UNARY,
@@ -3023,6 +3043,12 @@ class ModalClientStub:
3023
3043
  modal_proto.api_pb2.ClassGetRequest,
3024
3044
  modal_proto.api_pb2.ClassGetResponse,
3025
3045
  )
3046
+ self.CliCommandSuggest = grpclib.client.UnaryUnaryMethod(
3047
+ channel,
3048
+ '/modal.client.ModalClient/CliCommandSuggest',
3049
+ modal_proto.api_pb2.CliCommandSuggestRequest,
3050
+ modal_proto.api_pb2.CliCommandSuggestResponse,
3051
+ )
3026
3052
  self.ClientHello = grpclib.client.UnaryUnaryMethod(
3027
3053
  channel,
3028
3054
  '/modal.client.ModalClient/ClientHello',
@@ -3659,6 +3685,12 @@ class ModalClientStub:
3659
3685
  modal_proto.api_pb2.MountPutFileRequest,
3660
3686
  modal_proto.api_pb2.MountPutFileResponse,
3661
3687
  )
3688
+ self.ObjectSuggest = grpclib.client.UnaryUnaryMethod(
3689
+ channel,
3690
+ '/modal.client.ModalClient/ObjectSuggest',
3691
+ modal_proto.api_pb2.ObjectSuggestRequest,
3692
+ modal_proto.api_pb2.ObjectSuggestResponse,
3693
+ )
3662
3694
  self.PersistentSandboxCreate = grpclib.client.UnaryUnaryMethod(
3663
3695
  channel,
3664
3696
  '/modal.client.ModalClient/PersistentSandboxCreate',