kylebrodeur commited on
Commit
d7337a8
·
verified ·
1 Parent(s): d6e2ebf

space: clean sync from chief-engineer root incl. screenshots and latest README

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .agents/skills/hf-cli/.hf-skill-manifest.json +0 -4
  2. .agents/skills/hf-cli/SKILL.md +0 -218
  3. .agents/skills/modal/SKILL.md +0 -88
  4. .agents/skills/modal/references/api/modal.App.md +0 -514
  5. .agents/skills/modal/references/api/modal.Client.md +0 -75
  6. .agents/skills/modal/references/api/modal.CloudBucketMount.md +0 -103
  7. .agents/skills/modal/references/api/modal.Cls.md +0 -163
  8. .agents/skills/modal/references/api/modal.Cron.md +0 -48
  9. .agents/skills/modal/references/api/modal.Dict.md +0 -379
  10. .agents/skills/modal/references/api/modal.Environment.md +0 -166
  11. .agents/skills/modal/references/api/modal.Error.md +0 -22
  12. .agents/skills/modal/references/api/modal.FilePatternMatcher.md +0 -69
  13. .agents/skills/modal/references/api/modal.Function.md +0 -387
  14. .agents/skills/modal/references/api/modal.FunctionCall.md +0 -191
  15. .agents/skills/modal/references/api/modal.Image.md +0 -1181
  16. .agents/skills/modal/references/api/modal.NetworkFileSystem.md +0 -183
  17. .agents/skills/modal/references/api/modal.Period.md +0 -40
  18. .agents/skills/modal/references/api/modal.Probe.md +0 -47
  19. .agents/skills/modal/references/api/modal.Proxy.md +0 -45
  20. .agents/skills/modal/references/api/modal.Queue.md +0 -464
  21. .agents/skills/modal/references/api/modal.Retries.md +0 -58
  22. .agents/skills/modal/references/api/modal.Sandbox.md +0 -950
  23. .agents/skills/modal/references/api/modal.SandboxSnapshot.md +0 -42
  24. .agents/skills/modal/references/api/modal.Secret.md +0 -285
  25. .agents/skills/modal/references/api/modal.Tunnel.md +0 -36
  26. .agents/skills/modal/references/api/modal.Volume.md +0 -480
  27. .agents/skills/modal/references/api/modal.Workspace.md +0 -63
  28. .agents/skills/modal/references/api/modal.asgi_app.md +0 -23
  29. .agents/skills/modal/references/api/modal.batched.md +0 -28
  30. .agents/skills/modal/references/api/modal.billing.md +0 -46
  31. .agents/skills/modal/references/api/modal.call_graph.md +0 -33
  32. .agents/skills/modal/references/api/modal.concurrent.md +0 -45
  33. .agents/skills/modal/references/api/modal.config.md +0 -163
  34. .agents/skills/modal/references/api/modal.container_process.md +0 -64
  35. .agents/skills/modal/references/api/modal.current_function_call_id.md +0 -16
  36. .agents/skills/modal/references/api/modal.current_input_id.md +0 -16
  37. .agents/skills/modal/references/api/modal.enable_output.md +0 -20
  38. .agents/skills/modal/references/api/modal.enter.md +0 -8
  39. .agents/skills/modal/references/api/modal.exception.md +0 -766
  40. .agents/skills/modal/references/api/modal.exit.md +0 -8
  41. .agents/skills/modal/references/api/modal.fastapi_endpoint.md +0 -20
  42. .agents/skills/modal/references/api/modal.file_io.md +0 -152
  43. .agents/skills/modal/references/api/modal.forward.md +0 -117
  44. .agents/skills/modal/references/api/modal.interact.md +0 -9
  45. .agents/skills/modal/references/api/modal.io_streams.md +0 -96
  46. .agents/skills/modal/references/api/modal.is_local.md +0 -11
  47. .agents/skills/modal/references/api/modal.method.md +0 -17
  48. .agents/skills/modal/references/api/modal.parameter.md +0 -17
  49. .agents/skills/modal/references/api/modal.web_server.md +0 -31
  50. .agents/skills/modal/references/api/modal.wsgi_app.md +0 -25
.agents/skills/hf-cli/.hf-skill-manifest.json DELETED
@@ -1,4 +0,0 @@
1
- {
2
- "installed_revision": "7bf59b7f85b79c74207b10d5e425934514e8b089",
3
- "schema_version": 1
4
- }
 
 
 
 
 
.agents/skills/hf-cli/SKILL.md DELETED
@@ -1,218 +0,0 @@
1
- ---
2
- name: hf-cli
3
- description: "Hugging Face Hub CLI (`hf`) for downloading, uploading, and managing models, datasets, spaces, buckets, repos, papers, jobs, and more on the Hugging Face Hub. Use when: handling authentication; managing local cache; managing Hugging Face Buckets; running or scheduling jobs on Hugging Face infrastructure; managing Hugging Face repos; discussions and pull requests; browsing models, datasets and spaces; reading, searching, or browsing academic papers; managing collections; querying datasets; configuring spaces; setting up webhooks; or deploying and managing HF Inference Endpoints. Make sure to use this skill whenever the user mentions 'hf', 'huggingface', 'Hugging Face', 'huggingface-cli', or 'hugging face cli', or wants to do anything related to the Hugging Face ecosystem and to AI and ML in general. Also use for cloud storage needs like training checkpoints, data pipelines, or agent traces. Use even if the user doesn't explicitly ask for a CLI command. Replaces the deprecated `huggingface-cli`."
4
- ---
5
-
6
- Install: `curl -LsSf https://hf.co/cli/install.sh | bash -s`.
7
-
8
- The Hugging Face Hub CLI tool `hf` is available. IMPORTANT: The `hf` command replaces the deprecated `huggingface-cli` command.
9
-
10
- Use `hf --help` to view available functions. Note that auth commands are now all under `hf auth` e.g. `hf auth whoami`.
11
-
12
- Generated with `huggingface_hub v1.19.0`. Run `hf skills add --force` to regenerate.
13
-
14
- ## Commands
15
-
16
- - `hf cp SRC` — Copy files between local paths, repositories, and buckets. `[--format [auto|human|agent|json|quiet]]`
17
- - `hf download REPO_ID` — Download files from the Hub. `[--type [model|dataset|space] --revision TEXT --include TEXT --exclude TEXT --cache-dir TEXT --local-dir TEXT --force-download --dry-run --max-workers INTEGER --format [auto|human|agent|json|quiet]]`
18
- - `hf env` — Print information about the environment. `[--format [auto|human|agent|json|quiet]]`
19
- - `hf sync` — Sync files between local directory and a bucket. `[--delete --ignore-times --ignore-sizes --plan TEXT --apply TEXT --dry-run --include TEXT --exclude TEXT --filter-from TEXT --existing --ignore-existing --verbose --format [auto|human|agent|json|quiet]]`
20
- - `hf update` — Update the `hf` CLI to the latest version. `[--format [auto|human|agent|json|quiet]]`
21
- - `hf upload REPO_ID` — Upload a file or a folder to the Hub. Recommended for single-commit uploads. `[--type [model|dataset|space] --revision TEXT --private --include TEXT --exclude TEXT --delete TEXT --commit-message TEXT --commit-description TEXT --create-pr --every FLOAT --format [auto|human|agent|json|quiet]]`
22
- - `hf upload-large-folder REPO_ID LOCAL_PATH` — Upload a large folder to the Hub. Recommended for resumable uploads. `[--type [model|dataset|space] --revision TEXT --private --include TEXT --exclude TEXT --num-workers INTEGER --no-report --no-bars --format [auto|human|agent|json|quiet]]`
23
- - `hf version` — Print information about the hf version. `[--format [auto|human|agent|json|quiet]]`
24
-
25
- ### `hf auth` — Manage authentication (login, logout, etc.).
26
-
27
- - `hf auth list` — List all stored access tokens. `[--format [auto|human|agent|json|quiet]]`
28
- - `hf auth login` — Login using a token from huggingface.co/settings/tokens. `[--add-to-git-credential --force --format [auto|human|agent|json|quiet]]`
29
- - `hf auth logout` — Logout from a specific token. `[--token-name TEXT --format [auto|human|agent|json|quiet]]`
30
- - `hf auth switch` — Switch between access tokens. `[--token-name TEXT --add-to-git-credential --format [auto|human|agent|json|quiet]]`
31
- - `hf auth token` — Print the current access token to stdout. `[--format [auto|human|agent|json|quiet]]`
32
- - `hf auth whoami` — Find out which huggingface.co account you are logged in as. `[--format [auto|human|agent|json|quiet]]`
33
-
34
- ### `hf buckets` — Commands to interact with buckets.
35
-
36
- - `hf buckets cp SRC` — Copy files between local paths, repositories, and buckets. `[--format [auto|human|agent|json|quiet]]`
37
- - `hf buckets create BUCKET_ID` — Create a new bucket. `[--private --region [us|eu] --exist-ok --format [auto|human|agent|json|quiet]]`
38
- - `hf buckets delete BUCKET_ID` — Delete a bucket. `[--yes --missing-ok --format [auto|human|agent|json|quiet]]`
39
- - `hf buckets info BUCKET_ID` — Get info about a bucket. `[--format [auto|human|agent|json|quiet]]`
40
- - `hf buckets list` — List buckets or files in a bucket. `[--human-readable --tree --recursive --search TEXT --format [auto|human|agent|json|quiet]]`
41
- - `hf buckets move FROM_ID TO_ID` — Move (rename) a bucket to a new name or namespace. `[--format [auto|human|agent|json|quiet]]`
42
- - `hf buckets remove ARGUMENT` — Remove files from a bucket. `[--recursive --yes --dry-run --include TEXT --exclude TEXT --format [auto|human|agent|json|quiet]]`
43
- - `hf buckets sync` — Sync files between local directory and a bucket. `[--delete --ignore-times --ignore-sizes --plan TEXT --apply TEXT --dry-run --include TEXT --exclude TEXT --filter-from TEXT --existing --ignore-existing --verbose --format [auto|human|agent|json|quiet]]`
44
-
45
- ### `hf cache` — Manage local cache directory.
46
-
47
- - `hf cache list` — List cached repositories or revisions. `[--cache-dir TEXT --revisions --filter TEXT --sort [accessed|accessed:asc|accessed:desc|modified|modified:asc|modified:desc|name|name:asc|name:desc|size|size:asc|size:desc] --limit INTEGER --format [auto|human|agent|json|quiet]]`
48
- - `hf cache prune` — Remove detached revisions from the cache. `[--cache-dir TEXT --yes --dry-run --format [auto|human|agent|json|quiet]]`
49
- - `hf cache rm TARGETS` — Remove cached repositories or revisions. `[--cache-dir TEXT --yes --dry-run --format [auto|human|agent|json|quiet]]`
50
- - `hf cache verify REPO_ID` — Verify checksums for a single repo revision from cache or a local directory. `[--type [model|dataset|space] --revision TEXT --cache-dir TEXT --local-dir TEXT --fail-on-missing-files --fail-on-extra-files --format [auto|human|agent|json|quiet]]`
51
-
52
- ### `hf collections` — Interact with collections on the Hub.
53
-
54
- - `hf collections add-item COLLECTION_SLUG ITEM_ID ITEM_TYPE` — Add an item to a collection. `[--note TEXT --exists-ok --format [auto|human|agent|json|quiet]]`
55
- - `hf collections create TITLE` — Create a new collection on the Hub. `[--namespace TEXT --description TEXT --private --exists-ok --format [auto|human|agent|json|quiet]]`
56
- - `hf collections delete COLLECTION_SLUG` — Delete a collection from the Hub. `[--missing-ok --format [auto|human|agent|json|quiet]]`
57
- - `hf collections delete-item COLLECTION_SLUG ITEM_OBJECT_ID` — Delete an item from a collection. `[--missing-ok --format [auto|human|agent|json|quiet]]`
58
- - `hf collections info COLLECTION_SLUG` — Get info about a collection on the Hub. `[--format [auto|human|agent|json|quiet]]`
59
- - `hf collections list` — List collections on the Hub. `[--owner TEXT --item TEXT --sort [lastModified|trending|upvotes] --limit INTEGER --format [auto|human|agent|json|quiet]]`
60
- - `hf collections update COLLECTION_SLUG` — Update a collection's metadata on the Hub. `[--title TEXT --description TEXT --position INTEGER --private --theme TEXT --format [auto|human|agent|json|quiet]]`
61
- - `hf collections update-item COLLECTION_SLUG ITEM_OBJECT_ID` — Update an item in a collection. `[--note TEXT --position INTEGER --format [auto|human|agent|json|quiet]]`
62
-
63
- ### `hf datasets` — Interact with datasets on the Hub.
64
-
65
- - `hf datasets card DATASET_ID` — Get the dataset card (README) for a dataset on the Hub. `[--metadata --text --format [auto|human|agent|json|quiet]]`
66
- - `hf datasets info DATASET_ID` — Get info about a dataset on the Hub. `[--revision TEXT --expand TEXT --format [auto|human|agent|json|quiet]]`
67
- - `hf datasets leaderboard DATASET_ID` — List model scores from a dataset leaderboard. This command helps find the best models for a task or compare models by benchmark scores. Use 'hf datasets ls --filter benchmark:official' to list available leaderboards. `[--limit INTEGER --format [auto|human|agent|json|quiet]]`
68
- - `hf datasets list` — List datasets on the Hub, or files in a dataset repo. `[--search TEXT --author TEXT --filter TEXT --sort [created_at|downloads|last_modified|likes|trending_score] --limit INTEGER --expand TEXT --human-readable --tree --recursive --revision TEXT --format [auto|human|agent|json|quiet]]`
69
- - `hf datasets parquet DATASET_ID` — List parquet file URLs available for a dataset. `[--subset TEXT --split TEXT --format [auto|human|agent|json|quiet]]`
70
- - `hf datasets sql SQL` — Execute a raw SQL query with DuckDB against dataset parquet URLs. `[--format [auto|human|agent|json|quiet]]`
71
-
72
- ### `hf discussions` — Manage discussions and pull requests on the Hub.
73
-
74
- - `hf discussions close REPO_ID NUM` — Close a discussion or pull request. `[--comment TEXT --yes --type [model|dataset|space] --format [auto|human|agent|json|quiet]]`
75
- - `hf discussions comment REPO_ID NUM` — Comment on a discussion or pull request. `[--body TEXT --body-file PATH --type [model|dataset|space] --format [auto|human|agent|json|quiet]]`
76
- - `hf discussions create REPO_ID --title TEXT` — Create a new discussion or pull request on a repo. `[--body TEXT --body-file PATH --pull-request --type [model|dataset|space] --format [auto|human|agent|json|quiet]]`
77
- - `hf discussions diff REPO_ID NUM` — Show the diff of a pull request. `[--type [model|dataset|space] --format [auto|human|agent|json|quiet]]`
78
- - `hf discussions info REPO_ID NUM` — Get info about a discussion or pull request. `[--type [model|dataset|space] --format [auto|human|agent|json|quiet]]`
79
- - `hf discussions list REPO_ID` — List discussions and pull requests on a repo. `[--status [open|closed|merged|draft|all] --kind [all|discussion|pull_request] --author TEXT --limit INTEGER --type [model|dataset|space] --format [auto|human|agent|json|quiet]]`
80
- - `hf discussions merge REPO_ID NUM` — Merge a pull request. `[--comment TEXT --yes --type [model|dataset|space] --format [auto|human|agent|json|quiet]]`
81
- - `hf discussions rename REPO_ID NUM NEW_TITLE` — Rename a discussion or pull request. `[--type [model|dataset|space] --format [auto|human|agent|json|quiet]]`
82
- - `hf discussions reopen REPO_ID NUM` — Reopen a closed discussion or pull request. `[--comment TEXT --yes --type [model|dataset|space] --format [auto|human|agent|json|quiet]]`
83
-
84
- ### `hf endpoints` — Manage Hugging Face Inference Endpoints.
85
-
86
- - `hf endpoints catalog deploy --repo TEXT` — Deploy an Inference Endpoint from the Model Catalog. `[--name TEXT --accelerator TEXT --namespace TEXT --format [auto|human|agent|json|quiet]]`
87
- - `hf endpoints catalog list` — List available Catalog models. `[--format [auto|human|agent|json|quiet]]`
88
- - `hf endpoints delete NAME` — Delete an Inference Endpoint permanently. `[--namespace TEXT --yes --format [auto|human|agent|json|quiet]]`
89
- - `hf endpoints deploy NAME --repo TEXT --framework TEXT --accelerator TEXT --instance-size TEXT --instance-type TEXT --region TEXT --vendor TEXT` — Deploy an Inference Endpoint from a Hub repository. `[--namespace TEXT --task TEXT --min-replica INTEGER --max-replica INTEGER --scale-to-zero-timeout INTEGER --scaling-metric [pendingRequests|hardwareUsage] --scaling-threshold FLOAT --format [auto|human|agent|json|quiet]]`
90
- - `hf endpoints describe NAME` — Get information about an existing endpoint. `[--namespace TEXT --format [auto|human|agent|json|quiet]]`
91
- - `hf endpoints list` — Lists all Inference Endpoints for the given namespace. `[--namespace TEXT --format [auto|human|agent|json|quiet]]`
92
- - `hf endpoints pause NAME` — Pause an Inference Endpoint. `[--namespace TEXT --format [auto|human|agent|json|quiet]]`
93
- - `hf endpoints resume NAME` — Resume an Inference Endpoint. `[--namespace TEXT --fail-if-already-running --format [auto|human|agent|json|quiet]]`
94
- - `hf endpoints scale-to-zero NAME` — Scale an Inference Endpoint to zero. `[--namespace TEXT --format [auto|human|agent|json|quiet]]`
95
- - `hf endpoints update NAME` — Update an existing endpoint. `[--namespace TEXT --repo TEXT --accelerator TEXT --instance-size TEXT --instance-type TEXT --framework TEXT --revision TEXT --task TEXT --min-replica INTEGER --max-replica INTEGER --scale-to-zero-timeout INTEGER --scaling-metric [pendingRequests|hardwareUsage] --scaling-threshold FLOAT --format [auto|human|agent|json|quiet]]`
96
-
97
- ### `hf extensions` — Manage hf CLI extensions.
98
-
99
- - `hf extensions exec NAME` — Execute an installed extension.
100
- - `hf extensions install REPO_ID` — Install an extension from a public GitHub repository. `[--force --format [auto|human|agent|json|quiet]]`
101
- - `hf extensions list` — List installed extension commands. `[--format [auto|human|agent|json|quiet]]`
102
- - `hf extensions remove NAME` — Remove an installed extension. `[--format [auto|human|agent|json|quiet]]`
103
- - `hf extensions search` — Search extensions available on GitHub (tagged with 'hf-extension' topic). `[--format [auto|human|agent|json|quiet]]`
104
-
105
- ### `hf jobs` — Run and manage Jobs on the Hub.
106
-
107
- - `hf jobs cancel JOB_ID` — Cancel a Job `[--namespace TEXT --format [auto|human|agent|json|quiet]]`
108
- - `hf jobs hardware` — List available hardware options for Jobs `[--format [auto|human|agent|json|quiet]]`
109
- - `hf jobs inspect JOB_IDS` — Display detailed information on one or more Jobs `[--namespace TEXT --format [auto|human|agent|json|quiet]]`
110
- - `hf jobs labels JOB_ID` — Update labels on a Job. Replaces all existing labels. `[--label TEXT --clear --namespace TEXT --format [auto|human|agent|json|quiet]]`
111
- - `hf jobs logs JOB_ID` — Fetch the logs of a Job. `[--follow --tail INTEGER --namespace TEXT --format [auto|human|agent|json|quiet]]`
112
- - `hf jobs ps` — List Jobs. `[--all --namespace TEXT --filter TEXT --format [auto|human|agent|json|quiet]]`
113
- - `hf jobs run IMAGE COMMAND` — Run a Job. `[--env TEXT --secrets TEXT --label TEXT --volume TEXT --env-file TEXT --secrets-file TEXT --flavor [cpu-basic|cpu-upgrade|cpu-performance|cpu-xl|t4-small|t4-medium|l4x1|l4x4|l40sx1|l40sx4|l40sx8|a10g-small|a10g-large|a10g-largex2|a10g-largex4|a100-large|a100x4|a100x8|h200|h200x2|h200x4|h200x8|rtx-pro-6000|rtx-pro-6000x2|rtx-pro-6000x4|rtx-pro-6000x8] --timeout TEXT --detach --expose INTEGER --namespace TEXT]`
114
- - `hf jobs scheduled delete SCHEDULED_JOB_ID` — Delete a scheduled Job. `[--namespace TEXT --format [auto|human|agent|json|quiet]]`
115
- - `hf jobs scheduled inspect SCHEDULED_JOB_IDS` — Display detailed information on one or more scheduled Jobs `[--namespace TEXT --format [auto|human|agent|json|quiet]]`
116
- - `hf jobs scheduled labels SCHEDULED_JOB_ID` — Update labels on a scheduled Job. Replaces all existing labels. `[--label TEXT --clear --namespace TEXT --format [auto|human|agent|json|quiet]]`
117
- - `hf jobs scheduled ps` — List scheduled Jobs `[--all --namespace TEXT --filter TEXT --format [auto|human|agent|json|quiet]]`
118
- - `hf jobs scheduled resume SCHEDULED_JOB_ID` — Resume (unpause) a scheduled Job. `[--namespace TEXT --format [auto|human|agent|json|quiet]]`
119
- - `hf jobs scheduled run SCHEDULE IMAGE COMMAND` — Schedule a Job. `[--suspend --concurrency --env TEXT --secrets TEXT --label TEXT --volume TEXT --env-file TEXT --secrets-file TEXT --flavor [cpu-basic|cpu-upgrade|cpu-performance|cpu-xl|t4-small|t4-medium|l4x1|l4x4|l40sx1|l40sx4|l40sx8|a10g-small|a10g-large|a10g-largex2|a10g-largex4|a100-large|a100x4|a100x8|h200|h200x2|h200x4|h200x8|rtx-pro-6000|rtx-pro-6000x2|rtx-pro-6000x4|rtx-pro-6000x8] --timeout TEXT --expose INTEGER --namespace TEXT]`
120
- - `hf jobs scheduled suspend SCHEDULED_JOB_ID` — Suspend (pause) a scheduled Job. `[--namespace TEXT --format [auto|human|agent|json|quiet]]`
121
- - `hf jobs scheduled uv run SCHEDULE SCRIPT` — Run a UV script (local file or URL) on HF infrastructure `[--suspend --concurrency --image TEXT --flavor [cpu-basic|cpu-upgrade|cpu-performance|cpu-xl|t4-small|t4-medium|l4x1|l4x4|l40sx1|l40sx4|l40sx8|a10g-small|a10g-large|a10g-largex2|a10g-largex4|a100-large|a100x4|a100x8|h200|h200x2|h200x4|h200x8|rtx-pro-6000|rtx-pro-6000x2|rtx-pro-6000x4|rtx-pro-6000x8] --env TEXT --secrets TEXT --label TEXT --volume TEXT --env-file TEXT --secrets-file TEXT --timeout TEXT --expose INTEGER --namespace TEXT --with TEXT --python TEXT]`
122
- - `hf jobs stats` — Fetch the resource usage statistics and metrics of Jobs `[--namespace TEXT --format [auto|human|agent|json|quiet]]`
123
- - `hf jobs uv run SCRIPT` — Run a UV script (local file or URL) on HF infrastructure `[--image TEXT --flavor [cpu-basic|cpu-upgrade|cpu-performance|cpu-xl|t4-small|t4-medium|l4x1|l4x4|l40sx1|l40sx4|l40sx8|a10g-small|a10g-large|a10g-largex2|a10g-largex4|a100-large|a100x4|a100x8|h200|h200x2|h200x4|h200x8|rtx-pro-6000|rtx-pro-6000x2|rtx-pro-6000x4|rtx-pro-6000x8] --env TEXT --secrets TEXT --label TEXT --volume TEXT --env-file TEXT --secrets-file TEXT --timeout TEXT --detach --expose INTEGER --namespace TEXT --with TEXT --python TEXT]`
124
-
125
- ### `hf models` — Interact with models on the Hub.
126
-
127
- - `hf models card MODEL_ID` — Get the model card (README) for a model on the Hub. `[--metadata --text --format [auto|human|agent|json|quiet]]`
128
- - `hf models info MODEL_ID` — Get info about a model on the Hub. `[--revision TEXT --expand TEXT --format [auto|human|agent|json|quiet]]`
129
- - `hf models list` — List models on the Hub, or files in a model repo. `[--search TEXT --author TEXT --filter TEXT --num-parameters TEXT --sort [created_at|downloads|last_modified|likes|trending_score] --limit INTEGER --expand TEXT --human-readable --tree --recursive --revision TEXT --format [auto|human|agent|json|quiet]]`
130
-
131
- ### `hf papers` — Interact with papers on the Hub.
132
-
133
- - `hf papers info PAPER_ID` — Get info about a paper on the Hub. `[--format [auto|human|agent|json|quiet]]`
134
- - `hf papers list` — List daily papers on the Hub. `[--date TEXT --week TEXT --month TEXT --submitter TEXT --sort [publishedAt|trending] --limit INTEGER --format [auto|human|agent|json|quiet]]`
135
- - `hf papers read PAPER_ID` — Read a paper as markdown. `[--format [auto|human|agent|json|quiet]]`
136
- - `hf papers search QUERY` — Search papers on the Hub. `[--limit INTEGER --format [auto|human|agent|json|quiet]]`
137
-
138
- ### `hf repos` — Manage repos on the Hub.
139
-
140
- - `hf repos branch create REPO_ID BRANCH` — Create a new branch for a repo on the Hub. `[--revision TEXT --type [model|dataset|space] --exist-ok --format [auto|human|agent|json|quiet]]`
141
- - `hf repos branch delete REPO_ID BRANCH` — Delete a branch from a repo on the Hub. `[--type [model|dataset|space] --format [auto|human|agent|json|quiet]]`
142
- - `hf repos cp SRC` — Copy files between local paths, repositories, and buckets. `[--format [auto|human|agent|json|quiet]]`
143
- - `hf repos create REPO_ID` — Create a new repo on the Hub. `[--type [model|dataset|space] --space-sdk TEXT --private --public --protected --exist-ok --resource-group-id TEXT --region [us|eu] --flavor [cpu-basic|cpu-upgrade|zero-a10g|t4-small|t4-medium|l4x1|l4x4|l40sx1|l40sx4|l40sx8|a10g-small|a10g-large|a10g-largex2|a10g-largex4|a100-large|a100x4|a100x8] --storage [small|medium|large] --sleep-time INTEGER --secrets TEXT --secrets-file TEXT --env TEXT --env-file TEXT --volume TEXT --format [auto|human|agent|json|quiet]]`
144
- - `hf repos delete REPO_ID` — Delete a repo from the Hub. This is an irreversible operation. `[--type [model|dataset|space] --missing-ok --yes --format [auto|human|agent|json|quiet]]`
145
- - `hf repos delete-files REPO_ID PATTERNS` — Delete files from a repo on the Hub. `[--type [model|dataset|space] --revision TEXT --commit-message TEXT --commit-description TEXT --create-pr --format [auto|human|agent|json|quiet]]`
146
- - `hf repos duplicate FROM_ID` — Duplicate a repo on the Hub (model, dataset, or Space). `[--type [model|dataset|space] --private --public --protected --exist-ok --flavor [cpu-basic|cpu-upgrade|zero-a10g|t4-small|t4-medium|l4x1|l4x4|l40sx1|l40sx4|l40sx8|a10g-small|a10g-large|a10g-largex2|a10g-largex4|a100-large|a100x4|a100x8] --storage [small|medium|large] --sleep-time INTEGER --secrets TEXT --secrets-file TEXT --env TEXT --env-file TEXT --volume TEXT --format [auto|human|agent|json|quiet]]`
147
- - `hf repos list` — List all repos (models, datasets, spaces, buckets) with storage info. `[--namespace TEXT --type [model|dataset|space|bucket] --search TEXT --limit INTEGER --explore --format [auto|human|agent|json|quiet]]`
148
- - `hf repos move FROM_ID TO_ID` — Move a repository from a namespace to another namespace. `[--type [model|dataset|space] --format [auto|human|agent|json|quiet]]`
149
- - `hf repos settings REPO_ID` — Update the settings of a repository. `[--gated [auto|manual|false] --private --public --protected --type [model|dataset|space] --format [auto|human|agent|json|quiet]]`
150
- - `hf repos tag create REPO_ID TAG` — Create a tag for a repo. `[--message TEXT --revision TEXT --type [model|dataset|space] --format [auto|human|agent|json|quiet]]`
151
- - `hf repos tag delete REPO_ID TAG` — Delete a tag for a repo. `[--yes --type [model|dataset|space] --format [auto|human|agent|json|quiet]]`
152
- - `hf repos tag list REPO_ID` — List tags for a repo. `[--type [model|dataset|space] --format [auto|human|agent|json|quiet]]`
153
-
154
- ### `hf skills` — Manage skills for AI assistants.
155
-
156
- - `hf skills add` — Download a Hugging Face skill and install it for an AI assistant. `[--claude --global --dest PATH --force --format [auto|human|agent|json|quiet]]`
157
- - `hf skills list` — List available skills from the Hugging Face marketplace. `[--format [auto|human|agent|json|quiet]]`
158
- - `hf skills preview` — Print the generated `hf-cli` SKILL.md to stdout. `[--format [auto|human|agent|json|quiet]]`
159
- - `hf skills update` — Update installed Hugging Face marketplace skills. `[--claude --global --dest PATH --format [auto|human|agent|json|quiet]]`
160
-
161
- ### `hf spaces` — Interact with spaces on the Hub.
162
-
163
- - `hf spaces card SPACE_ID` — Get the Space card (README) for a Space on the Hub. `[--metadata --text --format [auto|human|agent|json|quiet]]`
164
- - `hf spaces dev-mode SPACE_ID` — Enable or disable dev mode on a Space. `[--stop --format [auto|human|agent|json|quiet]]`
165
- - `hf spaces hardware` — List available hardware options for Spaces. `[--format [auto|human|agent|json|quiet]]`
166
- - `hf spaces hot-reload SPACE_ID` — Hot-reload any Python file of a Space without a full rebuild + restart. `[--local-file PATH --skip-checks --skip-summary --format [auto|human|agent|json|quiet]]`
167
- - `hf spaces info SPACE_ID` — Get info about a space on the Hub. `[--revision TEXT --expand TEXT --format [auto|human|agent|json|quiet]]`
168
- - `hf spaces list` — List spaces on the Hub, or files in a space repo. `[--search TEXT --author TEXT --filter TEXT --sort [created_at|last_modified|likes|trending_score] --limit INTEGER --expand TEXT --human-readable --tree --recursive --revision TEXT --format [auto|human|agent|json|quiet]]`
169
- - `hf spaces logs SPACE_ID` — Fetch the run or build logs of a Space. `[--build --follow --tail INTEGER --format [auto|human|agent|json|quiet]]`
170
- - `hf spaces pause SPACE_ID` — Pause a Space. `[--format [auto|human|agent|json|quiet]]`
171
- - `hf spaces restart SPACE_ID` — Restart a Space. `[--factory-reboot --format [auto|human|agent|json|quiet]]`
172
- - `hf spaces search QUERY` — Search spaces on the Hub using semantic search. `[--filter TEXT --sdk TEXT --include-non-running --description --limit INTEGER --format [auto|human|agent|json|quiet]]`
173
- - `hf spaces secrets add SPACE_ID` — Add or update secrets for a Space. `[--secrets TEXT --secrets-file TEXT --format [auto|human|agent|json|quiet]]`
174
- - `hf spaces secrets delete SPACE_ID KEY` — Remove a secret from a Space. `[--yes --format [auto|human|agent|json|quiet]]`
175
- - `hf spaces secrets list SPACE_ID` — List secrets for a Space. Secret values are write-only and not returned. `[--format [auto|human|agent|json|quiet]]`
176
- - `hf spaces settings SPACE_ID` — Update the settings of a Space. `[--sleep-time INTEGER --hardware [cpu-basic|cpu-upgrade|zero-a10g|t4-small|t4-medium|l4x1|l4x4|l40sx1|l40sx4|l40sx8|a10g-small|a10g-large|a10g-largex2|a10g-largex4|a100-large|a100x4|a100x8] --format [auto|human|agent|json|quiet]]`
177
- - `hf spaces ssh SPACE_ID` — SSH into a Space's Dev Mode container. `[--identity-file PATH --dry-run --auto --format [auto|human|agent|json|quiet]]`
178
- - `hf spaces variables add SPACE_ID` — Add or update environment variables for a Space. `[--env TEXT --env-file TEXT --format [auto|human|agent|json|quiet]]`
179
- - `hf spaces variables delete SPACE_ID KEY` — Remove an environment variable from a Space. `[--yes --format [auto|human|agent|json|quiet]]`
180
- - `hf spaces variables list SPACE_ID` — List environment variables for a Space. `[--format [auto|human|agent|json|quiet]]`
181
- - `hf spaces volumes delete SPACE_ID` — Remove all volumes from a Space. `[--yes --format [auto|human|agent|json|quiet]]`
182
- - `hf spaces volumes list SPACE_ID` — List volumes mounted in a Space. `[--format [auto|human|agent|json|quiet]]`
183
- - `hf spaces volumes set SPACE_ID` — Set (replace) volumes for a Space. `[--volume TEXT --format [auto|human|agent|json|quiet]]`
184
-
185
- ### `hf webhooks` — Manage webhooks on the Hub.
186
-
187
- - `hf webhooks create --watch TEXT` — Create a new webhook. `[--url TEXT --job-id TEXT --domain [repo|discussions] --secret TEXT --format [auto|human|agent|json|quiet]]`
188
- - `hf webhooks delete WEBHOOK_ID` — Delete a webhook permanently. `[--yes --format [auto|human|agent|json|quiet]]`
189
- - `hf webhooks disable WEBHOOK_ID` — Disable an active webhook. `[--format [auto|human|agent|json|quiet]]`
190
- - `hf webhooks enable WEBHOOK_ID` — Enable a disabled webhook. `[--format [auto|human|agent|json|quiet]]`
191
- - `hf webhooks info WEBHOOK_ID` — Show full details for a single webhook. `[--format [auto|human|agent|json|quiet]]`
192
- - `hf webhooks list` — List all webhooks for the current user. `[--format [auto|human|agent|json|quiet]]`
193
- - `hf webhooks update WEBHOOK_ID` — Update an existing webhook. Only provided options are changed. `[--url TEXT --watch TEXT --domain [repo|discussions] --secret TEXT --format [auto|human|agent|json|quiet]]`
194
-
195
- ## Common options
196
-
197
- - `--format` — Output format: `--format json` (or `--json`) or `--format table` (default).
198
- - `-q / --quiet` — Quiet output (one ID per line).
199
- - `--revision` — Git revision id which can be a branch name, a tag, or a commit hash.
200
- - `--token` — Use a User Access Token. Prefer setting `HF_TOKEN` env var instead of passing `--token`.
201
- - `--type` — The type of repository (model, dataset, or space).
202
-
203
- ## Mounting repos as local filesystems
204
-
205
- To mount Hub repositories or buckets as local filesystems — no download, no copy, no waiting — use `hf-mount`. Files are fetched on demand. GitHub: https://github.com/huggingface/hf-mount
206
-
207
- Install: `curl -fsSL https://raw.githubusercontent.com/huggingface/hf-mount/main/install.sh | sh`
208
-
209
- Some command examples:
210
- - `hf-mount start repo openai-community/gpt2 /tmp/gpt2` — mount a repo (read-only)
211
- - `hf-mount start --hf-token $HF_TOKEN bucket myuser/my-bucket /tmp/data` — mount a bucket (read-write)
212
- - `hf-mount status` / `hf-mount stop /tmp/data` — list or unmount
213
-
214
- ## Tips
215
-
216
- - Use `hf <command> --help` for full options, descriptions, usage, and real-world examples
217
- - Authenticate with `HF_TOKEN` env var (recommended) or with `--token`
218
- - Update the CLI with `hf update` (uses the correct command for the detected install method)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/SKILL.md DELETED
@@ -1,88 +0,0 @@
1
- ---
2
- name: modal
3
- description: >
4
- This skill provides guidance for working with the Modal cloud platform. Use
5
- this skill whenever the user mentions Modal or has code that imports the
6
- `modal` SDK in Python, Go, or JavaScript. This skill should also trigger when
7
- the user needs to run Python code with vertical or horizontal scalability
8
- (e.g. batch jobs), needs access to GPUs (e.g. AI workloads including training
9
- and inference) or needs to run untrusted processes in a sandbox, since Modal
10
- serves these use cases well.
11
- metadata:
12
- version: "1.5.0"
13
- ---
14
-
15
- # Overview
16
-
17
- This is a foundational skill for working with the Modal cloud platform.
18
-
19
- Modal is a platform for AI workloads. It offers highly scalable serverless compute (including GPUs) with minimal configuration.
20
-
21
- # Documentation
22
-
23
- The official docs are the best source for up-to-date information on the platform. Make use of them when planning, debugging, or answering questions!
24
-
25
- Modal's documentation is outlined at https://modal.com/llms.txt. This file contains titles and URLs for all public docs; reading it directly will guide you to specific content.
26
-
27
- The docs are divided into three sections:
28
-
29
- - _Guide_ pages have explanations of Modal features, primitives, and workflows
30
- - _API Reference_ pages have detailed information about each component of the SDK
31
- - _Examples_ pages contain didactic examples of various AI applications on Modal
32
-
33
- Fetch the docs using a `.md` extension to get plain text.
34
-
35
- If this skill has been installed via the `modal` CLI, the docs are also bundled locally under `references/`.
36
-
37
- You can also refer to https://modal.com/llms-full.txt, which aggregates all docs in a single very large file. Do *not* read this into your main context, but it may be useful for searching.
38
-
39
- # Using the CLI
40
-
41
- The `modal` CLI can be used to run or deploy code, manage resources, and observe running Apps. It is a key tool for interacting with Modal throughout all stages of development.
42
-
43
- Run `modal --help` to see all available CLI commands.
44
-
45
- You can see more detailed information about each command by running `modal [command] --help`. Rely on the `--help` to discover functionality: new features are added in every release! Always check the `--help` if you encounter a usage error.
46
-
47
- Tip: many CLI commands accept a `--json` flag to make their output more easily parseable, e.g. with `jq`.
48
-
49
- The `modal` CLI is part of the Python SDK and executes in a Python runtime. Depending on the user's preferred Python development workflow, you may need to prefix `modal` CLI invocations with, e.g., `uv run` to ensure a consistent Python environment. The CLI can also be used via `uvx` as a standalone tool, but only do this when working outside of a Python project.
50
-
51
- # Getting up to date
52
-
53
- You have significant knowledge about Modal from your training data but may not be aware of new features or recent changes to the API. Modal is continuously adding new features. Reading relevant docs while planning or debugging can help you discover the most up-to-date way to accomplish a task on Modal.
54
-
55
- The Modal CLI provides a `modal changelog` command for learning about recent changes. Useful invocation patterns:
56
-
57
- - `modal changelog --since [DATE]` to see changes added since your knowledge cutoff
58
- - `modal changelog --since [VERSION]` when migrating a codebase to a newer version
59
- - `modal changelog --newer` to discover features that would be available on update
60
-
61
- Note: `modal changelog` requires network access.
62
-
63
- Run `modal --version` to see the SDK version that is in use.
64
-
65
- If your code exercises deprecated APIs, Modal will issue warnings. Use the warning message and related documentation to migrate your code to stable API.
66
-
67
- This skill will also be improved over time. Its version should correspond to the version of the Modal SDK that you are using. If the skill is out of date, it can be updated by running `modal skills update`.
68
-
69
- # Auth
70
-
71
- Modal is a cloud platform. Using the CLI or running code that depends on the `modal` library requires internet access and an authorization token. There is no "local development mode" with Modal.
72
-
73
- You can use the `modal token` CLI to create a new token (note: this workflow requires human user involvement) or to debug authorization issues. Token setup only needs to happen once, so assume it is configured unless you encounter issues.
74
-
75
- # Async Python
76
-
77
- When writing async Python, use Modal's `.aio()` interface (e.g. `await modal.Sandbox.create.aio(...)`, `await modal.Function.remote.aio(...)`) so that Modal runs its I/O operations via asynchronous coroutines.
78
-
79
- # Other languages
80
-
81
- Python is currently the only runtime language for Modal Functions, but there are Modal SDKs in both JavaScript (TypeScript) and Go:
82
-
83
- - JavaScript SDK: https://github.com/modal-labs/modal-client/blob/main/js/README.md
84
- - Go SDK: https://github.com/modal-labs/modal-client/blob/main/go/README.md
85
-
86
- The Go / JS SDKs are not as mature as the Python SDK and may be missing features. The current scope for the Go / JS SDKs includes (1) creating and interacting with Sandboxes and (2) calling into deployed Modal Functions (i.e., Functions defined in Python).
87
-
88
- They are primarily documented through examples hosted on GitHub rather than through the main Modal docs. You likely have much less knowledge of these SDKs from your training, so rely on these examples.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.App.md DELETED
@@ -1,514 +0,0 @@
1
- # modal.App
2
-
3
-
4
- ```python
5
- class App(object)
6
- ```
7
-
8
- A Modal App is a group of functions and classes that are deployed together.
9
-
10
- The app serves at least three purposes:
11
-
12
- * A unit of deployment for functions and classes.
13
- * Syncing of identities of (primarily) functions and classes across processes
14
- (your local Python interpreter and every Modal container active in your application).
15
- * Manage log collection for everything that happens inside your code.
16
-
17
- **Registering functions with an app**
18
-
19
- The most common way to explicitly register an Object with an app is through the
20
- `@app.function()` decorator. It both registers the annotated function itself and
21
- other passed objects, like schedules and secrets, with the app:
22
-
23
- ```python
24
- import modal
25
-
26
- app = modal.App()
27
-
28
- @app.function(
29
- secrets=[modal.Secret.from_name("some_secret")],
30
- schedule=modal.Period(days=1),
31
- )
32
- def foo():
33
- pass
34
- ```
35
-
36
- In this example, the secret and schedule are registered with the app.
37
-
38
- ```python
39
- __init__(self, name=None, *, tags=None, image=None, secrets=[], volumes={},
40
- include_source=True)
41
- ```
42
- Construct a new app, optionally with default image, mounts, secrets, or volumes.
43
-
44
- **Parameters**
45
-
46
- <Parameter name="name" type="str | None" defaultValue="None" description="Optional app name used for registration and lookup." />
47
- <Parameter name="tags" type="dict[str, str] | None" defaultValue="None" description="Additional metadata to set on the App." />
48
- <Parameter name="image" type="_Image | None" defaultValue="None" description="Default image for the App (otherwise defaults to `modal.Image.debian_slim()`)." />
49
- <Parameter name="secrets" type="Sequence[_Secret]" defaultValue="[]" description="Secrets to add for all Functions in the App." />
50
- <Parameter name="volumes" type="dict[str | PurePosixPath, _Volume]" defaultValue="&#123;&#125;" description="Volume mounts to use for all Functions." />
51
- <Parameter name="include_source" type="bool" defaultValue="True" description="Default for whether Function source files are added to the Modal container (per-function override possible)." />
52
-
53
- **Usage**
54
-
55
- ```python notest
56
- image = modal.Image.debian_slim().pip_install(...)
57
- secret = modal.Secret.from_name("my-secret")
58
- volume = modal.Volume.from_name("my-data")
59
- app = modal.App(image=image, secrets=[secret], volumes={"/mnt/data": volume})
60
- ```
61
-
62
- ## name
63
-
64
- ```python
65
- name(self)
66
- ```
67
- The user-provided name of the App.
68
-
69
- **Returns**
70
-
71
- The configured app name, if any.
72
-
73
- ## app_id
74
-
75
- ```python
76
- app_id(self)
77
- ```
78
- Return the app_id of a running or stopped app.
79
-
80
- **Returns**
81
-
82
- The app ID when the app has been deployed or run, otherwise None.
83
-
84
- ## description
85
-
86
- ```python
87
- description(self)
88
- ```
89
- The App's `name`, if available, or a fallback descriptive identifier.
90
-
91
- **Returns**
92
-
93
- Human-readable description string for the app.
94
-
95
- ## lookup
96
-
97
- ```python
98
- lookup(name, *, client=None, environment_name=None, create_if_missing=False)
99
- ```
100
- Look up an App with a given name, creating a new App if necessary.
101
-
102
- Note that Apps created through this method will be in a deployed state,
103
- but they will not have any associated Functions or Classes. This method
104
- is mainly useful for creating an App to associate with a Sandbox.
105
-
106
- **Parameters**
107
-
108
- <Parameter name="name" type="str" description="App name to resolve or create." />
109
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use; defaults to `Client.from_env()` when omitted." />
110
- <Parameter name="environment_name" type="str | None" defaultValue="None" description="Optional environment name; defaults to the configured environment." />
111
- <Parameter name="create_if_missing" type="bool" defaultValue="False" description="If True, create the app when it does not already exist." />
112
-
113
- **Returns**
114
-
115
- An `App` handle tied to the deployed app record.
116
-
117
- **Usage**
118
-
119
- ```python
120
- app = modal.App.lookup("my-app", create_if_missing=True)
121
- modal.Sandbox.create("echo", "hi", app=app)
122
- ```
123
-
124
- ## get_dashboard_url
125
-
126
- ```python
127
- get_dashboard_url(self)
128
- ```
129
- Get the dashboard URL for the App.
130
-
131
- **Returns**
132
-
133
- The dashboard URL for the App.
134
-
135
- **Usage**
136
-
137
- ```python
138
- app = modal.App.lookup("my-app")
139
- print(app.get_dashboard_url())
140
- ```
141
-
142
- ## run
143
-
144
- ```python
145
- run(self, *, name=None, client=None, detach=False, interactive=False,
146
- environment_name=None)
147
- ```
148
- Context manager that runs an ephemeral app on Modal.
149
-
150
- Use this as the main entry point for your Modal application. All calls
151
- to Modal Functions should be made within the scope of this context
152
- manager, and they will correspond to the current App.
153
-
154
- Note that you should not invoke this in global scope of a file where you have
155
- Modal Functions or Classes defined, since that would run the block when the Function
156
- or Cls is imported in your containers as well. If you want to run it as your entrypoint,
157
- consider protecting it with ``if __name__ == "__main__"``.
158
-
159
- **Parameters**
160
-
161
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use for the run session." />
162
- <Parameter name="detach" type="bool" defaultValue="False" description="Whether to detach after starting the app." />
163
- <Parameter name="interactive" type="bool" defaultValue="False" description="Whether to run in interactive mode." />
164
- <Parameter name="environment_name" type="str | None" defaultValue="None" description="Optional environment name; defaults to the configured environment." />
165
-
166
- **Returns**
167
-
168
- Async context manager yielding this `App` while it is running.
169
-
170
- **Usage**
171
-
172
- ```python notest
173
- with app.run():
174
- some_modal_function.remote()
175
- ```
176
-
177
- To enable output printing (i.e., to see App logs), use `modal.enable_output()`:
178
-
179
- ```python notest
180
- with modal.enable_output():
181
- with app.run():
182
- some_modal_function.remote()
183
- ```
184
-
185
- Note that you should not invoke this in global scope of a file where you have Modal
186
- Functions or Classes defined, since that would run the block when the Function or Cls
187
- is imported in your containers as well. If you want to run it as your entrypoint,
188
- consider protecting it:
189
-
190
- ```python
191
- if __name__ == "__main__":
192
- with app.run():
193
- some_modal_function.remote()
194
- ```
195
-
196
- You can then run your script with:
197
-
198
- ```shell
199
- python app_module.py
200
- ```
201
-
202
- ## deploy
203
-
204
- ```python
205
- deploy(self, *, name=None, environment_name=None, tag="", client=None,
206
- strategy="rolling")
207
- ```
208
- Deploy the App so that it is available persistently.
209
-
210
- Deployed Apps will be available for lookup or web-based invocations until they are stopped.
211
- Unlike with `App.run`, this method will return as soon as the deployment completes.
212
-
213
- This method is a programmatic alternative to the `modal deploy` CLI command.
214
-
215
- Unlike with `App.run`, Function logs will not stream back to the local client after the
216
- App is deployed.
217
-
218
- Note that you should not invoke this method in global scope, as that would redeploy
219
- the App every time the file is imported. If you want to write a programmatic deployment
220
- script, protect this call so that it only runs when the file is executed directly.
221
-
222
- **Parameters**
223
-
224
- <Parameter name="name" type="str | None" defaultValue="None" description="Name for the deployment, overriding any set on the App." />
225
- <Parameter name="environment_name" type="str | None" defaultValue="None" description="Environment to deploy the App in." />
226
- <Parameter name="tag" type="str" defaultValue="&quot;&quot;" description="Optional metadata that is specific to this deployment." />
227
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Alternate client to use for communication with the server." />
228
- <Parameter name="strategy" type="str" defaultValue="&quot;rolling&quot;" description="Deployment strategy. ``rolling`` (default) shifts traffic gradually to new containers while old ones drain. ``recreate`` terminates all running containers as part of the deployment before new work starts." />
229
-
230
- **Returns**
231
-
232
- This app instance after deployment completes.
233
-
234
- **Usage**
235
-
236
- ```python notest
237
- app = App("my-app")
238
- app.deploy()
239
- ```
240
-
241
- To enable output printing (i.e., to see build logs), use `modal.enable_output()`:
242
-
243
- ```python notest
244
- app = App("my-app")
245
- with modal.enable_output():
246
- app.deploy()
247
- ```
248
-
249
- Unlike with `App.run`, Function logs will not stream back to the local client after the App is deployed.
250
-
251
- Note that you should not invoke this method in global scope, as that would redeploy the App every time
252
- the file is imported. If you want to write a programmatic deployment script, protect this call so that it
253
- only runs when the file is executed directly. You can then run your script with:
254
-
255
- ```python notest
256
- if __name__ == "__main__":
257
- with modal.enable_output():
258
- app.deploy()
259
- ```
260
-
261
- Then you can deploy your app with:
262
-
263
- ```shell
264
- python app_module.py
265
- ```
266
-
267
- ## local_entrypoint
268
-
269
- ```python
270
- local_entrypoint(self, _warn_parentheses_missing=None, *, name=None)
271
- ```
272
- Decorate a function to be used as a CLI entrypoint for a Modal App.
273
-
274
- These functions can be used to define code that runs locally to set up the app,
275
- and act as an entrypoint to start Modal functions from. Note that regular
276
- Modal functions can also be used as CLI entrypoints, but unlike `local_entrypoint`,
277
- those functions are executed remotely directly.
278
-
279
- Note that an explicit [`app.run()`](https://modal.com/docs/reference/modal.App#run) is not needed, as an
280
- [app](https://modal.com/docs/guide/apps) is automatically created for you.
281
-
282
- **Parameters**
283
-
284
- <Parameter name="name" type="str | None" defaultValue="None" description="Optional name for the entrypoint; defaults to the function&#x27;s qualified name." />
285
-
286
- **Returns**
287
-
288
- A decorator that registers the wrapped callable as a local CLI entrypoint.
289
-
290
- **Usage**
291
-
292
- ```python
293
- @app.local_entrypoint()
294
- def main():
295
- some_modal_function.remote()
296
- ```
297
-
298
- You can call the function using `modal run` directly from the CLI:
299
-
300
- ```shell
301
- modal run app_module.py
302
- ```
303
-
304
- Note that an explicit `app.run()` is not needed, as an app is automatically created for you.
305
-
306
- **Multiple entrypoints**
307
-
308
- If you have multiple `local_entrypoint` functions, qualify the name:
309
-
310
- ```shell
311
- modal run app_module.py::app.some_other_function
312
- ```
313
-
314
- **Parsing arguments**
315
-
316
- If your entrypoint function take arguments with primitive types, `modal run` automatically
317
- parses them as CLI options. For example, the following function can be called with
318
- `modal run app_module.py --foo 1 --bar "hello"`:
319
-
320
- ```python
321
- @app.local_entrypoint()
322
- def main(foo: int, bar: str):
323
- some_modal_function.call(foo, bar)
324
- ```
325
-
326
- Currently, `str`, `int`, `float`, `bool`, and `datetime.datetime` are supported.
327
- Use `modal run app_module.py --help` for more information on usage.
328
-
329
- ## function
330
-
331
- ```python
332
- function(self, *, image=None, schedule=None, env=None, secrets=None, gpu=None,
333
- serialized=False, network_file_systems={}, volumes={}, cpu=None,
334
- memory=None, ephemeral_disk=None, min_containers=None, max_containers=None,
335
- buffer_containers=None, scaledown_window=None, proxy=None, retries=None,
336
- timeout=300, startup_timeout=None, name=None, is_generator=None, cloud=None,
337
- region=None, routing_region=None, nonpreemptible=False,
338
- enable_memory_snapshot=False, block_network=False,
339
- restrict_modal_access=False, single_use_containers=False, i6pn=None,
340
- include_source=None, experimental_options=None,
341
- _experimental_restrict_output=False, max_inputs=None)
342
- ```
343
- Decorator to register a new Modal Function with this App.
344
-
345
- **Parameters**
346
-
347
- <Parameter name="image" type="_Image | None" defaultValue="None" description="The image to run as the container for the function." />
348
- <Parameter name="schedule" type="Schedule | None" defaultValue="None" description="An optional Modal Schedule for the function." />
349
- <Parameter name="env" type="dict[str, str | None] | None" defaultValue="None" description="Environment variables to set in the container." />
350
- <Parameter name="secrets" type="Collection[_Secret] | None" defaultValue="None" description="Secrets to inject into the container as environment variables." />
351
- <Parameter name="gpu" type="str | list[str] | None" defaultValue="None" description="GPU request; either a single GPU type or a list of types." />
352
- <Parameter name="serialized" type="bool" defaultValue="False" description="Whether to send the function over using cloudpickle." />
353
- <Parameter name="network_file_systems" type="dict[str | PurePosixPath, _NetworkFileSystem]" defaultValue="&#123;&#125;" description="Mountpoints for Modal NetworkFileSystems." />
354
- <Parameter name="volumes" type="dict[str | PurePosixPath, _Volume | _CloudBucketMount]" defaultValue="&#123;&#125;" description="Mount points for Modal Volumes &amp; CloudBucketMounts." />
355
- <Parameter name="cpu" type="float | tuple[float, float] | None" defaultValue="None" description="Specify, in fractional CPU cores, how many CPU cores to request. Or, pass (request, limit) to additionally specify a hard limit in fractional CPU cores. CPU throttling will prevent a container from exceeding its specified limit." />
356
- <Parameter name="memory" type="int | tuple[int, int] | None" defaultValue="None" description="Specify, in MiB, a memory request which is the minimum memory required. Or, pass (request, limit) to additionally specify a hard limit in MiB." />
357
- <Parameter name="ephemeral_disk" type="int | None" defaultValue="None" description="Specify, in MiB, the ephemeral disk size for the Function." />
358
- <Parameter name="min_containers" type="int | None" defaultValue="None" description="Minimum number of containers to keep warm, even when Function is idle." />
359
- <Parameter name="max_containers" type="int | None" defaultValue="None" description="Limit on the number of containers that can be concurrently running." />
360
- <Parameter name="buffer_containers" type="int | None" defaultValue="None" description="Number of additional idle containers to maintain under active load." />
361
- <Parameter name="scaledown_window" type="int | None" defaultValue="None" description="Max time (in seconds) a container can remain idle while scaling down." />
362
- <Parameter name="proxy" type="_Proxy | None" defaultValue="None" description="Reference to a Modal Proxy to use in front of this function." />
363
- <Parameter name="retries" type="int | Retries | None" defaultValue="None" description="Number of times to retry each input in case of failure." />
364
- <Parameter name="timeout" type="int" defaultValue="300" description="Maximum execution time for inputs and startup time in seconds." />
365
- <Parameter name="startup_timeout" type="int | None" defaultValue="None" description="Maximum startup time in seconds with higher precedence than `timeout`." />
366
- <Parameter name="name" type="str | None" defaultValue="None" description="Sets the Modal name of the function within the app." />
367
- <Parameter name="is_generator" type="None | bool" defaultValue="None" description="Set this to True if it&#x27;s a non-generator function returning a sync or async generator object." />
368
- <Parameter name="cloud" type="str | None" defaultValue="None" description="Cloud provider to run the function on. Possible values are aws, gcp, oci, auto." />
369
- <Parameter name="region" type="str | Sequence[str] | None" defaultValue="None" description="Region or regions to run the function on." />
370
- <Parameter name="routing_region" type="str | None" defaultValue="None" description="Region to route inputs to the function through." />
371
- <Parameter name="nonpreemptible" type="bool" defaultValue="False" description="Whether to run the function on a nonpreemptible instance." />
372
- <Parameter name="enable_memory_snapshot" type="bool" defaultValue="False" description="Enable memory checkpointing for faster cold starts." />
373
- <Parameter name="block_network" type="bool" defaultValue="False" description="Whether to block network access." />
374
- <Parameter name="restrict_modal_access" type="bool" defaultValue="False" description="Whether to allow this function access to other Modal resources." />
375
- <Parameter name="single_use_containers" type="bool" defaultValue="False" description="When True, containers will shut down after handling a single input." />
376
- <Parameter name="i6pn" type="bool | None" defaultValue="None" description="Whether to enable IPv6 container networking within the region." />
377
- <Parameter name="include_source" type="bool | None" defaultValue="None" description="Whether the file or directory containing the Function&#x27;s source should automatically be included in the container. When unset, falls back to the App-level configuration, or is otherwise True by default." />
378
- <Parameter name="experimental_options" type="dict[str, Any] | None" defaultValue="None" description="Experimental options for the function." />
379
- <Parameter name="_experimental_restrict_output" type="bool" defaultValue="False" description="Experimental; do not use pickle for return values." />
380
- <Parameter name="max_inputs" type="int | None" defaultValue="None" description="Deprecated; replaced with `single_use_containers`." />
381
-
382
- **Returns**
383
-
384
- A decorator that registers the wrapped callable or partial as a Modal `Function`.
385
-
386
- ## cls
387
-
388
- ```python
389
- cls(self, *, image=None, env=None, secrets=None, gpu=None, serialized=False,
390
- network_file_systems={}, volumes={}, cpu=None, memory=None,
391
- ephemeral_disk=None, min_containers=None, max_containers=None,
392
- buffer_containers=None, scaledown_window=None, proxy=None, retries=None,
393
- timeout=300, startup_timeout=None, cloud=None, region=None,
394
- routing_region=None, nonpreemptible=False, enable_memory_snapshot=False,
395
- block_network=False, restrict_modal_access=False,
396
- single_use_containers=False, i6pn=None, include_source=None,
397
- experimental_options=None, _experimental_restrict_output=False,
398
- max_inputs=None)
399
- ```
400
- Decorator to register a new Modal [Cls](https://modal.com/docs/reference/modal.Cls) with this App.
401
-
402
- **Parameters**
403
-
404
- <Parameter name="image" type="_Image | None" defaultValue="None" description="The image to run as the container for the class service." />
405
- <Parameter name="env" type="dict[str, str | None] | None" defaultValue="None" description="Environment variables to set in the container." />
406
- <Parameter name="secrets" type="Collection[_Secret] | None" defaultValue="None" description="Secrets to inject into the container as environment variables." />
407
- <Parameter name="gpu" type="str | list[str] | None" defaultValue="None" description="GPU request; either a single GPU type or a list of types." />
408
- <Parameter name="serialized" type="bool" defaultValue="False" description="Whether to send the class over using cloudpickle." />
409
- <Parameter name="network_file_systems" type="dict[str | PurePosixPath, _NetworkFileSystem]" defaultValue="&#123;&#125;" description="Mountpoints for Modal NetworkFileSystems." />
410
- <Parameter name="volumes" type="dict[str | PurePosixPath, _Volume | _CloudBucketMount]" defaultValue="&#123;&#125;" description="Mount points for Modal Volumes &amp; CloudBucketMounts." />
411
- <Parameter name="cpu" type="float | tuple[float, float] | None" defaultValue="None" description="Specify, in fractional CPU cores, how many CPU cores to request. Or, pass (request, limit) to additionally specify a hard limit in fractional CPU cores. CPU throttling will prevent a container from exceeding its specified limit." />
412
- <Parameter name="memory" type="int | tuple[int, int] | None" defaultValue="None" description="Specify, in MiB, a memory request which is the minimum memory required. Or, pass (request, limit) to additionally specify a hard limit in MiB." />
413
- <Parameter name="ephemeral_disk" type="int | None" defaultValue="None" description="Specify, in MiB, the ephemeral disk size for the Function." />
414
- <Parameter name="min_containers" type="int | None" defaultValue="None" description="Minimum number of containers to keep warm, even when Function is idle." />
415
- <Parameter name="max_containers" type="int | None" defaultValue="None" description="Limit on the number of containers that can be concurrently running." />
416
- <Parameter name="buffer_containers" type="int | None" defaultValue="None" description="Number of additional idle containers to maintain under active load." />
417
- <Parameter name="scaledown_window" type="int | None" defaultValue="None" description="Max time (in seconds) a container can remain idle while scaling down." />
418
- <Parameter name="proxy" type="_Proxy | None" defaultValue="None" description="Reference to a Modal Proxy to use in front of this function." />
419
- <Parameter name="retries" type="int | Retries | None" defaultValue="None" description="Number of times to retry each input in case of failure." />
420
- <Parameter name="timeout" type="int" defaultValue="300" description="Maximum execution time for inputs and startup time in seconds." />
421
- <Parameter name="startup_timeout" type="int | None" defaultValue="None" description="Maximum startup time in seconds with higher precedence than `timeout`." />
422
- <Parameter name="cloud" type="str | None" defaultValue="None" description="Cloud provider to run the function on. Possible values are aws, gcp, oci, auto." />
423
- <Parameter name="region" type="str | Sequence[str] | None" defaultValue="None" description="Region or regions to run the function on." />
424
- <Parameter name="routing_region" type="str | None" defaultValue="None" description="Region to route inputs to the function through." />
425
- <Parameter name="nonpreemptible" type="bool" defaultValue="False" description="Whether to run the function on a non-preemptible instance." />
426
- <Parameter name="enable_memory_snapshot" type="bool" defaultValue="False" description="Enable memory checkpointing for faster cold starts." />
427
- <Parameter name="block_network" type="bool" defaultValue="False" description="Whether to block network access." />
428
- <Parameter name="restrict_modal_access" type="bool" defaultValue="False" description="Whether to allow this class access to other Modal resources." />
429
- <Parameter name="single_use_containers" type="bool" defaultValue="False" description="When True, containers will shut down after handling a single input." />
430
- <Parameter name="i6pn" type="bool | None" defaultValue="None" description="Whether to enable IPv6 container networking within the region." />
431
- <Parameter name="include_source" type="bool | None" defaultValue="None" description="When ``False``, don&#x27;t automatically add the App source to the container." />
432
- <Parameter name="experimental_options" type="dict[str, Any] | None" defaultValue="None" description="Experimental options for the class service." />
433
- <Parameter name="_experimental_restrict_output" type="bool" defaultValue="False" description="Experimental; do not use pickle for return values." />
434
- <Parameter name="max_inputs" type="int | None" defaultValue="None" description="Deprecated; replaced with `single_use_containers`." />
435
-
436
- **Returns**
437
-
438
- A decorator that registers the wrapped class or partial as a Modal `Cls`.
439
-
440
- ## include
441
-
442
- ```python
443
- include(self, /, other_app, inherit_tags=True)
444
- ```
445
- Include another App's objects in this one.
446
-
447
- Useful for splitting up Modal Apps across different self-contained files.
448
-
449
- When `inherit_tags=True` any tags set on the other App will be inherited by this App
450
- (with this App's tags taking precedence in the case of conflicts).
451
-
452
- **Parameters**
453
-
454
- <Parameter name="other_app" type="&quot;_App&quot;" description="App whose registered functions and classes are merged into this app." />
455
- <Parameter name="inherit_tags" type="bool" defaultValue="True" description="If True, merge tags from `other_app` into this app (this app wins on conflicts)." />
456
-
457
- **Returns**
458
-
459
- This app instance for chaining.
460
-
461
- **Usage**
462
-
463
- ```python
464
- app_a = modal.App("a")
465
- @app_a.function()
466
- def foo():
467
- ...
468
-
469
- app_b = modal.App("b")
470
- @app_b.function()
471
- def bar():
472
- ...
473
-
474
- app_a.include(app_b)
475
-
476
- @app_a.local_entrypoint()
477
- def main():
478
- # use function declared on the included app
479
- bar.remote()
480
- ```
481
-
482
- ## set_tags
483
-
484
- ```python
485
- set_tags(self, tags, *, client=None)
486
- ```
487
- Attach key-value metadata to the App.
488
-
489
- Tag metadata can be used to add organization-specific context to the App and can be
490
- included in billing reports and other informational APIs. Tags can also be set in
491
- the App constructor.
492
-
493
- Any tags set on the App before calling this method will be removed if they are not
494
- included in the argument (i.e., this method does not have `.update()` semantics).
495
-
496
- **Parameters**
497
-
498
- <Parameter name="tags" type="Mapping[str, str]" description="Complete tag set to store on the app (replaces previous tags)." />
499
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use for the RPC." />
500
-
501
- ## get_tags
502
-
503
- ```python
504
- get_tags(self, *, client=None)
505
- ```
506
- Get the tags that are currently attached to the App.
507
-
508
- **Parameters**
509
-
510
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use for the RPC." />
511
-
512
- **Returns**
513
-
514
- Tags as a map from key to value.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.Client.md DELETED
@@ -1,75 +0,0 @@
1
- # modal.Client
2
-
3
-
4
- ```python
5
- class Client(object)
6
- ```
7
-
8
-
9
- ## is_closed
10
-
11
- ```python
12
- is_closed(self)
13
- ```
14
- Check if the client is closed.
15
-
16
- **Returns**
17
-
18
- True if the client is closed, False otherwise.
19
-
20
- ## hello
21
-
22
- ```python
23
- hello(self)
24
- ```
25
- Connect to server and retrieve version information; raise appropriate error for various failures.
26
-
27
- **Usage**
28
-
29
- ```python
30
- client = modal.Client.from_env()
31
- client.hello()
32
- ```
33
-
34
- ## from_credentials
35
-
36
- ```python
37
- from_credentials(cls, token_id, token_secret)
38
- ```
39
- Constructor based on token credentials; useful for managing Modal on behalf of third-party users.
40
-
41
- Also useful when it's necessary to explicitly manage the lifecycle of the client
42
- (e.g. when running Modal in a forked subprocess) — see
43
- [troubleshooting](/docs/guide/troubleshooting#connection-issues-in-forked-processes).
44
-
45
- **Parameters**
46
-
47
- <Parameter name="token_id" type="str" description="API token ID." />
48
- <Parameter name="token_secret" type="str" description="API token secret." />
49
-
50
- **Returns**
51
-
52
- An authenticated `Client` with its connection opened.
53
-
54
- **Usage**
55
-
56
- ```python notest
57
- client = modal.Client.from_credentials("my_token_id", "my_token_secret")
58
-
59
- modal.Sandbox.create("echo", "hi", client=client, app=app)
60
- ```
61
-
62
- ## get_input_plane_metadata
63
-
64
- ```python
65
- get_input_plane_metadata(self, input_plane_region)
66
- ```
67
- Get the metadata for the input plane.
68
-
69
- **Parameters**
70
-
71
- <Parameter name="input_plane_region" type="str" description="The region of the input plane." />
72
-
73
- **Returns**
74
-
75
- The metadata for the input plane as a list of header/value tuples.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.CloudBucketMount.md DELETED
@@ -1,103 +0,0 @@
1
- # modal.CloudBucketMount
2
-
3
-
4
- ```python
5
- class CloudBucketMount(object)
6
- ```
7
-
8
- Mounts a cloud bucket to your container. Currently supports AWS S3 buckets.
9
-
10
- S3 buckets are mounted using [AWS S3 Mountpoint](https://github.com/awslabs/mountpoint-s3).
11
- S3 mounts are optimized for reading large files sequentially. It does not support every file operation; consult
12
- [the AWS S3 Mountpoint documentation](https://github.com/awslabs/mountpoint-s3/blob/main/doc/SEMANTICS.md)
13
- for more information.
14
-
15
- **Usage**
16
-
17
- S3:
18
-
19
- ```python
20
- import subprocess
21
-
22
- app = modal.App()
23
- secret = modal.Secret.from_name(
24
- "aws-secret",
25
- required_keys=["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY"]
26
- # Note: providing AWS_REGION can help when automatic detection of the bucket region fails.
27
- )
28
-
29
- @app.function(
30
- volumes={
31
- "/my-mount": modal.CloudBucketMount(
32
- bucket_name="s3-bucket-name",
33
- secret=secret,
34
- read_only=True
35
- )
36
- }
37
- )
38
- def f():
39
- subprocess.run(["ls", "/my-mount"], check=True)
40
- ```
41
-
42
- R2:
43
-
44
- Cloudflare R2 is [S3-compatible](https://developers.cloudflare.com/r2/api/s3/api/) so its setup looks
45
- very similar to S3. But additionally the `bucket_endpoint_url` argument must be passed.
46
-
47
- ```python
48
- import subprocess
49
-
50
- app = modal.App()
51
- secret = modal.Secret.from_name(
52
- "r2-secret",
53
- required_keys=["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY"]
54
- )
55
-
56
- @app.function(
57
- volumes={
58
- "/my-mount": modal.CloudBucketMount(
59
- bucket_name="my-r2-bucket",
60
- bucket_endpoint_url="https://<ACCOUNT ID>.r2.cloudflarestorage.com",
61
- secret=secret,
62
- read_only=True
63
- )
64
- }
65
- )
66
- def f():
67
- subprocess.run(["ls", "/my-mount"], check=True)
68
- ```
69
-
70
- GCS:
71
-
72
- Google Cloud Storage (GCS) is [S3-compatible](https://cloud.google.com/storage/docs/interoperability).
73
- GCS Buckets also require a secret with Google-specific key names (see below) populated with
74
- a [HMAC key](https://cloud.google.com/storage/docs/authentication/managing-hmackeys#create).
75
-
76
- ```python
77
- import subprocess
78
-
79
- app = modal.App()
80
- gcp_hmac_secret = modal.Secret.from_name(
81
- "gcp-secret",
82
- required_keys=["GOOGLE_ACCESS_KEY_ID", "GOOGLE_ACCESS_KEY_SECRET"]
83
- )
84
-
85
- @app.function(
86
- volumes={
87
- "/my-mount": modal.CloudBucketMount(
88
- bucket_name="my-gcs-bucket",
89
- bucket_endpoint_url="https://storage.googleapis.com",
90
- secret=gcp_hmac_secret,
91
- )
92
- }
93
- )
94
- def f():
95
- subprocess.run(["ls", "/my-mount"], check=True)
96
- ```
97
-
98
- ```python
99
- __init__(self, bucket_name, bucket_endpoint_url=None, key_prefix=None,
100
- secret=None, oidc_auth_role_arn=None, read_only=False, requester_pays=False,
101
- force_path_style=False)
102
- ```
103
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.Cls.md DELETED
@@ -1,163 +0,0 @@
1
- # modal.Cls
2
-
3
-
4
- ```python
5
- class Cls(modal.object.Object)
6
- ```
7
-
8
- Cls adds method pooling and [lifecycle hook](https://modal.com/docs/guide/lifecycle-functions) behavior
9
- to [modal.Function](https://modal.com/docs/reference/modal.Function).
10
-
11
- Generally, you will not construct a Cls directly.
12
- Instead, use the [`@app.cls()`](https://modal.com/docs/reference/modal.App#cls) decorator on the App object.
13
-
14
-
15
- ## hydrate
16
-
17
- ```python
18
- hydrate(self, client=None)
19
- ```
20
- Synchronize the local object with its identity on the Modal server.
21
-
22
- It is rarely necessary to call this method explicitly, as most operations
23
- will lazily hydrate when needed. The main use case is when you need to
24
- access object metadata, such as its ID.
25
-
26
- *Added in v0.72.39*: This method replaces the deprecated `.resolve()` method.
27
-
28
- ## from_name
29
-
30
- ```python
31
- from_name(cls, app_name, name, *, version=None, environment_name=None,
32
- client=None)
33
- ```
34
- Reference a Cls from a deployed App by its name.
35
-
36
- This is a lazy method that defers hydrating the local
37
- object with metadata from Modal servers until the first
38
- time it is actually used.
39
-
40
- **Parameters**
41
-
42
- <Parameter name="app_name" type="str" description="Name of the deployed App that defines this class." />
43
- <Parameter name="name" type="str" description="Object tag of the Cls within that App." />
44
- <Parameter name="environment_name" type="str | None" defaultValue="None" description="Workspace environment for the lookup; defaults to the active environment." />
45
- <Parameter name="client" type="&quot;_Client | None&quot;" defaultValue="None" description="Optional Modal client; defaults to the process client." />
46
-
47
- **Returns**
48
-
49
- A ``Cls`` reference that hydrates on first use.
50
-
51
- **Usage**
52
-
53
- ```python
54
- Model = modal.Cls.from_name("other-app", "Model")
55
- ```
56
-
57
- The `version` parameter constructs a version-pinned Cls:
58
-
59
- ```python
60
- Modelv3 = modal.Cls.from_name("other-app", "Model", version=3)
61
- ```
62
-
63
- ## with_options
64
-
65
- ```python
66
- with_options(self, *, cpu=None, memory=None, gpu=None, env=None, secrets=None,
67
- volumes={}, retries=None, max_containers=None, buffer_containers=None,
68
- scaledown_window=None, timeout=None, region=None, cloud=None)
69
- ```
70
- Override the static Cls configuration with invocation-specific values.
71
-
72
- This method will return a new variant of the Cls that will autoscale independently of the
73
- base configuration.
74
-
75
- Note that options cannot be "unset" with this method (i.e., if a GPU is configured in the
76
- `@app.cls()` decorator, passing `gpu=None` here will not create a CPU-only instance).
77
-
78
- Container arguments (``volumes`` and ``secrets``) from later calls replace earlier values; they are not merged.
79
-
80
- **Parameters**
81
-
82
- <Parameter name="cpu" type="float | tuple[float, float] | None" defaultValue="None" description="CPU cores for instances created from this Cls (see ``@app.function`` / ``@app.cls`` resource options)." />
83
- <Parameter name="memory" type="int | tuple[int, int] | None" defaultValue="None" description="Memory in MiB, or min/max pair, for those instances." />
84
- <Parameter name="gpu" type="str | None" defaultValue="None" description="GPU type string, for example ``A100``." />
85
- <Parameter name="env" type="dict[str, str | None] | None" defaultValue="None" description="Environment variables merged into a temporary secret for this configuration." />
86
- <Parameter name="secrets" type="Collection[_Secret] | None" defaultValue="None" description="Additional secrets attached to the service function." />
87
- <Parameter name="volumes" type="dict[str | PurePosixPath, _Volume | _CloudBucketMount]" defaultValue="&#123;&#125;" description="Volume and cloud-bucket mounts (paths to ``Volume`` or ``CloudBucketMount``)." />
88
- <Parameter name="retries" type="int | Retries | None" defaultValue="None" description="Retry policy or count for invocations." />
89
- <Parameter name="max_containers" type="int | None" defaultValue="None" description="Cap on concurrently running containers for this Cls configuration." />
90
- <Parameter name="buffer_containers" type="int | None" defaultValue="None" description="Extra idle containers kept warm while the Function is active." />
91
- <Parameter name="scaledown_window" type="int | None" defaultValue="None" description="Seconds a container may stay idle before scaling down." />
92
- <Parameter name="timeout" type="int | None" defaultValue="None" description="Function timeout in seconds." />
93
- <Parameter name="region" type="str | Sequence[str] | None" defaultValue="None" description="One region or a list of regions to schedule on." />
94
- <Parameter name="cloud" type="str | None" defaultValue="None" description="Cloud provider (for example ``aws``, ``gcp``, ``oci``, or ``auto``)." />
95
-
96
- **Returns**
97
-
98
- A new ``Cls`` with the merged options.
99
-
100
- **Usage**
101
-
102
- You can use this method after looking up the Cls from a deployed App or if you have a
103
- direct reference to a Cls from another Function or local entrypoint on its App:
104
-
105
- ```python notest
106
- Model = modal.Cls.from_name("my_app", "Model")
107
- ModelUsingGPU = Model.with_options(gpu="A100")
108
- ModelUsingGPU().generate.remote(input_prompt) # Run with an A100 GPU
109
- ```
110
-
111
- The method can be called multiple times to "stack" updates:
112
-
113
- ```python notest
114
- Model.with_options(gpu="A100").with_options(scaledown_window=300) # Use an A100 with slow scaledown
115
- ```
116
-
117
- ## with_concurrency
118
-
119
- ```python
120
- with_concurrency(self, *, max_inputs, target_inputs=None)
121
- ```
122
- Override the static Cls configuration with invocation-specific input concurrency settings.
123
-
124
- **Parameters**
125
-
126
- <Parameter name="max_inputs" type="int" description="Maximum number of inputs processed concurrently per container." />
127
- <Parameter name="target_inputs" type="int | None" defaultValue="None" description="Optional target concurrency; see ``@app.cls`` / Function concurrency docs." />
128
-
129
- **Returns**
130
-
131
- A new ``Cls`` with the merged concurrency settings.
132
-
133
- **Usage**
134
-
135
- ```python notest
136
- Model = modal.Cls.from_name("my_app", "Model")
137
- ModelUsingGPU = Model.with_options(gpu="A100").with_concurrency(max_inputs=100)
138
- ModelUsingGPU().generate.remote(42) # will run on an A100 GPU with input concurrency enabled
139
- ```
140
-
141
- ## with_batching
142
-
143
- ```python
144
- with_batching(self, *, max_batch_size, wait_ms)
145
- ```
146
- Override the static Cls configuration with invocation-specific dynamic batching settings.
147
-
148
- **Parameters**
149
-
150
- <Parameter name="max_batch_size" type="int" description="Maximum batch size for dynamic batching." />
151
- <Parameter name="wait_ms" type="int" description="Maximum time to wait to fill a batch, in milliseconds." />
152
-
153
- **Returns**
154
-
155
- A new ``Cls`` with the merged batching settings.
156
-
157
- **Usage**
158
-
159
- ```python notest
160
- Model = modal.Cls.from_name("my_app", "Model")
161
- ModelUsingGPU = Model.with_options(gpu="A100").with_batching(max_batch_size=100, wait_ms=1000)
162
- ModelUsingGPU().generate.remote(42) # A100 with dynamic batching
163
- ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.Cron.md DELETED
@@ -1,48 +0,0 @@
1
- # modal.Cron
2
-
3
-
4
- ```python
5
- class Cron(modal.schedule.Schedule)
6
- ```
7
-
8
- Cron jobs are a type of schedule, specified using the
9
- [Unix cron tab](https://crontab.guru/) syntax.
10
-
11
- The alternative schedule type is the [`modal.Period`](https://modal.com/docs/reference/modal.Period).
12
-
13
- ```python
14
- __init__(self, cron_string, timezone="UTC")
15
- ```
16
- Construct a schedule that runs according to a cron expression string.
17
-
18
- **Parameters**
19
-
20
- <Parameter name="cron_string" type="str" description="Cron expression (see crontab.guru)." />
21
- <Parameter name="timezone" type="str" defaultValue="&quot;UTC&quot;" description="IANA timezone name; defaults to UTC." />
22
-
23
- **Usage**
24
-
25
- ```python
26
- import modal
27
- app = modal.App()
28
-
29
-
30
- @app.function(schedule=modal.Cron("* * * * *"))
31
- def f():
32
- print("This function will run every minute")
33
- ```
34
-
35
- We can specify different schedules with cron strings, for example:
36
-
37
- ```python
38
- modal.Cron("5 4 * * *") # run at 4:05am UTC every night
39
- modal.Cron("0 9 * * 4") # runs every Thursday at 9am UTC
40
- ```
41
-
42
- We can also optionally specify a timezone, for example:
43
-
44
- ```python
45
- modal.Cron("0 6 * * *", timezone="America/New_York")
46
- ```
47
-
48
- If no timezone is specified, the default is UTC.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.Dict.md DELETED
@@ -1,379 +0,0 @@
1
- # modal.Dict
2
-
3
-
4
- ```python
5
- class Dict(modal.object.Object)
6
- ```
7
-
8
- Distributed dictionary for storage in Modal apps.
9
-
10
- Dict contents can be essentially any object so long as they can be serialized by
11
- `cloudpickle`. This includes other Modal objects. If writing and reading in different
12
- environments (eg., writing locally and reading remotely), it's necessary to have the
13
- library defining the data type installed, with compatible versions, on both sides.
14
- Additionally, cloudpickle serialization is not guaranteed to be deterministic, so it is
15
- generally recommended to use primitive types for keys.
16
-
17
- **Lifetime of a Dict and its items**
18
-
19
- An individual Dict entry will expire after 7 days of inactivity (no reads or writes). The
20
- Dict entries are written to durable storage.
21
-
22
- Legacy Dicts (created before 2025-05-20) will still have entries expire 30 days after being
23
- last added. Additionally, contents are stored in memory on the Modal server and could be lost
24
- due to unexpected server restarts. Eventually, these Dicts will be fully sunset.
25
-
26
- **Usage**
27
-
28
- ```python
29
- from modal import Dict
30
-
31
- my_dict = Dict.from_name("my-persisted_dict", create_if_missing=True)
32
-
33
- my_dict["some key"] = "some value"
34
- my_dict[123] = 456
35
-
36
- assert my_dict["some key"] == "some value"
37
- assert my_dict[123] == 456
38
- ```
39
-
40
- The `Dict` class offers a few methods for operations that are usually accomplished
41
- in Python with operators, such as `Dict.put` and `Dict.contains`. The advantage of
42
- these methods is that they can be safely called in an asynchronous context by using
43
- the `.aio` suffix on the method, whereas their operator-based analogues will always
44
- run synchronously and block the event loop.
45
-
46
- For more examples, see the [guide](https://modal.com/docs/guide/dicts-and-queues#modal-dicts).
47
-
48
-
49
- ## hydrate
50
-
51
- ```python
52
- hydrate(self, client=None)
53
- ```
54
- Synchronize the local object with its identity on the Modal server.
55
-
56
- It is rarely necessary to call this method explicitly, as most operations
57
- will lazily hydrate when needed. The main use case is when you need to
58
- access object metadata, such as its ID.
59
-
60
- *Added in v0.72.39*: This method replaces the deprecated `.resolve()` method.
61
-
62
- ## objects
63
-
64
-
65
- ```python
66
- objects: DictManager
67
- ```
68
-
69
- Namespace with methods for managing named Dict objects.
70
-
71
-
72
- ### objects.create
73
-
74
- ```python
75
- create(self, name, *, allow_existing=False, environment_name=None, client=None)
76
- ```
77
- Create a new named Dict in the workspace environment.
78
-
79
- This does not return a local handle; use `modal.Dict.from_name` to look up the Dict after creation.
80
-
81
- Added in v1.1.2.
82
-
83
- **Parameters**
84
-
85
- <Parameter name="name" type="str" description="Name for the new Dict." />
86
- <Parameter name="allow_existing" type="bool" defaultValue="False" description="If True, do nothing when a Dict with this name already exists." />
87
- <Parameter name="environment_name" type="str | None" defaultValue="None" description="Environment to create in; defaults to the active environment." />
88
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use; defaults to `Client.from_env()` when omitted." />
89
-
90
- **Usage**
91
-
92
- ```python notest
93
- modal.Dict.objects.create("my-dict")
94
- ```
95
-
96
- Dicts will be created in the active environment, or another one can be specified:
97
-
98
- ```python notest
99
- modal.Dict.objects.create("my-dict", environment_name="dev")
100
- ```
101
-
102
- By default, an error is raised if the Dict already exists; `allow_existing=True` makes that case a no-op:
103
-
104
- ```python notest
105
- modal.Dict.objects.create("my-dict", allow_existing=True)
106
- ```
107
-
108
- Note that this method does not return a local instance of the Dict. You can use
109
- `modal.Dict.from_name` to perform a lookup after creation.
110
-
111
- ### objects.list
112
-
113
- ```python
114
- list(self, *, max_objects=None, created_before=None, environment_name="",
115
- client=None)
116
- ```
117
- List named Dicts in the workspace environment as hydrated handles.
118
-
119
- Results are ordered newest to oldest. By default, all matching Dicts are returned.
120
-
121
- Added in v1.1.2.
122
-
123
- **Parameters**
124
-
125
- <Parameter name="max_objects" type="int | None" defaultValue="None" description="Maximum number of Dicts to return." />
126
- <Parameter name="created_before" type="datetime | str | None" defaultValue="None" description="Only include Dicts created before this time (datetime or ISO date string)." />
127
- <Parameter name="environment_name" type="str" defaultValue="&quot;&quot;" description="Environment to list from; defaults to the active environment." />
128
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use; defaults to `Client.from_env()` when omitted." />
129
-
130
- **Returns**
131
-
132
- Hydrated `Dict` objects for each named Dict in the listing.
133
-
134
- **Usage**
135
-
136
- ```python
137
- dicts = modal.Dict.objects.list()
138
- print([d.name for d in dicts])
139
- ```
140
-
141
- Dicts will be retrieved from the active environment, or another one can be specified:
142
-
143
- ```python notest
144
- dev_dicts = modal.Dict.objects.list(environment_name="dev")
145
- ```
146
-
147
- By default, all named Dicts are returned, newest to oldest. It's also possible to limit the
148
- number of results and to filter by creation date:
149
-
150
- ```python
151
- dicts = modal.Dict.objects.list(max_objects=10, created_before="2025-01-01")
152
- ```
153
-
154
- ### objects.delete
155
-
156
- ```python
157
- delete(self, name, *, allow_missing=False, environment_name=None, client=None)
158
- ```
159
- Delete a named Dict entirely (not a single key).
160
-
161
- Deletion is irreversible and affects any Apps using this Dict.
162
-
163
- Added in v1.1.2.
164
-
165
- **Parameters**
166
-
167
- <Parameter name="name" type="str" description="Name of the Dict to delete." />
168
- <Parameter name="allow_missing" type="bool" defaultValue="False" description="If True, do nothing when the Dict does not exist." />
169
- <Parameter name="environment_name" type="str | None" defaultValue="None" description="Environment to delete from; defaults to the active environment." />
170
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use; defaults to `Client.from_env()` when omitted." />
171
-
172
- **Usage**
173
-
174
- ```python notest
175
- await modal.Dict.objects.delete("my-dict")
176
- ```
177
-
178
- Dicts will be deleted from the active environment, or another one can be specified:
179
-
180
- ```python notest
181
- await modal.Dict.objects.delete("my-dict", environment_name="dev")
182
- ```
183
-
184
- ## name
185
-
186
- ```python
187
- name(self)
188
- ```
189
- Name of the Dict object.
190
-
191
- **Usage**
192
-
193
- ```python
194
- d = modal.Dict.from_name("my-dict")
195
- print(d.name)
196
- ```
197
-
198
- ## ephemeral
199
-
200
- ```python
201
- ephemeral(cls, *, client=None, environment_name=None)
202
- ```
203
- Create an anonymous Dict that exists for the duration of the context manager.
204
-
205
- **Parameters**
206
-
207
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use; defaults to `Client.from_env()` when omitted." />
208
- <Parameter name="environment_name" type="str | None" defaultValue="None" description="Environment for the ephemeral Dict; defaults to the active environment." />
209
-
210
- **Usage**
211
-
212
- ```python
213
- from modal import Dict
214
-
215
- with Dict.ephemeral() as d:
216
- d["foo"] = "bar"
217
- ```
218
-
219
- ```python notest
220
- async with Dict.ephemeral() as d:
221
- await d.put.aio("foo", "bar")
222
- ```
223
-
224
- ## from_name
225
-
226
- ```python
227
- from_name(name, *, environment_name=None, create_if_missing=False, client=None)
228
- ```
229
- Reference a named Dict, optionally creating it on the server first.
230
-
231
- Hydration is lazy: metadata is fetched from Modal the first time the handle is used.
232
-
233
- **Parameters**
234
-
235
- <Parameter name="name" type="str" description="Deployment name of the Dict." />
236
- <Parameter name="environment_name" type="str | None" defaultValue="None" description="Environment to resolve the name in; defaults to the active environment." />
237
- <Parameter name="create_if_missing" type="bool" defaultValue="False" description="If True, create the Dict when it does not already exist." />
238
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use for loading; defaults to `Client.from_env()` when omitted." />
239
-
240
- **Returns**
241
-
242
- A `Dict` handle (possibly not yet hydrated).
243
-
244
- **Usage**
245
-
246
- ```python
247
- d = modal.Dict.from_name("my-dict", create_if_missing=True)
248
- d[123] = 456
249
- ```
250
-
251
- ## from_id
252
-
253
- ```python
254
- from_id(dict_id, client=None)
255
- ```
256
- Construct a Dict from an id and look up the Dict metadata.
257
-
258
- This is a lazy method that defers hydrating the local
259
- object with metadata from Modal servers until the first
260
- time it is actually used.
261
-
262
- The ID of a Dict object can be accessed using `.object_id`.
263
-
264
- **Parameters**
265
-
266
- <Parameter name="dict_id" type="str" description="Dict object ID to attach to." />
267
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use for loading; defaults to `Client.from_env()` when omitted." />
268
-
269
- **Returns**
270
-
271
- A `Dict` handle (possibly not yet hydrated).
272
-
273
- **Usage**
274
-
275
- ```python notest
276
- @app.function()
277
- def my_worker(dict_id: str):
278
- d = modal.Dict.from_id(dict_id)
279
- d["key"] = "Hello from remote function!"
280
-
281
- with modal.Dict.ephemeral() as d:
282
- my_worker.remote(d.object_id)
283
- print(d["key"]) # "Hello from remote function!"
284
- ```
285
-
286
- ## info
287
-
288
- ```python
289
- info(self)
290
- ```
291
- Return information about the Dict object.
292
-
293
- ## clear
294
-
295
- ```python
296
- clear(self)
297
- ```
298
- Remove all items from the Dict.
299
-
300
- ## get
301
-
302
- ```python
303
- get(self, key, default=None)
304
- ```
305
- Get the value associated with a key.
306
-
307
- Returns `default` if key does not exist.
308
-
309
- ## contains
310
-
311
- ```python
312
- contains(self, key)
313
- ```
314
- Return if a key is present.
315
-
316
- ## len
317
-
318
- ```python
319
- len(self)
320
- ```
321
- Return the length of the Dict.
322
-
323
- Note: This is an expensive operation and will return at most 100,000.
324
-
325
- ## update
326
-
327
- ```python
328
- update(self, other=None, **kwargs)
329
- ```
330
- Update the Dict with additional items.
331
-
332
- ## put
333
-
334
- ```python
335
- put(self, key, value, *, skip_if_exists=False)
336
- ```
337
- Add a specific key-value pair to the Dict.
338
-
339
- Returns True if the key-value pair was added and False if it wasn't because the key already existed and
340
- `skip_if_exists` was set.
341
-
342
- ## pop
343
-
344
- ```python
345
- pop(self, key, default=_NO_DEFAULT)
346
- ```
347
- Remove a key from the Dict, returning the value if it exists.
348
-
349
- If key is not found, return default if provided, otherwise raise KeyError.
350
-
351
- ## keys
352
-
353
- ```python
354
- keys(self)
355
- ```
356
- Return an iterator over the keys in this Dict.
357
-
358
- Note that (unlike with Python dicts) the return value is a simple iterator,
359
- and results are unordered.
360
-
361
- ## values
362
-
363
- ```python
364
- values(self)
365
- ```
366
- Return an iterator over the values in this Dict.
367
-
368
- Note that (unlike with Python dicts) the return value is a simple iterator,
369
- and results are unordered.
370
-
371
- ## items
372
-
373
- ```python
374
- items(self)
375
- ```
376
- Return an iterator over the (key, value) tuples in this Dict.
377
-
378
- Note that (unlike with Python dicts) the return value is a simple iterator,
379
- and results are unordered.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.Environment.md DELETED
@@ -1,166 +0,0 @@
1
- # modal.Environment
2
-
3
-
4
- ```python
5
- class Environment(modal.object.Object)
6
- ```
7
-
8
-
9
- ## hydrate
10
-
11
- ```python
12
- hydrate(self, client=None)
13
- ```
14
- Synchronize the local object with its identity on the Modal server.
15
-
16
- It is rarely necessary to call this method explicitly, as most operations
17
- will lazily hydrate when needed. The main use case is when you need to
18
- access object metadata, such as its ID.
19
-
20
- *Added in v0.72.39*: This method replaces the deprecated `.resolve()` method.
21
-
22
- ## name
23
-
24
- ```python
25
- name(self)
26
- ```
27
-
28
-
29
- ## objects
30
-
31
-
32
- ```python
33
- objects: EnvironmentManager
34
- ```
35
-
36
- Namespace with methods for managing Environment objects.
37
-
38
-
39
- ### objects.create
40
-
41
- ```python
42
- create(self, name, *, restricted=False, client=None)
43
- ```
44
- Create a new Environment.
45
-
46
- **Examples:**
47
-
48
- ```python notest
49
- modal.Environment.objects.create("my-environment")
50
- ```
51
-
52
- ### objects.list
53
-
54
- ```python
55
- list(self, *, client=None)
56
- ```
57
- Return a list of hydrated Environment objects.
58
-
59
- **Examples:**
60
-
61
- ```python notest
62
- environments = modal.Environment.objects.list()
63
- print([e.name for e in environments])
64
- ```
65
-
66
- ### objects.delete
67
-
68
- ```python
69
- delete(self, name, *, client=None)
70
- ```
71
- Delete a named Environment.
72
-
73
- Warning: This is irreversible and will transitively delete all objects in the Environment.
74
-
75
- **Examples:**
76
-
77
- ```python notest
78
- modal.Environment.objects.delete("my-environment")
79
- ```
80
-
81
- ## members
82
-
83
-
84
- ```python
85
- members: EnvironmentMembersManager
86
- ```
87
-
88
- Namespace with methods for managing the membership of a restricted Environment.
89
-
90
- See https://modal.com/docs/guide/rbac for more information on restricted Environments.
91
-
92
-
93
- ### members.list
94
-
95
- ```python
96
- list(self)
97
- ```
98
- Return the members of a restricted Environment with their roles.
99
-
100
- **Examples:**
101
-
102
- ```python notest
103
- members = modal.Environment.from_name("my-restricted-env").members.list()
104
- print(members)
105
- # {
106
- # "users": {"alice": "contributor", "bob": "viewer"},
107
- # "service_users": {"alice-bot": "contributor"},
108
- # }
109
- ```
110
-
111
- ### members.update
112
-
113
- ```python
114
- update(self, *, users=None, service_users=None)
115
- ```
116
- Add or modify roles for members of a restricted Environment.
117
-
118
- Each user or service user will be added to the Environment if not currently a member;
119
- if already a member, the user or service user's role will be updated.
120
-
121
- **Examples:**
122
-
123
- ```python notest
124
- env = modal.Environment.from_name("my-restricted-env")
125
- env.members.update(
126
- users={"alice": "contributor", "bob": "viewer"},
127
- service_users={"alice-bot": "contributor"},
128
- )
129
- ```
130
-
131
- ### members.remove
132
-
133
- ```python
134
- remove(self, *, users=None, service_users=None)
135
- ```
136
- Remove members from a restricted Environment.
137
-
138
- **Examples:**
139
-
140
- ```python notest
141
- env = modal.Environment.from_name("my-restricted-env")
142
- env.members.remove(
143
- users=["alice"],
144
- service_users=["alice-bot"],
145
- )
146
- ```
147
-
148
- ## from_context
149
-
150
- ```python
151
- from_context(*, client=None)
152
- ```
153
- Look up an Environment object using the current context.
154
-
155
- This method returns the Environment that is defined by the local configuration
156
- (i.e., your active profile or the `MODAL_ENVIRONMENT` environment variable), or
157
- it fetches the default environment from the server when not defined locally.
158
- If called inside a Modal container, it will return the Environment that container
159
- is associated with.
160
-
161
- ## from_name
162
-
163
- ```python
164
- from_name(name, *, create_if_missing=False, client=None)
165
- ```
166
- Look up an Environment object using its name.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.Error.md DELETED
@@ -1,22 +0,0 @@
1
- # modal.Error
2
-
3
-
4
- ```python
5
- class Error(Exception)
6
- ```
7
-
8
- Base class for all Modal errors. See [`modal.exception`](https://modal.com/docs/reference/modal.exception)
9
- for the specialized error classes.
10
-
11
- **Usage**
12
-
13
- ```python notest
14
- import modal
15
-
16
- try:
17
- ...
18
- except modal.Error:
19
- # Catch any exception raised by Modal's systems.
20
- print("Responding to error...")
21
- ```
22
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.FilePatternMatcher.md DELETED
@@ -1,69 +0,0 @@
1
- # modal.FilePatternMatcher
2
-
3
-
4
- ```python
5
- class FilePatternMatcher(modal.file_pattern_matcher._AbstractPatternMatcher)
6
- ```
7
-
8
- Allows matching file Path objects against a list of patterns.
9
-
10
- **Usage**
11
-
12
- ```python
13
- from pathlib import Path
14
- from modal import FilePatternMatcher
15
-
16
- matcher = FilePatternMatcher("*.py")
17
-
18
- assert matcher(Path("foo.py"))
19
-
20
- # You can also negate the matcher.
21
- negated_matcher = ~matcher
22
-
23
- assert not negated_matcher(Path("foo.py"))
24
- ```
25
-
26
- ```python
27
- __init__(self, *pattern)
28
- ```
29
- Initialize a new FilePatternMatcher instance.
30
-
31
- **Parameters**
32
-
33
- <Parameter name="*pattern" type="str" description="One or more pattern strings." />
34
-
35
- **Raises**
36
-
37
- - `ValueError`: If an illegal exclusion pattern is provided.
38
-
39
- ## can_prune_directories
40
-
41
- ```python
42
- can_prune_directories(self)
43
- ```
44
- Returns True if this pattern matcher allows safe early directory pruning.
45
-
46
- Directory pruning is safe when matching directories can be skipped entirely
47
- without missing any files that should be included. This is for example not
48
- safe when we have inverted/negated ignore patterns (e.g. "!**/*.py").
49
-
50
- ## from_file
51
-
52
- ```python
53
- from_file(cls, file_path)
54
- ```
55
- Initialize a new FilePatternMatcher instance from a file.
56
-
57
- The patterns in the file will be read lazily when the matcher is first used.
58
-
59
- **Parameters**
60
-
61
- <Parameter name="file_path" type="Path" description="The path to the file containing patterns." />
62
-
63
- **Usage**
64
-
65
- ```python
66
- from modal import FilePatternMatcher
67
-
68
- matcher = FilePatternMatcher.from_file("/path/to/ignorefile")
69
- ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.Function.md DELETED
@@ -1,387 +0,0 @@
1
- # modal.Function
2
-
3
-
4
- ```python
5
- class Function(typing.Generic, modal.object.Object)
6
- ```
7
-
8
- Functions are the basic units of serverless execution on Modal.
9
-
10
- Generally, you will not construct a `Function` directly. Instead, use the
11
- `App.function()` decorator to register your Python functions with your App.
12
-
13
-
14
- ## hydrate
15
-
16
- ```python
17
- hydrate(self, client=None)
18
- ```
19
- Synchronize the local object with its identity on the Modal server.
20
-
21
- It is rarely necessary to call this method explicitly, as most operations
22
- will lazily hydrate when needed. The main use case is when you need to
23
- access object metadata, such as its ID.
24
-
25
- *Added in v0.72.39*: This method replaces the deprecated `.resolve()` method.
26
-
27
- ## update_autoscaler
28
-
29
- ```python
30
- update_autoscaler(self, *, min_containers=None, max_containers=None,
31
- buffer_containers=None, scaledown_window=None)
32
- ```
33
- Override the current autoscaler behavior for this Function.
34
-
35
- Unspecified parameters will retain their current value, i.e. either the static value
36
- from the function decorator, or an override value from a previous call to this method.
37
-
38
- Subsequent deployments of the App containing this Function will reset the autoscaler back to
39
- its static configuration.
40
-
41
- **Parameters**
42
-
43
- <Parameter name="min_containers" type="int | None" defaultValue="None" description="Minimum number of containers to keep running, or `None` to leave unchanged." />
44
- <Parameter name="max_containers" type="int | None" defaultValue="None" description="Maximum concurrent containers, or `None` to leave unchanged." />
45
- <Parameter name="buffer_containers" type="int | None" defaultValue="None" description="Extra containers to keep warm beyond demand, or `None` to leave unchanged." />
46
- <Parameter name="scaledown_window" type="int | None" defaultValue="None" description="Seconds idle containers wait before scaling down, or `None` to leave unchanged." />
47
-
48
- **Usage**
49
-
50
- ```python notest
51
- f = modal.Function.from_name("my-app", "function")
52
-
53
- # Always have at least 2 containers running, with an extra buffer when the Function is active
54
- f.update_autoscaler(min_containers=2, buffer_containers=1)
55
-
56
- # Limit this Function to avoid spinning up more than 5 containers
57
- f.update_autoscaler(max_containers=5)
58
-
59
- # Extend the scaledown window to increase the amount of time that idle containers stay alive
60
- f.update_autoscaler(scaledown_window=300)
61
- ```
62
-
63
- ## from_name
64
-
65
- ```python
66
- from_name(cls, app_name, name, *, version=None, environment_name=None,
67
- client=None)
68
- ```
69
- Reference a Function from a deployed App by its name.
70
-
71
- This is a lazy method that defers hydrating the local
72
- object with metadata from Modal servers until the first
73
- time it is actually used.
74
-
75
- **Parameters**
76
-
77
- <Parameter name="app_name" type="str" description="Name of the deployed App." />
78
- <Parameter name="name" type="str" description="Name of the Function within that App. For class methods, use `Cls.from_name` instead." />
79
- <Parameter name="environment_name" type="str | None" defaultValue="None" description="Environment to look up the App in; defaults to the active environment." />
80
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use; defaults to `Client.from_env()` when omitted." />
81
-
82
- **Returns**
83
-
84
- A lazy `Function` handle.
85
-
86
- **Usage**
87
-
88
- ```python
89
- f = modal.Function.from_name("other-app", "function")
90
- ```
91
-
92
- The `version` parameter allows you to invoke a version-pinned function:
93
-
94
- ```python
95
- f_v3 = modal.Function.from_name("other-app", "function", version=3)
96
- ```
97
-
98
- ## get_web_url
99
-
100
- ```python
101
- get_web_url(self)
102
- ```
103
- URL for addressing a Web Function via HTTP.
104
-
105
- **Returns**
106
-
107
- The HTTPS URL for the web endpoint, or `None` if this Function is not a web endpoint.
108
-
109
- ## with_options
110
-
111
- ```python
112
- with_options(self, *, cpu=None, memory=None, gpu=None, env=None, secrets=None,
113
- volumes={}, retries=None, max_containers=None, buffer_containers=None,
114
- scaledown_window=None, timeout=None, region=None, cloud=None)
115
- ```
116
- Dynamically override the static Function configuration with invocation-specific values.
117
-
118
- This method returns a new Function instance with the dynamic configuration. Invocations of
119
- the new Function will run in a distinct container pool and autoscale independently from the
120
- base Function (and from other dynamic configurations).
121
-
122
- Note that options cannot be "unset" with this method (i.e., if a GPU is configured in the
123
- `@app.cls()` decorator, passing `gpu=None` here will not create a CPU-only instance).
124
- Additionally, container arguments like `volumes` and `secrets` will _replace_ the base
125
- configuration or any previous use of this method rather than extending it.
126
-
127
- **Usage:**
128
-
129
- You can use this method after looking up a deployed Function:
130
-
131
- ```python notest
132
- fn = modal.Function.from_name("my_app", "fn").with_options(gpu="H100")
133
- fn.remote() # will run on a H100 GPU
134
- ```
135
-
136
- Or by referencing another Function defined in the same App:
137
-
138
- ```python notest
139
- @app.function()
140
- def fn():
141
- ...
142
-
143
- # From a local entrypoint or another Function
144
- fn.with_options(gpu="H100").remote() # Uses an H100 GPU
145
- fn.remote() # Uses the static configuration with no GPU
146
- ```
147
-
148
- ## with_concurrency
149
-
150
- ```python
151
- with_concurrency(self, *, max_inputs, target_inputs=None)
152
- ```
153
- Override the static Function configuration with invocation-specific input concurrency.
154
-
155
- Returns a new Function instance that is dynamically configured to behave like a Function using
156
- the `@modal.concurrent` decorator. This instance will autoscale independently from the base Function.
157
-
158
- ## with_batching
159
-
160
- ```python
161
- with_batching(self, *, max_batch_size, wait_ms)
162
- ```
163
- Override the static Function configuration with invocation-specific dynamic batching.
164
-
165
- Returns a new Function instance that is dynamically configured to behave like a Function using
166
- the `@modal.batched` decorator. This instance will autoscale independently from the base Function.
167
-
168
- ## remote
169
-
170
- ```python
171
- remote(self, *args, **kwargs)
172
- ```
173
- Calls the function remotely, executing it with the given arguments and returning the execution's result.
174
-
175
- **Parameters**
176
-
177
- <Parameter name="*args" type="P.args" description="Positional arguments forwarded to the deployed function." />
178
- <Parameter name="**kwargs" type="P.kwargs" description="Keyword arguments forwarded to the deployed function." />
179
-
180
- **Returns**
181
-
182
- The value returned by the remote function.
183
-
184
- ## remote_gen
185
-
186
- ```python
187
- remote_gen(self, *args, **kwargs)
188
- ```
189
- Calls the generator remotely, executing it with the given arguments.
190
-
191
- **Parameters**
192
-
193
- <Parameter name="*args" type="" description="Positional arguments forwarded to the deployed generator function." />
194
- <Parameter name="**kwargs" type="" description="Keyword arguments forwarded to the deployed generator function." />
195
-
196
- **Returns**
197
-
198
- Values produced by the remote generator.
199
-
200
- ## local
201
-
202
- ```python
203
- local(self, *args, **kwargs)
204
- ```
205
- Calls the function locally, executing it with the given arguments and returning the execution's result.
206
-
207
- The function will execute in the same environment as the caller, just like calling the underlying function
208
- directly in Python. In particular, only secrets available in the caller environment will be available
209
- through environment variables.
210
-
211
- **Parameters**
212
-
213
- <Parameter name="*args" type="P.args" description="Positional arguments passed to the underlying Python callable." />
214
- <Parameter name="**kwargs" type="P.kwargs" description="Keyword arguments passed to the underlying Python callable." />
215
-
216
- **Returns**
217
-
218
- The return value of the local call (or a coroutine for async functions).
219
-
220
- ## spawn
221
-
222
- ```python
223
- spawn(self, *args, **kwargs)
224
- ```
225
- Calls the function with the given arguments, without waiting for the results.
226
-
227
- Conceptually similar to `multiprocessing.pool.apply_async`, or a Future/Promise in other contexts.
228
-
229
- **Parameters**
230
-
231
- <Parameter name="*args" type="P.args" description="Positional arguments forwarded to the remote function." />
232
- <Parameter name="**kwargs" type="P.kwargs" description="Keyword arguments forwarded to the remote function." />
233
-
234
- **Returns**
235
-
236
- A [`modal.FunctionCall`](https://modal.com/docs/reference/modal.FunctionCall) object
237
- that can later be polled or waited for using
238
- [`.get(timeout=...)`](https://modal.com/docs/reference/modal.FunctionCall#get).
239
-
240
- ## get_raw_f
241
-
242
- ```python
243
- get_raw_f(self)
244
- ```
245
- Return the inner Python object wrapped by this Modal Function.
246
-
247
- **Returns**
248
-
249
- The original function object registered with Modal.
250
-
251
- ## get_current_stats
252
-
253
- ```python
254
- get_current_stats(self)
255
- ```
256
- Return a `FunctionStats` object describing the current function's queue and runner counts.
257
-
258
- **Returns**
259
-
260
- Snapshot counts for backlog, runners, and running inputs.
261
-
262
- ## map
263
-
264
- ```python
265
- map(self, *input_iterators, kwargs={}, order_outputs=True,
266
- return_exceptions=False, wrap_returned_exceptions=None)
267
- ```
268
- Parallel map over a set of inputs.
269
-
270
- Pass one iterable per positional argument of the underlying function. Results are yielded as an
271
- iterable (sync) or async iterator (``map.aio``).
272
-
273
- If applied to an ``@app.function``, ``map()`` returns one result per input and output order matches
274
- input order by default. Set ``order_outputs=False`` to emit results in completion order.
275
-
276
- ``return_exceptions`` can aggregate failures into the result stream instead of raising.
277
-
278
- **Parameters**
279
-
280
- <Parameter name="*input_iterators" type="typing.Iterable[Any]" description="One iterator per mapped positional parameter on the function." />
281
- <Parameter name="kwargs" type="" defaultValue="&#123;&#125;" description="Extra keyword arguments forwarded to every invocation." />
282
- <Parameter name="order_outputs" type="bool" defaultValue="True" description="If True, preserve input order in outputs; if False, use completion order." />
283
- <Parameter name="return_exceptions" type="bool" defaultValue="False" description="If True, failed inputs appear as exceptions in the result stream instead of raising." />
284
- <Parameter name="wrap_returned_exceptions" type="bool | None" defaultValue="None" description="Deprecated; no longer has any effect." />
285
-
286
- **Usage**
287
-
288
- ```python
289
- @app.function()
290
- def my_func(a):
291
- return a ** 2
292
-
293
-
294
- @app.local_entrypoint()
295
- def main():
296
- assert list(my_func.map([1, 2, 3, 4])) == [1, 4, 9, 16]
297
- ```
298
-
299
- ```python
300
- @app.function()
301
- def my_func(a):
302
- if a == 2:
303
- raise Exception("ohno")
304
- return a ** 2
305
-
306
-
307
- @app.local_entrypoint()
308
- def main():
309
- print(list(my_func.map(range(3), return_exceptions=True)))
310
- ```
311
-
312
- ## starmap
313
-
314
- ```python
315
- starmap(self, input_iterator, *, kwargs={}, order_outputs=True,
316
- return_exceptions=False, wrap_returned_exceptions=None)
317
- ```
318
- Like ``map``, but each input item is unpacked into multiple positional arguments.
319
-
320
- Every element of ``input_iterator`` should be a sequence (for example a tuple) with length equal to the
321
- arity of the function.
322
-
323
- **Parameters**
324
-
325
- <Parameter name="input_iterator" type="typing.Iterable[typing.Sequence[Any]]" description="Iterable of argument tuples to unpack into each call." />
326
- <Parameter name="kwargs" type="" defaultValue="&#123;&#125;" description="Extra keyword arguments forwarded to every invocation." />
327
- <Parameter name="order_outputs" type="bool" defaultValue="True" description="If True, preserve input order in outputs; if False, use completion order." />
328
- <Parameter name="return_exceptions" type="bool" defaultValue="False" description="If True, failed inputs appear as exceptions in the result stream instead of raising." />
329
- <Parameter name="wrap_returned_exceptions" type="bool | None" defaultValue="None" description="Deprecated; no longer has any effect." />
330
-
331
- **Usage**
332
-
333
- ```python
334
- @app.function()
335
- def my_func(a, b):
336
- return a + b
337
-
338
-
339
- @app.local_entrypoint()
340
- def main():
341
- assert list(my_func.starmap([(1, 2), (3, 4)])) == [3, 7]
342
- ```
343
-
344
- ## for_each
345
-
346
- ```python
347
- for_each(self, *input_iterators, kwargs={}, ignore_exceptions=False)
348
- ```
349
- Execute the function for all inputs and wait for completion, discarding return values.
350
-
351
- Like ``.map()`` but you do not need to iterate the result to drive work—Modal processes every input.
352
-
353
- **Parameters**
354
-
355
- <Parameter name="*input_iterators" type="" description="One iterator per mapped positional parameter on the function." />
356
- <Parameter name="kwargs" type="" defaultValue="&#123;&#125;" description="Extra keyword arguments forwarded to every invocation." />
357
- <Parameter name="ignore_exceptions" type="bool" defaultValue="False" description="If True, failures are swallowed instead of propagating." />
358
-
359
- ## spawn_map
360
-
361
- ```python
362
- spawn_map(self, *input_iterators, kwargs={})
363
- ```
364
- Spawn parallel execution over a set of inputs, exiting as soon as the inputs are created (without waiting
365
- for the map to complete).
366
-
367
- Takes one iterator argument per argument in the function being mapped over.
368
-
369
- Programmatic retrieval of results will be supported in a future update.
370
-
371
- **Parameters**
372
-
373
- <Parameter name="*input_iterators" type="" description="One iterator per mapped positional parameter on the function." />
374
- <Parameter name="kwargs" type="" defaultValue="&#123;&#125;" description="Extra keyword arguments forwarded to every invocation." />
375
-
376
- **Usage**
377
-
378
- ```python
379
- @app.function()
380
- def my_func(a):
381
- return a ** 2
382
-
383
-
384
- @app.local_entrypoint()
385
- def main():
386
- my_func.spawn_map([1, 2, 3, 4])
387
- ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.FunctionCall.md DELETED
@@ -1,191 +0,0 @@
1
- # modal.FunctionCall
2
-
3
-
4
- ```python
5
- class FunctionCall(typing.Generic, modal.object.Object)
6
- ```
7
-
8
- A reference to an executed function call.
9
-
10
- Constructed using `.spawn(...)` on a Modal function with the same
11
- arguments that a function normally takes. Acts as a reference to
12
- an ongoing function call that can be passed around and used to
13
- poll or fetch function results at some later time.
14
-
15
- Conceptually similar to a Future/Promise/AsyncResult in other contexts and languages.
16
-
17
-
18
- ## hydrate
19
-
20
- ```python
21
- hydrate(self, client=None)
22
- ```
23
- Synchronize the local object with its identity on the Modal server.
24
-
25
- It is rarely necessary to call this method explicitly, as most operations
26
- will lazily hydrate when needed. The main use case is when you need to
27
- access object metadata, such as its ID.
28
-
29
- *Added in v0.72.39*: This method replaces the deprecated `.resolve()` method.
30
-
31
- ## num_inputs
32
-
33
- ```python
34
- num_inputs(self)
35
- ```
36
- Get the number of inputs in the function call.
37
-
38
- **Returns**
39
-
40
- How many inputs this function call includes (e.g. `1` for `.spawn()`, more for `.spawn_map()`).
41
-
42
- ## get
43
-
44
- ```python
45
- get(self, timeout=None, *, index=0)
46
- ```
47
- Get the result of the index-th input of the function call.
48
-
49
- `.spawn()` calls have a single output, so only specifying `index=0` is valid.
50
- A non-zero index is useful when your function has multiple outputs, like via `.spawn_map()`.
51
-
52
- This function waits indefinitely by default. It takes an optional
53
- `timeout` argument that specifies the maximum number of seconds to wait,
54
- which can be set to `0` to poll for an output immediately.
55
-
56
- The returned coroutine is not cancellation-safe.
57
-
58
- **Parameters**
59
-
60
- <Parameter name="timeout" type="float | None" defaultValue="None" description="Maximum seconds to wait for a result, or `None` to wait indefinitely." />
61
- <Parameter name="index" type="int" defaultValue="0" description="Which input&#x27;s result to retrieve (typically `0` for `.spawn()`)." />
62
-
63
- **Returns**
64
-
65
- The deserialized return value from that input.
66
-
67
- ## iter
68
-
69
- ```python
70
- iter(self, *, start=0, end=None)
71
- ```
72
- Iterate in-order over the results of the function call.
73
-
74
- Optionally, specify a range [start, end) to iterate over.
75
-
76
- If `end` is not provided, it will iterate over all results.
77
-
78
- **Parameters**
79
-
80
- <Parameter name="start" type="int" defaultValue="0" description="First input index to include (inclusive)." />
81
- <Parameter name="end" type="int | None" defaultValue="None" description="One past the last index to include, or `None` for all remaining inputs." />
82
-
83
- **Returns**
84
-
85
- Each result value in index order.
86
-
87
- **Usage**
88
-
89
- ```python
90
- @app.function()
91
- def my_func(a):
92
- return a ** 2
93
-
94
-
95
- @app.local_entrypoint()
96
- def main():
97
- fc = my_func.spawn_map([1, 2, 3, 4])
98
- assert list(fc.iter()) == [1, 4, 9, 16]
99
- assert list(fc.iter(start=1, end=3)) == [4, 9]
100
- ```
101
-
102
- ## get_call_graph
103
-
104
- ```python
105
- get_call_graph(self)
106
- ```
107
- Returns a structure representing the call graph from a given root
108
- call ID, along with the status of execution for each node.
109
-
110
- See [`modal.call_graph`](https://modal.com/docs/reference/modal.call_graph) reference page
111
- for documentation on the structure of the returned `InputInfo` items.
112
-
113
- **Returns**
114
-
115
- A list of `InputInfo` nodes describing the call graph.
116
-
117
- ## cancel
118
-
119
- ```python
120
- cancel(self, terminate_containers=False)
121
- ```
122
- Cancels the function call, which will stop its execution and mark its inputs as
123
- [`TERMINATED`](https://modal.com/docs/reference/modal.call_graph#modalcall_graphinputstatus).
124
-
125
- If `terminate_containers=True` - the containers running the cancelled inputs are all terminated
126
- causing any non-cancelled inputs on those containers to be rescheduled in new containers.
127
-
128
- **Parameters**
129
-
130
- <Parameter name="terminate_containers" type="bool" defaultValue="False" description="If True, forcibly terminate workers running cancelled inputs." />
131
-
132
- ## from_id
133
-
134
- ```python
135
- from_id(cls, function_call_id, client=None)
136
- ```
137
- Instantiate a FunctionCall object from an existing ID.
138
-
139
- Note that it's only necessary to re-instantiate the `FunctionCall` with this method
140
- if you no longer have access to the original object returned from `Function.spawn`.
141
-
142
- **Parameters**
143
-
144
- <Parameter name="function_call_id" type="str" description="Object ID of an existing function call (e.g. from `FunctionCall.object_id`)." />
145
- <Parameter name="client" type="&quot;modal.client.Client | None&quot;" defaultValue="None" description="Modal client to use; defaults to `Client.from_env()` when omitted." />
146
-
147
- **Returns**
148
-
149
- A `FunctionCall` handle for the given ID.
150
-
151
- **Usage**
152
-
153
- ```python notest
154
- # Spawn a FunctionCall and keep track of its object ID
155
- fc = my_func.spawn()
156
- fc_id = fc.object_id
157
-
158
- # Later, use the ID to re-instantiate the FunctionCall object
159
- fc = FunctionCall.from_id(fc_id)
160
- result = fc.get()
161
- ```
162
-
163
- ## gather
164
-
165
- ```python
166
- gather(*function_calls)
167
- ```
168
- Wait until all Modal FunctionCall objects have results before returning.
169
-
170
- Accepts a variable number of `FunctionCall` objects, as returned by `Function.spawn()`.
171
-
172
- Raises an exception from the first failing function call.
173
-
174
- *Added in v0.73.69*: This method replaces the deprecated `modal.functions.gather` function.
175
-
176
- **Parameters**
177
-
178
- <Parameter name="*function_calls" type="&quot;_FunctionCall[T]&quot;" description="`FunctionCall` instances to wait on (same order as the returned sequence)." />
179
-
180
- **Returns**
181
-
182
- Results in the same order as `function_calls` (like `asyncio.gather`).
183
-
184
- **Usage**
185
-
186
- ```python notest
187
- fc1 = slow_func_1.spawn()
188
- fc2 = slow_func_2.spawn()
189
-
190
- result_1, result_2 = modal.FunctionCall.gather(fc1, fc2)
191
- ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.Image.md DELETED
@@ -1,1181 +0,0 @@
1
- # modal.Image
2
-
3
-
4
- ```python
5
- class Image(modal.object.Object)
6
- ```
7
-
8
- Base class for container images to run functions in.
9
-
10
- Do not construct this class directly; instead use one of its static factory methods,
11
- such as `modal.Image.debian_slim`, `modal.Image.from_registry`, or `modal.Image.micromamba`.
12
-
13
-
14
- ## add_local_file
15
-
16
- ```python
17
- add_local_file(self, local_path, remote_path, *, copy=False)
18
- ```
19
- Adds a local file to the image at `remote_path` within the container.
20
-
21
- By default (`copy=False`), the files are added to containers on startup and are not built into the actual Image,
22
- which speeds up deployment.
23
-
24
- Set `copy=True` to copy the files into an Image layer at build time instead, similar to how
25
- [`COPY`](https://docs.docker.com/engine/reference/builder/#copy) works in a `Dockerfile`.
26
-
27
- copy=True can slow down iteration since it requires a rebuild of the Image and any subsequent
28
- build steps whenever the included files change, but it is required if you want to run additional
29
- build steps after this one.
30
-
31
- *Added in v0.66.40*: This method replaces the deprecated `modal.Image.copy_local_file` method.
32
-
33
- **Parameters**
34
-
35
- <Parameter name="local_path" type="str | Path" description="Path to the file on the local machine." />
36
- <Parameter name="remote_path" type="str" description="Absolute path inside the container where the file should appear." />
37
- <Parameter name="copy" type="bool" defaultValue="False" description="If True, bake the file into an image layer at build time; if False, mount at container startup." />
38
-
39
- **Returns**
40
-
41
- A new `Image` with the file layer or mount applied.
42
-
43
- ## add_local_dir
44
-
45
- ```python
46
- add_local_dir(self, local_path, remote_path, *, copy=False, ignore=[])
47
- ```
48
- Adds a local directory's content to the image at `remote_path` within the container.
49
-
50
- By default (`copy=False`), the files are added to containers on startup and are not built into the actual Image,
51
- which speeds up deployment.
52
-
53
- Set `copy=True` to copy the files into an Image layer at build time instead, similar to how
54
- [`COPY`](https://docs.docker.com/engine/reference/builder/#copy) works in a `Dockerfile`.
55
-
56
- copy=True can slow down iteration since it requires a rebuild of the Image and any subsequent
57
- build steps whenever the included files change, but it is required if you want to run additional
58
- build steps after this one.
59
-
60
- *Added in v0.66.40*: This method replaces the deprecated `modal.Image.copy_local_dir` method.
61
-
62
- **Parameters**
63
-
64
- <Parameter name="local_path" type="str | Path" description="Path to the directory on the local machine." />
65
- <Parameter name="remote_path" type="str" description="Absolute path inside the container where the directory contents should appear." />
66
- <Parameter name="copy" type="bool" defaultValue="False" description="If True, bake the tree into an image layer at build time; if False, mount at container startup." />
67
- <Parameter name="ignore" type="Sequence[str] | Callable[[Path], bool]" defaultValue="[]" description="Predicate or pattern list for file exclusion (True means exclude). A sequence is converted to a dockerignore-style matcher." />
68
-
69
- **Returns**
70
-
71
- A new `Image` with the directory layer or mount applied.
72
-
73
- **Usage**
74
-
75
- ```python
76
- from modal import FilePatternMatcher
77
-
78
- image = modal.Image.debian_slim().add_local_dir(
79
- "~/assets",
80
- remote_path="/assets",
81
- ignore=["*.venv"],
82
- )
83
-
84
- image = modal.Image.debian_slim().add_local_dir(
85
- "~/assets",
86
- remote_path="/assets",
87
- ignore=lambda p: p.is_relative_to(".venv"),
88
- )
89
-
90
- image = modal.Image.debian_slim().add_local_dir(
91
- "~/assets",
92
- remote_path="/assets",
93
- ignore=FilePatternMatcher("**/*.txt"),
94
- )
95
-
96
- # When including files is simpler than excluding them, you can use the `~` operator to invert the matcher.
97
- image = modal.Image.debian_slim().add_local_dir(
98
- "~/assets",
99
- remote_path="/assets",
100
- ignore=~FilePatternMatcher("**/*.py"),
101
- )
102
-
103
- # You can also read ignore patterns from a file.
104
- image = modal.Image.debian_slim().add_local_dir(
105
- "~/assets",
106
- remote_path="/assets",
107
- ignore=FilePatternMatcher.from_file("/path/to/ignorefile"),
108
- )
109
- ```
110
-
111
- ## add_local_python_source
112
-
113
- ```python
114
- add_local_python_source(self, *modules, copy=False, ignore=NON_PYTHON_FILES)
115
- ```
116
- Adds locally available Python packages/modules to containers.
117
-
118
- Adds all files from the specified Python package or module to containers running the Image.
119
-
120
- Packages are added to the `/root` directory of containers, which is on the `PYTHONPATH`
121
- of any executed Modal Functions, enabling import of the module by that name.
122
-
123
- By default (`copy=False`), the files are added to containers on startup and are not built into the actual Image,
124
- which speeds up deployment.
125
-
126
- Set `copy=True` to copy the files into an Image layer at build time instead. This can slow down iteration since
127
- it requires a rebuild of the Image and any subsequent build steps whenever the included files change, but it is
128
- required if you want to run additional build steps after this one.
129
-
130
- **Note:** This excludes all dot-prefixed subdirectories or files and all `.pyc`/`__pycache__` files.
131
- To add full directories with finer control, use `.add_local_dir()` instead and specify `/root` as
132
- the destination directory.
133
-
134
- By default only includes `.py`-files in the source modules. Set the `ignore` argument to a list of patterns
135
- or a callable to override this behavior.
136
-
137
- *Added in v0.67.28*: This method replaces the deprecated `modal.Mount.from_local_python_packages` pattern.
138
-
139
- **Parameters**
140
-
141
- <Parameter name="*modules" type="str" description="Python package or module names to include from the local project." />
142
- <Parameter name="copy" type="bool" defaultValue="False" description="If True, bake sources into an image layer; if False, mount at container startup." />
143
- <Parameter name="ignore" type="Sequence[str] | Callable[[Path], bool]" defaultValue="NON_PYTHON_FILES" description="Patterns or callable controlling which files to exclude." />
144
-
145
- **Returns**
146
-
147
- A new `Image` with the Python source mount or layer applied.
148
-
149
- **Usage**
150
-
151
- ```py
152
- # includes everything except data.json
153
- modal.Image.debian_slim().add_local_python_source("mymodule", ignore=["data.json"])
154
-
155
- # exclude large files
156
- modal.Image.debian_slim().add_local_python_source(
157
- "mymodule",
158
- ignore=lambda p: p.stat().st_size > 1e9
159
- )
160
- ```
161
-
162
- ## from_id
163
-
164
- ```python
165
- from_id(cls, image_id, client=None)
166
- ```
167
- Construct an Image from an id and look up the Image result.
168
-
169
- The ID of an Image object can be accessed using `.object_id`.
170
-
171
- **Parameters**
172
-
173
- <Parameter name="image_id" type="str" description="Image object ID to load." />
174
- <Parameter name="client" type="&quot;modal.client.Client | None&quot;" defaultValue="None" description="Optional Modal client; uses the default synchronizer client when omitted." />
175
-
176
- **Returns**
177
-
178
- A hydrated `Image` handle for the given ID.
179
-
180
- ## build
181
-
182
- ```python
183
- build(self, app)
184
- ```
185
- Eagerly build an image.
186
-
187
- If your image was previously built, then this method will not rebuild your image
188
- and your cached image is returned.
189
-
190
- For defining Modal functions, images are built automatically when deploying or running an App.
191
- You do not need to build the image explicitly in that case.
192
-
193
- **Parameters**
194
-
195
- <Parameter name="app" type="modal.app._App" description="Initialized app used as the load context for the image build." />
196
-
197
- **Returns**
198
-
199
- This image after the build (and resolver load) completes.
200
-
201
- **Usage**
202
-
203
- ```python
204
- image = modal.Image.debian_slim().uv_pip_install("scipy", "numpy")
205
-
206
- app = modal.App.lookup("build-image", create_if_missing=True)
207
- with modal.enable_output(): # To see logs in your local terminal
208
- image.build(app)
209
-
210
- # Save the image id
211
- my_image_id = image.object_id
212
-
213
- # Reference the image with the id or uses it another context.
214
- built_image = modal.Image.from_id(my_image_id)
215
- ```
216
-
217
- Alternatively, you can pre-build an image and use it in a sandbox:
218
-
219
- ```python notest
220
- app = modal.App.lookup("sandbox-example", create_if_missing=True)
221
-
222
- with modal.enable_output():
223
- image = modal.Image.debian_slim().uv_pip_install("scipy")
224
- image.build(app)
225
-
226
- sb = modal.Sandbox.create("python", "-c", "import scipy; print(scipy)", app=app, image=image)
227
- print(sb.stdout.read())
228
- sb.terminate()
229
- ```
230
-
231
- ```python notest
232
- app = modal.App()
233
- image = modal.Image.debian_slim()
234
-
235
- # No need to explicitly build the image for defining a function.
236
- @app.function(image=image)
237
- def f():
238
- ...
239
- ```
240
-
241
- ## pip_install
242
-
243
- ```python
244
- pip_install(self, *packages, find_links=None, index_url=None,
245
- extra_index_url=None, pre=False, extra_options="", force_build=False,
246
- env=None, secrets=None, gpu=None)
247
- ```
248
- Install a list of Python packages using pip.
249
-
250
- **Parameters**
251
-
252
- <Parameter name="*packages" type="str | list[str]" description="Python packages to install, e.g. ``numpy`` or ``matplotlib&gt;=3.5.0``." />
253
- <Parameter name="find_links" type="str | None" defaultValue="None" description="Passed as ``--find-links`` to pip." />
254
- <Parameter name="index_url" type="str | None" defaultValue="None" description="Passed as ``--index-url`` to pip." />
255
- <Parameter name="extra_index_url" type="str | None" defaultValue="None" description="Passed as ``--extra-index-url`` to pip." />
256
- <Parameter name="pre" type="bool" defaultValue="False" description="If True, allow pre-release versions (``--pre``)." />
257
- <Parameter name="extra_options" type="str" defaultValue="&quot;&quot;" description="Additional raw options for pip, e.g. ``--no-build-isolation``." />
258
- <Parameter name="force_build" type="bool" defaultValue="False" description="If True, skip cached image builds (similar to ``docker build --no-cache``)." />
259
- <Parameter name="env" type="dict[str, str | None] | None" defaultValue="None" description="Environment variables set in the build container." />
260
- <Parameter name="secrets" type="Collection[_Secret] | None" defaultValue="None" description="Secrets injected as environment variables during the build." />
261
- <Parameter name="gpu" type="str | None" defaultValue="None" description="GPU type to attach to the builder container." />
262
-
263
- **Returns**
264
-
265
- A new `Image` with the pip install layer applied.
266
-
267
- **Usage**
268
-
269
- Simple installation:
270
-
271
- ```python
272
- image = modal.Image.debian_slim().pip_install("click", "httpx~=0.23.3")
273
- ```
274
-
275
- More complex installation:
276
-
277
- ```python
278
- image = (
279
- modal.Image.from_registry(
280
- "nvidia/cuda:12.2.0-devel-ubuntu22.04", add_python="3.11"
281
- )
282
- .pip_install(
283
- "ninja",
284
- "packaging",
285
- "wheel",
286
- "transformers==4.40.2",
287
- )
288
- .pip_install(
289
- "flash-attn==2.5.8", extra_options="--no-build-isolation"
290
- )
291
- )
292
- ```
293
-
294
- ## pip_install_private_repos
295
-
296
- ```python
297
- pip_install_private_repos(self, *repositories, git_user, find_links=None,
298
- index_url=None, extra_index_url=None, pre=False, extra_options="", gpu=None,
299
- env=None, secrets=None, force_build=False)
300
- ```
301
- Install a list of Python packages from private git repositories using pip.
302
-
303
- This method currently supports Github and Gitlab only.
304
-
305
- - **Github:** Provide a `modal.Secret` that contains a `GITHUB_TOKEN` key-value pair
306
- - **Gitlab:** Provide a `modal.Secret` that contains a `GITLAB_TOKEN` key-value pair
307
-
308
- These API tokens should have permissions to read the list of private repositories provided as arguments.
309
-
310
- We recommend using Github's ['fine-grained' access tokens](https://github.blog/2022-10-18-introducing-fine-grained-personal-access-tokens-for-github/).
311
- These tokens are repo-scoped, and avoid granting read permission across all of a user's private repos.
312
-
313
- **Parameters**
314
-
315
- <Parameter name="*repositories" type="str" description="Git URLs without scheme, e.g. ``github.com/org/repo@ref`` or with ``#subdirectory=``." />
316
- <Parameter name="git_user" type="str" description="Username embedded in HTTPS git URLs for authentication." />
317
- <Parameter name="find_links" type="str | None" defaultValue="None" description="Passed as ``--find-links`` to pip." />
318
- <Parameter name="index_url" type="str | None" defaultValue="None" description="Passed as ``--index-url`` to pip." />
319
- <Parameter name="extra_index_url" type="str | None" defaultValue="None" description="Passed as ``--extra-index-url`` to pip." />
320
- <Parameter name="pre" type="bool" defaultValue="False" description="If True, allow pre-release versions." />
321
- <Parameter name="extra_options" type="str" defaultValue="&quot;&quot;" description="Additional raw options for pip." />
322
- <Parameter name="gpu" type="str | None" defaultValue="None" description="GPU type to attach to the builder container." />
323
- <Parameter name="env" type="dict[str, str | None] | None" defaultValue="None" description="Environment variables set in the build container." />
324
- <Parameter name="secrets" type="Collection[_Secret] | None" defaultValue="None" description="Secrets that supply ``GITHUB_TOKEN`` / ``GITLAB_TOKEN`` as required." />
325
- <Parameter name="force_build" type="bool" defaultValue="False" description="If True, skip cached image builds." />
326
-
327
- **Returns**
328
-
329
- A new `Image` with private repositories installed.
330
-
331
- **Usage**
332
-
333
- ```python
334
- image = (
335
- modal.Image
336
- .debian_slim()
337
- .pip_install_private_repos(
338
- "github.com/ecorp/private-one@1.0.0",
339
- "github.com/ecorp/private-two@main"
340
- "github.com/ecorp/private-three@d4776502"
341
- # install from 'inner' directory on default branch.
342
- "github.com/ecorp/private-four#subdirectory=inner",
343
- git_user="erikbern",
344
- secrets=[modal.Secret.from_name("github-read-private")],
345
- )
346
- )
347
- ```
348
-
349
- ## pip_install_from_requirements
350
-
351
- ```python
352
- pip_install_from_requirements(self, requirements_txt, find_links=None, *,
353
- index_url=None, extra_index_url=None, pre=False, extra_options="",
354
- force_build=False, env=None, secrets=None, gpu=None)
355
- ```
356
- Install a list of Python packages from a local `requirements.txt` file.
357
-
358
- **Parameters**
359
-
360
- <Parameter name="requirements_txt" type="str" description="Path to a ``requirements.txt`` file on the local machine." />
361
- <Parameter name="find_links" type="str | None" defaultValue="None" description="Passed as ``--find-links`` to pip." />
362
- <Parameter name="index_url" type="str | None" defaultValue="None" description="Passed as ``--index-url`` to pip." />
363
- <Parameter name="extra_index_url" type="str | None" defaultValue="None" description="Passed as ``--extra-index-url`` to pip." />
364
- <Parameter name="pre" type="bool" defaultValue="False" description="If True, allow pre-release versions." />
365
- <Parameter name="extra_options" type="str" defaultValue="&quot;&quot;" description="Additional raw options for pip." />
366
- <Parameter name="force_build" type="bool" defaultValue="False" description="If True, skip cached image builds." />
367
- <Parameter name="env" type="dict[str, str | None] | None" defaultValue="None" description="Environment variables set in the build container." />
368
- <Parameter name="secrets" type="Collection[_Secret] | None" defaultValue="None" description="Secrets injected as environment variables during the build." />
369
- <Parameter name="gpu" type="str | None" defaultValue="None" description="GPU type to attach to the builder container." />
370
-
371
- **Returns**
372
-
373
- A new `Image` with requirements installed.
374
-
375
- ## pip_install_from_pyproject
376
-
377
- ```python
378
- pip_install_from_pyproject(self, pyproject_toml, optional_dependencies=[], *,
379
- find_links=None, index_url=None, extra_index_url=None, pre=False,
380
- extra_options="", force_build=False, env=None, secrets=None, gpu=None)
381
- ```
382
- Install dependencies specified by a local `pyproject.toml` file.
383
-
384
- `optional_dependencies` is a list of the keys of the
385
- optional-dependencies section(s) of the `pyproject.toml` file
386
- (e.g. test, doc, experiment, etc). When provided,
387
- all of the packages in each listed section are installed as well.
388
-
389
- **Parameters**
390
-
391
- <Parameter name="pyproject_toml" type="str" description="Path to a ``pyproject.toml`` using PEP 621 ``[project.dependencies]``." />
392
- <Parameter name="optional_dependencies" type="list[str]" defaultValue="[]" description="Keys under ``[project.optional-dependencies]`` to install additionally." />
393
- <Parameter name="find_links" type="str | None" defaultValue="None" description="Passed as ``--find-links`` to pip." />
394
- <Parameter name="index_url" type="str | None" defaultValue="None" description="Passed as ``--index-url`` to pip." />
395
- <Parameter name="extra_index_url" type="str | None" defaultValue="None" description="Passed as ``--extra-index-url`` to pip." />
396
- <Parameter name="pre" type="bool" defaultValue="False" description="If True, allow pre-release versions." />
397
- <Parameter name="extra_options" type="str" defaultValue="&quot;&quot;" description="Additional raw options for pip." />
398
- <Parameter name="force_build" type="bool" defaultValue="False" description="If True, skip cached image builds." />
399
- <Parameter name="env" type="dict[str, str | None] | None" defaultValue="None" description="Environment variables set in the build container." />
400
- <Parameter name="secrets" type="Collection[_Secret] | None" defaultValue="None" description="Secrets injected as environment variables during the build." />
401
- <Parameter name="gpu" type="str | None" defaultValue="None" description="GPU type to attach to the builder container." />
402
-
403
- **Returns**
404
-
405
- A new `Image` with project dependencies installed.
406
-
407
- ## uv_pip_install
408
-
409
- ```python
410
- uv_pip_install(self, *packages, requirements=None, find_links=None,
411
- index_url=None, extra_index_url=None, pre=False, extra_options="",
412
- force_build=False, uv_version=None, env=None, secrets=None, gpu=None)
413
- ```
414
- Install a list of Python packages using uv pip install.
415
-
416
- This method assumes that:
417
- - Python is on the ``$PATH`` and dependencies are installed with the first Python on the ``$PATH``.
418
- - The shell supports ``$()``-style substitution as used in the generated Dockerfile.
419
- - The ``command`` builtin is available on the ``$PATH``.
420
-
421
- Added in v1.1.0.
422
-
423
- **Parameters**
424
-
425
- <Parameter name="*packages" type="str | list[str]" description="Python packages to pass to ``uv pip install``." />
426
- <Parameter name="requirements" type="list[str] | None" defaultValue="None" description="Optional list of requirement file paths (passed as ``--requirements``)." />
427
- <Parameter name="find_links" type="str | None" defaultValue="None" description="Passed as ``--find-links`` to ``uv pip``." />
428
- <Parameter name="index_url" type="str | None" defaultValue="None" description="Passed as ``--index-url`` to ``uv pip``." />
429
- <Parameter name="extra_index_url" type="str | None" defaultValue="None" description="Passed as ``--extra-index-url`` to ``uv pip``." />
430
- <Parameter name="pre" type="bool" defaultValue="False" description="If True, allow pre-releases (``--prerelease allow``)." />
431
- <Parameter name="extra_options" type="str" defaultValue="&quot;&quot;" description="Additional raw options appended to the ``uv pip install`` invocation." />
432
- <Parameter name="force_build" type="bool" defaultValue="False" description="If True, skip cached image builds." />
433
- <Parameter name="uv_version" type="str | None" defaultValue="None" description="Pin the uv binary version copied from ``ghcr.io/astral-sh/uv``." />
434
- <Parameter name="env" type="dict[str, str | None] | None" defaultValue="None" description="Environment variables set in the build container." />
435
- <Parameter name="secrets" type="Collection[_Secret] | None" defaultValue="None" description="Secrets injected as environment variables during the build." />
436
- <Parameter name="gpu" type="str | None" defaultValue="None" description="GPU type to attach to the builder container." />
437
-
438
- **Returns**
439
-
440
- A new `Image` with packages installed via uv.
441
-
442
- **Usage**
443
-
444
- ```python
445
- image = modal.Image.debian_slim().uv_pip_install("torch==2.7.1", "numpy")
446
- ```
447
-
448
- ## poetry_install_from_file
449
-
450
- ```python
451
- poetry_install_from_file(self, poetry_pyproject_toml, poetry_lockfile=None, *,
452
- ignore_lockfile=False, force_build=False, with_=[], without=[], only=[],
453
- poetry_version="latest", old_installer=False, env=None, secrets=None,
454
- gpu=None)
455
- ```
456
- Install poetry *dependencies* specified by a local `pyproject.toml` file.
457
-
458
- If not provided as argument the path to the lockfile is inferred. However, the
459
- file has to exist, unless `ignore_lockfile` is set to `True`.
460
-
461
- Note that the root project of the poetry project is not installed, only the dependencies.
462
- For including local python source files see `add_local_python_source`
463
-
464
- Poetry will be installed to the Image (using pip) unless `poetry_version` is set to None.
465
- Note that the interpretation of `poetry_version="latest"` depends on the Modal Image Builder
466
- version, with versions 2024.10 and earlier limiting poetry to 1.x.
467
-
468
- **Parameters**
469
-
470
- <Parameter name="poetry_pyproject_toml" type="str" description="Path to a Poetry ``pyproject.toml`` file." />
471
- <Parameter name="poetry_lockfile" type="str | None" defaultValue="None" description="Path to ``poetry.lock``; if omitted, inferred next to the pyproject." />
472
- <Parameter name="ignore_lockfile" type="bool" defaultValue="False" description="If True, do not copy or use a lockfile even when present." />
473
- <Parameter name="force_build" type="bool" defaultValue="False" description="If True, skip cached image builds." />
474
- <Parameter name="with_" type="list[str]" defaultValue="[]" description="Optional dependency groups to include (``poetry install --with``)." />
475
- <Parameter name="without" type="list[str]" defaultValue="[]" description="Optional dependency groups to exclude (``poetry install --without``)." />
476
- <Parameter name="only" type="list[str]" defaultValue="[]" description="Only install dependency groups in this list (``poetry install --only``)." />
477
- <Parameter name="poetry_version" type="str | None" defaultValue="&quot;latest&quot;" description="Poetry version specifier to ``pip install``, or None to skip installing Poetry." />
478
- <Parameter name="old_installer" type="bool" defaultValue="False" description="If True, use Poetry&#x27;s legacy installer." />
479
- <Parameter name="env" type="dict[str, str | None] | None" defaultValue="None" description="Environment variables set in the build container." />
480
- <Parameter name="secrets" type="Collection[_Secret] | None" defaultValue="None" description="Secrets injected as environment variables during the build." />
481
- <Parameter name="gpu" type="str | None" defaultValue="None" description="GPU type to attach to the builder container." />
482
-
483
- **Returns**
484
-
485
- A new `Image` with Poetry dependencies installed.
486
-
487
- ## uv_sync
488
-
489
- ```python
490
- uv_sync(self, uv_project_dir="./", *, force_build=False, groups=None,
491
- extras=None, frozen=True, extra_options="", uv_version=None, env=None,
492
- secrets=None, gpu=None)
493
- ```
494
- Creates a virtual environment with the dependencies in a uv managed project with `uv sync`.
495
-
496
- The `pyproject.toml` and `uv.lock` in `uv_project_dir` are automatically added to the build context. The
497
- `uv_project_dir` is relative to the current working directory of where `modal` is called.
498
-
499
- NOTE: This does *not* install the project itself into the environment (this is equivalent to the
500
- `--no-install-project` flag in the `uv sync` command) and you would be expected to add any local python source
501
- files using `Image.add_local_python_source` or similar methods after this call.
502
-
503
- This ensures that updates to your project code wouldn't require reinstalling third-party dependencies
504
- after every change.
505
-
506
- uv workspaces are currently not supported.
507
-
508
- Added in v1.1.0.
509
-
510
- **Parameters**
511
-
512
- <Parameter name="uv_project_dir" type="str" defaultValue="&quot;./&quot;" description="Path to the local uv project directory (contains ``pyproject.toml``)." />
513
- <Parameter name="force_build" type="bool" defaultValue="False" description="If True, skip cached image builds." />
514
- <Parameter name="groups" type="list[str] | None" defaultValue="None" description="Dependency groups passed as ``uv sync --group``." />
515
- <Parameter name="extras" type="list[str] | None" defaultValue="None" description="Optional extras passed as ``uv sync --extra``." />
516
- <Parameter name="frozen" type="bool" defaultValue="True" description="If True and a ``uv.lock`` exists, run ``uv sync --frozen`` so the lock is not updated at build time." />
517
- <Parameter name="extra_options" type="str" defaultValue="&quot;&quot;" description="Additional raw options appended to ``uv sync``." />
518
- <Parameter name="uv_version" type="str | None" defaultValue="None" description="Pin the uv binary version copied from ``ghcr.io/astral-sh/uv``." />
519
- <Parameter name="env" type="dict[str, str | None] | None" defaultValue="None" description="Environment variables set in the build container." />
520
- <Parameter name="secrets" type="Collection[_Secret] | None" defaultValue="None" description="Secrets injected as environment variables during the build." />
521
- <Parameter name="gpu" type="str | None" defaultValue="None" description="GPU type to attach to the builder container." />
522
-
523
- **Returns**
524
-
525
- A new `Image` with a uv-managed virtual environment.
526
-
527
- **Usage**
528
-
529
- ```python
530
- image = modal.Image.debian_slim().uv_sync()
531
- ```
532
-
533
- ## dockerfile_commands
534
-
535
- ```python
536
- dockerfile_commands(self, *dockerfile_commands, context_files={}, env=None,
537
- secrets=None, gpu=None, context_dir=None, force_build=False,
538
- ignore=AUTO_DOCKERIGNORE, build_args={})
539
- ```
540
- Extend an image with arbitrary Dockerfile-like commands.
541
-
542
- **Parameters**
543
-
544
- <Parameter name="*dockerfile_commands" type="str | list[str]" description="Dockerfile lines to append after ``FROM base`` (strings or nested lists)." />
545
- <Parameter name="context_files" type="dict[str, str]" defaultValue="&#123;&#125;" description="Map of container paths to local files to include in the build context." />
546
- <Parameter name="env" type="dict[str, str | None] | None" defaultValue="None" description="Environment variables set in the build container." />
547
- <Parameter name="secrets" type="Collection[_Secret] | None" defaultValue="None" description="Secrets injected as environment variables during the build." />
548
- <Parameter name="gpu" type="str | None" defaultValue="None" description="GPU type to attach to the builder container." />
549
- <Parameter name="context_dir" type="Path | str | None" defaultValue="None" description="Root directory for resolving relative COPY paths in implicit context mounts." />
550
- <Parameter name="force_build" type="bool" defaultValue="False" description="If True, skip cached image builds." />
551
- <Parameter name="ignore" type="Sequence[str] | Callable[[Path], bool]" defaultValue="AUTO_DOCKERIGNORE" description="Ignore rules for the implicit context mount (defaults to auto ``.dockerignore`` behavior)." />
552
- <Parameter name="build_args" type="dict[str, str]" defaultValue="&#123;&#125;" description="Dockerfile ``ARG`` values forwarded to the build." />
553
-
554
- **Returns**
555
-
556
- A new `Image` with the Dockerfile fragment applied.
557
-
558
- **Usage**
559
-
560
- ```python
561
- from modal import FilePatternMatcher
562
-
563
- # By default a .dockerignore file is used if present in the current working directory
564
- image = modal.Image.debian_slim().dockerfile_commands(
565
- ["COPY data /data"],
566
- )
567
-
568
- image = modal.Image.debian_slim().dockerfile_commands(
569
- ["COPY data /data"],
570
- ignore=["*.venv"],
571
- )
572
-
573
- image = modal.Image.debian_slim().dockerfile_commands(
574
- ["COPY data /data"],
575
- ignore=lambda p: p.is_relative_to(".venv"),
576
- )
577
-
578
- image = modal.Image.debian_slim().dockerfile_commands(
579
- ["COPY data /data"],
580
- ignore=FilePatternMatcher("**/*.txt"),
581
- )
582
-
583
- # When including files is simpler than excluding them, you can use the `~` operator to invert the matcher.
584
- image = modal.Image.debian_slim().dockerfile_commands(
585
- ["COPY data /data"],
586
- ignore=~FilePatternMatcher("**/*.py"),
587
- )
588
-
589
- # You can also read ignore patterns from a file.
590
- image = modal.Image.debian_slim().dockerfile_commands(
591
- ["COPY data /data"],
592
- ignore=FilePatternMatcher.from_file("/path/to/dockerignore"),
593
- )
594
- ```
595
-
596
- ## entrypoint
597
-
598
- ```python
599
- entrypoint(self, entrypoint_commands)
600
- ```
601
- Set the ENTRYPOINT for the image.
602
-
603
- **Parameters**
604
-
605
- <Parameter name="entrypoint_commands" type="list[str]" description="argv tokens for the ``ENTRYPOINT`` JSON array form." />
606
-
607
- **Returns**
608
-
609
- A new `Image` with the entrypoint Dockerfile directive applied.
610
-
611
- ## shell
612
-
613
- ```python
614
- shell(self, shell_commands)
615
- ```
616
- Overwrite default shell for the image.
617
-
618
- **Parameters**
619
-
620
- <Parameter name="shell_commands" type="list[str]" description="argv tokens for the ``SHELL`` JSON array form." />
621
-
622
- **Returns**
623
-
624
- A new `Image` with the shell Dockerfile directive applied.
625
-
626
- ## run_commands
627
-
628
- ```python
629
- run_commands(self, *commands, env=None, secrets=None, volumes=None, gpu=None,
630
- force_build=False)
631
- ```
632
- Extend an image with a list of shell commands to run.
633
-
634
- **Parameters**
635
-
636
- <Parameter name="*commands" type="str | list[str]" description="Shell commands to run as separate ``RUN`` lines (strings or nested lists)." />
637
- <Parameter name="env" type="dict[str, str | None] | None" defaultValue="None" description="Environment variables set in the build container." />
638
- <Parameter name="secrets" type="Collection[_Secret] | None" defaultValue="None" description="Secrets injected as environment variables during the build." />
639
- <Parameter name="volumes" type="dict[str | PurePosixPath, _Volume] | None" defaultValue="None" description="Modal volumes to attach during the build step." />
640
- <Parameter name="gpu" type="str | None" defaultValue="None" description="GPU type to attach to the builder container." />
641
- <Parameter name="force_build" type="bool" defaultValue="False" description="If True, skip cached image builds." />
642
-
643
- **Returns**
644
-
645
- A new `Image` with the commands executed as layers.
646
-
647
- ## micromamba
648
-
649
- ```python
650
- micromamba(python_version=None, force_build=False)
651
- ```
652
- A Micromamba base image. Micromamba allows for fast building of small Conda-based containers.
653
-
654
- **Parameters**
655
-
656
- <Parameter name="python_version" type="str | None" defaultValue="None" description="Python series or full version to install in the base conda environment." />
657
- <Parameter name="force_build" type="bool" defaultValue="False" description="If True, skip cached image builds." />
658
-
659
- **Returns**
660
-
661
- A Micromamba-based `Image`.
662
-
663
- ## micromamba_install
664
-
665
- ```python
666
- micromamba_install(self, *packages, spec_file=None, channels=[],
667
- force_build=False, env=None, secrets=None, gpu=None)
668
- ```
669
- Install a list of additional packages using micromamba.
670
-
671
- **Parameters**
672
-
673
- <Parameter name="*packages" type="str | list[str]" description="Conda packages to install, e.g. ``numpy`` or version constraints." />
674
- <Parameter name="spec_file" type="str | None" defaultValue="None" description="Optional local path to a conda spec file to pass with ``-f``." />
675
- <Parameter name="channels" type="list[str]" defaultValue="[]" description="Conda channels to pass with repeated ``-c`` flags." />
676
- <Parameter name="force_build" type="bool" defaultValue="False" description="If True, skip cached image builds." />
677
- <Parameter name="env" type="dict[str, str | None] | None" defaultValue="None" description="Environment variables set in the build container." />
678
- <Parameter name="secrets" type="Collection[_Secret] | None" defaultValue="None" description="Secrets injected as environment variables during the build." />
679
- <Parameter name="gpu" type="str | None" defaultValue="None" description="GPU type to attach to the builder container." />
680
-
681
- **Returns**
682
-
683
- A new `Image` with micromamba packages installed.
684
-
685
- ## from_registry
686
-
687
- ```python
688
- from_registry(tag, secret=None, *, setup_dockerfile_commands=[],
689
- force_build=False, add_python=None, **kwargs)
690
- ```
691
- Build a Modal Image from a public or private image registry, such as Docker Hub.
692
-
693
- The image must be built for the `linux/amd64` platform.
694
-
695
- If your image does not come with Python installed, you can use the `add_python` parameter
696
- to specify a version of Python to add to the image. Otherwise, the image is expected to
697
- have Python on PATH as `python`, along with `pip`.
698
-
699
- You may also use `setup_dockerfile_commands` to run Dockerfile commands before the
700
- remaining commands run. This might be useful if you want a custom Python installation or to
701
- set a `SHELL`. Prefer `run_commands()` when possible though.
702
-
703
- To authenticate against a private registry with static credentials, you must set the `secret` parameter to
704
- a `modal.Secret` containing a username (`REGISTRY_USERNAME`) and
705
- an access token or password (`REGISTRY_PASSWORD`).
706
-
707
- To authenticate against private registries with credentials from a cloud provider,
708
- use `Image.from_gcp_artifact_registry()` or `Image.from_aws_ecr()`.
709
-
710
- **Parameters**
711
-
712
- <Parameter name="tag" type="str" description="Registry image reference (e.g. ``python:3.11-slim``)." />
713
- <Parameter name="secret" type="_Secret | None" defaultValue="None" description="Optional secret for static registry credentials." />
714
- <Parameter name="setup_dockerfile_commands" type="list[str]" defaultValue="[]" description="Extra Dockerfile lines run after ``FROM`` during base setup." />
715
- <Parameter name="force_build" type="bool" defaultValue="False" description="If True, skip cached image builds." />
716
- <Parameter name="add_python" type="str | None" defaultValue="None" description="Optional standalone Python series to inject when the base image lacks Python." />
717
- <Parameter name="**kwargs" type="" description="Additional arguments forwarded to the internal image constructor (e.g. registry config)." />
718
-
719
- **Returns**
720
-
721
- An `Image` based on the registry tag.
722
-
723
- **Usage**
724
-
725
- ```python
726
- modal.Image.from_registry("python:3.11-slim-bookworm")
727
- modal.Image.from_registry("ubuntu:22.04", add_python="3.11")
728
- modal.Image.from_registry("nvcr.io/nvidia/pytorch:22.12-py3")
729
- ```
730
-
731
- ## from_gcp_artifact_registry
732
-
733
- ```python
734
- from_gcp_artifact_registry(tag, secret=None, *, setup_dockerfile_commands=[],
735
- force_build=False, add_python=None, **kwargs)
736
- ```
737
- Build a Modal image from a private image in Google Cloud Platform (GCP) Artifact Registry.
738
-
739
- You will need to pass a `modal.Secret` containing [your GCP service account key data](https://cloud.google.com/iam/docs/keys-create-delete#creating)
740
- as `SERVICE_ACCOUNT_JSON`. This can be done from the [Secrets](https://modal.com/secrets) page.
741
- Your service account should be granted a specific role depending on the GCP registry used:
742
-
743
- - For Artifact Registry images (`pkg.dev` domains) use
744
- the ["Artifact Registry Reader"](https://cloud.google.com/artifact-registry/docs/access-control#roles) role
745
- - For Container Registry images (`gcr.io` domains) use
746
- the ["Storage Object Viewer"](https://cloud.google.com/artifact-registry/docs/transition/setup-gcr-repo) role
747
-
748
- **Note:** This method does not use `GOOGLE_APPLICATION_CREDENTIALS` as that
749
- variable accepts a path to a JSON file, not the actual JSON string.
750
-
751
- See `Image.from_registry()` for information about the other parameters.
752
-
753
- **Parameters**
754
-
755
- <Parameter name="tag" type="str" description="Full GCP Artifact Registry image reference." />
756
- <Parameter name="secret" type="_Secret | None" defaultValue="None" description="Secret containing ``SERVICE_ACCOUNT_JSON`` for registry authentication." />
757
- <Parameter name="setup_dockerfile_commands" type="list[str]" defaultValue="[]" description="Extra Dockerfile lines run after ``FROM`` during base setup." />
758
- <Parameter name="force_build" type="bool" defaultValue="False" description="If True, skip cached image builds." />
759
- <Parameter name="add_python" type="str | None" defaultValue="None" description="Optional standalone Python series to inject when the base image lacks Python." />
760
- <Parameter name="**kwargs" type="" description="Additional arguments forwarded to `from_registry`." />
761
-
762
- **Returns**
763
-
764
- An `Image` based on the private GCP artifact.
765
-
766
- **Usage**
767
-
768
- ```python
769
- modal.Image.from_gcp_artifact_registry(
770
- "us-east1-docker.pkg.dev/my-project-1234/my-repo/my-image:my-version",
771
- secret=modal.Secret.from_name(
772
- "my-gcp-secret",
773
- required_keys=["SERVICE_ACCOUNT_JSON"],
774
- ),
775
- add_python="3.11",
776
- )
777
- ```
778
-
779
- ## from_aws_ecr
780
-
781
- ```python
782
- from_aws_ecr(tag, secret=None, *, setup_dockerfile_commands=[],
783
- force_build=False, add_python=None, **kwargs)
784
- ```
785
- Build a Modal image from a private image in AWS Elastic Container Registry (ECR).
786
-
787
- You will need to pass a `modal.Secret` containing either IAM user credentials or OIDC
788
- configuration to access the target ECR registry.
789
-
790
- For IAM user authentication, set `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, and `AWS_REGION`.
791
-
792
- For OIDC authentication, set `AWS_ROLE_ARN` and `AWS_REGION`.
793
-
794
- IAM configuration details can be found in the AWS documentation for
795
- ["Private repository policies"](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policies.html).
796
-
797
- For more details on using an AWS role to access ECR, see the [OIDC integration guide](https://modal.com/docs/guide/oidc-integration).
798
-
799
- See `Image.from_registry()` for information about the other parameters.
800
-
801
- **Parameters**
802
-
803
- <Parameter name="tag" type="str" description="Full ECR image URI." />
804
- <Parameter name="secret" type="_Secret | None" defaultValue="None" description="Secret with IAM or OIDC credentials for ECR." />
805
- <Parameter name="setup_dockerfile_commands" type="list[str]" defaultValue="[]" description="Extra Dockerfile lines run after ``FROM`` during base setup." />
806
- <Parameter name="force_build" type="bool" defaultValue="False" description="If True, skip cached image builds." />
807
- <Parameter name="add_python" type="str | None" defaultValue="None" description="Optional standalone Python series to inject when the base image lacks Python." />
808
- <Parameter name="**kwargs" type="" description="Additional arguments forwarded to `from_registry`." />
809
-
810
- **Returns**
811
-
812
- An `Image` based on the private ECR image.
813
-
814
- **Usage**
815
-
816
- ```python
817
- modal.Image.from_aws_ecr(
818
- "000000000000.dkr.ecr.us-east-1.amazonaws.com/my-private-registry:my-version",
819
- secret=modal.Secret.from_name(
820
- "aws",
821
- required_keys=["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "AWS_REGION"],
822
- ),
823
- add_python="3.11",
824
- )
825
- ```
826
-
827
- ## from_dockerfile
828
-
829
- ```python
830
- from_dockerfile(path, *, force_build=False, context_dir=None, env=None,
831
- secrets=None, gpu=None, add_python=None, build_args={},
832
- ignore=AUTO_DOCKERIGNORE)
833
- ```
834
- Build a Modal image from a local Dockerfile.
835
-
836
- If your Dockerfile does not have Python installed, you can use the `add_python` parameter
837
- to specify a version of Python to add to the image.
838
-
839
- **Parameters**
840
-
841
- <Parameter name="path" type="str | Path" description="Path to the Dockerfile on the local machine." />
842
- <Parameter name="force_build" type="bool" defaultValue="False" description="If True, skip cached image builds." />
843
- <Parameter name="context_dir" type="Path | str | None" defaultValue="None" description="Build context directory for resolving relative COPY paths." />
844
- <Parameter name="env" type="dict[str, str | None] | None" defaultValue="None" description="Environment variables set in the build container." />
845
- <Parameter name="secrets" type="Collection[_Secret] | None" defaultValue="None" description="Secrets injected as environment variables during the build." />
846
- <Parameter name="gpu" type="str | None" defaultValue="None" description="GPU type to attach to the builder container." />
847
- <Parameter name="add_python" type="str | None" defaultValue="None" description="Standalone Python version to add when the Dockerfile does not install Python." />
848
- <Parameter name="build_args" type="dict[str, str]" defaultValue="&#123;&#125;" description="Dockerfile ``ARG`` values forwarded to the build." />
849
- <Parameter name="ignore" type="Sequence[str] | Callable[[Path], bool]" defaultValue="AUTO_DOCKERIGNORE" description="Ignore rules for the implicit context mount (defaults to auto ``.dockerignore`` behavior)." />
850
-
851
- **Returns**
852
-
853
- An `Image` built from the Dockerfile plus Modal runtime dependencies.
854
-
855
- **Usage**
856
-
857
- ```python
858
- from modal import FilePatternMatcher
859
-
860
- # By default a .dockerignore file is used if present in the current working directory
861
- image = modal.Image.from_dockerfile(
862
- "./Dockerfile",
863
- add_python="3.12",
864
- )
865
-
866
- image = modal.Image.from_dockerfile(
867
- "./Dockerfile",
868
- add_python="3.12",
869
- ignore=["*.venv"],
870
- )
871
-
872
- image = modal.Image.from_dockerfile(
873
- "./Dockerfile",
874
- add_python="3.12",
875
- ignore=lambda p: p.is_relative_to(".venv"),
876
- )
877
-
878
- image = modal.Image.from_dockerfile(
879
- "./Dockerfile",
880
- add_python="3.12",
881
- ignore=FilePatternMatcher("**/*.txt"),
882
- )
883
-
884
- # When including files is simpler than excluding them, you can use the `~` operator to invert the matcher.
885
- image = modal.Image.from_dockerfile(
886
- "./Dockerfile",
887
- add_python="3.12",
888
- ignore=~FilePatternMatcher("**/*.py"),
889
- )
890
-
891
- # You can also read ignore patterns from a file.
892
- image = modal.Image.from_dockerfile(
893
- "./Dockerfile",
894
- add_python="3.12",
895
- ignore=FilePatternMatcher.from_file("/path/to/dockerignore"),
896
- )
897
- ```
898
-
899
- ## from_scratch
900
-
901
- ```python
902
- from_scratch(force_build=False)
903
- ```
904
- Create an empty Image, equivalent to `FROM scratch` in Docker.
905
-
906
- The resulting Image has no operating system, shell, or package manager. It is
907
- primarily useful as a lightweight filesystem to mount into a Sandbox via
908
- `Sandbox.mount_image`.
909
-
910
- Note that since this Image doesn't contain Python or other standard OS utilities,
911
- higher-level Image build steps like `pip_install` cannot be chained onto it. It also
912
- cannot be used for `modal.Function` execution, which requires a Python interpreter.
913
-
914
- **Parameters**
915
-
916
- <Parameter name="force_build" type="bool" defaultValue="False" description="If True, skip cached image builds." />
917
-
918
- **Returns**
919
-
920
- An empty `Image` suitable for minimal filesystem mounts.
921
-
922
- **Usage**
923
-
924
- ```python notest
925
- image = modal.Image.from_scratch().add_local_file(local_path, "/bin/my_binary", copy=True)
926
- ```
927
-
928
- ## debian_slim
929
-
930
- ```python
931
- debian_slim(python_version=None, force_build=False)
932
- ```
933
- Default image, based on the official `python` Docker images.
934
-
935
- **Parameters**
936
-
937
- <Parameter name="python_version" type="str | None" defaultValue="None" description="Python series or full version to use from the Debian slim images." />
938
- <Parameter name="force_build" type="bool" defaultValue="False" description="If True, skip cached image builds." />
939
-
940
- **Returns**
941
-
942
- The standard Debian slim Python `Image` used as Modal's default base.
943
-
944
- ## apt_install
945
-
946
- ```python
947
- apt_install(self, *packages, force_build=False, env=None, secrets=None,
948
- gpu=None)
949
- ```
950
- Install a list of Debian packages using `apt`.
951
-
952
- **Parameters**
953
-
954
- <Parameter name="*packages" type="str | list[str]" description="Apt package names to install, e.g. ``git`` or ``libpq-dev``." />
955
- <Parameter name="force_build" type="bool" defaultValue="False" description="If True, skip cached image builds." />
956
- <Parameter name="env" type="dict[str, str | None] | None" defaultValue="None" description="Environment variables set in the build container." />
957
- <Parameter name="secrets" type="Collection[_Secret] | None" defaultValue="None" description="Secrets injected as environment variables during the build." />
958
- <Parameter name="gpu" type="str | None" defaultValue="None" description="GPU type to attach to the builder container." />
959
-
960
- **Returns**
961
-
962
- A new `Image` with ``apt-get install`` layers applied.
963
-
964
- **Usage**
965
-
966
- ```python
967
- image = modal.Image.debian_slim().apt_install("git")
968
- ```
969
-
970
- ## run_function
971
-
972
- ```python
973
- run_function(self, raw_f, *, env=None, secrets=None, volumes={},
974
- network_file_systems={}, gpu=None, cpu=None, memory=None, timeout=60 * 60,
975
- cloud=None, region=None, force_build=False, args=(), kwargs={},
976
- include_source=True)
977
- ```
978
- Run user-defined function `raw_f` as an image build step.
979
-
980
- The function runs like an ordinary Modal Function, accepting a resource configuration and integrating
981
- with Modal features like Secrets and Volumes. Unlike ordinary Modal Functions, any changes to the
982
- filesystem state will be captured on container exit and saved as a new Image.
983
-
984
- Only the source code of `raw_f`, the contents of `**kwargs`, and any referenced *global* variables
985
- are used to determine whether the image has changed and needs to be rebuilt.
986
- If this function references other functions or variables, the image will not be rebuilt if you
987
- make changes to them. You can force a rebuild by changing the function's source code itself.
988
-
989
- **Parameters**
990
-
991
- <Parameter name="raw_f" type="Callable[..., Any]" description="Callable executed remotely during the image build." />
992
- <Parameter name="env" type="dict[str, str | None] | None" defaultValue="None" description="Environment variables set in the builder container." />
993
- <Parameter name="secrets" type="Collection[_Secret] | None" defaultValue="None" description="Secrets available to the builder function." />
994
- <Parameter name="volumes" type="dict[str | PurePosixPath, _Volume | _CloudBucketMount]" defaultValue="&#123;&#125;" description="Volume and bucket mounts attached for the build." />
995
- <Parameter name="network_file_systems" type="dict[str | PurePosixPath, _NetworkFileSystem]" defaultValue="&#123;&#125;" description="Network file systems attached for the build." />
996
- <Parameter name="gpu" type="str | list[str] | None" defaultValue="None" description="GPU type or list of types for the builder container." />
997
- <Parameter name="cpu" type="float | None" defaultValue="None" description="CPU cores to request (soft limit)." />
998
- <Parameter name="memory" type="int | None" defaultValue="None" description="Memory to request in MiB (soft limit)." />
999
- <Parameter name="timeout" type="int" defaultValue="60 * 60" description="Maximum build-step runtime in seconds." />
1000
- <Parameter name="cloud" type="str | None" defaultValue="None" description="Cloud provider for the builder function." />
1001
- <Parameter name="region" type="str | Sequence[str] | None" defaultValue="None" description="Region or regions for the builder function." />
1002
- <Parameter name="force_build" type="bool" defaultValue="False" description="If True, skip cached image builds." />
1003
- <Parameter name="args" type="Sequence[Any]" defaultValue="()" description="Positional arguments serialized to the builder function." />
1004
- <Parameter name="kwargs" type="dict[str, Any]" defaultValue="&#123;&#125;" description="Keyword arguments serialized to the builder function." />
1005
- <Parameter name="include_source" type="bool" defaultValue="True" description="Whether to include the function&#x27;s source in the builder image." />
1006
-
1007
- **Returns**
1008
-
1009
- A new `Image` capturing the filesystem after `raw_f` completes.
1010
-
1011
- **Usage**
1012
-
1013
- ```python notest
1014
-
1015
- def my_build_function():
1016
- open("model.pt", "w").write("parameters!")
1017
-
1018
- image = (
1019
- modal.Image
1020
- .debian_slim()
1021
- .pip_install("torch")
1022
- .run_function(my_build_function, secrets=[...], volumes={...})
1023
- )
1024
- ```
1025
-
1026
- ## env
1027
-
1028
- ```python
1029
- env(self, vars)
1030
- ```
1031
- Sets the environment variables in an Image.
1032
-
1033
- **Parameters**
1034
-
1035
- <Parameter name="vars" type="dict[str, str]" description="Map of environment variable names to string values." />
1036
-
1037
- **Returns**
1038
-
1039
- A new `Image` with ``ENV`` directives applied.
1040
-
1041
- **Usage**
1042
-
1043
- ```python
1044
- image = (
1045
- modal.Image.debian_slim()
1046
- .env({"HF_HUB_ENABLE_HF_TRANSFER": "1"})
1047
- )
1048
- ```
1049
-
1050
- ## workdir
1051
-
1052
- ```python
1053
- workdir(self, path)
1054
- ```
1055
- Set the working directory for subsequent image build steps and function execution.
1056
-
1057
- **Parameters**
1058
-
1059
- <Parameter name="path" type="str | PurePosixPath" description="Working directory path inside the image." />
1060
-
1061
- **Returns**
1062
-
1063
- A new `Image` with ``WORKDIR`` applied.
1064
-
1065
- **Usage**
1066
-
1067
- ```python
1068
- image = (
1069
- modal.Image.debian_slim()
1070
- .run_commands("git clone https://xyz app")
1071
- .workdir("/app")
1072
- .run_commands("yarn install")
1073
- )
1074
- ```
1075
-
1076
- ## cmd
1077
-
1078
- ```python
1079
- cmd(self, cmd)
1080
- ```
1081
- Set the default command (`CMD`) to run when a container is started.
1082
-
1083
- Used with `modal.Sandbox`. Has no effect on `modal.Function`.
1084
-
1085
- **Parameters**
1086
-
1087
- <Parameter name="cmd" type="list[str]" description="argv tokens for the default container command." />
1088
-
1089
- **Returns**
1090
-
1091
- A new `Image` with ``CMD`` applied.
1092
-
1093
- **Usage**
1094
-
1095
- ```python
1096
- image = (
1097
- modal.Image.debian_slim().cmd(["python", "app.py"])
1098
- )
1099
- ```
1100
-
1101
- ## pipe
1102
-
1103
- ```python
1104
- pipe(self, func, *args, **kwargs)
1105
- ```
1106
- Apply a local function to expand the Image recipe.
1107
-
1108
- This method can be useful for defining reusable Image build
1109
- recipes that compose well with the fluent Image builder interface.
1110
-
1111
- **Example**
1112
-
1113
- ```python
1114
- def workspace_setup(image: modal.Image, repo: str) -> modal.Image:
1115
- return image.run_commands(f"git clone {repo}").uv_pip_install(".")
1116
-
1117
- image = (
1118
- modal.Image.debian_slim()
1119
- .apt_install("git")
1120
- .pipe(workspace_setup, "https://github.com/example/repo.git")
1121
- )
1122
- ```
1123
-
1124
- ## imports
1125
-
1126
- ```python
1127
- imports(self)
1128
- ```
1129
- Used to import packages in global scope that are only available when running remotely.
1130
-
1131
- By using this context manager you can avoid an `ImportError` due to not having certain
1132
- packages installed locally.
1133
-
1134
- **Returns**
1135
-
1136
- Context manager that records import failures until the image is hydrated in the remote environment.
1137
-
1138
- **Usage**
1139
-
1140
- ```python notest
1141
- with image.imports():
1142
- import torch
1143
- ```
1144
-
1145
- ## from_name
1146
-
1147
- ```python
1148
- from_name(name, *, environment_name=None, client=None)
1149
- ```
1150
- Reference a named Image that was previously published with `.publish()`.
1151
-
1152
- Names can contain an optional `:tag` part - if no tag part is included `":latest"` is used,
1153
- matching Docker conventions.
1154
-
1155
- ```python notest
1156
- image = modal.Image.from_name("my-image") # references my-image:latest
1157
- image_v1 = modal.Image.from_name("my-image:v1")
1158
-
1159
- @app.function(image=image)
1160
- def run():
1161
- ...
1162
- ```
1163
-
1164
- ## publish
1165
-
1166
- ```python
1167
- publish(self, name, *, environment_name=None, client=None)
1168
- ```
1169
- Publish this image under the given name
1170
-
1171
- The Image must already be created (typically by calling `image.build()` or `sandbox.snapshot_filesystem()`).
1172
-
1173
- Image names can contain an explicit tag designation (using the `name:tag`). If no tag is included in the name,
1174
- `":latest"` is used, matching Docker conventions. To publish multiple tags, call `.publish()` once per tag.
1175
-
1176
- ```python notest
1177
- image = modal.Image.debian_slim().pip_install("numpy")
1178
- image.build(app)
1179
- image.publish("my-image-with-numpy") # my-image-with-numpy:latest
1180
- image.publish("my-image-with-numpy:v1")
1181
- ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.NetworkFileSystem.md DELETED
@@ -1,183 +0,0 @@
1
- # modal.NetworkFileSystem
2
-
3
-
4
- ```python
5
- class NetworkFileSystem(modal.object.Object)
6
- ```
7
-
8
- A shared, writable file system accessible by one or more Modal functions.
9
-
10
- By attaching this file system as a mount to one or more functions, they can
11
- share and persist data with each other.
12
-
13
- **Note: `NetworkFileSystem` has been deprecated and will be removed.**
14
-
15
- **Usage**
16
-
17
- ```python
18
- import modal
19
-
20
- nfs = modal.NetworkFileSystem.from_name("my-nfs", create_if_missing=True)
21
- app = modal.App()
22
-
23
- @app.function(network_file_systems={"/root/foo": nfs})
24
- def f():
25
- pass
26
-
27
- @app.function(network_file_systems={"/root/goo": nfs})
28
- def g():
29
- pass
30
- ```
31
-
32
- Also see the CLI methods for accessing network file systems:
33
-
34
- ```
35
- modal nfs --help
36
- ```
37
-
38
- A `NetworkFileSystem` can also be useful for some local scripting scenarios, e.g.:
39
-
40
- ```python notest
41
- nfs = modal.NetworkFileSystem.from_name("my-network-file-system")
42
- for chunk in nfs.read_file("my_db_dump.csv"):
43
- ...
44
- ```
45
-
46
-
47
- ## hydrate
48
-
49
- ```python
50
- hydrate(self, client=None)
51
- ```
52
- Synchronize the local object with its identity on the Modal server.
53
-
54
- It is rarely necessary to call this method explicitly, as most operations
55
- will lazily hydrate when needed. The main use case is when you need to
56
- access object metadata, such as its ID.
57
-
58
- *Added in v0.72.39*: This method replaces the deprecated `.resolve()` method.
59
-
60
- ## from_name
61
-
62
- ```python
63
- from_name(name, *, environment_name=None, create_if_missing=False, client=None)
64
- ```
65
- Reference a NetworkFileSystem by name, optionally creating it on the server first.
66
-
67
- Hydration is lazy: metadata is fetched from Modal the first time the handle is used.
68
-
69
- **Parameters**
70
-
71
- <Parameter name="name" type="str" description="Deployment name of the network file system." />
72
- <Parameter name="environment_name" type="str | None" defaultValue="None" description="Environment to resolve the name in; defaults to the active environment." />
73
- <Parameter name="create_if_missing" type="bool" defaultValue="False" description="If True, create the object when it does not already exist." />
74
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use for loading; defaults to `Client.from_env()` when omitted." />
75
-
76
- **Returns**
77
-
78
- A `NetworkFileSystem` handle (possibly not yet hydrated).
79
-
80
- **Usage**
81
-
82
- ```python notest
83
- nfs = NetworkFileSystem.from_name("my-nfs", create_if_missing=True)
84
-
85
- @app.function(network_file_systems={"/data": nfs})
86
- def f():
87
- pass
88
- ```
89
-
90
- ## ephemeral
91
-
92
- ```python
93
- ephemeral(cls, client=None, environment_name=None)
94
- ```
95
- Create an anonymous NetworkFileSystem that exists for the duration of the context manager.
96
-
97
- **Parameters**
98
-
99
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use; defaults to `Client.from_env()` when omitted." />
100
- <Parameter name="environment_name" type="str | None" defaultValue="None" description="Environment for the ephemeral object; defaults to the active environment." />
101
-
102
- **Usage**
103
-
104
- ```python
105
- with modal.NetworkFileSystem.ephemeral() as nfs:
106
- assert nfs.listdir("/") == []
107
- ```
108
-
109
- ```python notest
110
- async with modal.NetworkFileSystem.ephemeral() as nfs:
111
- assert await nfs.listdir("/") == []
112
- ```
113
-
114
- ## delete
115
-
116
- ```python
117
- delete(name, client=None, environment_name=None)
118
- ```
119
-
120
-
121
- ## write_file
122
-
123
- ```python
124
- write_file(self, remote_path, fp, progress_cb=None)
125
- ```
126
- Write from a file object to a path on the network file system, atomically.
127
-
128
- Will create any needed parent directories automatically.
129
-
130
- If remote_path ends with `/` it's assumed to be a directory and the
131
- file will be uploaded with its current name to that directory.
132
-
133
- ## read_file
134
-
135
- ```python
136
- read_file(self, path)
137
- ```
138
- Read a file from the network file system
139
-
140
- ## iterdir
141
-
142
- ```python
143
- iterdir(self, path)
144
- ```
145
- Iterate over all files in a directory in the network file system.
146
-
147
- * Passing a directory path lists all files in the directory (names are relative to the directory)
148
- * Passing a file path returns a list containing only that file's listing description
149
- * Passing a glob path (including at least one * or ** sequence) returns all files matching
150
- that glob path (using absolute paths)
151
-
152
- ## add_local_file
153
-
154
- ```python
155
- add_local_file(self, local_path, remote_path=None, progress_cb=None)
156
- ```
157
-
158
-
159
- ## add_local_dir
160
-
161
- ```python
162
- add_local_dir(self, local_path, remote_path=None, progress_cb=None)
163
- ```
164
-
165
-
166
- ## listdir
167
-
168
- ```python
169
- listdir(self, path)
170
- ```
171
- List all files in a directory in the network file system.
172
-
173
- * Passing a directory path lists all files in the directory (names are relative to the directory)
174
- * Passing a file path returns a list containing only that file's listing description
175
- * Passing a glob path (including at least one * or ** sequence) returns all files matching
176
- that glob path (using absolute paths)
177
-
178
- ## remove_file
179
-
180
- ```python
181
- remove_file(self, path, recursive=False)
182
- ```
183
- Remove a file in a network file system.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.Period.md DELETED
@@ -1,40 +0,0 @@
1
- # modal.Period
2
-
3
-
4
- ```python
5
- class Period(modal.schedule.Schedule)
6
- ```
7
-
8
- Create a schedule that runs every given time interval.
9
-
10
- Only `seconds` can be a float. All other arguments are integers.
11
-
12
- Note that `days=1` will trigger the function the same time every day.
13
- This does not have the same behavior as `seconds=84000` since days have
14
- different lengths due to daylight savings and leap seconds. Similarly,
15
- using `months=1` will trigger the function on the same day each month.
16
-
17
- This behaves similar to the
18
- [dateutil](https://dateutil.readthedocs.io/en/latest/relativedelta.html)
19
- package.
20
-
21
- **Usage**
22
-
23
- ```python
24
- import modal
25
- app = modal.App()
26
-
27
- @app.function(schedule=modal.Period(days=1))
28
- def f():
29
- print("This function will run every day")
30
-
31
- modal.Period(hours=4) # runs every 4 hours
32
- modal.Period(minutes=15) # runs every 15 minutes
33
- modal.Period(seconds=math.pi) # runs every 3.141592653589793 seconds
34
- ```
35
-
36
- ```python
37
- __init__(self, *, years=0, months=0, weeks=0, days=0, hours=0, minutes=0,
38
- seconds=0)
39
- ```
40
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.Probe.md DELETED
@@ -1,47 +0,0 @@
1
- # modal.Probe
2
-
3
-
4
- ```python
5
- class Probe(object)
6
- ```
7
-
8
- Probe configuration for the Sandbox Readiness Probe.
9
-
10
- **Usage**
11
-
12
- ```python notest
13
- # Wait until a file exists.
14
- readiness_probe = modal.Probe.with_exec(
15
- "sh", "-c", "test -f /tmp/ready",
16
- )
17
-
18
- # Wait until a TCP port is accepting connections.
19
- readiness_probe = modal.Probe.with_tcp(8080)
20
-
21
- app = modal.App.lookup('sandbox-readiness-probe', create_if_missing=True)
22
- sandbox = modal.Sandbox.create(
23
- "python3", "-m", "http.server", "8080",
24
- readiness_probe=readiness_probe,
25
- app=app,
26
- )
27
- sandbox.wait_until_ready()
28
- ```
29
-
30
- ```python
31
- __init__(self, tcp_port=None, exec_argv=None, interval_ms=100)
32
- ```
33
-
34
-
35
- ## with_tcp
36
-
37
- ```python
38
- with_tcp(cls, port, *, interval_ms=100)
39
- ```
40
-
41
-
42
- ## with_exec
43
-
44
- ```python
45
- with_exec(cls, *argv, interval_ms=100)
46
- ```
47
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.Proxy.md DELETED
@@ -1,45 +0,0 @@
1
- # modal.Proxy
2
-
3
-
4
- ```python
5
- class Proxy(modal.object.Object)
6
- ```
7
-
8
- Proxy objects give your Modal containers a static outbound IP address.
9
-
10
- This can be used for connecting to a remote address with network whitelist, for example
11
- a database. See [the guide](https://modal.com/docs/guide/proxy-ips) for more information.
12
-
13
-
14
- ## hydrate
15
-
16
- ```python
17
- hydrate(self, client=None)
18
- ```
19
- Synchronize the local object with its identity on the Modal server.
20
-
21
- It is rarely necessary to call this method explicitly, as most operations
22
- will lazily hydrate when needed. The main use case is when you need to
23
- access object metadata, such as its ID.
24
-
25
- *Added in v0.72.39*: This method replaces the deprecated `.resolve()` method.
26
-
27
- ## from_name
28
-
29
- ```python
30
- from_name(name, *, environment_name=None, client=None)
31
- ```
32
- Reference a Proxy by its name.
33
-
34
- In contrast to most other Modal objects, new Proxy objects must be
35
- provisioned via the Dashboard and cannot be created on the fly from code.
36
-
37
- **Parameters**
38
-
39
- <Parameter name="name" type="str" description="Name of the Proxy in the target environment." />
40
- <Parameter name="environment_name" type="str | None" defaultValue="None" description="Environment to resolve the name in; defaults to the active environment." />
41
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use for loading; defaults to `Client.from_env()` when omitted." />
42
-
43
- **Returns**
44
-
45
- A lazy `Proxy` handle.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.Queue.md DELETED
@@ -1,464 +0,0 @@
1
- # modal.Queue
2
-
3
-
4
- ```python
5
- class Queue(modal.object.Object)
6
- ```
7
-
8
- Distributed, FIFO queue for data flow in Modal apps.
9
-
10
- The queue can contain any object serializable by `cloudpickle`, including Modal objects.
11
-
12
- By default, the `Queue` object acts as a single FIFO queue which supports puts and gets (blocking and non-blocking).
13
-
14
- **Usage**
15
-
16
- ```python
17
- from modal import Queue
18
-
19
- # Create an ephemeral queue which is anonymous and garbage collected
20
- with Queue.ephemeral() as my_queue:
21
- # Putting values
22
- my_queue.put("some value")
23
- my_queue.put(123)
24
-
25
- # Getting values
26
- assert my_queue.get() == "some value"
27
- assert my_queue.get() == 123
28
-
29
- # Using partitions
30
- my_queue.put(0)
31
- my_queue.put(1, partition="foo")
32
- my_queue.put(2, partition="bar")
33
-
34
- # Default and "foo" partition are ignored by the get operation.
35
- assert my_queue.get(partition="bar") == 2
36
-
37
- # Set custom 10s expiration time on "foo" partition.
38
- my_queue.put(3, partition="foo", partition_ttl=10)
39
-
40
- # Iterate through items in place (read immutably)
41
- my_queue.put(1)
42
- assert [v for v in my_queue.iterate()] == [0, 1]
43
-
44
- # You can also create persistent queues that can be used across apps
45
- queue = Queue.from_name("my-persisted-queue", create_if_missing=True)
46
- queue.put(42)
47
- assert queue.get() == 42
48
- ```
49
-
50
- For more examples, see the [guide](https://modal.com/docs/guide/dicts-and-queues#modal-queues).
51
-
52
- **Queue partitions**
53
-
54
- Specifying partition keys gives access to other independent FIFO partitions within the same `Queue` object.
55
- Across any two partitions, puts and gets are completely independent.
56
- For example, a put in one partition does not affect a get in any other partition.
57
-
58
- When no partition key is specified (by default), puts and gets will operate on a default partition.
59
- This default partition is also isolated from all other partitions.
60
- Please see the Usage section below for an example using partitions.
61
-
62
- **Lifetime of a queue and its partitions**
63
-
64
- By default, each partition is cleared 24 hours after the last `put` operation.
65
- A lower TTL can be specified by the `partition_ttl` argument in the `put` or `put_many` methods.
66
- Each partition's expiry is handled independently.
67
-
68
- As such, `Queue`s are best used for communication between active functions and not relied on for persistent
69
- storage.
70
-
71
- On app completion or after stopping an app any associated `Queue` objects are cleaned up.
72
- All its partitions will be cleared.
73
-
74
- **Limits**
75
-
76
- A single `Queue` can contain up to 100,000 partitions, each with up to 5,000 items. Each item can be up to
77
- 1 MiB.
78
-
79
- Partition keys must be non-empty and must not exceed 64 bytes.
80
-
81
-
82
- ## hydrate
83
-
84
- ```python
85
- hydrate(self, client=None)
86
- ```
87
- Synchronize the local object with its identity on the Modal server.
88
-
89
- It is rarely necessary to call this method explicitly, as most operations
90
- will lazily hydrate when needed. The main use case is when you need to
91
- access object metadata, such as its ID.
92
-
93
- *Added in v0.72.39*: This method replaces the deprecated `.resolve()` method.
94
-
95
- ## objects
96
-
97
-
98
- ```python
99
- objects: QueueManager
100
- ```
101
-
102
- Namespace with methods for managing named Queue objects.
103
-
104
-
105
- ### objects.create
106
-
107
- ```python
108
- create(self, name, *, allow_existing=False, environment_name=None, client=None)
109
- ```
110
- Create a new named Queue in the workspace environment.
111
-
112
- This does not return a local handle; use `modal.Queue.from_name` to look up the Queue after creation.
113
-
114
- Added in v1.1.2.
115
-
116
- **Parameters**
117
-
118
- <Parameter name="name" type="str" description="Name for the new Queue." />
119
- <Parameter name="allow_existing" type="bool" defaultValue="False" description="If True, do nothing when a Queue with this name already exists." />
120
- <Parameter name="environment_name" type="str | None" defaultValue="None" description="Environment to create in; defaults to the active environment." />
121
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use; defaults to `Client.from_env()` when omitted." />
122
-
123
- **Usage**
124
-
125
- ```python notest
126
- modal.Queue.objects.create("my-queue")
127
- ```
128
-
129
- Queues will be created in the active environment, or another one can be specified:
130
-
131
- ```python notest
132
- modal.Queue.objects.create("my-queue", environment_name="dev")
133
- ```
134
-
135
- By default, an error is raised if the Queue already exists; `allow_existing=True` makes that case a no-op:
136
-
137
- ```python notest
138
- modal.Queue.objects.create("my-queue", allow_existing=True)
139
- ```
140
-
141
- Note that this method does not return a local instance of the Queue. You can use
142
- `modal.Queue.from_name` to perform a lookup after creation.
143
-
144
- ### objects.list
145
-
146
- ```python
147
- list(self, *, max_objects=None, created_before=None, environment_name="",
148
- client=None)
149
- ```
150
- List named Queues in the workspace environment as hydrated handles.
151
-
152
- Results are ordered newest to oldest. By default, all matching Queues are returned.
153
-
154
- Added in v1.1.2.
155
-
156
- **Parameters**
157
-
158
- <Parameter name="max_objects" type="int | None" defaultValue="None" description="Maximum number of Queues to return." />
159
- <Parameter name="created_before" type="datetime | str | None" defaultValue="None" description="Only include Queues created before this time (datetime or ISO date string)." />
160
- <Parameter name="environment_name" type="str" defaultValue="&quot;&quot;" description="Environment to list from; defaults to the active environment." />
161
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use; defaults to `Client.from_env()` when omitted." />
162
-
163
- **Returns**
164
-
165
- Hydrated `Queue` objects for each named Queue in the listing.
166
-
167
- **Usage**
168
-
169
- ```python
170
- queues = modal.Queue.objects.list()
171
- print([q.name for q in queues])
172
- ```
173
-
174
- Queues will be retrieved from the active environment, or another one can be specified:
175
-
176
- ```python notest
177
- dev_queues = modal.Queue.objects.list(environment_name="dev")
178
- ```
179
-
180
- By default, all named Queues are returned, newest to oldest. It's also possible to limit the
181
- number of results and to filter by creation date:
182
-
183
- ```python
184
- queues = modal.Queue.objects.list(max_objects=10, created_before="2025-01-01")
185
- ```
186
-
187
- ### objects.delete
188
-
189
- ```python
190
- delete(self, name, *, allow_missing=False, environment_name=None, client=None)
191
- ```
192
- Delete a named Queue entirely (not a single message or partition).
193
-
194
- Deletion is irreversible and affects any Apps using this Queue.
195
-
196
- Added in v1.1.2.
197
-
198
- **Parameters**
199
-
200
- <Parameter name="name" type="str" description="Name of the Queue to delete." />
201
- <Parameter name="allow_missing" type="bool" defaultValue="False" description="If True, do nothing when the Queue does not exist." />
202
- <Parameter name="environment_name" type="str | None" defaultValue="None" description="Environment to delete from; defaults to the active environment." />
203
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use; defaults to `Client.from_env()` when omitted." />
204
-
205
- **Usage**
206
-
207
- ```python notest
208
- await modal.Queue.objects.delete("my-queue")
209
- ```
210
-
211
- Queues will be deleted from the active environment, or another one can be specified:
212
-
213
- ```python notest
214
- await modal.Queue.objects.delete("my-queue", environment_name="dev")
215
- ```
216
-
217
- ## name
218
-
219
- ```python
220
- name(self)
221
- ```
222
-
223
-
224
- ## validate_partition_key
225
-
226
- ```python
227
- validate_partition_key(partition)
228
- ```
229
-
230
-
231
- ## ephemeral
232
-
233
- ```python
234
- ephemeral(cls, client=None, environment_name=None)
235
- ```
236
- Create an anonymous Queue that exists for the duration of the context manager.
237
-
238
- **Parameters**
239
-
240
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use; defaults to `Client.from_env()` when omitted." />
241
- <Parameter name="environment_name" type="str | None" defaultValue="None" description="Environment for the ephemeral Queue; defaults to the active environment." />
242
-
243
- **Usage**
244
-
245
- ```python
246
- from modal import Queue
247
-
248
- with Queue.ephemeral() as q:
249
- q.put(123)
250
- ```
251
-
252
- ```python notest
253
- async with Queue.ephemeral() as q:
254
- await q.put.aio(123)
255
- ```
256
-
257
- ## from_name
258
-
259
- ```python
260
- from_name(name, *, environment_name=None, create_if_missing=False, client=None)
261
- ```
262
- Reference a named Queue, optionally creating it on the server first.
263
-
264
- Hydration is lazy: metadata is fetched from Modal the first time the handle is used.
265
-
266
- **Parameters**
267
-
268
- <Parameter name="name" type="str" description="Deployment name of the Queue." />
269
- <Parameter name="environment_name" type="str | None" defaultValue="None" description="Environment to resolve the name in; defaults to the active environment." />
270
- <Parameter name="create_if_missing" type="bool" defaultValue="False" description="If True, create the Queue when it does not already exist." />
271
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use for loading; defaults to `Client.from_env()` when omitted." />
272
-
273
- **Returns**
274
-
275
- A `Queue` handle (possibly not yet hydrated).
276
-
277
- **Usage**
278
-
279
- ```python
280
- q = modal.Queue.from_name("my-queue", create_if_missing=True)
281
- q.put(123)
282
- ```
283
-
284
- ## from_id
285
-
286
- ```python
287
- from_id(queue_id, client=None)
288
- ```
289
- Construct a Queue from an id and look up the Queue metadata.
290
-
291
- This is a lazy method that defers hydrating the local
292
- object with metadata from Modal servers until the first
293
- time it is actually used.
294
-
295
- The ID of a Queue object can be accessed using `.object_id`.
296
-
297
- **Parameters**
298
-
299
- <Parameter name="queue_id" type="str" description="Queue object ID to attach to." />
300
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use for loading; defaults to `Client.from_env()` when omitted." />
301
-
302
- **Returns**
303
-
304
- A `Queue` handle (possibly not yet hydrated).
305
-
306
- **Usage**
307
-
308
- ```python notest
309
- @app.function()
310
- def my_consumer(queue_id: str):
311
- queue = modal.Queue.from_id(queue_id)
312
- queue.put("Hello from remote function!")
313
-
314
- with modal.Queue.ephemeral() as q:
315
- my_consumer.remote(q.object_id)
316
- print(q.get()) # "Hello from remote function!"
317
- ```
318
-
319
- ## info
320
-
321
- ```python
322
- info(self)
323
- ```
324
- Return information about the Queue object.
325
-
326
- ## clear
327
-
328
- ```python
329
- clear(self, *, partition=None, all=False)
330
- ```
331
- Clear the contents of a single partition or all partitions.
332
-
333
- Warning: this is a destructive operation and will irrevocably delete data.
334
-
335
- **Parameters**
336
-
337
- <Parameter name="partition" type="str | None" defaultValue="None" description="Partition to clear; omit with `all=True` to clear every partition." />
338
- <Parameter name="all" type="bool" defaultValue="False" description="If True, clear all partitions (`partition` must not be set)." />
339
-
340
- **Usage**
341
-
342
- ```python
343
- q = modal.Queue.from_name("my-queue", create_if_missing=True)
344
- q.clear()
345
- ```
346
-
347
- ## get
348
-
349
- ```python
350
- get(self, block=True, timeout=None, *, partition=None)
351
- ```
352
- Remove and return the next object in the queue.
353
-
354
- If `block` is `True` (the default) and the queue is empty, `get` will wait indefinitely for
355
- an object, or until `timeout` if specified. Raises a native `queue.Empty` exception
356
- if the `timeout` is reached.
357
-
358
- If `block` is `False`, `get` returns `None` immediately if the queue is empty. The `timeout` is
359
- ignored in this case.
360
-
361
- **Parameters**
362
-
363
- <Parameter name="block" type="bool" defaultValue="True" description="If True, wait for an item; if False, return ``None`` immediately when empty." />
364
- <Parameter name="timeout" type="float | None" defaultValue="None" description="Seconds to wait when blocking; ignored when ``block`` is False." />
365
- <Parameter name="partition" type="str | None" defaultValue="None" description="FIFO partition to read from; uses the default partition when omitted." />
366
-
367
- ## get_many
368
-
369
- ```python
370
- get_many(self, n_values, block=True, timeout=None, *, partition=None)
371
- ```
372
- Remove and return up to `n_values` objects from the queue.
373
-
374
- If there are fewer than `n_values` items in the queue, return all of them.
375
-
376
- If `block` is `True` (the default) and the queue is empty, `get_many` waits until at least one
377
- object is present, or until `timeout` if specified. Raises the stdlib's `queue.Empty` if the
378
- timeout is reached before any item arrives.
379
-
380
- If `block` is `False`, this returns an empty list immediately when the queue is empty. The `timeout`
381
- is ignored in that case.
382
-
383
- **Parameters**
384
-
385
- <Parameter name="n_values" type="int" description="Maximum number of items to remove and return." />
386
- <Parameter name="block" type="bool" defaultValue="True" description="If True, wait until at least one item is available (or until `timeout`); if False, return immediately when empty." />
387
- <Parameter name="timeout" type="float | None" defaultValue="None" description="Seconds to wait when blocking; ignored when ``block`` is False." />
388
- <Parameter name="partition" type="str | None" defaultValue="None" description="FIFO partition to read from; uses the default partition when omitted." />
389
-
390
- ## put
391
-
392
- ```python
393
- put(self, v, block=True, timeout=None, *, partition=None, partition_ttl=24 *
394
- 3600)
395
- ```
396
- Add an object to the end of the queue.
397
-
398
- If `block` is `True` and the queue is full, this method will retry indefinitely or
399
- until `timeout` if specified. Raises the stdlib's `queue.Full` exception if the `timeout` is reached.
400
- If blocking it is not recommended to omit the `timeout`, as the operation could wait indefinitely.
401
-
402
- If `block` is `False`, this method raises `queue.Full` immediately if the queue is full. The `timeout` is
403
- ignored in this case.
404
-
405
- **Parameters**
406
-
407
- <Parameter name="v" type="Any" description="Value to enqueue (must be serializable)." />
408
- <Parameter name="block" type="bool" defaultValue="True" description="If True, wait for capacity; if False, fail immediately when full." />
409
- <Parameter name="timeout" type="float | None" defaultValue="None" description="Max seconds to wait when blocking." />
410
- <Parameter name="partition" type="str | None" defaultValue="None" description="FIFO partition to write to; uses the default partition when omitted." />
411
- <Parameter name="partition_ttl" type="int" defaultValue="24 * 3600" description="Seconds after the last activity before this partition may be cleared (default 24 hours)." />
412
-
413
- ## put_many
414
-
415
- ```python
416
- put_many(self, vs, block=True, timeout=None, *, partition=None, partition_ttl=24
417
- * 3600)
418
- ```
419
- Add several objects to the end of the queue.
420
-
421
- If `block` is `True` and the queue is full, this method will retry indefinitely or
422
- until `timeout` if specified. Raises the stdlib's `queue.Full` exception if the `timeout` is reached.
423
- If blocking it is not recommended to omit the `timeout`, as the operation could wait indefinitely.
424
-
425
- If `block` is `False`, this method raises `queue.Full` immediately if the queue is full. The `timeout` is
426
- ignored in this case.
427
-
428
- **Parameters**
429
-
430
- <Parameter name="vs" type="list[Any]" description="Values to enqueue (each must be serializable)." />
431
- <Parameter name="block" type="bool" defaultValue="True" description="If True, wait for capacity; if False, fail immediately when full." />
432
- <Parameter name="timeout" type="float | None" defaultValue="None" description="Max seconds to wait when blocking." />
433
- <Parameter name="partition" type="str | None" defaultValue="None" description="FIFO partition to write to; uses the default partition when omitted." />
434
- <Parameter name="partition_ttl" type="int" defaultValue="24 * 3600" description="Seconds after the last activity before this partition may be cleared (default 24 hours)." />
435
-
436
- ## len
437
-
438
- ```python
439
- len(self, *, partition=None, total=False)
440
- ```
441
- Return the number of objects in the queue partition.
442
-
443
- **Parameters**
444
-
445
- <Parameter name="partition" type="str | None" defaultValue="None" description="Partition to measure; omit for the default partition." />
446
- <Parameter name="total" type="bool" defaultValue="False" description="If True, return the combined length of all partitions (do not pass `partition`)." />
447
-
448
- **Returns**
449
-
450
- Item count (capped by the server when very large).
451
-
452
- ## iterate
453
-
454
- ```python
455
- iterate(self, *, partition=None, item_poll_timeout=0.0)
456
- ```
457
- Iterate through items in the queue without mutation.
458
-
459
- Specify `item_poll_timeout` to control how long the iterator should wait for the next time before giving up.
460
-
461
- **Parameters**
462
-
463
- <Parameter name="partition" type="str | None" defaultValue="None" description="Partition to scan; uses the default partition when omitted." />
464
- <Parameter name="item_poll_timeout" type="float" defaultValue="0.0" description="How long to wait for another item before stopping the iterator." />
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.Retries.md DELETED
@@ -1,58 +0,0 @@
1
- # modal.Retries
2
-
3
-
4
- ```python
5
- class Retries(object)
6
- ```
7
-
8
- Adds a retry policy to a Modal function.
9
-
10
- **Usage**
11
-
12
- ```python
13
- import modal
14
- app = modal.App()
15
-
16
- # Basic configuration.
17
- # This sets a policy of max 4 retries with 1-second delay between failures.
18
- @app.function(retries=4)
19
- def f():
20
- pass
21
-
22
-
23
- # Fixed-interval retries with 3-second delay between failures.
24
- @app.function(
25
- retries=modal.Retries(
26
- max_retries=2,
27
- backoff_coefficient=1.0,
28
- initial_delay=3.0,
29
- )
30
- )
31
- def g():
32
- pass
33
-
34
-
35
- # Exponential backoff, with retry delay doubling after each failure.
36
- @app.function(
37
- retries=modal.Retries(
38
- max_retries=4,
39
- backoff_coefficient=2.0,
40
- initial_delay=1.0,
41
- )
42
- )
43
- def h():
44
- pass
45
- ```
46
-
47
- ```python
48
- __init__(self, *, max_retries, backoff_coefficient=2.0, initial_delay=1.0,
49
- max_delay=60.0)
50
- ```
51
- Construct a new retries policy, supporting exponential and fixed-interval delays via a backoff coefficient.
52
-
53
- **Parameters**
54
-
55
- <Parameter name="max_retries" type="int" description="Maximum number of retries after failures." />
56
- <Parameter name="backoff_coefficient" type="float" defaultValue="2.0" description="Multiplier applied to the delay after each attempt; ``1.0`` means fixed delay." />
57
- <Parameter name="initial_delay" type="float" defaultValue="1.0" description="Seconds before the first retry." />
58
- <Parameter name="max_delay" type="float" defaultValue="60.0" description="Upper cap on the delay between retries (seconds)." />
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.Sandbox.md DELETED
@@ -1,950 +0,0 @@
1
- # modal.Sandbox
2
-
3
-
4
- ```python
5
- class Sandbox(modal.object.Object)
6
- ```
7
-
8
- A `Sandbox` object lets you interact with a running sandbox. This API is similar to Python's
9
- [asyncio.subprocess.Process](https://docs.python.org/3/library/asyncio-subprocess.html#asyncio.subprocess.Process).
10
-
11
- Refer to the [guide](https://modal.com/docs/guide/sandbox) on how to spawn and use sandboxes.
12
-
13
-
14
- ## hydrate
15
-
16
- ```python
17
- hydrate(self, client=None)
18
- ```
19
- Synchronize the local object with its identity on the Modal server.
20
-
21
- It is rarely necessary to call this method explicitly, as most operations
22
- will lazily hydrate when needed. The main use case is when you need to
23
- access object metadata, such as its ID.
24
-
25
- *Added in v0.72.39*: This method replaces the deprecated `.resolve()` method.
26
-
27
- ## create
28
-
29
- ```python
30
- create(*args, app=None, name=None, tags=None, image=None, env=None,
31
- secrets=None, network_file_systems={}, timeout=300, idle_timeout=None,
32
- workdir=None, gpu=None, cloud=None, region=None, cpu=None, memory=None,
33
- block_network=False, outbound_cidr_allowlist=None,
34
- outbound_domain_allowlist=None, inbound_cidr_allowlist=None, volumes={},
35
- pty=False, encrypted_ports=[], h2_ports=[], unencrypted_ports=[],
36
- custom_domain=None, proxy=None, include_oidc_identity_token=False,
37
- readiness_probe=None, verbose=False, experimental_options=None,
38
- _experimental_enable_snapshot=False, client=None, environment_name=None,
39
- pty_info=None, cidr_allowlist=None)
40
- ```
41
- Create a new Sandbox to run untrusted, arbitrary code.
42
-
43
- The Sandbox's corresponding container will be created asynchronously.
44
-
45
- **Parameters**
46
-
47
- <Parameter name="*args" type="str" description="Set the CMD of the Sandbox, overriding any CMD of the container image." />
48
- <Parameter name="app" type="&quot;modal.app._App | None&quot;" defaultValue="None" description="Associate the sandbox with an app. Required unless creating from a container." />
49
- <Parameter name="name" type="str | None" defaultValue="None" description="Optionally give the sandbox a name. Unique within an app." />
50
- <Parameter name="tags" type="dict[str, str] | None" defaultValue="None" description="Tags to assign to the Sandbox." />
51
- <Parameter name="image" type="_Image | None" defaultValue="None" description="The image to run as the container for the sandbox." />
52
- <Parameter name="env" type="dict[str, str | None] | None" defaultValue="None" description="Environment variables to set in the Sandbox." />
53
- <Parameter name="secrets" type="Collection[_Secret] | None" defaultValue="None" description="Secrets to inject into the Sandbox as environment variables." />
54
- <Parameter name="network_file_systems" type="dict[str | os.PathLike, _NetworkFileSystem]" defaultValue="&#123;&#125;" description="Network file systems to mount into the sandbox." />
55
- <Parameter name="timeout" type="int" defaultValue="300" description="Maximum lifetime of the sandbox in seconds." />
56
- <Parameter name="idle_timeout" type="int | None" defaultValue="None" description="The amount of time in seconds that a sandbox can be idle before being terminated." />
57
- <Parameter name="workdir" type="str | None" defaultValue="None" description="Working directory of the sandbox." />
58
- <Parameter name="gpu" type="str | None" defaultValue="None" description="GPU reservation for the sandbox." />
59
- <Parameter name="cloud" type="str | None" defaultValue="None" description="Cloud provider for the sandbox." />
60
- <Parameter name="region" type="str | Sequence[str] | None" defaultValue="None" description="Region or regions to run the sandbox on." />
61
- <Parameter name="cpu" type="float | tuple[float, float] | None" defaultValue="None" description="Specify, in fractional CPU cores, how many CPU cores to request. Or, pass (request, limit) to additionally specify a hard limit in fractional CPU cores. CPU throttling will prevent a container from exceeding its specified limit." />
62
- <Parameter name="memory" type="int | tuple[int, int] | None" defaultValue="None" description="Specify, in MiB, a memory request which is the minimum memory required. Or, pass (request, limit) to additionally specify a hard limit in MiB." />
63
- <Parameter name="block_network" type="bool" defaultValue="False" description="Whether to block network access." />
64
- <Parameter name="outbound_cidr_allowlist" type="Sequence[str] | None" defaultValue="None" description="List of CIDRs the sandbox is allowed to access. If None, all CIDRs are allowed." />
65
- <Parameter name="outbound_domain_allowlist" type="Sequence[str] | None" defaultValue="None" description="List of domain names the sandbox is allowed to access. Supports wildcard prefixes (``*.``)." />
66
- <Parameter name="inbound_cidr_allowlist" type="Sequence[str] | None" defaultValue="None" description="List of CIDRs allowed to connect inbound to the sandbox (tunnels and connection tokens). If None, all CIDRs are allowed." />
67
- <Parameter name="volumes" type="dict[str | os.PathLike, _Volume | _CloudBucketMount]" defaultValue="&#123;&#125;" description="Mount points for Modal Volumes and CloudBucketMounts." />
68
- <Parameter name="pty" type="bool" defaultValue="False" description="Enable a PTY for the Sandbox entrypoint command. When enabled, all output (stdout and stderr from the process) is multiplexed into stdout, and the stderr stream is effectively empty." />
69
- <Parameter name="encrypted_ports" type="Sequence[int]" defaultValue="[]" description="List of ports to tunnel into the sandbox. Encrypted ports are tunneled with TLS." />
70
- <Parameter name="h2_ports" type="Sequence[int]" defaultValue="[]" description="List of encrypted ports to tunnel into the sandbox, using HTTP/2." />
71
- <Parameter name="unencrypted_ports" type="Sequence[int]" defaultValue="[]" description="List of ports to tunnel into the sandbox without encryption." />
72
- <Parameter name="custom_domain" type="str | None" defaultValue="None" description="Allow connections to the Sandbox via a subdomain of this parent rather than a default Modal domain." />
73
- <Parameter name="proxy" type="_Proxy | None" defaultValue="None" description="Reference to a Modal Proxy to use in front of this Sandbox." />
74
- <Parameter name="include_oidc_identity_token" type="bool" defaultValue="False" description="If True, the sandbox will receive a MODAL_IDENTITY_TOKEN env var for OIDC-based auth." />
75
- <Parameter name="readiness_probe" type="Probe | None" defaultValue="None" description="Probe used to determine when the sandbox has become ready." />
76
- <Parameter name="verbose" type="bool" defaultValue="False" description="Enable verbose logging for sandbox operations." />
77
- <Parameter name="experimental_options" type="dict[str, bool] | None" defaultValue="None" description="Experimental options to pass to the sandbox." />
78
- <Parameter name="_experimental_enable_snapshot" type="bool" defaultValue="False" description="Enable memory snapshots." />
79
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal Client to use for the sandbox." />
80
- <Parameter name="environment_name" type="str | None" defaultValue="None" description="*DEPRECATED* Optionally override the default environment" />
81
- <Parameter name="pty_info" type="api_pb2.PTYInfo | None" defaultValue="None" description="*DEPRECATED* Use `pty` instead. `pty` will override `pty_info`." />
82
- <Parameter name="cidr_allowlist" type="Sequence[str] | None" defaultValue="None" description="*DEPRECATED* Use outbound_cidr_allowlist instead." />
83
-
84
- **Returns**
85
-
86
- A `Sandbox` object representing the created sandbox which can be used to interact with the sandbox.
87
-
88
- **Raises**
89
-
90
- - `AlreadyExistsError`: If a sandbox with the same name already exists.
91
-
92
- **Usage**
93
-
94
- ```python
95
- app = modal.App.lookup('sandbox-hello-world', create_if_missing=True)
96
- sandbox = modal.Sandbox.create("echo", "hello world", app=app)
97
- print(sandbox.stdout.read())
98
- sandbox.wait()
99
- ```
100
-
101
- ## detach
102
-
103
- ```python
104
- detach(self)
105
- ```
106
- Disconnects your client from the sandbox and cleans up resources assoicated with the connection.
107
-
108
- Be sure to only call `detach` when you are done interacting with the sandbox. After calling `detach`,
109
- any operation using the Sandbox object is not guaranteed to work anymore. If you want to continue interacting
110
- with a running sandbox, use `Sandbox.from_id` to get a new Sandbox object.
111
-
112
- ## from_name
113
-
114
- ```python
115
- from_name(app_name, name, *, environment_name=None, client=None)
116
- ```
117
- Get a running Sandbox by name from a deployed App.
118
-
119
- A Sandbox's name is the `name` argument passed to `Sandbox.create`.
120
-
121
- **Parameters**
122
-
123
- <Parameter name="app_name" type="str" description="Name of the deployed app to look up the sandbox under." />
124
- <Parameter name="name" type="str" description="Sandbox name to resolve." />
125
- <Parameter name="environment_name" type="str | None" defaultValue="None" description="Optional environment name for the lookup; defaults to the configured environment." />
126
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use for the RPC; defaults to `Client.from_env()` when omitted." />
127
-
128
- **Returns**
129
-
130
- A `Sandbox` handle for the running sandbox.
131
-
132
- **Raises**
133
-
134
- - `NotFoundError`: If no running sandbox exists with the given name.
135
-
136
- ## from_id
137
-
138
- ```python
139
- from_id(sandbox_id, client=None)
140
- ```
141
- Construct a Sandbox from an id and look up the Sandbox result.
142
-
143
- The ID of a Sandbox object can be accessed using `.object_id`.
144
-
145
- **Parameters**
146
-
147
- <Parameter name="sandbox_id" type="str" description="Sandbox object ID to attach to." />
148
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use for the lookup; defaults to the environment client when omitted." />
149
-
150
- **Returns**
151
-
152
- A `Sandbox` handle with any available result metadata populated from the server.
153
-
154
- ## get_tags
155
-
156
- ```python
157
- get_tags(self)
158
- ```
159
- Fetches any tags (key-value pairs) currently attached to this Sandbox from the server.
160
-
161
- **Returns**
162
-
163
- Tags as a map from tag name to tag value.
164
-
165
- ## set_tags
166
-
167
- ```python
168
- set_tags(self, tags, *, client=None)
169
- ```
170
- Set tags (key-value pairs) on the Sandbox. Tags can be used to filter results in `Sandbox.list`.
171
-
172
- **Parameters**
173
-
174
- <Parameter name="tags" type="dict[str, str]" description="Tag names and values to set on this sandbox." />
175
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Deprecated. Prefer setting the client when creating or re-attaching to the sandbox." />
176
-
177
- ## snapshot_filesystem
178
-
179
- ```python
180
- snapshot_filesystem(self, timeout=55, *, ttl=30 * 24 * 3600)
181
- ```
182
- Snapshot the filesystem of the Sandbox.
183
-
184
- **Parameters**
185
-
186
- <Parameter name="timeout" type="int" defaultValue="55" description="Maximum time in seconds to wait for the snapshot operation. If the snapshot does not return within that window, the call is cancelled and `modal.exception.TimeoutError` is raised." />
187
- <Parameter name="ttl" type="int | None" defaultValue="30 * 24 * 3600" description="The resulting Image is retained for `ttl` seconds (default: 30 days). Pass `ttl=None` to retain the image indefinitely." />
188
-
189
- **Returns**
190
-
191
- An [`Image`](https://modal.com/docs/reference/modal.Image) object which can be used to spawn a new
192
- Sandbox with the same filesystem.
193
-
194
- ## mount_image
195
-
196
- ```python
197
- mount_image(self, path, image, *, _experimental_encryption_key=None)
198
- ```
199
- Mount an Image at a specified path in a running Sandbox.
200
-
201
- `path` should be a directory that is **not** the root path (`/`). If the path doesn't exist
202
- it will be created. If it exists and contains data, the previous directory will be replaced
203
- by the mount.
204
-
205
- The `image` argument supports any Image that has an object ID, including:
206
- - Images built using `image.build()`
207
- - Images referenced by ID, e.g. `Image.from_id(...)`
208
- - Filesystem/directory snapshots, e.g. created by `.snapshot_directory()` or `.snapshot_filesystem()`
209
- - Empty images created with `Image.from_scratch()`
210
-
211
- **Parameters**
212
-
213
- <Parameter name="path" type="PurePosixPath | str" description="Absolute mount point directory inside the sandbox (not `/`)." />
214
- <Parameter name="image" type="_Image" description="Image to mount at `path` (must be built, referenced by ID, or snapshot-based as described above)." />
215
-
216
- **Usage**
217
-
218
- ```py notest
219
- user_project_snapshot: Image = sandbox_session_1.snapshot_directory("/user_project")
220
-
221
- # You can later mount this snapshot to another Sandbox:
222
- sandbox_session_2 = modal.Sandbox.create(...)
223
- sandbox_session_2.mount_image("/user_project", user_project_snapshot)
224
- sandbox_session_2.filesystem.list_files("/user_project")
225
- ```
226
-
227
- ## unmount_image
228
-
229
- ```python
230
- unmount_image(self, path)
231
- ```
232
- Unmount a previously mounted Image from a running Sandbox.
233
-
234
- `path` must be the exact mount point that was passed to `.mount_image()`.
235
- After unmounting, the underlying Sandbox filesystem at that path becomes
236
- visible again.
237
-
238
- **Parameters**
239
-
240
- <Parameter name="path" type="PurePosixPath | str" description="Absolute mount point directory to unmount." />
241
-
242
- ## snapshot_directory
243
-
244
- ```python
245
- snapshot_directory(self, path, *, timeout=55, ttl=30 * 24 * 3600,
246
- _experimental_encryption_key=None)
247
- ```
248
- Snapshot a directory in a running Sandbox, creating a new Image with its content.
249
-
250
- `timeout` If the snapshot does not return within that window, the call is cancelled
251
- and `modal.exception.TimeoutError` is raised.
252
-
253
- `ttl` The resulting Image is retained for `ttl` seconds (default: 30 days)
254
- Pass `ttl=None` to retain the image indefinitely.
255
-
256
- **Parameters**
257
-
258
- <Parameter name="path" type="PurePosixPath | str" description="Absolute path of the directory inside the sandbox to snapshot." />
259
-
260
- **Returns**
261
-
262
- An `Image` containing the directory contents.
263
-
264
- **Usage**
265
-
266
- ```py notest
267
- user_project_snapshot: Image = sandbox_session_1.snapshot_directory("/user_project")
268
-
269
- # You can later mount this snapshot to another Sandbox:
270
- sandbox_session_2 = modal.Sandbox.create(...)
271
- sandbox_session_2.mount_image("/user_project", user_project_snapshot)
272
- sandbox_session_2.filesystem.list_files("/user_project")
273
- ```
274
-
275
- ## wait
276
-
277
- ```python
278
- wait(self, raise_on_termination=True)
279
- ```
280
- Wait for the Sandbox to finish running.
281
-
282
- **Parameters**
283
-
284
- <Parameter name="raise_on_termination" type="bool" defaultValue="True" description="If True, raise when the sandbox is terminated externally." />
285
-
286
- ## wait_until_ready
287
-
288
- ```python
289
- wait_until_ready(self, *, timeout=300)
290
- ```
291
- Wait for the Sandbox readiness probe to report that the Sandbox is ready.
292
-
293
- The Sandbox must be configured with a `readiness_probe` in order to use this method.
294
-
295
- **Parameters**
296
-
297
- <Parameter name="timeout" type="int" defaultValue="300" description="Maximum time in seconds to wait for readiness." />
298
-
299
- **Usage**
300
-
301
- ```py notest
302
- app = modal.App.lookup('sandbox-wait-until-ready', create_if_missing=True)
303
- sandbox = modal.Sandbox.create(
304
- "python3", "-m", "http.server", "8080",
305
- readiness_probe=modal.Probe.with_tcp(8080),
306
- app=app,
307
- )
308
- sandbox.wait_until_ready()
309
- ```
310
-
311
- ## tunnels
312
-
313
- ```python
314
- tunnels(self, timeout=50)
315
- ```
316
- Get Tunnel metadata for the sandbox.
317
-
318
- NOTE: Previous to client [v0.64.153](https://modal.com/docs/reference/changelog#064153-2024-09-30), this
319
- returned a list of `TunnelData` objects.
320
-
321
- **Parameters**
322
-
323
- <Parameter name="timeout" type="int" defaultValue="50" description="Maximum time in seconds to wait for tunnel metadata when not already cached." />
324
-
325
- **Returns**
326
-
327
- A dictionary mapping container port to `Tunnel` metadata.
328
-
329
- **Raises**
330
-
331
- - `SandboxTimeoutError`: If the tunnels are not available after the timeout.
332
-
333
- ## create_connect_token
334
-
335
- ```python
336
- create_connect_token(self, user_metadata=None)
337
- ```
338
- Create a token for making HTTP connections to the Sandbox.
339
-
340
- Also accepts an optional user_metadata string or dict to associate with the token. This metadata
341
- will be added to the headers by the proxy when forwarding requests to the Sandbox.
342
-
343
- **Parameters**
344
-
345
- <Parameter name="user_metadata" type="str | dict[str, Any] | None" defaultValue="None" description="Optional JSON-serializable metadata or string stored with the connect token." />
346
-
347
- **Returns**
348
-
349
- URL and token credentials for connecting to the sandbox over HTTP.
350
-
351
- ## reload_volumes
352
-
353
- ```python
354
- reload_volumes(self)
355
- ```
356
- Reload all Volumes mounted in the Sandbox.
357
-
358
- Added in v1.1.0.
359
-
360
- ## terminate
361
-
362
- ```python
363
- terminate(self, *, wait=False)
364
- ```
365
- Terminate Sandbox execution.
366
-
367
- This is a no-op if the Sandbox has already finished running.
368
-
369
- **Parameters**
370
-
371
- <Parameter name="wait" type="bool" defaultValue="False" description="If True, block until termination completes and return the exit code." />
372
-
373
- **Returns**
374
-
375
- The sandbox exit code when `wait` is True; otherwise None.
376
-
377
- ## poll
378
-
379
- ```python
380
- poll(self)
381
- ```
382
- Check if the Sandbox has finished running.
383
-
384
- **Returns**
385
-
386
- `None` if the Sandbox is still running, otherwise the exit code.
387
-
388
- ## exec
389
-
390
- ```python
391
- exec(self, *args, stdout=StreamType.PIPE, stderr=StreamType.PIPE, timeout=None,
392
- workdir=None, env=None, secrets=None, text=True, bufsize=-1, pty=False,
393
- _pty_info=None, pty_info=None)
394
- ```
395
- Execute a command in the Sandbox and return a ContainerProcess handle.
396
-
397
- See the [`ContainerProcess`](https://modal.com/docs/reference/modal.container_process#modalcontainer_processcontainerprocess)
398
- docs for more information.
399
-
400
- **Parameters**
401
-
402
- <Parameter name="*args" type="str" description="Command and arguments to run inside the sandbox." />
403
- <Parameter name="stdout" type="StreamType" defaultValue="StreamType.PIPE" description="Where to connect the process stdout stream." />
404
- <Parameter name="stderr" type="StreamType" defaultValue="StreamType.PIPE" description="Where to connect the process stderr stream." />
405
- <Parameter name="timeout" type="int | None" defaultValue="None" description="Optional timeout in seconds for the exec session." />
406
- <Parameter name="workdir" type="str | None" defaultValue="None" description="Working directory for the command; must be absolute if set." />
407
- <Parameter name="env" type="dict[str, str | None] | None" defaultValue="None" description="Environment variables to set during command execution." />
408
- <Parameter name="secrets" type="Collection[_Secret] | None" defaultValue="None" description="Secrets to inject as environment variables during command execution." />
409
- <Parameter name="text" type="bool" defaultValue="True" description="If True, decode streams as text; if False, yield bytes." />
410
- <Parameter name="bufsize" type="Literal[-1, 1]" defaultValue="-1" description="Control line-buffered output. ``-1`` means unbuffered; ``1`` means line-buffered (only when ``text`` is True)." />
411
- <Parameter name="pty" type="bool" defaultValue="False" description="Enable a PTY for the command. When enabled, all output (stdout and stderr from the process) is multiplexed into stdout, and the stderr stream is effectively empty." />
412
- <Parameter name="_pty_info" type="api_pb2.PTYInfo | None" defaultValue="None" description="*DEPRECATED* Use `pty` instead. `pty` will override `_pty_info`." />
413
- <Parameter name="pty_info" type="api_pb2.PTYInfo | None" defaultValue="None" description="*DEPRECATED* Use `pty` instead. `pty` will override `pty_info`." />
414
-
415
- **Returns**
416
-
417
- A `ContainerProcess` handle for the running command (text or bytes depending on `text`).
418
-
419
- **Usage**
420
-
421
- ```python fixture:sandbox
422
- process = sandbox.exec("bash", "-c", "for i in $(seq 1 3); do echo foo $i; sleep 0.1; done")
423
- for line in process.stdout:
424
- print(line)
425
- ```
426
-
427
- ## filesystem
428
-
429
-
430
- ```python
431
- filesystem: SandboxFilesystem
432
- ```
433
-
434
- Namespace for Sandbox filesystem APIs.
435
-
436
-
437
- ### filesystem.copy_from_local
438
-
439
- ```python
440
- copy_from_local(self, local_path, remote_path)
441
- ```
442
- Copy a local file into the Sandbox.
443
-
444
- `remote_path` must be an absolute path to a file in the Sandbox.
445
- Parent directories for `remote_path` are created if needed.
446
- The remote file is overwritten if it already exists.
447
-
448
- **Parameters**
449
-
450
- <Parameter name="local_path" type="str | os.PathLike" description="Path to the file on the local machine." />
451
- <Parameter name="remote_path" type="str" description="Absolute path to the file in the Sandbox." />
452
-
453
- **Raises**
454
-
455
- - `SandboxFilesystemNotADirectoryError`: A parent path component of ``remote_path`` is not a directory.
456
- - `SandboxFilesystemIsADirectoryError`: ``remote_path`` points to a directory.
457
- - `SandboxFilesystemPermissionError`: Write permission is denied in the Sandbox.
458
- - `SandboxFilesystemError`: The command fails for any other reason.
459
- - `FileNotFoundError`: ``local_path`` does not exist.
460
- - `IsADirectoryError`: ``local_path`` is a directory.
461
- - `PermissionError`: Reading ``local_path`` is not permitted.
462
-
463
- **Usage**
464
-
465
- ```python fixture:sandbox fixture:tmpdir
466
- import tempfile
467
- from pathlib import Path
468
-
469
- local_path = Path(tempfile.mktemp())
470
- local_path.write_text("Hello, world!\n")
471
- sandbox.filesystem.copy_from_local(local_path, "/tmp/hello.txt")
472
- ```
473
-
474
- ### filesystem.copy_to_local
475
-
476
- ```python
477
- copy_to_local(self, remote_path, local_path)
478
- ```
479
- Copy a file from the Sandbox to a local path.
480
-
481
- `remote_path` must be an absolute path to a file in the Sandbox.
482
- Parent directories for `local_path` are created if needed.
483
- The local file is overwritten if it already exists.
484
-
485
- **Raises**
486
-
487
- - `SandboxFilesystemNotFoundError`: the remote path does not exist.
488
- - `SandboxFilesystemIsADirectoryError`: the remote path points to a directory.
489
- - `SandboxFilesystemPermissionError`: read permission is denied in the Sandbox.
490
- - `SandboxFilesystemError`: the command fails for any other reason.
491
- - `IsADirectoryError`: `local_path` points to a directory.
492
- - `NotADirectoryError`: a component of the `local_path` parent is not a directory.
493
- - `PermissionError`: writing `local_path` is not permitted.
494
-
495
- **Usage**
496
-
497
- ```python fixture:sandbox fixture:tmpdir
498
- sandbox.filesystem.write_text("Hello, world!\n", "/tmp/hello.txt")
499
- sandbox.filesystem.copy_to_local("/tmp/hello.txt", "/tmp/local-hello.txt")
500
- ```
501
-
502
- ### filesystem.list_files
503
-
504
- ```python
505
- list_files(self, remote_path)
506
- ```
507
- List files and directories in a Sandbox directory.
508
-
509
- **Parameters**
510
-
511
- <Parameter name="remote_path" type="str" description="Absolute path to the directory in the Sandbox." />
512
-
513
- **Returns**
514
-
515
- A list of `FileInfo` objects describing each entry.
516
-
517
- **Raises**
518
-
519
- - `SandboxFilesystemNotFoundError`: The path does not exist.
520
- - `SandboxFilesystemNotADirectoryError`: The path is not a directory.
521
- - `SandboxFilesystemPermissionError`: Read permission is denied.
522
- - `SandboxFilesystemError`: The command fails for any other reason.
523
-
524
- **Usage**
525
-
526
- ```python fixture:sandbox
527
- entries = sandbox.filesystem.list_files("/tmp")
528
- for entry in entries:
529
- print(entry.name, entry.type, entry.size)
530
- ```
531
-
532
- ### filesystem.make_directory
533
-
534
- ```python
535
- make_directory(self, remote_path, *, create_parents=True)
536
- ```
537
- Create a new directory in the Sandbox.
538
-
539
- `remote_path` must be an absolute path in the Sandbox.
540
-
541
- When `create_parents` is `True` (the default), any missing parent directories are created and the call is
542
- idempotent (succeeds silently if the directory already exists). When `create_parents` is `False`, the
543
- immediate parent directory must already exist and the path must not already exist.
544
-
545
- **Parameters**
546
-
547
- <Parameter name="remote_path" type="str" description="Absolute path of the directory to create in the Sandbox." />
548
- <Parameter name="create_parents" type="bool" defaultValue="True" description="When ``True``, create missing parents and succeed if the directory already exists." />
549
-
550
- **Raises**
551
-
552
- - `SandboxFilesystemNotFoundError`: The parent directory does not exist and ``create_parents`` is false.
553
- - `SandboxFilesystemPathAlreadyExistsError`: The path already exists.
554
- - `SandboxFilesystemNotADirectoryError`: A path component is not a directory.
555
- - `SandboxFilesystemPermissionError`: Creation is not permitted.
556
- - `InvalidError`: The operation is not supported by the mount.
557
- - `SandboxFilesystemError`: The command fails for any other reason.
558
-
559
- **Usage**
560
-
561
- ```python fixture:sandbox
562
- sandbox.filesystem.make_directory("/tmp/a/b/c")
563
- ```
564
-
565
- ### filesystem.read_bytes
566
-
567
- ```python
568
- read_bytes(self, remote_path)
569
- ```
570
- Read a file from the Sandbox and return its contents as bytes.
571
-
572
- `remote_path` must be an absolute path to a file in the Sandbox.
573
-
574
- **Parameters**
575
-
576
- <Parameter name="remote_path" type="str" description="Absolute path to the file in the Sandbox." />
577
-
578
- **Returns**
579
-
580
- Raw bytes read from the file.
581
-
582
- **Raises**
583
-
584
- - `SandboxFilesystemNotFoundError`: The path does not exist.
585
- - `SandboxFilesystemIsADirectoryError`: The path points to a directory.
586
- - `SandboxFilesystemPermissionError`: Read permission is denied.
587
- - `SandboxFilesystemError`: The command fails for any other reason.
588
-
589
- **Usage**
590
-
591
- ```python fixture:sandbox
592
- sandbox.filesystem.write_bytes(b"Hello, world!\n", "/tmp/hello.bin")
593
- contents = sandbox.filesystem.read_bytes("/tmp/hello.bin")
594
- print(contents.decode("utf-8"))
595
- ```
596
-
597
- ### filesystem.read_text
598
-
599
- ```python
600
- read_text(self, remote_path)
601
- ```
602
- Read a file from the Sandbox and return its contents as a UTF-8 string.
603
-
604
- `remote_path` must be an absolute path to a file in the Sandbox.
605
-
606
- **Parameters**
607
-
608
- <Parameter name="remote_path" type="str" description="Absolute path to the file in the Sandbox." />
609
-
610
- **Returns**
611
-
612
- File contents decoded as UTF-8.
613
-
614
- **Raises**
615
-
616
- - `SandboxFilesystemNotFoundError`: The path does not exist.
617
- - `SandboxFilesystemIsADirectoryError`: The path points to a directory.
618
- - `SandboxFilesystemPermissionError`: Read permission is denied.
619
- - `SandboxFilesystemError`: The command fails for any other reason.
620
-
621
- **Usage**
622
-
623
- ```python fixture:sandbox
624
- sandbox.filesystem.write_text("Hello, world!\n", "/tmp/hello.txt")
625
- contents = sandbox.filesystem.read_text("/tmp/hello.txt")
626
- print(contents)
627
- ```
628
-
629
- ### filesystem.remove
630
-
631
- ```python
632
- remove(self, remote_path, *, recursive=False)
633
- ```
634
- Remove a file or directory in the Sandbox.
635
-
636
- When `remote_path` is a directory and `recursive` is `False` (the
637
- default), removes it only if it is empty. When `recursive` is `True`,
638
- removes the directory and all its contents.
639
-
640
- Recursive directory removal is not supported on all mounts.
641
- In particular, `CloudBucketMount` does not support it. An
642
- `InvalidError` is raised in that case.
643
-
644
- **Parameters**
645
-
646
- <Parameter name="remote_path" type="str" description="Absolute path to the file in the Sandbox." />
647
- <Parameter name="recursive" type="bool" defaultValue="False" description="When ``True``, remove the directory and all its contents." />
648
-
649
- **Raises**
650
-
651
- - `SandboxFilesystemNotFoundError`: The remote path does not exist.
652
- - `SandboxFilesystemDirectoryNotEmptyError`: `recursive` is `False` and the directory is not empty.
653
- - `SandboxFilesystemPermissionError`: Read permission is denied in the Sandbox.
654
- - `InvalidError`: The operation is not supported by the mount.
655
- - `SandboxFilesystemError`: The command fails for any other reason.
656
-
657
- **Usage**
658
-
659
- To remove a file:
660
-
661
- ```python fixture:sandbox
662
- sandbox.filesystem.write_bytes(b"Hello, world!\n", "/tmp/hello.bin")
663
- sandbox.filesystem.remove("/tmp/hello.bin")
664
- ```
665
-
666
- To remove a directory and all its contents:
667
-
668
- ```python fixture:sandbox
669
- sandbox.filesystem.make_directory("/tmp/mydir/subdir")
670
- sandbox.filesystem.remove("/tmp/mydir", recursive=True)
671
- ```
672
-
673
- ### filesystem.stat
674
-
675
- ```python
676
- stat(self, remote_path)
677
- ```
678
- Return metadata for a single file, directory, or symlink in the Sandbox.
679
-
680
- `remote_path` must be an absolute path in the Sandbox. If `remote_path` is a symlink, the returned
681
- `FileInfo` object describes the symlink, not the target it points to.
682
-
683
- **Raises**
684
-
685
- - `SandboxFilesystemNotFoundError`: the path does not exist.
686
- - `SandboxFilesystemNotADirectoryError`: a non-leaf component of the path is not a directory.
687
- - `SandboxFilesystemPermissionError`: a component of the path is not searchable.
688
- - `SandboxFilesystemError`: the command fails for any other reason.
689
-
690
- **Usage**
691
-
692
- ```python fixture:sandbox
693
- sandbox.filesystem.write_text("Hello, world!\n", "/tmp/hello.txt")
694
- info = sandbox.filesystem.stat("/tmp/hello.txt")
695
- print(info.size, info.permissions, info.modified_time)
696
- ```
697
-
698
- ### filesystem.watch
699
-
700
- ```python
701
- watch(self, remote_path, *, filter=None, recursive=False, timeout=None)
702
- ```
703
- Watch a path in the Sandbox for filesystem changes.
704
-
705
- `remote_path` must be an absolute path in the Sandbox. If it points
706
- to a file, events for that file are reported. If it points to a
707
- directory, events for entries directly inside it are reported. Set
708
- `recursive=True` to also receive events for all nested subdirectories.
709
- If `remote_path` is a symlink, it is followed and events reference
710
- paths under the resolved target.
711
-
712
- Yields `FileWatchEvent` objects as changes occur, until either
713
- `timeout` seconds elapse, the iterator is closed, or the Sandbox
714
- is terminated.
715
-
716
- Optionally restrict the kinds of events emitted to those included
717
- in `filter`. The default filter `None` permits all event types.
718
-
719
- `timeout` is in seconds. `None` means watch indefinitely. When
720
- `timeout` elapses, the iterator stops without raising an exception.
721
-
722
- **Raises**
723
-
724
- - `SandboxFilesystemNotFoundError`: `remote_path` does not exist.
725
- - `SandboxFilesystemPermissionError`: watch access is denied.
726
- - `InvalidError`: the filesystem at `remote_path` does not support
727
- watching.
728
- - `SandboxFilesystemError`: the command fails for any other reason.
729
-
730
- **Usage**
731
-
732
- ```python notest
733
- for event in sandbox.filesystem.watch(
734
- "/tmp/foo",
735
- recursive=True,
736
- filter=[FileWatchEventType.Create],
737
- timeout=60,
738
- ):
739
- if any(p.endswith(".done") for p in event.paths):
740
- break
741
- ```
742
-
743
- ### filesystem.write_bytes
744
-
745
- ```python
746
- write_bytes(self, data, remote_path)
747
- ```
748
- Write binary content to a file in the Sandbox.
749
-
750
- `remote_path` must be an absolute path to a file in the Sandbox.
751
- Parent directories for `remote_path` are created if needed.
752
- The remote file is overwritten if it already exists.
753
-
754
- **Parameters**
755
-
756
- <Parameter name="data" type="bytes | bytearray | memoryview" description="Bytes to write." />
757
- <Parameter name="remote_path" type="str" description="Absolute path to the file in the Sandbox." />
758
-
759
- **Raises**
760
-
761
- - `TypeError`: ``data`` is not bytes-like.
762
- - `SandboxFilesystemNotADirectoryError`: A parent path component is not a directory.
763
- - `SandboxFilesystemIsADirectoryError`: ``remote_path`` points to a directory.
764
- - `SandboxFilesystemPermissionError`: Write permission is denied.
765
- - `SandboxFilesystemError`: The command fails for any other reason.
766
-
767
- **Usage**
768
-
769
- ```python fixture:sandbox
770
- sandbox.filesystem.write_bytes(b"Hello, world!\n", "/tmp/hello.bin")
771
- ```
772
-
773
- ### filesystem.write_text
774
-
775
- ```python
776
- write_text(self, data, remote_path)
777
- ```
778
- Write UTF-8 text to a file in the Sandbox.
779
-
780
- `remote_path` must be an absolute path to a file in the Sandbox.
781
- Parent directories for `remote_path` are created if needed.
782
- The remote file is overwritten if it already exists.
783
-
784
- **Parameters**
785
-
786
- <Parameter name="data" type="str" description="Text to write (encoded as UTF-8)." />
787
- <Parameter name="remote_path" type="str" description="Absolute path to the file in the Sandbox." />
788
-
789
- **Raises**
790
-
791
- - `TypeError`: ``data`` is not a string.
792
- - `SandboxFilesystemNotADirectoryError`: A parent path component is not a directory.
793
- - `SandboxFilesystemIsADirectoryError`: ``remote_path`` points to a directory.
794
- - `SandboxFilesystemPermissionError`: Write permission is denied.
795
- - `SandboxFilesystemError`: The command fails for any other reason.
796
-
797
- **Usage**
798
-
799
- ```python fixture:sandbox
800
- sandbox.filesystem.write_text("Hello, world!\n", "/tmp/hello.txt")
801
- ```
802
-
803
- ## open
804
-
805
- ```python
806
- open(self, path, mode="r")
807
- ```
808
- [Alpha] Open a file in the Sandbox and return a FileIO handle.
809
-
810
- **Deprecated (2026-03-09):** Use the `Sandbox.filesystem` APIs instead for improved reliability.
811
-
812
- See the [`FileIO`](https://modal.com/docs/reference/modal.file_io#modalfile_iofileio) docs for more information.
813
-
814
- **Parameters**
815
-
816
- <Parameter name="path" type="str" description="Absolute path of the file inside the sandbox." />
817
- <Parameter name="mode" type="Union[_typeshed.OpenTextMode, _typeshed.OpenBinaryMode]" defaultValue="&quot;r&quot;" description="File open mode (text or binary), following built-in ``open`` conventions." />
818
-
819
- **Returns**
820
-
821
- A `FileIO` handle for reading or writing the remote file.
822
-
823
- **Usage**
824
-
825
- ```python notest
826
- sb = modal.Sandbox.create(app=sb_app)
827
- f = sb.open("/test.txt", "w")
828
- f.write("hello")
829
- f.close()
830
- ```
831
-
832
- ## ls
833
-
834
- ```python
835
- ls(self, path)
836
- ```
837
- [Alpha] List the contents of a directory in the Sandbox.
838
-
839
- **Deprecated (2026-04-15):** Use `Sandbox.filesystem.list_files()` instead for improved reliability.
840
-
841
- **Parameters**
842
-
843
- <Parameter name="path" type="str" description="Absolute directory path inside the sandbox." />
844
-
845
- **Returns**
846
-
847
- Entry names in the directory as a list of strings.
848
-
849
- ## mkdir
850
-
851
- ```python
852
- mkdir(self, path, parents=False)
853
- ```
854
- [Alpha] Create a new directory in the Sandbox.
855
-
856
- **Deprecated (2026-04-15):** Use `Sandbox.filesystem.make_directory()` instead for improved reliability.
857
-
858
- ## rm
859
-
860
- ```python
861
- rm(self, path, recursive=False)
862
- ```
863
- [Alpha] Remove a file or directory in the Sandbox.
864
-
865
- **Deprecated (2026-04-15):** Use `Sandbox.filesystem.remove()` instead for improved reliability.
866
-
867
- ## watch
868
-
869
- ```python
870
- watch(self, path, filter=None, recursive=None, timeout=None)
871
- ```
872
- [Alpha] Watch a file or directory in the Sandbox for changes.
873
-
874
- **Deprecated (2026-05-08):** Use `Sandbox.filesystem.watch()` instead for improved reliability.
875
-
876
- **Parameters**
877
-
878
- <Parameter name="path" type="str" description="Absolute path to watch." />
879
- <Parameter name="filter" type="builtins.list[FileWatchEventType] | None" defaultValue="None" description="Optional list of event types to include." />
880
- <Parameter name="recursive" type="bool | None" defaultValue="None" description="Whether to watch subdirectories; None uses server defaults." />
881
- <Parameter name="timeout" type="int | None" defaultValue="None" description="Optional timeout for the watch stream." />
882
-
883
- **Returns**
884
-
885
- An async iterator of `FileWatchEvent` values.
886
-
887
- ## stdout
888
-
889
- ```python
890
- stdout(self)
891
- ```
892
- [`StreamReader`](https://modal.com/docs/reference/modal.io_streams#modalio_streamsstreamreader)
893
- for the sandbox's stdout stream.
894
-
895
- **Returns**
896
-
897
- Stream reader for sandbox stdout.
898
-
899
- ## stderr
900
-
901
- ```python
902
- stderr(self)
903
- ```
904
- [`StreamReader`](https://modal.com/docs/reference/modal.io_streams#modalio_streamsstreamreader)
905
- for the Sandbox's stderr stream.
906
-
907
- **Returns**
908
-
909
- Stream reader for sandbox stderr.
910
-
911
- ## stdin
912
-
913
- ```python
914
- stdin(self)
915
- ```
916
- [`StreamWriter`](https://modal.com/docs/reference/modal.io_streams#modalio_streamsstreamwriter)
917
- for the Sandbox's stdin stream.
918
-
919
- **Returns**
920
-
921
- Stream writer for sandbox stdin.
922
-
923
- ## returncode
924
-
925
- ```python
926
- returncode(self)
927
- ```
928
- Return code of the Sandbox process if it has finished running, else `None`.
929
-
930
- **Returns**
931
-
932
- Exit code when the sandbox process has completed, otherwise None.
933
-
934
- ## list
935
-
936
- ```python
937
- list(*, app_id=None, tags=None, client=None)
938
- ```
939
- List all Sandboxes for the current Environment or App ID (if specified). If tags are specified, only
940
- Sandboxes that have at least those tags are returned.
941
-
942
- **Parameters**
943
-
944
- <Parameter name="app_id" type="str | None" defaultValue="None" description="If set, restrict results to sandboxes under this app ID." />
945
- <Parameter name="tags" type="dict[str, str] | None" defaultValue="None" description="If set, only sandboxes containing at least these tags are returned." />
946
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use for listing; defaults to `Client.from_env()` when omitted." />
947
-
948
- **Returns**
949
-
950
- An async generator yielding `Sandbox` objects.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.SandboxSnapshot.md DELETED
@@ -1,42 +0,0 @@
1
- # modal.SandboxSnapshot
2
-
3
-
4
- ```python
5
- class SandboxSnapshot(modal.object.Object)
6
- ```
7
-
8
- > Sandbox memory snapshots are in **early preview**.
9
-
10
- A `SandboxSnapshot` object lets you interact with a stored Sandbox snapshot that was created by calling
11
- `._experimental_snapshot()` on a Sandbox instance. This includes both the filesystem and memory state of
12
- the original Sandbox at the time the snapshot was taken.
13
-
14
-
15
- ## hydrate
16
-
17
- ```python
18
- hydrate(self, client=None)
19
- ```
20
- Synchronize the local object with its identity on the Modal server.
21
-
22
- It is rarely necessary to call this method explicitly, as most operations
23
- will lazily hydrate when needed. The main use case is when you need to
24
- access object metadata, such as its ID.
25
-
26
- *Added in v0.72.39*: This method replaces the deprecated `.resolve()` method.
27
-
28
- ## from_id
29
-
30
- ```python
31
- from_id(cls, sandbox_snapshot_id, client=None)
32
- ```
33
- Construct a `SandboxSnapshot` for an existing snapshot ID.
34
-
35
- **Parameters**
36
-
37
- <Parameter name="sandbox_snapshot_id" type="str" description="Snapshot ID returned when the snapshot was created." />
38
- <Parameter name="client" type="&quot;modal.client.Client | None&quot;" defaultValue="None" description="Modal client to use; defaults to `Client.from_env()` when omitted." />
39
-
40
- **Returns**
41
-
42
- A `SandboxSnapshot` handle (hydration validates the ID when used).
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.Secret.md DELETED
@@ -1,285 +0,0 @@
1
- # modal.Secret
2
-
3
-
4
- ```python
5
- class Secret(modal.object.Object)
6
- ```
7
-
8
- Secrets provide a dictionary of environment variables for images.
9
-
10
- Secrets are a secure way to add credentials and other sensitive information
11
- to the containers your functions run in. You can create and edit secrets on
12
- [the dashboard](https://modal.com/secrets), or programmatically from Python code.
13
-
14
- See [the secrets guide page](https://modal.com/docs/guide/secrets) for more information.
15
-
16
-
17
- ## hydrate
18
-
19
- ```python
20
- hydrate(self, client=None)
21
- ```
22
- Synchronize the local object with its identity on the Modal server.
23
-
24
- It is rarely necessary to call this method explicitly, as most operations
25
- will lazily hydrate when needed. The main use case is when you need to
26
- access object metadata, such as its ID.
27
-
28
- *Added in v0.72.39*: This method replaces the deprecated `.resolve()` method.
29
-
30
- ## objects
31
-
32
-
33
- ```python
34
- objects: SecretManager
35
- ```
36
-
37
- Namespace with methods for managing named Secret objects.
38
-
39
-
40
- ### objects.create
41
-
42
- ```python
43
- create(self, name, env_dict, *, allow_existing=False, environment_name=None,
44
- client=None)
45
- ```
46
- Create a new named Secret in the workspace environment.
47
-
48
- This does not return a local handle; use `modal.Secret.from_name` to look up the Secret after creation.
49
-
50
- Added in v1.1.2.
51
-
52
- **Parameters**
53
-
54
- <Parameter name="name" type="str" description="Name for the new Secret." />
55
- <Parameter name="env_dict" type="dict[str, str]" description="Environment variable keys and values stored in the Secret." />
56
- <Parameter name="allow_existing" type="bool" defaultValue="False" description="If True, do nothing when a Secret with this name already exists (existing values are kept)." />
57
- <Parameter name="environment_name" type="str | None" defaultValue="None" description="Environment to create in; defaults to the active environment." />
58
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use; defaults to `Client.from_env()` when omitted." />
59
-
60
- **Usage**
61
-
62
- ```python notest
63
- contents = {"MY_KEY": "my-value", "MY_OTHER_KEY": "my-other-value"}
64
- modal.Secret.objects.create("my-secret", contents)
65
- ```
66
-
67
- Secrets will be created in the active environment, or another one can be specified:
68
-
69
- ```python notest
70
- modal.Secret.objects.create("my-secret", contents, environment_name="dev")
71
- ```
72
-
73
- By default, an error will be raised if the Secret already exists, but passing
74
- `allow_existing=True` will make the creation attempt a no-op in this case.
75
- If the `env_dict` data differs from the existing Secret, it will be ignored.
76
-
77
- ```python notest
78
- modal.Secret.objects.create("my-secret", contents, allow_existing=True)
79
- ```
80
-
81
- Note that this method does not return a local instance of the Secret. You can use
82
- `modal.Secret.from_name` to perform a lookup after creation.
83
-
84
- ### objects.list
85
-
86
- ```python
87
- list(self, *, max_objects=None, created_before=None, environment_name="",
88
- client=None)
89
- ```
90
- List named Secrets in the workspace environment as hydrated handles.
91
-
92
- Results are ordered newest to oldest. By default, all matching Secrets are returned.
93
-
94
- Added in v1.1.2.
95
-
96
- **Parameters**
97
-
98
- <Parameter name="max_objects" type="int | None" defaultValue="None" description="Maximum number of Secrets to return." />
99
- <Parameter name="created_before" type="datetime | str | None" defaultValue="None" description="Only include Secrets created before this time (datetime or ISO date string)." />
100
- <Parameter name="environment_name" type="str" defaultValue="&quot;&quot;" description="Environment to list from; defaults to the active environment." />
101
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use; defaults to `Client.from_env()` when omitted." />
102
-
103
- **Returns**
104
-
105
- Hydrated `Secret` objects for each named Secret in the listing.
106
-
107
- **Usage**
108
-
109
- ```python
110
- secrets = modal.Secret.objects.list()
111
- print([s.name for s in secrets])
112
- ```
113
-
114
- Secrets will be retrieved from the active environment, or another one can be specified:
115
-
116
- ```python notest
117
- dev_secrets = modal.Secret.objects.list(environment_name="dev")
118
- ```
119
-
120
- By default, all named Secrets are returned, newest to oldest. It's also possible to limit the
121
- number of results and to filter by creation date:
122
-
123
- ```python
124
- secrets = modal.Secret.objects.list(max_objects=10, created_before="2025-01-01")
125
- ```
126
-
127
- ### objects.delete
128
-
129
- ```python
130
- delete(self, name, *, allow_missing=False, environment_name=None, client=None)
131
- ```
132
- Delete a named Secret entirely.
133
-
134
- Deletion is irreversible and affects any Apps using this Secret.
135
-
136
- Added in v1.1.2.
137
-
138
- **Parameters**
139
-
140
- <Parameter name="name" type="str" description="Name of the Secret to delete." />
141
- <Parameter name="allow_missing" type="bool" defaultValue="False" description="If True, do nothing when the Secret does not exist." />
142
- <Parameter name="environment_name" type="str | None" defaultValue="None" description="Environment to delete from; defaults to the active environment." />
143
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use; defaults to `Client.from_env()` when omitted." />
144
-
145
- **Usage**
146
-
147
- ```python notest
148
- await modal.Secret.objects.delete("my-secret")
149
- ```
150
-
151
- Secrets will be deleted from the active environment, or another one can be specified:
152
-
153
- ```python notest
154
- await modal.Secret.objects.delete("my-secret", environment_name="dev")
155
- ```
156
-
157
- ## name
158
-
159
- ```python
160
- name(self)
161
- ```
162
-
163
-
164
- ## from_dict
165
-
166
- ```python
167
- from_dict(env_dict={})
168
- ```
169
- Create a Secret from a dictionary of environment variable names to string values.
170
-
171
- Values may be ``None``; those keys are omitted from the Secret.
172
-
173
- **Parameters**
174
-
175
- <Parameter name="env_dict" type="dict[str, str | None]" defaultValue="&#123;&#125;" description="Mapping of variable names to values (or ``None`` to skip a key)." />
176
-
177
- **Returns**
178
-
179
- A lazy `Secret` handle backed by the given key-value pairs.
180
-
181
- **Usage**
182
-
183
- ```python
184
- @app.function(secrets=[modal.Secret.from_dict({"FOO": "bar"})])
185
- def run():
186
- print(os.environ["FOO"])
187
- ```
188
-
189
- ## from_local_environ
190
-
191
- ```python
192
- from_local_environ(env_keys)
193
- ```
194
- Build a Secret from the current process environment (local runs only).
195
-
196
- In remote execution, returns an empty Secret.
197
-
198
- **Parameters**
199
-
200
- <Parameter name="env_keys" type="list[str]" description="Names of environment variables to copy into the Secret." />
201
-
202
- **Returns**
203
-
204
- A `Secret` containing the resolved variables (or empty when not local).
205
-
206
- ## from_dotenv
207
-
208
- ```python
209
- from_dotenv(path=None, *, filename=".env", client=None)
210
- ```
211
- Load environment variables from a `.env` file into a Secret.
212
-
213
- With no `path`, searches from the current working directory (not the caller's file path).
214
- With `path` set, walks upward from that file or directory to find `filename`.
215
-
216
- **Parameters**
217
-
218
- <Parameter name="path" type="" defaultValue="None" description="File or directory to search from; omit to search from the process cwd." />
219
- <Parameter name="filename" type="" defaultValue="&quot;.env&quot;" description="Name of the env file to find (default ``.env``)." />
220
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client used when hydrating the Secret." />
221
-
222
- **Returns**
223
-
224
- A lazy `Secret` handle whose values are loaded from the resolved `.env` file.
225
-
226
- **Usage**
227
-
228
- ```python
229
- @app.function(secrets=[modal.Secret.from_dotenv(__file__)])
230
- def run():
231
- print(os.environ["USERNAME"]) # Assumes USERNAME is defined in your .env file
232
- ```
233
-
234
- ```python
235
- @app.function(secrets=[modal.Secret.from_dotenv(filename=".env-dev")])
236
- def run():
237
- ...
238
- ```
239
-
240
- ## from_name
241
-
242
- ```python
243
- from_name(name, *, environment_name=None, required_keys=[], client=None)
244
- ```
245
- Reference a deployed Secret by name.
246
-
247
- Hydration is lazy until the Secret is used.
248
-
249
- **Parameters**
250
-
251
- <Parameter name="name" type="str" description="Deployment name of the Secret." />
252
- <Parameter name="environment_name" type="str | None" defaultValue="None" description="Environment to resolve the name in; defaults to the active environment." />
253
- <Parameter name="required_keys" type="list[str]" defaultValue="[]" description="If non-empty, the server asserts these keys exist on the Secret." />
254
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use for loading; defaults to `Client.from_env()` when omitted." />
255
-
256
- **Returns**
257
-
258
- A `Secret` handle (possibly not yet hydrated).
259
-
260
- **Usage**
261
-
262
- ```python
263
- secret = modal.Secret.from_name("my-secret")
264
-
265
- @app.function(secrets=[secret])
266
- def run():
267
- ...
268
- ```
269
-
270
- ## info
271
-
272
- ```python
273
- info(self)
274
- ```
275
- Return information about the Secret object.
276
-
277
- ## update
278
-
279
- ```python
280
- update(self, env_dict)
281
- ```
282
- Update this Secret, adding or overwriting key-value pairs.
283
-
284
- Like dict.update(), this merges `env_dict` into the existing Secret.
285
- Keys not mentioned in `env_dict` are left unchanged.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.Tunnel.md DELETED
@@ -1,36 +0,0 @@
1
- # modal.Tunnel
2
-
3
-
4
- ```python
5
- class Tunnel(object)
6
- ```
7
-
8
- A port forwarded from within a running Modal container. Created by `modal.forward()`.
9
-
10
- **Important:** This is an experimental API which may change in the future.
11
-
12
- ```python
13
- __init__(self, host, port, unencrypted_host, unencrypted_port)
14
- ```
15
-
16
-
17
- ## url
18
-
19
- ```python
20
- url(self)
21
- ```
22
- Get the public HTTPS URL of the forwarded port.
23
-
24
- ## tls_socket
25
-
26
- ```python
27
- tls_socket(self)
28
- ```
29
- Get the public TLS socket as a (host, port) tuple.
30
-
31
- ## tcp_socket
32
-
33
- ```python
34
- tcp_socket(self)
35
- ```
36
- Get the public TCP socket as a (host, port) tuple.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.Volume.md DELETED
@@ -1,480 +0,0 @@
1
- # modal.Volume
2
-
3
-
4
- ```python
5
- class Volume(modal.object.Object)
6
- ```
7
-
8
- A writeable volume that can be used to share files between one or more Modal functions.
9
-
10
- The contents of a volume is exposed as a filesystem. You can use it to share data between different functions, or
11
- to persist durable state across several instances of the same function.
12
-
13
- Unlike a networked filesystem, you need to explicitly reload the volume to see changes made since it was mounted.
14
- Similarly, you need to explicitly commit any changes you make to the volume for the changes to become visible
15
- outside the current container.
16
-
17
- Concurrent modification is supported, but concurrent modifications of the same files should be avoided! Last write
18
- wins in case of concurrent modification of the same file - any data the last writer didn't have when committing
19
- changes will be lost!
20
-
21
- As a result, volumes are typically not a good fit for use cases where you need to make concurrent modifications to
22
- the same file (nor is distributed file locking supported).
23
-
24
- Volumes can only be reloaded if there are no open files for the volume - attempting to reload with open files
25
- will result in an error.
26
-
27
- **Usage**
28
-
29
- ```python
30
- import modal
31
-
32
- app = modal.App()
33
- volume = modal.Volume.from_name("my-persisted-volume", create_if_missing=True)
34
-
35
- @app.function(volumes={"/root/foo": volume})
36
- def f():
37
- with open("/root/foo/bar.txt", "w") as f:
38
- f.write("hello")
39
- volume.commit() # Persist changes
40
-
41
- @app.function(volumes={"/root/foo": volume})
42
- def g():
43
- volume.reload() # Fetch latest changes
44
- with open("/root/foo/bar.txt", "r") as f:
45
- print(f.read())
46
- ```
47
-
48
-
49
- ## hydrate
50
-
51
- ```python
52
- hydrate(self, client=None)
53
- ```
54
- Synchronize the local object with its identity on the Modal server.
55
-
56
- It is rarely necessary to call this method explicitly, as most operations
57
- will lazily hydrate when needed. The main use case is when you need to
58
- access object metadata, such as its ID.
59
-
60
- *Added in v0.72.39*: This method replaces the deprecated `.resolve()` method.
61
-
62
- ## objects
63
-
64
-
65
- ```python
66
- objects: VolumeManager
67
- ```
68
-
69
- Namespace with methods for managing named Volume objects.
70
-
71
-
72
- ### objects.create
73
-
74
- ```python
75
- create(self, name, *, version=None, allow_existing=False, environment_name=None,
76
- client=None)
77
- ```
78
- Create a new named Volume in the workspace environment.
79
-
80
- This does not return a local handle; use `modal.Volume.from_name` to look up the Volume after creation.
81
-
82
- Added in v1.1.2.
83
-
84
- **Parameters**
85
-
86
- <Parameter name="name" type="str" description="Name for the new Volume." />
87
- <Parameter name="version" type="int | None" defaultValue="None" description="Optional VolumeFS backend version (1 or 2); experimental." />
88
- <Parameter name="allow_existing" type="bool" defaultValue="False" description="If True, do nothing when a Volume with this name already exists." />
89
- <Parameter name="environment_name" type="str | None" defaultValue="None" description="Environment to create in; defaults to the active environment." />
90
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use; defaults to `Client.from_env()` when omitted." />
91
-
92
- **Usage**
93
-
94
- ```python notest
95
- modal.Volume.objects.create("my-volume")
96
- ```
97
-
98
- Volumes will be created in the active environment, or another one can be specified:
99
-
100
- ```python notest
101
- modal.Volume.objects.create("my-volume", environment_name="dev")
102
- ```
103
-
104
- By default, an error is raised if the Volume already exists; `allow_existing=True` makes that case a no-op:
105
-
106
- ```python notest
107
- modal.Volume.objects.create("my-volume", allow_existing=True)
108
- ```
109
-
110
- Note that this method does not return a local instance of the Volume. You can use
111
- `modal.Volume.from_name` to perform a lookup after creation.
112
-
113
- ### objects.list
114
-
115
- ```python
116
- list(self, *, max_objects=None, created_before=None, environment_name="",
117
- client=None)
118
- ```
119
- List named Volumes in the workspace environment as hydrated handles.
120
-
121
- Results are ordered newest to oldest. By default, all matching Volumes are returned.
122
-
123
- Added in v1.1.2.
124
-
125
- **Parameters**
126
-
127
- <Parameter name="max_objects" type="int | None" defaultValue="None" description="Maximum number of Volumes to return." />
128
- <Parameter name="created_before" type="datetime | str | None" defaultValue="None" description="Only include Volumes created before this time (datetime or ISO date string)." />
129
- <Parameter name="environment_name" type="str" defaultValue="&quot;&quot;" description="Environment to list from; defaults to the active environment." />
130
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use; defaults to `Client.from_env()` when omitted." />
131
-
132
- **Returns**
133
-
134
- Hydrated `Volume` objects for each named Volume in the listing.
135
-
136
- **Usage**
137
-
138
- ```python
139
- volumes = modal.Volume.objects.list()
140
- print([v.name for v in volumes])
141
- ```
142
-
143
- Volumes will be retrieved from the active environment, or another one can be specified:
144
-
145
- ```python notest
146
- dev_volumes = modal.Volume.objects.list(environment_name="dev")
147
- ```
148
-
149
- By default, all named Volumes are returned, newest to oldest. It's also possible to limit the
150
- number of results and to filter by creation date:
151
-
152
- ```python
153
- volumes = modal.Volume.objects.list(max_objects=10, created_before="2025-01-01")
154
- ```
155
-
156
- ### objects.delete
157
-
158
- ```python
159
- delete(self, name, *, allow_missing=False, environment_name=None, client=None)
160
- ```
161
- Delete a named Volume entirely (not individual files).
162
-
163
- Deletion is irreversible and affects any Apps using this Volume.
164
-
165
- Added in v1.1.2.
166
-
167
- **Parameters**
168
-
169
- <Parameter name="name" type="str" description="Name of the Volume to delete." />
170
- <Parameter name="allow_missing" type="bool" defaultValue="False" description="If True, do nothing when the Volume does not exist." />
171
- <Parameter name="environment_name" type="str | None" defaultValue="None" description="Environment to delete from; defaults to the active environment." />
172
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use; defaults to `Client.from_env()` when omitted." />
173
-
174
- **Usage**
175
-
176
- ```python notest
177
- await modal.Volume.objects.delete("my-volume")
178
- ```
179
-
180
- Volumes will be deleted from the active environment, or another one can be specified:
181
-
182
- ```python notest
183
- await modal.Volume.objects.delete("my-volume", environment_name="dev")
184
- ```
185
-
186
- ## name
187
-
188
- ```python
189
- name(self)
190
- ```
191
-
192
-
193
- ## with_mount_options
194
-
195
- ```python
196
- with_mount_options(self, *, read_only=None, sub_path=None)
197
- ```
198
- Configure options used when mounting this Volume.
199
-
200
- Note that these options are not properties stored with the Volume itself - they can be individually configured
201
- for each Volume - container association.
202
-
203
- **Parameters**
204
-
205
- <Parameter name="read_only" type="bool | None" defaultValue="None" description="Set this to True to make the Volume read only from within containers." />
206
- <Parameter name="sub_path" type="str | PurePosixPath | None" defaultValue="None" description="Only mount this sub_path directory from the Volume. If the directory doesn&#x27;t exist in the Volume, it will be created when the container starts up." />
207
-
208
- **Returns**
209
-
210
- A `Volume` handle with the mount options applied.
211
-
212
- **Usage**
213
-
214
- To mount a volume in read-only mode:
215
-
216
- ```python
217
- import modal
218
-
219
- volume = modal.Volume.from_name("my-volume")
220
-
221
- @app.function(volumes={"/mnt": volume.with_mount_options(read_only=True)})
222
- def f():
223
- return os.mkdir("/mnt/foo") # not possible!
224
- ```
225
-
226
- To mount only part of a Volume using sub_path:
227
-
228
- ```python
229
- import modal
230
-
231
- volume = modal.Volume.from_name("my-volume")
232
-
233
- @app.function(volumes={"/user_data": volume.with_mount_options(sub_path="/users/my_user")})
234
- def f():
235
- return os.listdir("/user_data") # lists data from /users/my_user
236
- ```
237
-
238
- ## from_name
239
-
240
- ```python
241
- from_name(name, *, environment_name=None, create_if_missing=False, version=None,
242
- client=None)
243
- ```
244
- Reference a Volume by name, optionally creating it on the server first.
245
-
246
- Hydration is lazy: metadata is fetched from Modal the first time the handle is used.
247
-
248
- **Parameters**
249
-
250
- <Parameter name="name" type="str" description="Deployment name of the Volume." />
251
- <Parameter name="environment_name" type="str | None" defaultValue="None" description="Environment to resolve the name in; defaults to the active environment." />
252
- <Parameter name="create_if_missing" type="bool" defaultValue="False" description="If True, create the Volume when it does not already exist." />
253
- <Parameter name="version" type="&quot;modal_proto.api_pb2.VolumeFsVersion.ValueType | None&quot;" defaultValue="None" description="Optional VolumeFS backend version; must match an existing Volume when set." />
254
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use for loading; defaults to `Client.from_env()` when omitted." />
255
-
256
- **Returns**
257
-
258
- A `Volume` handle (possibly not yet hydrated).
259
-
260
- **Usage**
261
-
262
- ```python
263
- vol = modal.Volume.from_name("my-volume", create_if_missing=True)
264
-
265
- app = modal.App()
266
-
267
- @app.function(volumes={"/data": vol})
268
- def f():
269
- pass
270
- ```
271
-
272
- ## from_id
273
-
274
- ```python
275
- from_id(volume_id, client=None)
276
- ```
277
- Construct a Volume from an id and look up the Volume metadata.
278
-
279
- This is a lazy method that defers hydrating the local
280
- object with metadata from Modal servers until the first
281
- time it is actually used.
282
-
283
- The ID of a Volume object can be accessed using `.object_id`.
284
-
285
- **Parameters**
286
-
287
- <Parameter name="volume_id" type="str" description="Volume object ID to attach to." />
288
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use for loading; defaults to `Client.from_env()` when omitted." />
289
-
290
- **Returns**
291
-
292
- A `Volume` handle (possibly not yet hydrated).
293
-
294
- **Usage**
295
-
296
- ```python notest
297
- @app.function()
298
- def my_worker(volume_id: str):
299
- vol = modal.Volume.from_id(volume_id)
300
- for entry in vol.listdir("/"):
301
- print(entry.path)
302
-
303
- with modal.Volume.ephemeral() as vol:
304
- my_worker.remote(vol.object_id)
305
- ```
306
-
307
- ## ephemeral
308
-
309
- ```python
310
- ephemeral(cls, client=None, environment_name=None, version=None)
311
- ```
312
- Create an anonymous Volume that exists for the duration of the context manager.
313
-
314
- **Parameters**
315
-
316
- <Parameter name="client" type="_Client | None" defaultValue="None" description="Modal client to use; defaults to `Client.from_env()` when omitted." />
317
- <Parameter name="environment_name" type="str | None" defaultValue="None" description="Environment for the ephemeral Volume; defaults to the active environment." />
318
- <Parameter name="version" type="&quot;modal_proto.api_pb2.VolumeFsVersion.ValueType | None&quot;" defaultValue="None" description="Optional VolumeFS backend version for the ephemeral Volume." />
319
-
320
- **Usage**
321
-
322
- ```python
323
- import modal
324
-
325
- with modal.Volume.ephemeral() as vol:
326
- assert vol.listdir("/") == []
327
- ```
328
-
329
- ```python notest
330
- async with modal.Volume.ephemeral() as vol:
331
- assert await vol.listdir("/") == []
332
- ```
333
-
334
- ## info
335
-
336
- ```python
337
- info(self)
338
- ```
339
- Return information about the Volume object.
340
-
341
- ## commit
342
-
343
- ```python
344
- commit(self)
345
- ```
346
- Commit changes to a mounted volume.
347
-
348
- If successful, the changes made are now persisted in durable storage and available to other containers accessing
349
- the volume.
350
-
351
- ## reload
352
-
353
- ```python
354
- reload(self)
355
- ```
356
- Make latest committed state of volume available in the running container.
357
-
358
- Any uncommitted changes to the volume, such as new or modified files, may implicitly be committed when
359
- reloading.
360
-
361
- Reloading will fail if there are open files for the volume.
362
-
363
- ## iterdir
364
-
365
- ```python
366
- iterdir(self, path, *, recursive=True)
367
- ```
368
- Iterate over all files in a directory in the volume.
369
-
370
- Passing a directory path lists all files in the directory. For a file path, return only that
371
- file's description. If `recursive` is set to True, list all files and folders under the path
372
- recursively.
373
-
374
- ## listdir
375
-
376
- ```python
377
- listdir(self, path, *, recursive=False)
378
- ```
379
- List all files under a path prefix in the modal.Volume.
380
-
381
- Passing a directory path lists all files in the directory. For a file path, return only that
382
- file's description. If `recursive` is set to True, list all files and folders under the path
383
- recursively.
384
-
385
- ## read_file
386
-
387
- ```python
388
- read_file(self, path)
389
- ```
390
- Read a file from the modal.Volume.
391
-
392
- Note - this function is primarily intended to be used outside of a Modal App.
393
- For more information on downloading files from a Modal Volume, see
394
- [the guide](https://modal.com/docs/guide/volumes).
395
-
396
- **Parameters**
397
-
398
- <Parameter name="path" type="str" description="Path to the file inside the Volume." />
399
-
400
- **Usage**
401
-
402
- ```python notest
403
- vol = modal.Volume.from_name("my-modal-volume")
404
- data = b""
405
- for chunk in vol.read_file("1mb.csv"):
406
- data += chunk
407
- print(len(data)) # == 1024 * 1024
408
- ```
409
-
410
- ## remove_file
411
-
412
- ```python
413
- remove_file(self, path, recursive=False)
414
- ```
415
- Remove a file or directory from a volume.
416
-
417
- ## copy_files
418
-
419
- ```python
420
- copy_files(self, src_paths, dst_path, recursive=False)
421
- ```
422
- Copy files within the volume from src_paths to dst_path.
423
- The semantics of the copy operation follow those of the UNIX cp command.
424
-
425
- The `src_paths` parameter is a list. If you want to copy a single file, you should pass a list with a
426
- single element.
427
-
428
- `src_paths` and `dst_path` should refer to the desired location *inside* the volume. You do not need to prepend
429
- the volume mount path.
430
-
431
- Note that if the volume is already mounted on the Modal function, you should use normal filesystem operations
432
- like `os.rename()` and then `commit()` the volume. The `copy_files()` method is useful when you don't have
433
- the volume mounted as a filesystem, e.g. when running a script on your local computer.
434
-
435
- **Parameters**
436
-
437
- <Parameter name="src_paths" type="Sequence[str]" description="Source paths inside the Volume (list of one or more paths)." />
438
- <Parameter name="dst_path" type="str" description="Destination path inside the Volume (file or directory, following ``cp`` semantics)." />
439
- <Parameter name="recursive" type="bool" defaultValue="False" description="Whether to copy directories recursively (V2 volumes only)." />
440
-
441
- **Usage**
442
-
443
- ```python notest
444
- vol = modal.Volume.from_name("my-modal-volume")
445
-
446
- vol.copy_files(["bar/example.txt"], "bar2")
447
- vol.copy_files(["bar/example.txt"], "bar/example2.txt")
448
- ```
449
-
450
- ## batch_upload
451
-
452
- ```python
453
- batch_upload(self, force=False)
454
- ```
455
- Initiate a batched upload to a volume.
456
-
457
- To allow overwriting existing files, set `force` to `True` (you cannot overwrite existing directories with
458
- uploaded files regardless).
459
-
460
- **Parameters**
461
-
462
- <Parameter name="force" type="bool" defaultValue="False" description="If True, allow overwriting existing files with uploads (not directories)." />
463
-
464
- **Usage**
465
-
466
- ```python notest
467
- vol = modal.Volume.from_name("my-modal-volume")
468
-
469
- with vol.batch_upload() as batch:
470
- batch.put_file("local-path.txt", "/remote-path.txt")
471
- batch.put_directory("/local/directory/", "/remote/directory")
472
- batch.put_file(io.BytesIO(b"some data"), "/foobar")
473
- ```
474
-
475
- ## rename
476
-
477
- ```python
478
- rename(old_name, new_name, *, client=None, environment_name=None)
479
- ```
480
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.Workspace.md DELETED
@@ -1,63 +0,0 @@
1
- # modal.Workspace
2
-
3
-
4
- ```python
5
- class Workspace(modal.object.Object)
6
- ```
7
-
8
-
9
- ## hydrate
10
-
11
- ```python
12
- hydrate(self, client=None)
13
- ```
14
- Synchronize the local object with its identity on the Modal server.
15
-
16
- It is rarely necessary to call this method explicitly, as most operations
17
- will lazily hydrate when needed. The main use case is when you need to
18
- access object metadata, such as its ID.
19
-
20
- *Added in v0.72.39*: This method replaces the deprecated `.resolve()` method.
21
-
22
- ## name
23
-
24
- ```python
25
- name(self)
26
- ```
27
-
28
-
29
- ## members
30
-
31
-
32
- ```python
33
- members: WorkspaceMembersManager
34
- ```
35
-
36
- Namespace with methods for managing the membership of a Workspace.
37
-
38
-
39
- ### members.list
40
-
41
- ```python
42
- list(self)
43
- ```
44
- Return the members of the Workspace.
45
-
46
- **Examples:**
47
-
48
- ```python notest
49
- members = modal.Workspace.from_context().members.list()
50
- print([m.name for m in members])
51
- ```
52
-
53
- ## from_context
54
-
55
- ```python
56
- from_context(*, client=None)
57
- ```
58
- Look up the Workspace associated with the current context.
59
-
60
- This returns the Workspace that the active Modal credentials authenticate against
61
- (i.e., your active profile or the `MODAL_TOKEN_ID` / `MODAL_TOKEN_SECRET` environment
62
- variables). If called inside a Modal container, it returns the Workspace that the
63
- container is running in.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.asgi_app.md DELETED
@@ -1,23 +0,0 @@
1
- # modal.asgi_app
2
-
3
- ```python
4
- asgi_app(*, label=None, custom_domains=None, requires_proxy_auth=False)
5
- ```
6
- Decorator for registering an ASGI app as a Web Function.
7
-
8
- Asynchronous Server Gateway Interface (ASGI) is a standard for Python
9
- web apps, supported by all popular Python web libraries.
10
-
11
- To learn how to use Modal with popular web frameworks, see the
12
- [guide on Web Functions](https://modal.com/docs/guide/webhooks).
13
-
14
- **Usage**
15
-
16
- ```python
17
- from typing import Callable
18
-
19
- @app.function()
20
- @modal.asgi_app()
21
- def create_asgi() -> Callable:
22
- ...
23
- ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.batched.md DELETED
@@ -1,28 +0,0 @@
1
- # modal.batched
2
-
3
- ```python
4
- batched(*, max_batch_size, wait_ms)
5
- ```
6
- Decorator for functions or class methods that should be batched.
7
-
8
- See the [dynamic batching guide](https://modal.com/docs/guide/dynamic-batching) for more information.
9
-
10
- **Usage**
11
-
12
- ```python
13
- # Stack the decorator under `@app.function()` to enable dynamic batching
14
- @app.function()
15
- @modal.batched(max_batch_size=4, wait_ms=1000)
16
- async def batched_multiply(xs: list[int], ys: list[int]) -> list[int]:
17
- return [x * y for x, y in zip(xs, ys)]
18
-
19
- # call batched_multiply with individual inputs
20
- # batched_multiply.remote.aio(2, 100)
21
-
22
- # With `@app.cls()`, apply the decorator to a method (this may change in the future)
23
- @app.cls()
24
- class BatchedClass:
25
- @modal.batched(max_batch_size=4, wait_ms=1000)
26
- def batched_multiply(self, xs: list[int], ys: list[int]) -> list[int]:
27
- return [x * y for x, y in zip(xs, ys)]
28
- ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.billing.md DELETED
@@ -1,46 +0,0 @@
1
- # modal.billing
2
-
3
- ## modal.billing.WorkspaceBillingReportItem
4
-
5
- ```python
6
- class WorkspaceBillingReportItem(TypedDict):
7
- object_id: str
8
- description: str
9
- environment_name: str
10
- interval_start: datetime.datetime
11
- cost: decimal.Decimal
12
- tags: dict[str, str]
13
- ```
14
-
15
- ## modal.billing.workspace_billing_report
16
-
17
- ```python
18
- workspace_billing_report(*, start, end=None, resolution="d", tag_names=None,
19
- client=None)
20
- ```
21
- Generate a tabular report of workspace usage by object and time.
22
-
23
- The result will be a list of dictionaries for each interval (determined by `resolution`)
24
- between the `start` and `end` limits. The dictionary represents a single Modal object
25
- that billing can be attributed to (e.g., an App) along with metadata (including user-defined
26
- tags) for identifying that object.
27
-
28
- The `start` and `end` parameters are required to either have a UTC timezone or to be
29
- timezone-naive (which will be interpreted as UTC times). The timestamps in the result will
30
- be in UTC. Cost will be reported for full intervals, even if the provided `start` or `end`
31
- parameters are partial: `start` will be rounded to the beginning of its interval, while
32
- partial `end` intervals will be excluded.
33
-
34
- Additional user-provided metadata can be included in the report if the objects have tags
35
- and `tag_names` (i.e., keys) are specified in the request. Alternatively, pass `tag_names=["*"]`
36
- to include all tags in the report. Note that tags will be attributed to the entire interval even
37
- if they were added or removed at some point within it. If the tag name was not in use during an
38
- interval, it will be absent from the tags dictionary in that output row.
39
-
40
- In most cases, billing data will be available in the database that this API queries within
41
- minutes, although there may be collection delays. If completeness is important for your use
42
- case, we recommend leaving a buffer after the end of the query interval.
43
-
44
- It's also possible to generate reports using the
45
- [`modal billing report`](https://modal.com/docs/reference/cli/billing) CLI command. The CLI
46
- has a few convenience features for generating reports across relative time ranges.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.call_graph.md DELETED
@@ -1,33 +0,0 @@
1
- # modal.call_graph
2
-
3
- ## modal.call_graph.InputInfo
4
-
5
-
6
- ```python
7
- class InputInfo(object)
8
- ```
9
-
10
- Simple data structure storing information about a function input.
11
-
12
- ```python
13
- __init__(self, input_id, function_call_id, task_id, status, function_name,
14
- module_name, children)
15
- ```
16
-
17
- ## modal.call_graph.InputStatus
18
-
19
-
20
- ```python
21
- class InputStatus(enum.IntEnum)
22
- ```
23
-
24
- Enum representing status of a function input.
25
-
26
- The possible values are:
27
-
28
- * `PENDING`
29
- * `SUCCESS`
30
- * `FAILURE`
31
- * `INIT_FAILURE`
32
- * `TERMINATED`
33
- * `TIMEOUT`
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.concurrent.md DELETED
@@ -1,45 +0,0 @@
1
- # modal.concurrent
2
-
3
- ```python
4
- concurrent(*, max_inputs=None, target_inputs=None)
5
- ```
6
- Decorator that allows individual containers to handle multiple inputs concurrently.
7
-
8
- The concurrency mechanism depends on whether the function is async or not:
9
- - Async functions will run inputs on a single thread as asyncio tasks.
10
- - Synchronous functions will use multi-threading. The code must be thread-safe.
11
-
12
- Input concurrency will be most useful for workflows that are IO-bound
13
- (e.g., making network requests) or when running an inference server that supports
14
- dynamic batching.
15
-
16
- When `target_inputs` is set, Modal's autoscaler will try to provision resources
17
- such that each container is running that many inputs concurrently, rather than
18
- autoscaling based on `max_inputs`. Containers may burst up to up to `max_inputs`
19
- if resources are insufficient to remain at the target concurrency, e.g. when the
20
- arrival rate of inputs increases. This can trade-off a small increase in average
21
- latency to avoid larger tail latencies from input queuing.
22
-
23
- *Added in v0.73.148:* This decorator replaces the `allow_concurrent_inputs` parameter
24
- in `@app.function()` and `@app.cls()`.
25
-
26
- **Usage**
27
-
28
- ```python
29
- # Stack the decorator under `@app.function()` to enable input concurrency
30
- @app.function()
31
- @modal.concurrent(max_inputs=100)
32
- async def f(data):
33
- # Async function; will be scheduled as asyncio task
34
- ...
35
-
36
- # With `@app.cls()`, apply the decorator at the class level, not on individual methods
37
- @app.cls()
38
- @modal.concurrent(max_inputs=100, target_inputs=80)
39
- class C:
40
- @modal.method()
41
- def f(self, data):
42
- # Sync function; must be thread-safe
43
- ...
44
-
45
- ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.config.md DELETED
@@ -1,163 +0,0 @@
1
- # modal.config
2
-
3
- Modal intentionally keeps configurability to a minimum.
4
-
5
- The main configuration options are the API tokens: the token id and the token secret.
6
- These can be configured in two ways:
7
-
8
- 1. By running the `modal token set` command.
9
- This writes the tokens to `.modal.toml` file in your home directory.
10
- 2. By setting the environment variables `MODAL_TOKEN_ID` and `MODAL_TOKEN_SECRET`.
11
- This takes precedence over the previous method.
12
-
13
- .modal.toml
14
- ---------------
15
-
16
- The `.modal.toml` file is generally stored in your home directory.
17
- It should look like this::
18
-
19
- ```toml
20
- [default]
21
- token_id = "ak-12345..."
22
- token_secret = "as-12345..."
23
- ```
24
-
25
- You can create this file manually, or you can run the `modal token set ...`
26
- command (see below).
27
-
28
- Setting tokens using the CLI
29
- ----------------------------
30
-
31
- You can set a token by running the command::
32
-
33
- ```
34
- modal token set \
35
- --token-id <token id> \
36
- --token-secret <token secret>
37
- ```
38
-
39
- This will write the token id and secret to `.modal.toml`.
40
-
41
- If the token id or secret is provided as the string `-` (a single dash),
42
- then it will be read in a secret way from stdin instead.
43
-
44
- Other configuration options
45
- ---------------------------
46
-
47
- Other possible configuration options are:
48
-
49
- * `loglevel` (in the .toml file) / `MODAL_LOGLEVEL` (as an env var).
50
- Defaults to `WARNING`. Set this to `DEBUG` to see internal messages.
51
- * `logs_timeout` (in the .toml file) / `MODAL_LOGS_TIMEOUT` (as an env var).
52
- Defaults to 10.
53
- Number of seconds to wait for logs to drain when closing the session,
54
- before giving up.
55
- * `max_throttle_wait` (in the .toml file) / `MODAL_MAX_THROTTLE_WAIT` (as an env var).
56
- Defaults to None (no limit).
57
- Maximum number of seconds to wait when requests are being throttled (i.e., due
58
- to rate limiting or other cases that can normally be resolved through backoff).
59
- * `force_build` (in the .toml file) / `MODAL_FORCE_BUILD` (as an env var).
60
- Defaults to False.
61
- When set, ignores the Image cache and builds all Image layers. Note that this
62
- will break the cache for all images based on the rebuilt layers, so other images
63
- may rebuild on subsequent runs / deploys even if the config is reverted.
64
- * `ignore_cache` (in the .toml file) / `MODAL_IGNORE_CACHE` (as an env var).
65
- Defaults to False.
66
- When set, ignores the Image cache and builds all Image layers. Unlike `force_build`,
67
- this will not overwrite the cache for other images that have the same recipe.
68
- Subsequent runs that do not use this option will pull the *previous* Image from
69
- the cache, if one exists. It can be useful for testing an App's robustness to
70
- Image rebuilds without clobbering Images used by other Apps.
71
- * `traceback` (in the .toml file) / `MODAL_TRACEBACK` (as an env var).
72
- Defaults to False. Enables printing full tracebacks on unexpected CLI
73
- errors, which can be useful for debugging client issues.
74
- * `log_pattern` (in the .toml file) / `MODAL_LOG_PATTERN` (as an env var).
75
- Defaults to `"[modal-client] %(asctime)s %(message)s"`
76
- The log formatting pattern that will be used by the modal client itself.
77
- See https://docs.python.org/3/library/logging.html#logrecord-attributes for available
78
- log attributes.
79
- * `dev_suffix` (in the .toml file) / `MODAL_DEV_SUFFIX` (as an env var).
80
- Overrides the default `-dev` suffix added to URLs generated for Web Functions
81
- when the App is ephemeral (i.e., created via `modal serve`). Must be a short
82
- alphanumeric string.
83
-
84
- Meta-configuration
85
- ------------------
86
-
87
- Some "meta-options" are set using environment variables only:
88
-
89
- * `MODAL_CONFIG_PATH` lets you override the location of the .toml file,
90
- by default `~/.modal.toml`.
91
- * `MODAL_PROFILE` lets you use multiple sections in the .toml file
92
- and switch between them. It defaults to "default".
93
-
94
- ## modal.config.Config
95
-
96
-
97
- ```python
98
- class Config(object)
99
- ```
100
-
101
- Singleton that holds configuration used by Modal internally.
102
-
103
- ```python
104
- __init__(self)
105
- ```
106
-
107
-
108
- ### get
109
-
110
- ```python
111
- get(self, key, profile=None, use_env=True)
112
- ```
113
- Look up a configuration value.
114
-
115
- Resolution order (highest priority first):
116
-
117
- 1. Environment variable ``MODAL_<KEY>`` (underscore-separated, uppercased), when ``use_env`` is True.
118
- 2. The named profile in ``.modal.toml``.
119
- 3. The built-in default for that setting.
120
-
121
- **Parameters**
122
-
123
- <Parameter name="key" type="" description="Setting name (for example ``&quot;loglevel&quot;`` or ``&quot;server_url&quot;``); see the ``modal.config`` module docs." />
124
- <Parameter name="profile" type="" defaultValue="None" description="Profile section to read from the TOML file; defaults to the active profile." />
125
- <Parameter name="use_env" type="" defaultValue="True" description="When False, skip environment variables and read only from the file or defaults." />
126
-
127
- **Returns**
128
-
129
- The transformed configuration value (type depends on the setting).
130
-
131
- ### override_locally
132
-
133
- ```python
134
- override_locally(self, key, value)
135
- ```
136
-
137
-
138
- ### to_dict
139
-
140
- ```python
141
- to_dict(self)
142
- ```
143
-
144
- ## modal.config.config_profiles
145
-
146
- ```python
147
- config_profiles()
148
- ```
149
- List the available Modal profiles in the ``.modal.toml`` file.
150
-
151
- **Returns**
152
-
153
- Profile section names present in the configuration file.
154
- ## modal.config.config_set_active_profile
155
-
156
- ```python
157
- config_set_active_profile(profile)
158
- ```
159
- Set the user's active Modal profile by writing it to the ``.modal.toml`` file.
160
-
161
- **Parameters**
162
-
163
- <Parameter name="profile" type="str" description="Name of an existing profile section to mark as active." />
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.container_process.md DELETED
@@ -1,64 +0,0 @@
1
- # modal.container_process
2
-
3
- ## modal.container_process.ContainerProcess
4
-
5
-
6
- ```python
7
- class ContainerProcess(typing.Generic)
8
- ```
9
-
10
- Represents a running process in a container.
11
-
12
- Container processes communicate via direct communication with
13
- the Modal worker where the container is running.
14
-
15
- ```python
16
- __init__(self, process_id, task_id, client, command_router_client,
17
- stdout=StreamType.PIPE, stderr=StreamType.PIPE, exec_deadline=None,
18
- text=True, by_line=False)
19
- ```
20
-
21
-
22
- ### stdout
23
-
24
- ```python
25
- stdout(self)
26
- ```
27
- StreamReader for the container process's stdout stream.
28
-
29
- ### stderr
30
-
31
- ```python
32
- stderr(self)
33
- ```
34
- StreamReader for the container process's stderr stream.
35
-
36
- ### stdin
37
-
38
- ```python
39
- stdin(self)
40
- ```
41
- StreamWriter for the container process's stdin stream.
42
-
43
- ### returncode
44
-
45
- ```python
46
- returncode(self)
47
- ```
48
-
49
-
50
- ### poll
51
-
52
- ```python
53
- poll(self)
54
- ```
55
- Check if the container process has finished running.
56
-
57
- Returns `None` if the process is still running, else returns the exit code.
58
-
59
- ### wait
60
-
61
- ```python
62
- wait(self)
63
- ```
64
- Wait for the container process to finish running. Returns the exit code.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.current_function_call_id.md DELETED
@@ -1,16 +0,0 @@
1
- # modal.current_function_call_id
2
-
3
- ```python
4
- current_function_call_id()
5
- ```
6
- Returns the function call ID for the current input.
7
-
8
- Can only be called from Modal function (i.e. in a container context).
9
-
10
- ```python
11
- from modal import current_function_call_id
12
-
13
- @app.function()
14
- def process_stuff():
15
- print(f"Starting to process input from {current_function_call_id()}")
16
- ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.current_input_id.md DELETED
@@ -1,16 +0,0 @@
1
- # modal.current_input_id
2
-
3
- ```python
4
- current_input_id()
5
- ```
6
- Returns the input ID for the current input.
7
-
8
- Can only be called from Modal function (i.e. in a container context).
9
-
10
- ```python
11
- from modal import current_input_id
12
-
13
- @app.function()
14
- def process_stuff():
15
- print(f"Starting to process {current_input_id()}")
16
- ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.enable_output.md DELETED
@@ -1,20 +0,0 @@
1
- # modal.enable_output
2
-
3
- ```python
4
- enable_output()
5
- ```
6
- Context manager that enable output when using the Python SDK.
7
-
8
- This will print to stdout and stderr things such as
9
- 1. Logs from running functions
10
- 2. Status of creating objects
11
- 3. Map progress
12
-
13
- **Usage**
14
-
15
- ```python
16
- app = modal.App()
17
- with modal.enable_output():
18
- with app.run():
19
- ...
20
- ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.enter.md DELETED
@@ -1,8 +0,0 @@
1
- # modal.enter
2
-
3
- ```python
4
- enter(*, snap=False)
5
- ```
6
- Decorator for methods which should be executed when a new container is started.
7
-
8
- See the [lifeycle function guide](https://modal.com/docs/guide/lifecycle-functions#enter) for more information.
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.exception.md DELETED
@@ -1,766 +0,0 @@
1
- # modal.exception
2
-
3
- Modal-specific exception types.
4
-
5
- ## Notes on `grpclib.GRPCError` migration
6
-
7
- Historically, the Modal SDK could propagate `grpclib.GRPCError` exceptions out
8
- to user code. As of v1.3, we are in the process of gracefully migrating to
9
- always raising a Modal exception type in these cases. To avoid breaking user
10
- code that relies on catching `grpclib.GRPCError`, a subset of Modal exception
11
- types temporarily inherit from `grpclib.GRPCError`.
12
-
13
- We encourage users to migrate any code that currently catches `grpclib.GRPCError`
14
- to instead catch the appropriate Modal exception type. The following mapping
15
- between GRPCError status codes and Modal exception types is currently in use:
16
-
17
- ```
18
- CANCELLED -> ServiceError
19
- UNKNOWN -> ServiceError
20
- INVALID_ARGUMENT -> InvalidError
21
- DEADLINE_EXCEEDED -> ServiceError
22
- NOT_FOUND -> NotFoundError
23
- ALREADY_EXISTS -> AlreadyExistsError
24
- PERMISSION_DENIED -> PermissionDeniedError
25
- RESOURCE_EXHAUSTED -> ResourceExhaustedError
26
- FAILED_PRECONDITION -> ConflictError
27
- ABORTED -> ConflictError
28
- OUT_OF_RANGE -> InvalidError
29
- UNIMPLEMENTED -> UnimplementedError
30
- INTERNAL -> InternalError
31
- UNAVAILABLE -> ServiceError
32
- DATA_LOSS -> DataLossError
33
- UNAUTHENTICATED -> AuthError
34
- ```
35
-
36
- ## modal.exception.AlreadyExistsError
37
-
38
-
39
- ```python
40
- class AlreadyExistsError(modal.exception.Error, modal.exception._GRPCErrorWrapper)
41
- ```
42
-
43
- Raised when a resource creation conflicts with an existing resource.
44
-
45
- ```python
46
- __init__(self, message=None)
47
- ```
48
-
49
-
50
- ### message
51
-
52
- ```python
53
- message(self)
54
- ```
55
-
56
-
57
- ### status
58
-
59
- ```python
60
- status(self)
61
- ```
62
-
63
-
64
- ### details
65
-
66
- ```python
67
- details(self)
68
- ```
69
-
70
- ## modal.exception.AsyncUsageWarning
71
-
72
-
73
- ```python
74
- class AsyncUsageWarning(UserWarning)
75
- ```
76
-
77
- Warning emitted when a blocking Modal interface is used in an async context.
78
-
79
- ## modal.exception.AuthError
80
-
81
-
82
- ```python
83
- class AuthError(modal.exception.Error, modal.exception._GRPCErrorWrapper)
84
- ```
85
-
86
- Raised when a client has missing or invalid authentication.
87
-
88
- ```python
89
- __init__(self, message=None)
90
- ```
91
-
92
-
93
- ### message
94
-
95
- ```python
96
- message(self)
97
- ```
98
-
99
-
100
- ### status
101
-
102
- ```python
103
- status(self)
104
- ```
105
-
106
-
107
- ### details
108
-
109
- ```python
110
- details(self)
111
- ```
112
-
113
- ## modal.exception.ClientClosed
114
-
115
-
116
- ```python
117
- class ClientClosed(modal.exception.Error)
118
- ```
119
-
120
- ## modal.exception.ConflictError
121
-
122
-
123
- ```python
124
- class ConflictError(modal.exception.InvalidError, modal.exception._GRPCErrorWrapper)
125
- ```
126
-
127
- Raised when a resource conflict occurs between the request and current system state.
128
-
129
- ```python
130
- __init__(self, message=None)
131
- ```
132
-
133
-
134
- ### message
135
-
136
- ```python
137
- message(self)
138
- ```
139
-
140
-
141
- ### status
142
-
143
- ```python
144
- status(self)
145
- ```
146
-
147
-
148
- ### details
149
-
150
- ```python
151
- details(self)
152
- ```
153
-
154
- ## modal.exception.ConnectionError
155
-
156
-
157
- ```python
158
- class ConnectionError(modal.exception.Error)
159
- ```
160
-
161
- Raised when an issue occurs while connecting to the Modal servers.
162
-
163
- ## modal.exception.DataLossError
164
-
165
-
166
- ```python
167
- class DataLossError(modal.exception.Error, modal.exception._GRPCErrorWrapper)
168
- ```
169
-
170
- Raised when data is lost or corrupted.
171
-
172
- ```python
173
- __init__(self, message=None)
174
- ```
175
-
176
-
177
- ### message
178
-
179
- ```python
180
- message(self)
181
- ```
182
-
183
-
184
- ### status
185
-
186
- ```python
187
- status(self)
188
- ```
189
-
190
-
191
- ### details
192
-
193
- ```python
194
- details(self)
195
- ```
196
-
197
- ## modal.exception.DeprecationError
198
-
199
-
200
- ```python
201
- class DeprecationError(UserWarning)
202
- ```
203
-
204
- UserWarning category emitted when a deprecated Modal feature or API is used.
205
-
206
- ## modal.exception.DeserializationError
207
-
208
-
209
- ```python
210
- class DeserializationError(modal.exception.Error)
211
- ```
212
-
213
- Raised to provide more context when an error is encountered during deserialization.
214
-
215
- ## modal.exception.Error
216
-
217
-
218
- ```python
219
- class Error(Exception)
220
- ```
221
-
222
- Base class for all Modal errors. See [`modal.exception`](https://modal.com/docs/reference/modal.exception)
223
- for the specialized error classes.
224
-
225
- **Usage**
226
-
227
- ```python notest
228
- import modal
229
-
230
- try:
231
- ...
232
- except modal.Error:
233
- # Catch any exception raised by Modal's systems.
234
- print("Responding to error...")
235
- ```
236
-
237
- ## modal.exception.ExecTimeoutError
238
-
239
-
240
- ```python
241
- class ExecTimeoutError(modal.exception.TimeoutError)
242
- ```
243
-
244
- Raised when a container process exceeds its execution duration limit and times out.
245
-
246
- ## modal.exception.ExecutionError
247
-
248
-
249
- ```python
250
- class ExecutionError(modal.exception.Error)
251
- ```
252
-
253
- Raised when something unexpected happened during runtime.
254
-
255
- ## modal.exception.FilesystemExecutionError
256
-
257
-
258
- ```python
259
- class FilesystemExecutionError(modal.exception.Error)
260
- ```
261
-
262
- Raised when an unknown error is thrown during a container filesystem operation.
263
-
264
- ## modal.exception.FunctionTimeoutError
265
-
266
-
267
- ```python
268
- class FunctionTimeoutError(modal.exception.TimeoutError)
269
- ```
270
-
271
- Raised when a Function exceeds its execution duration limit and times out.
272
-
273
- ## modal.exception.InputCancellation
274
-
275
-
276
- ```python
277
- class InputCancellation(BaseException)
278
- ```
279
-
280
- Raised when the current input is cancelled by the task
281
-
282
- Intentionally a BaseException instead of an Exception, so it won't get
283
- caught by unspecified user exception clauses that might be used for retries and
284
- other control flow.
285
-
286
- ## modal.exception.InteractiveTimeoutError
287
-
288
-
289
- ```python
290
- class InteractiveTimeoutError(modal.exception.TimeoutError)
291
- ```
292
-
293
- Raised when interactive frontends time out while trying to connect to a container.
294
-
295
- ## modal.exception.InternalError
296
-
297
-
298
- ```python
299
- class InternalError(modal.exception.Error, modal.exception._GRPCErrorWrapper)
300
- ```
301
-
302
- Raised when an internal error occurs in the Modal system.
303
-
304
- ```python
305
- __init__(self, message=None)
306
- ```
307
-
308
-
309
- ### message
310
-
311
- ```python
312
- message(self)
313
- ```
314
-
315
-
316
- ### status
317
-
318
- ```python
319
- status(self)
320
- ```
321
-
322
-
323
- ### details
324
-
325
- ```python
326
- details(self)
327
- ```
328
-
329
- ## modal.exception.InternalFailure
330
-
331
-
332
- ```python
333
- class InternalFailure(modal.exception.Error)
334
- ```
335
-
336
- Retriable internal error.
337
-
338
- ## modal.exception.InvalidError
339
-
340
-
341
- ```python
342
- class InvalidError(modal.exception.Error, modal.exception._GRPCErrorWrapper)
343
- ```
344
-
345
- Raised when user does something invalid.
346
-
347
- ```python
348
- __init__(self, message=None)
349
- ```
350
-
351
-
352
- ### message
353
-
354
- ```python
355
- message(self)
356
- ```
357
-
358
-
359
- ### status
360
-
361
- ```python
362
- status(self)
363
- ```
364
-
365
-
366
- ### details
367
-
368
- ```python
369
- details(self)
370
- ```
371
-
372
- ## modal.exception.LogsFetchError
373
-
374
-
375
- ```python
376
- class LogsFetchError(modal.exception.Error)
377
- ```
378
-
379
- Raised when trying to fetch too many logs.
380
-
381
- ## modal.exception.ModuleNotMountable
382
-
383
-
384
- ```python
385
- class ModuleNotMountable(Exception)
386
- ```
387
-
388
- ## modal.exception.MountUploadTimeoutError
389
-
390
-
391
- ```python
392
- class MountUploadTimeoutError(modal.exception.TimeoutError)
393
- ```
394
-
395
- Raised when a Mount upload times out.
396
-
397
- ## modal.exception.NotFoundError
398
-
399
-
400
- ```python
401
- class NotFoundError(modal.exception.Error, modal.exception._GRPCErrorWrapper)
402
- ```
403
-
404
- Raised when a requested resource was not found.
405
-
406
- ```python
407
- __init__(self, message=None)
408
- ```
409
-
410
-
411
- ### message
412
-
413
- ```python
414
- message(self)
415
- ```
416
-
417
-
418
- ### status
419
-
420
- ```python
421
- status(self)
422
- ```
423
-
424
-
425
- ### details
426
-
427
- ```python
428
- details(self)
429
- ```
430
-
431
- ## modal.exception.OutputExpiredError
432
-
433
-
434
- ```python
435
- class OutputExpiredError(modal.exception.TimeoutError)
436
- ```
437
-
438
- Raised when the Output exceeds expiration and times out.
439
-
440
- ## modal.exception.PermissionDeniedError
441
-
442
-
443
- ```python
444
- class PermissionDeniedError(modal.exception.Error, modal.exception._GRPCErrorWrapper)
445
- ```
446
-
447
- Raised when a user does not have permission to perform the requested operation.
448
-
449
- ```python
450
- __init__(self, message=None)
451
- ```
452
-
453
-
454
- ### message
455
-
456
- ```python
457
- message(self)
458
- ```
459
-
460
-
461
- ### status
462
-
463
- ```python
464
- status(self)
465
- ```
466
-
467
-
468
- ### details
469
-
470
- ```python
471
- details(self)
472
- ```
473
-
474
- ## modal.exception.RemoteError
475
-
476
-
477
- ```python
478
- class RemoteError(modal.exception.Error)
479
- ```
480
-
481
- Raised when an error occurs on the Modal server.
482
-
483
- ## modal.exception.RequestSizeError
484
-
485
-
486
- ```python
487
- class RequestSizeError(modal.exception.Error)
488
- ```
489
-
490
- Raised when an operation produces a gRPC request that is rejected by the server for being too large.
491
-
492
- ## modal.exception.ResourceExhaustedError
493
-
494
-
495
- ```python
496
- class ResourceExhaustedError(modal.exception.Error, modal.exception._GRPCErrorWrapper)
497
- ```
498
-
499
- Raised when a server-side resource has been exhausted, e.g. a quota or rate limit.
500
-
501
- ```python
502
- __init__(self, message=None)
503
- ```
504
-
505
-
506
- ### message
507
-
508
- ```python
509
- message(self)
510
- ```
511
-
512
-
513
- ### status
514
-
515
- ```python
516
- status(self)
517
- ```
518
-
519
-
520
- ### details
521
-
522
- ```python
523
- details(self)
524
- ```
525
-
526
- ## modal.exception.SandboxFilesystemDirectoryNotEmptyError
527
-
528
-
529
- ```python
530
- class SandboxFilesystemDirectoryNotEmptyError(modal.exception.SandboxFilesystemError)
531
- ```
532
-
533
- Raised when a directory is not empty.
534
-
535
- ## modal.exception.SandboxFilesystemError
536
-
537
-
538
- ```python
539
- class SandboxFilesystemError(modal.exception.Error)
540
- ```
541
-
542
- Base class for sandbox filesystem errors.
543
-
544
- ## modal.exception.SandboxFilesystemFileTooLargeError
545
-
546
-
547
- ```python
548
- class SandboxFilesystemFileTooLargeError(modal.exception.SandboxFilesystemError)
549
- ```
550
-
551
- Raised when a file exceeds the maximum allowed size for a read operation in the sandbox.
552
-
553
- ## modal.exception.SandboxFilesystemIsADirectoryError
554
-
555
-
556
- ```python
557
- class SandboxFilesystemIsADirectoryError(modal.exception.SandboxFilesystemError)
558
- ```
559
-
560
- Raised when a file operation in the sandbox targets a directory when it should target a non-directory file.
561
-
562
- ## modal.exception.SandboxFilesystemNotADirectoryError
563
-
564
-
565
- ```python
566
- class SandboxFilesystemNotADirectoryError(modal.exception.SandboxFilesystemError)
567
- ```
568
-
569
- Raised when a path component in the sandbox is not a directory.
570
-
571
- ## modal.exception.SandboxFilesystemNotFoundError
572
-
573
-
574
- ```python
575
- class SandboxFilesystemNotFoundError(modal.exception.SandboxFilesystemError)
576
- ```
577
-
578
- Raised when a file or directory is not found in the sandbox.
579
-
580
- ## modal.exception.SandboxFilesystemPathAlreadyExistsError
581
-
582
-
583
- ```python
584
- class SandboxFilesystemPathAlreadyExistsError(modal.exception.SandboxFilesystemError)
585
- ```
586
-
587
- Raised when a path already exists and the operation requires it to be absent.
588
-
589
- ## modal.exception.SandboxFilesystemPermissionError
590
-
591
-
592
- ```python
593
- class SandboxFilesystemPermissionError(modal.exception.SandboxFilesystemError)
594
- ```
595
-
596
- Raised when permission is denied for a file operation in the sandbox.
597
-
598
- ## modal.exception.SandboxTerminatedError
599
-
600
-
601
- ```python
602
- class SandboxTerminatedError(modal.exception.Error)
603
- ```
604
-
605
- Raised when a Sandbox is terminated for an internal reason.
606
-
607
- ## modal.exception.SandboxTimeoutError
608
-
609
-
610
- ```python
611
- class SandboxTimeoutError(modal.exception.TimeoutError)
612
- ```
613
-
614
- Raised when a Sandbox exceeds its execution duration limit and times out.
615
-
616
- ## modal.exception.SerializationError
617
-
618
-
619
- ```python
620
- class SerializationError(modal.exception.Error)
621
- ```
622
-
623
- Raised to provide more context when an error is encountered during serialization.
624
-
625
- ## modal.exception.ServerWarning
626
-
627
-
628
- ```python
629
- class ServerWarning(UserWarning)
630
- ```
631
-
632
- Warning originating from the Modal server and re-issued in client code.
633
-
634
- ## modal.exception.ServiceError
635
-
636
-
637
- ```python
638
- class ServiceError(modal.exception.Error, modal.exception._GRPCErrorWrapper)
639
- ```
640
-
641
- Raised when an error occurs in basic client/server communication.
642
-
643
- ```python
644
- __init__(self, message=None)
645
- ```
646
-
647
-
648
- ### message
649
-
650
- ```python
651
- message(self)
652
- ```
653
-
654
-
655
- ### status
656
-
657
- ```python
658
- status(self)
659
- ```
660
-
661
-
662
- ### details
663
-
664
- ```python
665
- details(self)
666
- ```
667
-
668
- ## modal.exception.TimeoutError
669
-
670
-
671
- ```python
672
- class TimeoutError(modal.exception.Error)
673
- ```
674
-
675
- Base class for Modal timeouts.
676
-
677
- ## modal.exception.UnimplementedError
678
-
679
-
680
- ```python
681
- class UnimplementedError(modal.exception.Error, modal.exception._GRPCErrorWrapper)
682
- ```
683
-
684
- Raised when a requested operation is not implemented or not supported.
685
-
686
- ```python
687
- __init__(self, message=None)
688
- ```
689
-
690
-
691
- ### message
692
-
693
- ```python
694
- message(self)
695
- ```
696
-
697
-
698
- ### status
699
-
700
- ```python
701
- status(self)
702
- ```
703
-
704
-
705
- ### details
706
-
707
- ```python
708
- details(self)
709
- ```
710
-
711
- ## modal.exception.VersionError
712
-
713
-
714
- ```python
715
- class VersionError(modal.exception.Error)
716
- ```
717
-
718
- Raised when the current client version of Modal is unsupported.
719
-
720
- ## modal.exception.VolumeUploadTimeoutError
721
-
722
-
723
- ```python
724
- class VolumeUploadTimeoutError(modal.exception.TimeoutError)
725
- ```
726
-
727
- Raised when a Volume upload times out.
728
-
729
- ## modal.exception.WorkspaceManagementError
730
-
731
-
732
- ```python
733
- class WorkspaceManagementError(modal.exception.Error)
734
- ```
735
-
736
- Raised when an error occurs while managing a workspace.
737
-
738
- ## modal.exception.simulate_preemption
739
-
740
- ```python
741
- simulate_preemption(wait_seconds, jitter_seconds=0)
742
- ```
743
- Utility for simulating a preemption interrupt after `wait_seconds` seconds.
744
- The first interrupt is the SIGINT signal. After 30 seconds, a second
745
- interrupt will trigger.
746
-
747
- This second interrupt simulates SIGKILL, and should not be caught.
748
- Optionally add between zero and `jitter_seconds` seconds of additional waiting before first interrupt.
749
-
750
- **Usage**
751
-
752
- ```python notest
753
- import time
754
- from modal.exception import simulate_preemption
755
-
756
- simulate_preemption(3)
757
-
758
- try:
759
- time.sleep(4)
760
- except KeyboardInterrupt:
761
- print("got preempted") # Handle interrupt
762
- raise
763
- ```
764
-
765
- See https://modal.com/docs/guide/preemption for more details on preemption
766
- handling.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.exit.md DELETED
@@ -1,8 +0,0 @@
1
- # modal.exit
2
-
3
- ```python
4
- exit(_warn_parentheses_missing=None)
5
- ```
6
- Decorator for methods which should be executed when a container is about to exit.
7
-
8
- See the [lifeycle function guide](https://modal.com/docs/guide/lifecycle-functions#exit) for more information.
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.fastapi_endpoint.md DELETED
@@ -1,20 +0,0 @@
1
- # modal.fastapi_endpoint
2
-
3
- ```python
4
- fastapi_endpoint(*, method="GET", label=None, custom_domains=None, docs=False,
5
- requires_proxy_auth=False)
6
- ```
7
- Create a Web Function that can be addressed via HTTP at a public URL.
8
-
9
- Modal will internally use [FastAPI](https://fastapi.tiangolo.com/) to expose a
10
- simple, single request handler. If you are defining your own `FastAPI` application
11
- (e.g. if you want to define multiple routes), use `@modal.asgi_app` instead.
12
-
13
- The Web Function created with this decorator will automatically have
14
- [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) enabled
15
- and can leverage many of FastAPI's features.
16
-
17
- For more information on using Modal with popular web frameworks, see our
18
- [guide on Web Functions](https://modal.com/docs/guide/webhooks).
19
-
20
- *Added in v0.73.82*: This function replaces the deprecated `@web_endpoint` decorator.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.file_io.md DELETED
@@ -1,152 +0,0 @@
1
- # modal.file_io
2
-
3
- ## modal.file_io.FileIO
4
-
5
-
6
- ```python
7
- class FileIO(typing.Generic)
8
- ```
9
-
10
- [Alpha] FileIO handle, used in the Sandbox filesystem API.
11
-
12
- Deprecated on 2026-03-09. Use the `Sandbox.filesystem` APIs instead.
13
-
14
- The API is designed to mimic Python's io.FileIO.
15
-
16
- Currently this API is in Alpha and is subject to change. File I/O operations
17
- may be limited in size to 100 MiB, and the throughput of requests is
18
- restricted in the current implementation. For our recommendations on large file transfers
19
- see the Sandbox [filesystem access guide](https://modal.com/docs/guide/sandbox-files).
20
-
21
- **Usage**
22
-
23
- ```python notest
24
- import modal
25
-
26
- app = modal.App.lookup("my-app", create_if_missing=True)
27
-
28
- sb = modal.Sandbox.create(app=app)
29
- f = sb.open("/tmp/foo.txt", "w")
30
- f.write("hello")
31
- f.close()
32
- ```
33
-
34
- ```python
35
- __init__(self, client, task_id)
36
- ```
37
-
38
-
39
- ### create
40
-
41
- ```python
42
- create(cls, path, mode, client, task_id)
43
- ```
44
- Create a new FileIO handle.
45
-
46
- ### read
47
-
48
- ```python
49
- read(self, n=None)
50
- ```
51
- Read n bytes from the current position, or the entire remaining file if n is None.
52
-
53
- ### readline
54
-
55
- ```python
56
- readline(self)
57
- ```
58
- Read a single line from the current position.
59
-
60
- ### readlines
61
-
62
- ```python
63
- readlines(self)
64
- ```
65
- Read all lines from the current position.
66
-
67
- ### write
68
-
69
- ```python
70
- write(self, data)
71
- ```
72
- Write data to the current position.
73
-
74
- Writes may not appear until the entire buffer is flushed, which
75
- can be done manually with `flush()` or automatically when the file is
76
- closed.
77
-
78
- ### flush
79
-
80
- ```python
81
- flush(self)
82
- ```
83
- Flush the buffer to disk.
84
-
85
- ### seek
86
-
87
- ```python
88
- seek(self, offset, whence=0)
89
- ```
90
- Move to a new position in the file.
91
-
92
- `whence` defaults to 0 (absolute file positioning); other values are 1
93
- (relative to the current position) and 2 (relative to the file's end).
94
-
95
- ### ls
96
-
97
- ```python
98
- ls(cls, path, client, task_id)
99
- ```
100
- List the contents of the provided directory.
101
-
102
- ### mkdir
103
-
104
- ```python
105
- mkdir(cls, path, client, task_id, parents=False)
106
- ```
107
- Create a new directory.
108
-
109
- ### rm
110
-
111
- ```python
112
- rm(cls, path, client, task_id, recursive=False)
113
- ```
114
- Remove a file or directory in the Sandbox.
115
-
116
- ### watch
117
-
118
- ```python
119
- watch(cls, path, client, task_id, filter=None, recursive=False, timeout=None)
120
- ```
121
-
122
-
123
- ### close
124
-
125
- ```python
126
- close(self)
127
- ```
128
- Flush the buffer and close the file.
129
- ## modal.file_io.ls
130
-
131
- ```python
132
- ls(path, client, task_id)
133
- ```
134
- List the contents of the provided directory.
135
- ## modal.file_io.mkdir
136
-
137
- ```python
138
- mkdir(path, client, task_id, parents=False)
139
- ```
140
- Create a new directory.
141
- ## modal.file_io.rm
142
-
143
- ```python
144
- rm(path, client, task_id, recursive=False)
145
- ```
146
- Remove a file or directory in the Sandbox.
147
- ## modal.file_io.watch
148
-
149
- ```python
150
- watch(path, client, task_id, filter=None, recursive=False, timeout=None)
151
- ```
152
- Watch a file or directory for changes.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.forward.md DELETED
@@ -1,117 +0,0 @@
1
- # modal.forward
2
-
3
- ```python
4
- forward(port, *, unencrypted=False, h2_enabled=False, client=None)
5
- ```
6
- Expose a port publicly from inside a running Modal container, with TLS.
7
-
8
- If `unencrypted` is set, this also exposes the TCP socket without encryption on a random port
9
- number. This can be used to SSH into a container (see example below). Note that it is on the public Internet, so
10
- make sure you are using a secure protocol over TCP.
11
-
12
- If `h2_enabled` is set, the TLS server will advertise support for HTTP/2.
13
-
14
- **Important:** This is an experimental API which may change in the future.
15
-
16
- **Usage**
17
-
18
- ```python notest
19
- import modal
20
- from flask import Flask
21
-
22
- app = modal.App(image=modal.Image.debian_slim().pip_install("Flask"))
23
- flask_app = Flask(__name__)
24
-
25
-
26
- @flask_app.route("/")
27
- def hello_world():
28
- return "Hello, World!"
29
-
30
-
31
- @app.function()
32
- def run_app():
33
- # Start a web server inside the container at port 8000. `modal.forward(8000)` lets us
34
- # expose that port to the world at a random HTTPS URL.
35
- with modal.forward(8000) as tunnel:
36
- print("Server listening at", tunnel.url)
37
- flask_app.run("0.0.0.0", 8000)
38
-
39
- # When the context manager exits, the port is no longer exposed.
40
- ```
41
-
42
- **Raw TCP usage:**
43
-
44
- ```python
45
- import socket
46
- import threading
47
-
48
- import modal
49
-
50
-
51
- def run_echo_server(port: int):
52
- """Run a TCP echo server listening on the given port."""
53
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
54
- sock.bind(("0.0.0.0", port))
55
- sock.listen(1)
56
-
57
- while True:
58
- conn, addr = sock.accept()
59
- print("Connection from:", addr)
60
-
61
- # Start a new thread to handle the connection
62
- def handle(conn):
63
- with conn:
64
- while True:
65
- data = conn.recv(1024)
66
- if not data:
67
- break
68
- conn.sendall(data)
69
-
70
- threading.Thread(target=handle, args=(conn,)).start()
71
-
72
-
73
- app = modal.App()
74
-
75
-
76
- @app.function()
77
- def tcp_tunnel():
78
- # This exposes port 8000 to public Internet traffic over TCP.
79
- with modal.forward(8000, unencrypted=True) as tunnel:
80
- # You can connect to this TCP socket from outside the container, for example, using `nc`:
81
- # nc <HOST> <PORT>
82
- print("TCP tunnel listening at:", tunnel.tcp_socket)
83
- run_echo_server(8000)
84
- ```
85
-
86
- **SSH example:**
87
- This assumes you have a rsa keypair in `~/.ssh/id_rsa{.pub}`, this is a bare-bones example
88
- letting you SSH into a Modal container.
89
-
90
- ```python
91
- import subprocess
92
- import time
93
-
94
- import modal
95
-
96
- app = modal.App()
97
- image = (
98
- modal.Image.debian_slim()
99
- .apt_install("openssh-server")
100
- .run_commands("mkdir /run/sshd")
101
- .add_local_file("~/.ssh/id_rsa.pub", "/root/.ssh/authorized_keys", copy=True)
102
- )
103
-
104
-
105
- @app.function(image=image, timeout=3600)
106
- def some_function():
107
- subprocess.Popen(["/usr/sbin/sshd", "-D", "-e"])
108
- with modal.forward(port=22, unencrypted=True) as tunnel:
109
- hostname, port = tunnel.tcp_socket
110
- connection_cmd = f'ssh -p {port} root@{hostname}'
111
- print(f"ssh into container using: {connection_cmd}")
112
- time.sleep(3600) # keep alive for 1 hour or until killed
113
- ```
114
-
115
- If you intend to use this more generally, a suggestion is to put the subprocess and port
116
- forwarding code in an `@enter` lifecycle method of an @app.cls, to only make a single
117
- ssh server and port for each container (and not one for each input to the function).
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.interact.md DELETED
@@ -1,9 +0,0 @@
1
- # modal.interact
2
-
3
- ```python
4
- interact()
5
- ```
6
- Enable interactivity with user input inside a Modal container.
7
-
8
- See the [interactivity guide](https://modal.com/docs/guide/developing-debugging#interactivity)
9
- for more information on how to use this function.
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.io_streams.md DELETED
@@ -1,96 +0,0 @@
1
- # modal.io_streams
2
-
3
- ## modal.io_streams.StreamReader
4
-
5
-
6
- ```python
7
- class StreamReader(typing.Generic)
8
- ```
9
-
10
- Retrieve logs from a stream (`stdout` or `stderr`).
11
-
12
- As an asynchronous iterable, the object supports the `for` and `async for`
13
- statements. Just loop over the object to read in chunks.
14
-
15
-
16
- ### file_descriptor
17
-
18
- ```python
19
- file_descriptor(self)
20
- ```
21
- Possible values are `1` for stdout and `2` for stderr.
22
-
23
- ### read
24
-
25
- ```python
26
- read(self)
27
- ```
28
- Fetch the entire contents of the stream until EOF.
29
- ## modal.io_streams.StreamWriter
30
-
31
-
32
- ```python
33
- class StreamWriter(object)
34
- ```
35
-
36
- Provides an interface to buffer and write logs to a sandbox or container process stream (`stdin`).
37
-
38
-
39
- ### write
40
-
41
- ```python
42
- write(self, data)
43
- ```
44
- Write data to the stream but does not send it immediately.
45
-
46
- This is non-blocking and queues the data to an internal buffer. Must be
47
- used along with the `drain()` method, which flushes the buffer.
48
-
49
- **Usage**
50
-
51
- ```python fixture:sandbox
52
- proc = sandbox.exec(
53
- "bash",
54
- "-c",
55
- "while read line; do echo $line; done",
56
- )
57
- proc.stdin.write(b"foo\n")
58
- proc.stdin.write(b"bar\n")
59
- proc.stdin.write_eof()
60
- proc.stdin.drain()
61
- ```
62
-
63
- ### write_eof
64
-
65
- ```python
66
- write_eof(self)
67
- ```
68
- Close the write end of the stream after the buffered data is drained.
69
-
70
- If the process was blocked on input, it will become unblocked after
71
- `write_eof()`. This method needs to be used along with the `drain()`
72
- method, which flushes the EOF to the process.
73
-
74
- ### drain
75
-
76
- ```python
77
- drain(self)
78
- ```
79
- Flush the write buffer and send data to the running process.
80
-
81
- This is a flow control method that blocks until data is sent. It returns
82
- when it is appropriate to continue writing data to the stream.
83
-
84
- **Usage**
85
-
86
- ```python notest
87
- writer.write(data)
88
- writer.drain()
89
- ```
90
-
91
- Async usage:
92
-
93
- ```python notest
94
- writer.write(data) # not a blocking operation
95
- await writer.drain.aio()
96
- ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.is_local.md DELETED
@@ -1,11 +0,0 @@
1
- # modal.is_local
2
-
3
- ```python
4
- is_local()
5
- ```
6
- Indicate the execution context of the current process.
7
-
8
- Note: this function specifically returns False when the current process is
9
- running a Modal Function and True in all other cases. It will return True
10
- when called from a child process of a Function or inside a Modal Sandbox,
11
- even though those processes are running on Modal hardware.
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.method.md DELETED
@@ -1,17 +0,0 @@
1
- # modal.method
2
-
3
- ```python
4
- method(*, is_generator=None)
5
- ```
6
- Decorator for methods that should be transformed into a Modal Function registered against this class's App.
7
-
8
- **Usage**
9
-
10
- ```python
11
- @app.cls(cpu=8)
12
- class MyCls:
13
-
14
- @modal.method()
15
- def f(self):
16
- ...
17
- ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.parameter.md DELETED
@@ -1,17 +0,0 @@
1
- # modal.parameter
2
-
3
- ```python
4
- parameter(*, default=_no_default, init=True)
5
- ```
6
- Used to specify options for modal.cls parameters, similar to dataclass.field for dataclasses
7
- ```
8
- class A:
9
- a: str = modal.parameter()
10
-
11
- ```
12
-
13
- If `init=False` is specified, the field is not considered a parameter for the
14
- Modal class and not used in the synthesized constructor. This can be used to
15
- optionally annotate the type of a field that's used internally, for example values
16
- being set by @enter lifecycle methods, without breaking type checkers, but it has
17
- no runtime effect on the class.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.web_server.md DELETED
@@ -1,31 +0,0 @@
1
- # modal.web_server
2
-
3
- ```python
4
- web_server(port, *, startup_timeout=5.0, label=None, custom_domains=None,
5
- requires_proxy_auth=False)
6
- ```
7
- Decorator that registers an HTTP web server inside the container.
8
-
9
- This is similar to `@modal.asgi_app` and `@modal.wsgi_app`, but it allows you to expose a full
10
- HTTP server listening on a container port. This is useful for servers written in other languages
11
- like Rust, as well as integrating with non-ASGI frameworks like aiohttp and Tornado.
12
-
13
- The above example starts a simple file server, displaying the contents of the root directory.
14
- Here, requests to the URL will go to external port 8000 on the container. The
15
- `http.server` module is included with Python, but you could run anything here.
16
-
17
- Internally, the web server is transparently converted into a Web Function by Modal, so it has
18
- the same serverless autoscaling behavior as other Web Functions.
19
-
20
- For more info, see the [guide on Web Functions](https://modal.com/docs/guide/webhooks).
21
-
22
- **Usage**
23
-
24
- ```python
25
- import subprocess
26
-
27
- @app.function()
28
- @modal.web_server(8000)
29
- def my_file_server():
30
- subprocess.Popen("python -m http.server -d / 8000", shell=True)
31
- ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.agents/skills/modal/references/api/modal.wsgi_app.md DELETED
@@ -1,25 +0,0 @@
1
- # modal.wsgi_app
2
-
3
- ```python
4
- wsgi_app(*, label=None, custom_domains=None, requires_proxy_auth=False)
5
- ```
6
- Decorator for registering a WSGI app with a Modal function.
7
-
8
- Web Server Gateway Interface (WSGI) is a standard for synchronous Python web apps.
9
- It has been [succeeded by the ASGI interface](https://asgi.readthedocs.io/en/latest/introduction.html#wsgi-compatibility)
10
- which is compatible with ASGI and supports additional functionality such as web sockets.
11
- Modal supports ASGI via [`asgi_app`](https://modal.com/docs/reference/modal.asgi_app).
12
-
13
- To learn how to use this decorator with popular web frameworks, see the
14
- [guide on Web Functions](https://modal.com/docs/guide/webhooks).
15
-
16
- **Usage**
17
-
18
- ```python
19
- from typing import Callable
20
-
21
- @app.function()
22
- @modal.wsgi_app()
23
- def create_wsgi() -> Callable:
24
- ...
25
- ```