diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index 140ba82204..6ca99d764a 100644 --- a/.github/workflows/build-docs.yml +++ b/.github/workflows/build-docs.yml @@ -23,3 +23,4 @@ jobs: name: site path: site retention-days: 1 + include-hidden-files: true diff --git a/.gitignore b/.gitignore index 0d2163398d..bed3aa2ccc 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,4 @@ uv.lock /src/dstack/_internal/server/statics profiling_results.html +docs/docs/reference/api/rest/openapi.json diff --git a/contributing/DOCS.md b/contributing/DOCS.md index c20076466e..a885c5f51e 100644 --- a/contributing/DOCS.md +++ b/contributing/DOCS.md @@ -47,3 +47,106 @@ If you want to build static files, you can use the following command: ```shell uv run mkdocs build -s ``` + +## Documentation build system + +The documentation uses a custom build system with MkDocs hooks to generate various files dynamically. + +### Build hooks + +The build process is customized via hooks in `scripts/docs/hooks.py`: + +#### 1. Example materialization + +Example pages like `examples/single-node-training/trl/index.md` are stubs that reference `README.md` files in the repository root: +- **Stub location**: `docs/examples/single-node-training/trl/index.md` +- **Content source**: `examples/single-node-training/trl/README.md` + +During the build, the hook reads the README content and uses it for rendering the HTML page. + +#### 2. Schema reference expansion + +Files in `docs/reference/**/*.md` can use `#SCHEMA#` placeholders that are expanded with generated schema documentation during the build. + +#### 3. llms.txt generation + +Two files are generated for LLM consumption: + +- **llms.txt**: Structured overview of documentation with titles and descriptions + - Generated from mkdocs nav structure + - Includes sections: Getting started, Concepts, Guides, Examples + - Excludes: Reference section + - Configuration: `scripts/docs/gen_llms_files.py` (INCLUDE_SECTIONS, EXCLUDE_SECTIONS) + +- **llms-full.txt**: Full concatenation of all pages from llms.txt + - Contains complete markdown content of all included pages + +The generation logic is in `scripts/docs/gen_llms_files.py` and uses: +- `site_name`, `site_description`, `site_url` from `mkdocs.yml` +- Page titles from mkdocs nav structure +- Page descriptions from markdown frontmatter + +**Adding descriptions**: To add descriptions to pages, add YAML frontmatter: + +```yaml +--- +title: Page Title +description: Short description of what this page covers +--- +``` + +For examples, add frontmatter to the `README.md` files in the repository root (e.g., `examples/single-node-training/trl/README.md`). + +#### 4. Skills discovery + +The build creates `.well-known/skills/` directory structure for skills discovery: +- Reads `skills/dstack/SKILL.md` +- Parses name and description from frontmatter +- Generates `.well-known/skills/index.json` +- Copies SKILL.md to both `.well-known/skills/dstack/` and site root + +### File structure + +``` +docs/ +├── docs/ # Main documentation content +│ ├── index.md # Getting started +│ ├── installation.md +│ ├── quickstart.md +│ ├── concepts/ # Concept pages +│ ├── guides/ # How-to guides +│ └── reference/ # API reference (schema expansion) +├── examples/ # Example stub files (index.md) +│ └── single-node-training/ +│ └── trl/ +│ └── index.md # Stub referencing root README +└── overrides/ # Theme customization + +examples/ # Example content (repository root) +└── single-node-training/ + └── trl/ + ├── README.md # Actual content with frontmatter + └── train.dstack.yml + +scripts/docs/ +├── hooks.py # MkDocs build hooks +├── gen_llms_files.py # llms.txt generation +├── gen_schema_reference.py # Schema expansion +└── gen_cli_reference.py # CLI reference generation + +skills/ +└── dstack/ + └── SKILL.md # Skills discovery content +``` + +### Testing changes + +When modifying the build system: + +1. Test local build: `uv run mkdocs build -s` +2. Check generated files in `site/`: + - `site/llms.txt` + - `site/llms-full.txt` + - `site/.well-known/skills/index.json` +3. Verify example pages render correctly +4. Check that descriptions appear in llms.txt diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/blog/posts/0_20.md b/docs/blog/posts/0_20.md index 02c088e3e6..550cb60ad4 100644 --- a/docs/blog/posts/0_20.md +++ b/docs/blog/posts/0_20.md @@ -121,7 +121,7 @@ While the update introduces breaking changes, 0.19.* CLIs remain compatible with ## What's next -1. Follow the [Installation](../../docs/installation/index.md) guide +1. Follow the [Installation](../../docs/installation.md) guide 2. Try the [Quickstart](../../docs/quickstart.md) 3. Report issues on [GitHub](https://github.com/dstackai/dstack/issues) 4. Ask questions on [Discord](https://discord.gg/u8SmfwPpMd) diff --git a/docs/blog/posts/digitalocean-and-amd-dev-cloud.md b/docs/blog/posts/digitalocean-and-amd-dev-cloud.md index ce400899d6..7893356f4c 100644 --- a/docs/blog/posts/digitalocean-and-amd-dev-cloud.md +++ b/docs/blog/posts/digitalocean-and-amd-dev-cloud.md @@ -71,7 +71,7 @@ $ dstack server -For more details, see [Installation](../../docs/installation/index.md). +For more details, see [Installation](../../docs/installation.md). Use the `dstack` CLI to manage [dev environments](../../docs/concepts/dev-environments.md), [tasks](../../docs/concepts/tasks.md), diff --git a/docs/blog/posts/dstack-sky.md b/docs/blog/posts/dstack-sky.md index 78d35641c0..6919372024 100644 --- a/docs/blog/posts/dstack-sky.md +++ b/docs/blog/posts/dstack-sky.md @@ -69,7 +69,7 @@ Continue? [y/n]: !!! info "Backends" - `dstack Sky` supports the same [backends](../../docs/installation/index.md) as the open-source version, except that you + `dstack Sky` supports the same [backends](../../docs/installation.md) as the open-source version, except that you don't need to set them up. By default, it uses all supported backends. You can use both on-demand and spot instances without needing to manage quotas, as they are automatically handled diff --git a/docs/blog/posts/hotaisle.md b/docs/blog/posts/hotaisle.md index 928d0cf9c6..0d531710d5 100644 --- a/docs/blog/posts/hotaisle.md +++ b/docs/blog/posts/hotaisle.md @@ -80,7 +80,7 @@ $ dstack server -For more details, see [Installation](../../docs/installation/index.md). +For more details, see [Installation](../../docs/installation.md). Use the `dstack` CLI to manage [dev environments](../../docs/concepts/dev-environments.md), [tasks](../../docs/concepts/tasks.md), diff --git a/docs/blog/posts/nebius.md b/docs/blog/posts/nebius.md index c7a280971a..5fab310227 100644 --- a/docs/blog/posts/nebius.md +++ b/docs/blog/posts/nebius.md @@ -77,7 +77,7 @@ $ dstack server -For more details, refer to [Installation](../../docs/installation/index.md). +For more details, refer to [Installation](../../docs/installation.md). Use the `dstack` CLI to manage [dev environments](../../docs/concepts/dev-environments.md), [tasks](../../docs/concepts/tasks.md), diff --git a/docs/blog/posts/nvidia-and-amd-on-vultr.md b/docs/blog/posts/nvidia-and-amd-on-vultr.md index ed75607d47..512d316f8b 100644 --- a/docs/blog/posts/nvidia-and-amd-on-vultr.md +++ b/docs/blog/posts/nvidia-and-amd-on-vultr.md @@ -65,7 +65,7 @@ projects: -For more details, refer to [Installation](../../docs/installation/index.md). +For more details, refer to [Installation](../../docs/installation.md). > Interested in fine-tuning or deploying DeepSeek on Vultr? Check out the corresponding [example](../../examples/llms/deepseek/index.md). diff --git a/docs/docs/concepts/backends.md b/docs/docs/concepts/backends.md index 572d4e0411..b601969337 100644 --- a/docs/docs/concepts/backends.md +++ b/docs/docs/concepts/backends.md @@ -1,3 +1,8 @@ +--- +title: Backends +description: Configuring cloud providers and Kubernetes clusters +--- + # Backends Backends allow `dstack` to provision fleets across GPU clouds or Kubernetes clusters. diff --git a/docs/docs/concepts/dev-environments.md b/docs/docs/concepts/dev-environments.md index bda3406a61..81781d49af 100644 --- a/docs/docs/concepts/dev-environments.md +++ b/docs/docs/concepts/dev-environments.md @@ -1,9 +1,14 @@ +--- +title: Dev environments +description: Provisioning remote instances for cloud-based development +--- + # Dev environments A dev environment lets you provision an instance and access it with your desktop IDE. ??? info "Prerequisites" - Before running a dev environment, make sure you’ve [installed](../installation/index.md) the server and CLI, and created a [fleet](fleets.md). + Before running a dev environment, make sure you’ve [installed](../installation.md) the server and CLI, and created a [fleet](fleets.md). ## Apply a configuration diff --git a/docs/docs/concepts/events.md b/docs/docs/concepts/events.md index fb6e0938a2..d4057715a2 100644 --- a/docs/docs/concepts/events.md +++ b/docs/docs/concepts/events.md @@ -1,3 +1,8 @@ +--- +title: Events +description: Auditing resource state changes and operations +--- + # Events Events provide a chronological record of notable state changes and operations affecting `dstack` resources. They are designed for auditing, debugging, and understanding the lifecycle of runs, jobs, fleets, and other resources. diff --git a/docs/docs/concepts/fleets.md b/docs/docs/concepts/fleets.md index dad06cb80a..02308a649a 100644 --- a/docs/docs/concepts/fleets.md +++ b/docs/docs/concepts/fleets.md @@ -1,3 +1,8 @@ +--- +title: Fleets +description: Managing pools of compute instances +--- + # Fleets Before submitting runs, you must create a fleet. Fleets act as both pools of instances and templates for how those instances are provisioned. diff --git a/docs/docs/concepts/gateways.md b/docs/docs/concepts/gateways.md index 7402bc5762..55573bd747 100644 --- a/docs/docs/concepts/gateways.md +++ b/docs/docs/concepts/gateways.md @@ -1,3 +1,8 @@ +--- +title: Gateways +description: Managing ingress traffic and endpoints for services +--- + # Gateways Gateways manage ingress traffic for running [services](services.md), handle auto-scaling and rate limits, enable HTTPS, and allow you to configure a custom domain. They also support custom routers, such as the [SGLang Model Gateway](https://docs.sglang.ai/advanced_features/router.html#). diff --git a/docs/docs/concepts/metrics.md b/docs/docs/concepts/metrics.md index 394bb59d4b..3bebef4c09 100644 --- a/docs/docs/concepts/metrics.md +++ b/docs/docs/concepts/metrics.md @@ -1,3 +1,8 @@ +--- +title: Metrics +description: Tracking and monitoring system metrics +--- + # Metrics `dstack` automatically tracks essential metrics, which you can access via the CLI and UI. diff --git a/docs/docs/concepts/projects.md b/docs/docs/concepts/projects.md index a67e3d0569..a7e7454079 100644 --- a/docs/docs/concepts/projects.md +++ b/docs/docs/concepts/projects.md @@ -1,3 +1,8 @@ +--- +title: Projects +description: Organizing teams and isolating resources +--- + # Projects Projects enable the isolation of different teams and their resources. Each project can configure its own backends and diff --git a/docs/docs/concepts/secrets.md b/docs/docs/concepts/secrets.md index d541f281a6..0528e10c09 100644 --- a/docs/docs/concepts/secrets.md +++ b/docs/docs/concepts/secrets.md @@ -1,3 +1,8 @@ +--- +title: Secrets +description: Managing sensitive values and credentials +--- + # Secrets Secrets allow centralized management of sensitive values such as API keys and credentials. They are project-scoped, managed by project admins, and can be referenced in run configurations to pass sensitive values to runs in a secure manner. diff --git a/docs/docs/concepts/services.md b/docs/docs/concepts/services.md index 0f6bf07bb8..fe5830f356 100644 --- a/docs/docs/concepts/services.md +++ b/docs/docs/concepts/services.md @@ -1,9 +1,14 @@ +--- +title: Services +description: Deploying models and web apps as endpoints +--- + # Services Services allow you to deploy models or web apps as secure and scalable endpoints. ??? info "Prerequisites" - Before running a service, make sure you’ve [installed](../installation/index.md) the server and CLI, and created a [fleet](fleets.md). + Before running a service, make sure you’ve [installed](../installation.md) the server and CLI, and created a [fleet](fleets.md). ## Apply a configuration diff --git a/docs/docs/concepts/tasks.md b/docs/docs/concepts/tasks.md index 6f3f2fabb7..dd4a83c62c 100644 --- a/docs/docs/concepts/tasks.md +++ b/docs/docs/concepts/tasks.md @@ -1,9 +1,14 @@ +--- +title: Tasks +description: Running commands for training and batch processing +--- + # Tasks A task allows you to run arbitrary commands on one or more nodes. They are best suited for jobs like training or batch processing. ??? info "Prerequisites" - Before running a task, make sure you’ve [installed](../installation/index.md) the server and CLI, and created a [fleet](fleets.md). + Before running a task, make sure you’ve [installed](../installation.md) the server and CLI, and created a [fleet](fleets.md). ## Apply a configuration diff --git a/docs/docs/concepts/volumes.md b/docs/docs/concepts/volumes.md index fa5d73c714..e6d6c4cf91 100644 --- a/docs/docs/concepts/volumes.md +++ b/docs/docs/concepts/volumes.md @@ -1,3 +1,8 @@ +--- +title: Volumes +description: Managing persistent data storage +--- + # Volumes Volumes enable data persistence between runs of dev environments, tasks, and services. diff --git a/docs/docs/guides/protips.md b/docs/docs/guides/protips.md index dfb7abf0b6..a68d43f3d3 100644 --- a/docs/docs/guides/protips.md +++ b/docs/docs/guides/protips.md @@ -1,3 +1,8 @@ +--- +title: Protips +description: Tips and tricks for using dstack efficiently +--- + # Protips Below are tips and tricks to use `dstack` more efficiently. diff --git a/docs/docs/guides/server-deployment.md b/docs/docs/guides/server-deployment.md index 42365452aa..966c4c7cd2 100644 --- a/docs/docs/guides/server-deployment.md +++ b/docs/docs/guides/server-deployment.md @@ -1,3 +1,8 @@ +--- +title: Server Deployment +description: Deploying the dstack server +--- + The `dstack` server can run on your laptop or any environment with access to the cloud and on-prem clusters you plan to use. The minimum hardware requirements for running the server are 1 CPU and 1GB of RAM. diff --git a/docs/docs/guides/troubleshooting.md b/docs/docs/guides/troubleshooting.md index 2b4356fb5c..87169081f9 100644 --- a/docs/docs/guides/troubleshooting.md +++ b/docs/docs/guides/troubleshooting.md @@ -1,3 +1,8 @@ +--- +title: Troubleshooting +description: Common issues and how to resolve them +--- + # Troubleshooting ## Reporting issues diff --git a/docs/docs/guides/upgrade.md b/docs/docs/guides/upgrade.md index aacf473fd8..220c6b7475 100644 --- a/docs/docs/guides/upgrade.md +++ b/docs/docs/guides/upgrade.md @@ -1,3 +1,8 @@ +--- +title: Upgrade +description: Upgrading to newer versions of dstack +--- + # Upgrade guide diff --git a/docs/docs/index.md b/docs/docs/index.md index 121a379150..8afc24fdb5 100644 --- a/docs/docs/index.md +++ b/docs/docs/index.md @@ -1,3 +1,8 @@ +--- +title: What is dstack? +description: Introduction to dstack and how it works +--- + # What is dstack? `dstack` is a unified control plane for GPU provisioning and orchestration that works with any GPU cloud, Kubernetes, or on-prem clusters. @@ -13,7 +18,7 @@ It streamlines development, training, and inference, and is compatible with any #### 1. Set up the server -> Before using `dstack`, ensure you've [installed](installation/index.md) the server, or signed up for [dstack Sky](https://sky.dstack.ai). +> Before using `dstack`, ensure you've [installed](installation.md) the server, or signed up for [dstack Sky](https://sky.dstack.ai). #### 2. Define configurations @@ -35,7 +40,7 @@ Apply the configuration either via the `dstack apply` CLI command (or through a port-forwarding, ingress, and more. !!! info "Where do I start?" - 1. Proceed to [installation](installation/index.md) + 1. Proceed to [installation](installation.md) 2. See [quickstart](quickstart.md) 3. Browse [examples](/examples) 4. Join [Discord](https://discord.gg/u8SmfwPpMd) diff --git a/docs/docs/installation/index.md b/docs/docs/installation.md similarity index 87% rename from docs/docs/installation/index.md rename to docs/docs/installation.md index e179a8e663..725611f08e 100644 --- a/docs/docs/installation/index.md +++ b/docs/docs/installation.md @@ -1,3 +1,8 @@ +--- +title: Installation +description: How to install the dstack server and CLI +--- + # Installation -To verify that both the server and CLI are properly configured, use the [`dstack offer`](../reference/cli/dstack/offer.md#list-gpu-offers) command to list available GPU offers. If you don't see valid offers, ensure you've set up [backends](../concepts/backends.md). + ??? info "Shell autocompletion" @@ -195,8 +200,8 @@ To verify that both the server and CLI are properly configured, use the [`dstack > `autoload -Uz compinit && compinit`. !!! info "What's next?" - 1. See [Backends](../concepts/backends.md) - 2. Follow [Quickstart](../quickstart.md) - 3. Check the [server deployment](../guides/server-deployment.md) guide - 4. Browse [examples](../../examples.md) + 1. See [Backends](concepts/backends.md) + 2. Follow [Quickstart](quickstart.md) + 3. Check the [server deployment](guides/server-deployment.md) guide + 4. Browse [examples](../examples.md) 5. Join the community via [Discord](https://discord.gg/u8SmfwPpMd) diff --git a/docs/docs/quickstart.md b/docs/docs/quickstart.md index 2a8d3f0610..19331b5787 100644 --- a/docs/docs/quickstart.md +++ b/docs/docs/quickstart.md @@ -1,7 +1,12 @@ +--- +title: Quickstart +description: Quick guide to creating fleets and submitting runs +--- + # Quickstart !!! info "Prerequsites" - Before using `dstack`, ensure you've [installed](installation/index.md) the server and the CLI. + Before using `dstack`, ensure you've [installed](installation.md) the server and the CLI. ## Create a fleet diff --git a/docs/docs/reference/api/rest/openapi.json b/docs/docs/reference/api/rest/openapi.json new file mode 100644 index 0000000000..c0055e0884 --- /dev/null +++ b/docs/docs/reference/api/rest/openapi.json @@ -0,0 +1 @@ +{"openapi": "3.1.0", "info": {"title": "OpenAPI Spec", "version": "0.0.0"}, "servers": [{"url": "http://localhost:3000", "description": "Local server"}, {"url": "https://sky.dstack.ai", "description": "Managed server"}], "paths": {"/api/server/get_info": {"post": {"tags": ["server"], "summary": "Get Server Info", "operationId": "get_server_info_api_server_get_info_post", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ServerInfoRequest"}}}}}}}, "/api/users/list": {"post": {"tags": ["users"], "summary": "List Users", "description": "Returns users visible to the user, sorted by descending `created_at`.\n\nAdmins see all non-deleted users. Non-admins only see themselves.\n\nThe results are paginated. To get the next page, pass `created_at` and `id` of\nthe last user from the previous page as `prev_created_at` and `prev_id`.", "operationId": "list_users_api_users_list_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ListUsersRequestRequest"}}}}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"anyOf": [{"items": {"$ref": "#/components/schemas/UserRequest"}, "type": "array"}, {"$ref": "#/components/schemas/UsersInfoListRequest"}], "title": "Response List Users Api Users List Post"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/users/get_my_user": {"post": {"tags": ["users"], "summary": "Get My User", "operationId": "get_my_user_api_users_get_my_user_post", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UserWithCredsRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/users/get_user": {"post": {"tags": ["users"], "summary": "Get User", "operationId": "get_user_api_users_get_user_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetUserRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UserWithCredsRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/users/create": {"post": {"tags": ["users"], "summary": "Create User", "operationId": "create_user_api_users_create_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateUserRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UserRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/users/update": {"post": {"tags": ["users"], "summary": "Update User", "operationId": "update_user_api_users_update_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateUserRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UserRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/users/refresh_ssh_key": {"post": {"tags": ["users"], "summary": "Refresh Ssh Key", "operationId": "refresh_ssh_key_api_users_refresh_ssh_key_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/RefreshTokenRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UserWithCredsRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/users/refresh_token": {"post": {"tags": ["users"], "summary": "Refresh Token", "operationId": "refresh_token_api_users_refresh_token_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/RefreshTokenRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UserWithCredsRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/users/delete": {"post": {"tags": ["users"], "summary": "Delete Users", "operationId": "delete_users_api_users_delete_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DeleteUsersRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/auth/list_providers": {"post": {"tags": ["auth"], "summary": "List Providers", "description": "Returns OAuth2 providers registered on the server.", "operationId": "list_providers_api_auth_list_providers_post", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/OAuthProviderInfoRequest"}, "type": "array", "title": "Response List Providers Api Auth List Providers Post"}}}}}}}, "/api/auth/get_next_redirect": {"post": {"tags": ["auth"], "summary": "Get Next Redirect", "description": "A helper endpoint that returns the next redirect URL in case the state encodes it.\nCan be used by the UI after the redirect from the provider\nto determine if the user needs to be redirected further (CLI login)\nor the auth callback endpoint needs to be called directly (UI login).", "operationId": "get_next_redirect_api_auth_get_next_redirect_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/OAuthGetNextRedirectRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/OAuthGetNextRedirectResponseRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/api/projects/list": {"post": {"tags": ["projects"], "summary": "List Projects", "description": "Returns projects visible to the user.\n\nReturns all accessible projects (member projects for regular users, all non-deleted\nprojects for global admins, plus public projects if `include_not_joined` is `True`).\n\n`members` and `backends` are always empty - call `/api/projects/{project_name}/get` to retrieve them.", "operationId": "list_projects_api_projects_list_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ListProjectsRequestRequest"}}}}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"anyOf": [{"items": {"$ref": "#/components/schemas/ProjectRequest"}, "type": "array"}, {"$ref": "#/components/schemas/ProjectsInfoListRequest"}], "title": "Response List Projects Api Projects List Post"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/projects/list_only_no_fleets": {"post": {"tags": ["projects"], "summary": "List Only No Fleets", "description": "Returns only projects where the user is a member and that have no active fleets,\nsorted by ascending `created_at`.\n\nActive fleets are those with `deleted == False`. Projects with deleted fleets\n(but no active fleets) are included.\n\n`members` and `backends` are always empty - call `/api/projects/{project_name}/get` to retrieve them.", "operationId": "list_only_no_fleets_api_projects_list_only_no_fleets_post", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/ProjectRequest"}, "type": "array", "title": "Response List Only No Fleets Api Projects List Only No Fleets Post"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/projects/create": {"post": {"tags": ["projects"], "summary": "Create Project", "operationId": "create_project_api_projects_create_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateProjectRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/projects/delete": {"post": {"tags": ["projects"], "summary": "Delete Projects", "operationId": "delete_projects_api_projects_delete_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DeleteProjectsRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/projects/{project_name}/get": {"post": {"tags": ["projects"], "summary": "Get Project", "operationId": "get_project_api_projects__project_name__get_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/projects/{project_name}/set_members": {"post": {"tags": ["projects"], "summary": "Set Project Members", "operationId": "set_project_members_api_projects__project_name__set_members_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SetProjectMembersRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/projects/{project_name}/add_members": {"post": {"tags": ["projects"], "summary": "Add Project Members", "operationId": "add_project_members_api_projects__project_name__add_members_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AddProjectMemberRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/projects/{project_name}/remove_members": {"post": {"tags": ["projects"], "summary": "Remove Project Members", "operationId": "remove_project_members_api_projects__project_name__remove_members_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/RemoveProjectMemberRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/projects/{project_name}/update": {"post": {"tags": ["projects"], "summary": "Update Project", "operationId": "update_project_api_projects__project_name__update_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/UpdateProjectRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProjectRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/backends/list_types": {"post": {"tags": ["backends"], "summary": "List Backend Types", "operationId": "list_backend_types_api_backends_list_types_post", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/BackendType"}, "type": "array"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}}}}, "/api/project/{project_name}/backends/create": {"post": {"tags": ["backends"], "summary": "Create Backend", "operationId": "create_backend_api_project__project_name__backends_create_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/AWSBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/AzureBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/CloudRiftBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/CudoBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/VerdaBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/BaseDigitalOceanBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/GCPBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/HotAisleBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/KubernetesBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/LambdaBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/OCIBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/NebiusBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/RunpodBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/TensorDockBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/VastAIBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/VultrBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/DstackBackendConfigRequest"}], "title": "Body"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/AWSBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/AzureBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/CloudRiftBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/CudoBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/VerdaBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/BaseDigitalOceanBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/GCPBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/HotAisleBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/KubernetesBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/LambdaBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/OCIBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/NebiusBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/RunpodBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/TensorDockBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/VastAIBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/VultrBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/DstackBackendConfigRequest"}], "title": "Response Create Backend Api Project Project Name Backends Create Post"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/backends/update": {"post": {"tags": ["backends"], "summary": "Update Backend", "operationId": "update_backend_api_project__project_name__backends_update_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/AWSBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/AzureBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/CloudRiftBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/CudoBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/VerdaBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/BaseDigitalOceanBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/GCPBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/HotAisleBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/KubernetesBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/LambdaBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/OCIBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/NebiusBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/RunpodBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/TensorDockBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/VastAIBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/VultrBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/DstackBackendConfigRequest"}], "title": "Body"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/AWSBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/AzureBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/CloudRiftBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/CudoBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/VerdaBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/BaseDigitalOceanBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/GCPBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/HotAisleBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/KubernetesBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/LambdaBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/OCIBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/NebiusBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/RunpodBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/TensorDockBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/VastAIBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/VultrBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/DstackBackendConfigRequest"}], "title": "Response Update Backend Api Project Project Name Backends Update Post"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/backends/delete": {"post": {"tags": ["backends"], "summary": "Delete Backends", "operationId": "delete_backends_api_project__project_name__backends_delete_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DeleteBackendsRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/backends/{backend_name}/config_info": {"post": {"tags": ["backends"], "summary": "Get Backend Config Info", "operationId": "get_backend_config_info_api_project__project_name__backends__backend_name__config_info_post", "parameters": [{"required": true, "schema": {"$ref": "#/components/schemas/BackendType"}, "name": "backend_name", "in": "path"}, {"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"anyOf": [{"$ref": "#/components/schemas/AWSBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/AzureBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/CloudRiftBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/CudoBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/VerdaBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/BaseDigitalOceanBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/GCPBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/HotAisleBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/KubernetesBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/LambdaBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/OCIBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/NebiusBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/RunpodBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/TensorDockBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/VastAIBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/VultrBackendConfigWithCredsRequest"}, {"$ref": "#/components/schemas/DstackBackendConfigRequest"}], "title": "Response Get Backend Config Info Api Project Project Name Backends Backend Name Config Info Post"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/backends/create_yaml": {"post": {"tags": ["backends"], "summary": "Create Backend Yaml", "operationId": "create_backend_yaml_api_project__project_name__backends_create_yaml_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateBackendYAMLRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/backends/update_yaml": {"post": {"tags": ["backends"], "summary": "Update Backend Yaml", "operationId": "update_backend_yaml_api_project__project_name__backends_update_yaml_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/UpdateBackendYAMLRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/backends/{backend_name}/get_yaml": {"post": {"tags": ["backends"], "summary": "Get Backend Yaml", "operationId": "get_backend_yaml_api_project__project_name__backends__backend_name__get_yaml_post", "parameters": [{"required": true, "schema": {"$ref": "#/components/schemas/BackendType"}, "name": "backend_name", "in": "path"}, {"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BackendInfoYAMLRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/fleets/list": {"post": {"tags": ["fleets"], "summary": "List Fleets", "description": "Returns all fleets and instances within them visible to user sorted by descending `created_at`.\n`project_name` and `only_active` can be specified as filters.\nIncludes only active fleet instances. To list all fleet instances, use `/api/instances/list`.\n\nThe results are paginated. To get the next page, pass `created_at` and `id` of\nthe last fleet from the previous page as `prev_created_at` and `prev_id`.", "operationId": "list_fleets_api_fleets_list_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ListFleetsRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/FleetRequest"}, "type": "array", "title": "Response List Fleets Api Fleets List Post"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/fleets/list": {"post": {"tags": ["fleets"], "summary": "List Project Fleets", "description": "Returns all fleets in the project.\nIncludes only active fleet instances. To list all fleet instances, use `/api/instances/list`.", "operationId": "list_project_fleets_api_project__project_name__fleets_list_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/FleetRequest"}, "type": "array", "title": "Response List Project Fleets Api Project Project Name Fleets List Post"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/fleets/get": {"post": {"tags": ["fleets"], "summary": "Get Fleet", "description": "Returns a fleet given `name` or `id`.\nIf given `name`, does not return deleted fleets.\nIf given `id`, returns deleted fleets.", "operationId": "get_fleet_api_project__project_name__fleets_get_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetFleetRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/FleetRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/fleets/get_plan": {"post": {"tags": ["fleets"], "summary": "Get Plan", "description": "Returns a fleet plan for the given fleet configuration.", "operationId": "get_plan_api_project__project_name__fleets_get_plan_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetFleetPlanRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/FleetPlanRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/fleets/apply": {"post": {"tags": ["fleets"], "summary": "Apply Plan", "description": "Creates a new fleet or updates an existing fleet.\nErrors if the expected current resource from the plan does not match the current resource.\nUse `force: true` to apply even if the current resource does not match.", "operationId": "apply_plan_api_project__project_name__fleets_apply_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApplyFleetPlanRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/FleetRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/fleets/create": {"post": {"tags": ["fleets"], "summary": "Create Fleet", "description": "Creates a fleet given a fleet configuration.", "operationId": "create_fleet_api_project__project_name__fleets_create_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateFleetRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/FleetRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "deprecated": true, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/fleets/delete": {"post": {"tags": ["fleets"], "summary": "Delete Fleets", "description": "Deletes one or more fleets.", "operationId": "delete_fleets_api_project__project_name__fleets_delete_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DeleteFleetsRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/fleets/delete_instances": {"post": {"tags": ["fleets"], "summary": "Delete Fleet Instances", "description": "Deletes one or more instances within the fleet.", "operationId": "delete_fleet_instances_api_project__project_name__fleets_delete_instances_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DeleteFleetInstancesRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/instances/list": {"post": {"tags": ["instances"], "summary": "List Instances", "description": "Returns all instances visible to user sorted by descending `created_at`.\n`project_names` and `fleet_ids` can be specified as filters.\n\nThe results are paginated. To get the next page, pass `created_at` and `id` of\nthe last instance from the previous page as `prev_created_at` and `prev_id`.", "operationId": "list_instances_api_instances_list_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ListInstancesRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/InstanceRequest"}, "type": "array", "title": "Response List Instances Api Instances List Post"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/instances/get_instance_health_checks": {"post": {"tags": ["instances"], "summary": "Get Instance Health Checks", "operationId": "get_instance_health_checks_api_project__project_name__instances_get_instance_health_checks_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetInstanceHealthChecksRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetInstanceHealthChecksResponseRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/repos/list": {"post": {"tags": ["repos"], "summary": "List Repos", "operationId": "list_repos_api_project__project_name__repos_list_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/RepoHeadRequest"}, "type": "array", "title": "Response List Repos Api Project Project Name Repos List Post"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/repos/get": {"post": {"tags": ["repos"], "summary": "Get Repo", "operationId": "get_repo_api_project__project_name__repos_get_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetRepoRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/RepoHeadWithCredsRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/repos/init": {"post": {"tags": ["repos"], "summary": "Init Repo", "description": "Creates or updates a repo with the repo info and repo creds.\nRuns belong to repos, so this endpoint must be called before applying run configurations.\nYou can create `virtual` repos if you don't use git repos.", "operationId": "init_repo_api_project__project_name__repos_init_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SaveRepoCredsRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/repos/delete": {"post": {"tags": ["repos"], "summary": "Delete Repos", "operationId": "delete_repos_api_project__project_name__repos_delete_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DeleteReposRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/repos/upload_code": {"post": {"tags": ["repos"], "summary": "Upload Code", "operationId": "upload_code_api_project__project_name__repos_upload_code_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}, {"required": true, "schema": {"type": "string", "title": "Repo Id"}, "name": "repo_id", "in": "query"}], "requestBody": {"content": {"multipart/form-data": {"schema": {"$ref": "#/components/schemas/Body_upload_code_api_project__project_name__repos_upload_code_post"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/runs/list": {"post": {"tags": ["runs"], "summary": "List Runs", "description": "Returns all runs visible to user sorted by descending `submitted_at`.\n`project_name`, `repo_id`, `username`, and `only_active` can be specified as filters.\nSetting `only_active` to `true` excludes finished runs and deleted runs.\nSpecifying `repo_id` without `project_name` returns no runs.\n\nThe results are paginated. To get the next page, pass `submitted_at` and `id` of\nthe last run from the previous page as `prev_submitted_at` and `prev_run_id`.", "operationId": "list_runs_api_runs_list_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ListRunsRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/RunRequest"}, "type": "array", "title": "Response List Runs Api Runs List Post"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/runs/get": {"post": {"tags": ["runs"], "summary": "Get Run", "description": "Returns a run given `run_name` or `id`.\nIf given `run_name`, does not return deleted runs.\nIf given `id`, returns deleted runs.", "operationId": "get_run_api_project__project_name__runs_get_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetRunRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/RunRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/runs/get_plan": {"post": {"tags": ["runs"], "summary": "Get Plan", "description": "Returns a run plan for the given run spec.\nThis is an optional step before calling `/apply`.", "operationId": "get_plan_api_project__project_name__runs_get_plan_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetRunPlanRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/RunPlanRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/runs/apply": {"post": {"tags": ["runs"], "summary": "Apply Plan", "description": "Creates a new run or updates an existing run.\nErrors if the expected current resource from the plan does not match the current resource.\nUse `force: true` to apply even if the current resource does not match.\nIf the existing run is active and cannot be updated, it must be stopped first.", "operationId": "apply_plan_api_project__project_name__runs_apply_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApplyRunPlanRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/RunRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/runs/stop": {"post": {"tags": ["runs"], "summary": "Stop Runs", "description": "Stop one or more runs.", "operationId": "stop_runs_api_project__project_name__runs_stop_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/StopRunsRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/runs/delete": {"post": {"tags": ["runs"], "summary": "Delete Runs", "description": "Delete one or more runs. The runs must be stopped before they can be deleted.", "operationId": "delete_runs_api_project__project_name__runs_delete_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DeleteRunsRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/runs/submit": {"post": {"tags": ["runs"], "summary": "Submit Run", "operationId": "submit_run_api_project__project_name__runs_submit_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SubmitRunRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/RunRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "deprecated": true, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/gpus/list": {"post": {"tags": ["gpus"], "summary": "List Gpus", "operationId": "list_gpus_api_project__project_name__gpus_list_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ListGpusRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ListGpusResponseRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/metrics/job/{run_name}": {"get": {"tags": ["metrics"], "summary": "Get Job Metrics", "description": "Returns job-level metrics such as hardware utilization\ngiven `run_name`, `run_id`, `replica_num`, and `job_num`.\nIf only `run_name` is specified, returns metrics of `(replica_num=0, job_num=0)`\nof the latest run with the given name.\nBy default, returns one latest sample. To control time window/number of samples, use\n`limit`, `after`, `before`.\n\nSupported metrics (all optional):\n* `cpus_detected_num`\n* `cpu_usage_percent`\n* `memory_total_bytes`\n* `memory_usage_bytes`\n* `memory_working_set_bytes`\n* `gpus_detected_num`\n* `gpu_memory_total_bytes`\n* `gpu_memory_usage_bytes_gpu{i}`\n* `gpu_util_percent_gpu{i}`", "operationId": "get_job_metrics_api_project__project_name__metrics_job__run_name__get", "parameters": [{"required": true, "schema": {"type": "string", "title": "Run Name"}, "name": "run_name", "in": "path"}, {"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}, {"required": false, "schema": {"type": "string", "format": "uuid", "title": "Run Id"}, "name": "run_id", "in": "query"}, {"required": false, "schema": {"type": "integer", "title": "Replica Num", "default": 0}, "name": "replica_num", "in": "query"}, {"required": false, "schema": {"type": "integer", "title": "Job Num", "default": 0}, "name": "job_num", "in": "query"}, {"required": false, "schema": {"type": "integer", "title": "Limit", "default": 1}, "name": "limit", "in": "query"}, {"required": false, "schema": {"type": "string", "format": "date-time", "title": "After"}, "name": "after", "in": "query"}, {"required": false, "schema": {"type": "string", "format": "date-time", "title": "Before"}, "name": "before", "in": "query"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/JobMetricsRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/logs/poll": {"post": {"tags": ["logs"], "summary": "Poll Logs", "operationId": "poll_logs_api_project__project_name__logs_poll_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/PollLogsRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/JobSubmissionLogsRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/secrets/list": {"post": {"tags": ["secrets"], "summary": "List Secrets", "operationId": "list_secrets_api_project__project_name__secrets_list_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/SecretRequest"}, "type": "array", "title": "Response List Secrets Api Project Project Name Secrets List Post"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/secrets/get": {"post": {"tags": ["secrets"], "summary": "Get Secret", "operationId": "get_secret_api_project__project_name__secrets_get_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetSecretRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SecretRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/secrets/create_or_update": {"post": {"tags": ["secrets"], "summary": "Create Or Update Secret", "operationId": "create_or_update_secret_api_project__project_name__secrets_create_or_update_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateOrUpdateSecretRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SecretRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/secrets/delete": {"post": {"tags": ["secrets"], "summary": "Delete Secrets", "operationId": "delete_secrets_api_project__project_name__secrets_delete_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DeleteSecretsRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/gateways/list": {"post": {"tags": ["gateways"], "summary": "List Gateways", "operationId": "list_gateways_api_project__project_name__gateways_list_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/GatewayRequest"}, "type": "array", "title": "Response List Gateways Api Project Project Name Gateways List Post"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/gateways/get": {"post": {"tags": ["gateways"], "summary": "Get Gateway", "operationId": "get_gateway_api_project__project_name__gateways_get_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetGatewayRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/GatewayRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/gateways/create": {"post": {"tags": ["gateways"], "summary": "Create Gateway", "operationId": "create_gateway_api_project__project_name__gateways_create_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateGatewayRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/GatewayRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/gateways/delete": {"post": {"tags": ["gateways"], "summary": "Delete Gateways", "operationId": "delete_gateways_api_project__project_name__gateways_delete_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DeleteGatewaysRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/gateways/set_default": {"post": {"tags": ["gateways"], "summary": "Set Default Gateway", "operationId": "set_default_gateway_api_project__project_name__gateways_set_default_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SetDefaultGatewayRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/gateways/set_wildcard_domain": {"post": {"tags": ["gateways"], "summary": "Set Gateway Wildcard Domain", "operationId": "set_gateway_wildcard_domain_api_project__project_name__gateways_set_wildcard_domain_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SetWildcardDomainRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/GatewayRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/volumes/list": {"post": {"tags": ["volumes"], "summary": "List Volumes", "description": "Returns all volumes visible to user sorted by descending `created_at`.\n`project_name` and `only_active` can be specified as filters.\n\nThe results are paginated. To get the next page, pass `created_at` and `id` of\nthe last fleet from the previous page as `prev_created_at` and `prev_id`.", "operationId": "list_volumes_api_volumes_list_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ListVolumesRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/VolumeRequest"}, "type": "array", "title": "Response List Volumes Api Volumes List Post"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/volumes/list": {"post": {"tags": ["volumes"], "summary": "List Project Volumes", "description": "Returns all volumes in the project.", "operationId": "list_project_volumes_api_project__project_name__volumes_list_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/VolumeRequest"}, "type": "array", "title": "Response List Project Volumes Api Project Project Name Volumes List Post"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/volumes/get": {"post": {"tags": ["volumes"], "summary": "Get Volume", "description": "Returns a volume given a volume name.", "operationId": "get_volume_api_project__project_name__volumes_get_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetVolumeRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/VolumeRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/volumes/create": {"post": {"tags": ["volumes"], "summary": "Create Volume", "description": "Creates a volume given a volume configuration.", "operationId": "create_volume_api_project__project_name__volumes_create_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreateVolumeRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/VolumeRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/project/{project_name}/volumes/delete": {"post": {"tags": ["volumes"], "summary": "Delete Volumes", "description": "Deletes one or more volumes.", "operationId": "delete_volumes_api_project__project_name__volumes_delete_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DeleteVolumesRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/proxy/services/{project_name}/{run_name}": {"get": {"tags": ["service-proxy"], "summary": "Redirect To Service Root", "operationId": "redirect_to_service_root_proxy_services__project_name___run_name__get", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}, {"required": true, "schema": {"type": "string", "title": "Run Name"}, "name": "run_name", "in": "path"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}, "put": {"tags": ["service-proxy"], "summary": "Redirect To Service Root", "operationId": "redirect_to_service_root_proxy_services__project_name___run_name__put", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}, {"required": true, "schema": {"type": "string", "title": "Run Name"}, "name": "run_name", "in": "path"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}, "post": {"tags": ["service-proxy"], "summary": "Redirect To Service Root", "operationId": "redirect_to_service_root_proxy_services__project_name___run_name__post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}, {"required": true, "schema": {"type": "string", "title": "Run Name"}, "name": "run_name", "in": "path"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}, "delete": {"tags": ["service-proxy"], "summary": "Redirect To Service Root", "operationId": "redirect_to_service_root_proxy_services__project_name___run_name__delete", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}, {"required": true, "schema": {"type": "string", "title": "Run Name"}, "name": "run_name", "in": "path"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}, "head": {"tags": ["service-proxy"], "summary": "Redirect To Service Root", "operationId": "redirect_to_service_root_proxy_services__project_name___run_name__head", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}, {"required": true, "schema": {"type": "string", "title": "Run Name"}, "name": "run_name", "in": "path"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}, "patch": {"tags": ["service-proxy"], "summary": "Redirect To Service Root", "operationId": "redirect_to_service_root_proxy_services__project_name___run_name__patch", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}, {"required": true, "schema": {"type": "string", "title": "Run Name"}, "name": "run_name", "in": "path"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}}}, "/proxy/services/{project_name}/{run_name}/{path}": {"get": {"tags": ["service-proxy"], "summary": "Service Reverse Proxy", "operationId": "service_reverse_proxy_proxy_services__project_name___run_name___path__get", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}, {"required": true, "schema": {"type": "string", "title": "Run Name"}, "name": "run_name", "in": "path"}, {"required": true, "schema": {"type": "string", "title": "Path"}, "name": "path", "in": "path"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}, "put": {"tags": ["service-proxy"], "summary": "Service Reverse Proxy", "operationId": "service_reverse_proxy_proxy_services__project_name___run_name___path__put", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}, {"required": true, "schema": {"type": "string", "title": "Run Name"}, "name": "run_name", "in": "path"}, {"required": true, "schema": {"type": "string", "title": "Path"}, "name": "path", "in": "path"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}, "post": {"tags": ["service-proxy"], "summary": "Service Reverse Proxy", "operationId": "service_reverse_proxy_proxy_services__project_name___run_name___path__post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}, {"required": true, "schema": {"type": "string", "title": "Run Name"}, "name": "run_name", "in": "path"}, {"required": true, "schema": {"type": "string", "title": "Path"}, "name": "path", "in": "path"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}, "delete": {"tags": ["service-proxy"], "summary": "Service Reverse Proxy", "operationId": "service_reverse_proxy_proxy_services__project_name___run_name___path__delete", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}, {"required": true, "schema": {"type": "string", "title": "Run Name"}, "name": "run_name", "in": "path"}, {"required": true, "schema": {"type": "string", "title": "Path"}, "name": "path", "in": "path"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}, "options": {"tags": ["service-proxy"], "summary": "Service Reverse Proxy", "operationId": "service_reverse_proxy_proxy_services__project_name___run_name___path__options", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}, {"required": true, "schema": {"type": "string", "title": "Run Name"}, "name": "run_name", "in": "path"}, {"required": true, "schema": {"type": "string", "title": "Path"}, "name": "path", "in": "path"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}, "head": {"tags": ["service-proxy"], "summary": "Service Reverse Proxy", "operationId": "service_reverse_proxy_proxy_services__project_name___run_name___path__head", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}, {"required": true, "schema": {"type": "string", "title": "Run Name"}, "name": "run_name", "in": "path"}, {"required": true, "schema": {"type": "string", "title": "Path"}, "name": "path", "in": "path"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}, "patch": {"tags": ["service-proxy"], "summary": "Service Reverse Proxy", "operationId": "service_reverse_proxy_proxy_services__project_name___run_name___path__patch", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}, {"required": true, "schema": {"type": "string", "title": "Run Name"}, "name": "run_name", "in": "path"}, {"required": true, "schema": {"type": "string", "title": "Path"}, "name": "path", "in": "path"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/proxy/models/{project_name}/models": {"get": {"tags": ["model-proxy"], "summary": "Get Models", "operationId": "get_models_proxy_models__project_name__models_get", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ModelsResponseRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/proxy/models/{project_name}/chat/completions": {"post": {"tags": ["model-proxy"], "summary": "Post Chat Completions", "operationId": "post_chat_completions_proxy_models__project_name__chat_completions_post", "parameters": [{"required": true, "schema": {"type": "string", "title": "Project Name"}, "name": "project_name", "in": "path"}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ChatCompletionsRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ChatCompletionsResponseRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/metrics": {"get": {"tags": ["prometheus"], "summary": "Get Prometheus Metrics", "operationId": "get_prometheus_metrics_metrics_get", "responses": {"200": {"description": "Successful Response", "content": {"text/plain": {"schema": {"type": "string"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/files/get_archive_by_hash": {"post": {"tags": ["files"], "summary": "Get Archive By Hash", "operationId": "get_archive_by_hash_api_files_get_archive_by_hash_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/GetFileArchiveByHashRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/FileArchiveRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/files/upload_archive": {"post": {"tags": ["files"], "summary": "Upload Archive", "operationId": "upload_archive_api_files_upload_archive_post", "requestBody": {"content": {"multipart/form-data": {"schema": {"$ref": "#/components/schemas/Body_upload_archive_api_files_upload_archive_post"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/FileArchiveRequest"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/api/events/list": {"post": {"tags": ["events"], "summary": "List Events", "description": "Returns events visible to the current user.\n\nRegular users can see events related to themselves and to projects they are members of.\nGlobal admins can see all events.\n\nThe results are paginated. To get the next page, pass `recorded_at` and `id` of\nthe last event from the previous page as `prev_recorded_at` and `prev_id`.", "operationId": "list_events_api_events_list_post", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ListEventsRequestRequest"}}}, "required": true}, "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"items": {"$ref": "#/components/schemas/EventRequest"}, "type": "array", "title": "Response List Events Api Events List Post"}}}}, "400": {"description": "Bad request", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BadRequestErrorModelRequest"}}}}, "403": {"description": "Access denied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccessDeniedErrorModelRequest"}}}}, "422": {"description": "Validation Error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/HTTPValidationError"}}}}}, "security": [{"HTTPBearer": []}]}}, "/healthcheck": {"get": {"summary": "Healthcheck", "operationId": "healthcheck_healthcheck_get", "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {}}}}}}}}, "components": {"schemas": {"ACMGatewayCertificateRequest": {"properties": {"type": {"type": "string", "enum": ["acm"], "title": "Type", "description": "Certificates by AWS Certificate Manager (ACM)", "default": "acm"}, "arn": {"type": "string", "title": "Arn", "description": "The ARN of the wildcard ACM certificate for the domain"}}, "additionalProperties": false, "type": "object", "required": ["arn"], "title": "ACMGatewayCertificateRequest"}, "AWSAccessKeyCredsRequest": {"properties": {"type": {"type": "string", "enum": ["access_key"], "title": "Type", "description": "The type of credentials", "default": "access_key"}, "access_key": {"type": "string", "title": "Access Key", "description": "The access key"}, "secret_key": {"type": "string", "title": "Secret Key", "description": "The secret key"}}, "additionalProperties": false, "type": "object", "required": ["access_key", "secret_key"], "title": "AWSAccessKeyCredsRequest"}, "AWSBackendConfigRequest": {"properties": {"type": {"type": "string", "enum": ["aws"], "title": "Type", "description": "The type of the backend", "default": "aws"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of AWS regions. Omit to use all regions"}, "vpc_name": {"type": "string", "title": "Vpc Name", "description": "The name of custom VPCs. All configured regions must have a VPC with this name. If your custom VPCs don't have names or have different names in different regions, use `vpc_ids` instead."}, "vpc_ids": {"additionalProperties": {"type": "string"}, "type": "object", "title": "Vpc Ids", "description": "The mapping from AWS regions to VPC IDs. If `default_vpcs: true`, omitted regions will use default VPCs"}, "default_vpcs": {"type": "boolean", "title": "Default Vpcs", "description": "A flag to enable/disable using default VPCs in regions not configured by `vpc_ids`. Set to `false` if default VPCs should never be used. Defaults to `true`"}, "public_ips": {"type": "boolean", "title": "Public Ips", "description": "A flag to enable/disable public IP assigning on instances. `public_ips: false` requires at least one private subnet with outbound internet connectivity provided by a NAT Gateway or a Transit Gateway. Defaults to `true`"}, "iam_instance_profile": {"type": "string", "title": "Iam Instance Profile", "description": "The name of the IAM instance profile to associate with EC2 instances. You can also specify the IAM role name for roles created via the AWS console. AWS automatically creates an instance profile and gives it the same name as the role"}, "tags": {"additionalProperties": {"type": "string"}, "type": "object", "title": "Tags", "description": "The tags that will be assigned to resources created by `dstack`"}, "os_images": {"allOf": [{"$ref": "#/components/schemas/AWSOSImageConfigRequest"}], "title": "Os Images", "description": "The mapping of instance categories (CPU, NVIDIA GPU) to AMI configurations"}}, "additionalProperties": false, "type": "object", "title": "AWSBackendConfigRequest"}, "AWSBackendConfigWithCredsRequest": {"properties": {"type": {"type": "string", "enum": ["aws"], "title": "Type", "description": "The type of the backend", "default": "aws"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of AWS regions. Omit to use all regions"}, "vpc_name": {"type": "string", "title": "Vpc Name", "description": "The name of custom VPCs. All configured regions must have a VPC with this name. If your custom VPCs don't have names or have different names in different regions, use `vpc_ids` instead."}, "vpc_ids": {"additionalProperties": {"type": "string"}, "type": "object", "title": "Vpc Ids", "description": "The mapping from AWS regions to VPC IDs. If `default_vpcs: true`, omitted regions will use default VPCs"}, "default_vpcs": {"type": "boolean", "title": "Default Vpcs", "description": "A flag to enable/disable using default VPCs in regions not configured by `vpc_ids`. Set to `false` if default VPCs should never be used. Defaults to `true`"}, "public_ips": {"type": "boolean", "title": "Public Ips", "description": "A flag to enable/disable public IP assigning on instances. `public_ips: false` requires at least one private subnet with outbound internet connectivity provided by a NAT Gateway or a Transit Gateway. Defaults to `true`"}, "iam_instance_profile": {"type": "string", "title": "Iam Instance Profile", "description": "The name of the IAM instance profile to associate with EC2 instances. You can also specify the IAM role name for roles created via the AWS console. AWS automatically creates an instance profile and gives it the same name as the role"}, "tags": {"additionalProperties": {"type": "string"}, "type": "object", "title": "Tags", "description": "The tags that will be assigned to resources created by `dstack`"}, "os_images": {"allOf": [{"$ref": "#/components/schemas/AWSOSImageConfigRequest"}], "title": "Os Images", "description": "The mapping of instance categories (CPU, NVIDIA GPU) to AMI configurations"}, "creds": {"oneOf": [{"$ref": "#/components/schemas/AWSAccessKeyCredsRequest"}, {"$ref": "#/components/schemas/AWSDefaultCredsRequest"}], "title": "Creds", "description": "The credentials", "discriminator": {"propertyName": "type", "mapping": {"access_key": "#/components/schemas/AWSAccessKeyCredsRequest", "default": "#/components/schemas/AWSDefaultCredsRequest"}}}}, "additionalProperties": false, "type": "object", "required": ["creds"], "title": "AWSBackendConfigWithCredsRequest"}, "AWSDefaultCredsRequest": {"properties": {"type": {"type": "string", "enum": ["default"], "title": "Type", "description": "The type of credentials", "default": "default"}}, "additionalProperties": false, "type": "object", "title": "AWSDefaultCredsRequest"}, "AWSOSImageConfigRequest": {"properties": {"cpu": {"allOf": [{"$ref": "#/components/schemas/AWSOSImageRequest"}], "title": "Cpu", "description": "The AMI used for CPU instances"}, "nvidia": {"allOf": [{"$ref": "#/components/schemas/AWSOSImageRequest"}], "title": "Nvidia", "description": "The AMI used for NVIDIA GPU instances"}}, "additionalProperties": false, "type": "object", "title": "AWSOSImageConfigRequest"}, "AWSOSImageRequest": {"properties": {"name": {"type": "string", "title": "Name", "description": "The AMI name"}, "owner": {"type": "string", "pattern": "^(\\d{12}|self)$", "title": "Owner", "description": "The AMI owner, account ID or `self`", "default": "self"}, "user": {"type": "string", "title": "User", "description": "The OS user for provisioning"}}, "additionalProperties": false, "type": "object", "required": ["name", "user"], "title": "AWSOSImageRequest"}, "AcceleratorVendor": {"type": "string", "enum": ["nvidia", "amd", "google", "intel", "tenstorrent"], "title": "AcceleratorVendor", "description": "An enumeration."}, "AccessDeniedDetailsModelRequest": {"properties": {"code": {"type": "string", "title": "Code"}, "msg": {"type": "string", "title": "Msg", "default": "Access denied"}}, "additionalProperties": false, "type": "object", "title": "AccessDeniedDetailsModelRequest"}, "AccessDeniedErrorModelRequest": {"properties": {"detail": {"$ref": "#/components/schemas/AccessDeniedDetailsModelRequest"}}, "additionalProperties": false, "type": "object", "required": ["detail"], "title": "AccessDeniedErrorModelRequest"}, "AddProjectMemberRequestRequest": {"properties": {"members": {"items": {"$ref": "#/components/schemas/MemberSettingRequest"}, "type": "array", "title": "Members"}}, "additionalProperties": false, "type": "object", "required": ["members"], "title": "AddProjectMemberRequestRequest"}, "AppSpecRequest": {"properties": {"port": {"type": "integer", "title": "Port"}, "map_to_port": {"type": "integer", "title": "Map To Port"}, "app_name": {"type": "string", "title": "App Name"}, "url_path": {"type": "string", "title": "Url Path"}, "url_query_params": {"additionalProperties": {"type": "string"}, "type": "object", "title": "Url Query Params"}}, "additionalProperties": false, "type": "object", "required": ["port", "app_name"], "title": "AppSpecRequest"}, "ApplyAction": {"type": "string", "enum": ["create", "update"], "title": "ApplyAction", "description": "An enumeration."}, "ApplyFleetPlanInputRequest": {"properties": {"spec": {"$ref": "#/components/schemas/FleetSpecRequest"}, "current_resource": {"allOf": [{"$ref": "#/components/schemas/FleetRequest"}], "title": "Current Resource", "description": "The expected current resource. If the resource has changed, the apply fails unless `force: true`."}}, "additionalProperties": false, "type": "object", "required": ["spec"], "title": "ApplyFleetPlanInputRequest"}, "ApplyFleetPlanRequestRequest": {"properties": {"plan": {"$ref": "#/components/schemas/ApplyFleetPlanInputRequest"}, "force": {"type": "boolean", "title": "Force", "description": "Use `force: true` to apply even if the expected resource does not match."}}, "additionalProperties": false, "type": "object", "required": ["plan", "force"], "title": "ApplyFleetPlanRequestRequest"}, "ApplyRunPlanInputRequest": {"properties": {"run_spec": {"$ref": "#/components/schemas/RunSpecRequest"}, "current_resource": {"allOf": [{"$ref": "#/components/schemas/RunRequest"}], "title": "Current Resource", "description": "The expected current resource. If the resource has changed, the apply fails unless `force: true`."}}, "additionalProperties": false, "type": "object", "required": ["run_spec"], "title": "ApplyRunPlanInputRequest"}, "ApplyRunPlanRequestRequest": {"properties": {"plan": {"$ref": "#/components/schemas/ApplyRunPlanInputRequest"}, "force": {"type": "boolean", "title": "Force", "description": "Use `force: true` to apply even if the expected resource does not match."}}, "additionalProperties": false, "type": "object", "required": ["plan", "force"], "title": "ApplyRunPlanRequestRequest"}, "AzureBackendConfigRequest": {"properties": {"type": {"type": "string", "enum": ["azure"], "title": "Type", "description": "The type of the backend", "default": "azure"}, "tenant_id": {"type": "string", "title": "Tenant Id", "description": "The tenant ID"}, "subscription_id": {"type": "string", "title": "Subscription Id", "description": "The subscription ID"}, "resource_group": {"type": "string", "title": "Resource Group", "description": "The resource group for resources created by `dstack`. If not specified, `dstack` will create a new resource group"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of Azure regions (locations). Omit to use all regions"}, "vpc_ids": {"additionalProperties": {"type": "string"}, "type": "object", "title": "Vpc Ids", "description": "The mapping from configured Azure locations to network IDs. A network ID must have a format `networkResourceGroup/networkName` If not specified, `dstack` will create a new network for every configured region"}, "public_ips": {"type": "boolean", "title": "Public Ips", "description": "A flag to enable/disable public IP assigning on instances. `public_ips: false` requires `vpc_ids` that specifies custom networks with outbound internet connectivity provided by NAT Gateway or other mechanism. Defaults to `true`"}, "vm_managed_identity": {"type": "string", "title": "Vm Managed Identity", "description": "The managed identity to associate with provisioned VMs. Must have a format `managedIdentityResourceGroup/managedIdentityName`"}, "tags": {"additionalProperties": {"type": "string"}, "type": "object", "title": "Tags", "description": "The tags that will be assigned to resources created by `dstack`"}}, "additionalProperties": false, "type": "object", "required": ["tenant_id", "subscription_id"], "title": "AzureBackendConfigRequest"}, "AzureBackendConfigWithCredsRequest": {"properties": {"type": {"type": "string", "enum": ["azure"], "title": "Type", "description": "The type of the backend", "default": "azure"}, "tenant_id": {"type": "string", "title": "Tenant Id", "description": "The tenant ID"}, "subscription_id": {"type": "string", "title": "Subscription Id", "description": "The subscription ID"}, "resource_group": {"type": "string", "title": "Resource Group", "description": "The resource group for resources created by `dstack`. If not specified, `dstack` will create a new resource group"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of Azure regions (locations). Omit to use all regions"}, "vpc_ids": {"additionalProperties": {"type": "string"}, "type": "object", "title": "Vpc Ids", "description": "The mapping from configured Azure locations to network IDs. A network ID must have a format `networkResourceGroup/networkName` If not specified, `dstack` will create a new network for every configured region"}, "public_ips": {"type": "boolean", "title": "Public Ips", "description": "A flag to enable/disable public IP assigning on instances. `public_ips: false` requires `vpc_ids` that specifies custom networks with outbound internet connectivity provided by NAT Gateway or other mechanism. Defaults to `true`"}, "vm_managed_identity": {"type": "string", "title": "Vm Managed Identity", "description": "The managed identity to associate with provisioned VMs. Must have a format `managedIdentityResourceGroup/managedIdentityName`"}, "tags": {"additionalProperties": {"type": "string"}, "type": "object", "title": "Tags", "description": "The tags that will be assigned to resources created by `dstack`"}, "creds": {"oneOf": [{"$ref": "#/components/schemas/AzureClientCredsRequest"}, {"$ref": "#/components/schemas/AzureDefaultCredsRequest"}], "title": "Creds", "description": "The credentials", "discriminator": {"propertyName": "type", "mapping": {"client": "#/components/schemas/AzureClientCredsRequest", "default": "#/components/schemas/AzureDefaultCredsRequest"}}}}, "additionalProperties": false, "type": "object", "required": ["tenant_id", "subscription_id", "creds"], "title": "AzureBackendConfigWithCredsRequest"}, "AzureClientCredsRequest": {"properties": {"type": {"type": "string", "enum": ["client"], "title": "Type", "description": "The type of credentials", "default": "client"}, "client_id": {"type": "string", "title": "Client Id", "description": "The client ID"}, "client_secret": {"type": "string", "title": "Client Secret", "description": "The client secret"}, "tenant_id": {"type": "string", "title": "Tenant Id"}}, "additionalProperties": false, "type": "object", "required": ["client_id", "client_secret"], "title": "AzureClientCredsRequest"}, "AzureDefaultCredsRequest": {"properties": {"type": {"type": "string", "enum": ["default"], "title": "Type", "description": "The type of credentials", "default": "default"}}, "additionalProperties": false, "type": "object", "title": "AzureDefaultCredsRequest"}, "BackendInfoRequest": {"properties": {"name": {"type": "string", "title": "Name"}, "config": {"anyOf": [{"$ref": "#/components/schemas/AWSBackendConfigRequest"}, {"$ref": "#/components/schemas/AzureBackendConfigRequest"}, {"$ref": "#/components/schemas/CloudRiftBackendConfigRequest"}, {"$ref": "#/components/schemas/CudoBackendConfigRequest"}, {"$ref": "#/components/schemas/BaseDigitalOceanBackendConfigRequest"}, {"$ref": "#/components/schemas/GCPBackendConfigRequest"}, {"$ref": "#/components/schemas/HotAisleBackendConfigRequest"}, {"$ref": "#/components/schemas/KubernetesBackendConfigRequest"}, {"$ref": "#/components/schemas/LambdaBackendConfigRequest"}, {"$ref": "#/components/schemas/NebiusBackendConfigRequest"}, {"$ref": "#/components/schemas/OCIBackendConfigRequest"}, {"$ref": "#/components/schemas/RunpodBackendConfigRequest"}, {"$ref": "#/components/schemas/TensorDockBackendConfigRequest"}, {"$ref": "#/components/schemas/VastAIBackendConfigRequest"}, {"$ref": "#/components/schemas/VerdaBackendConfigRequest"}, {"$ref": "#/components/schemas/VultrBackendConfigRequest"}, {"$ref": "#/components/schemas/DstackBackendConfigRequest"}, {"$ref": "#/components/schemas/DstackBaseBackendConfigRequest"}], "title": "Config"}}, "additionalProperties": false, "type": "object", "required": ["name", "config"], "title": "BackendInfoRequest"}, "BackendInfoYAMLRequest": {"properties": {"name": {"type": "string", "title": "Name"}, "config_yaml": {"type": "string", "title": "Config Yaml"}}, "additionalProperties": false, "type": "object", "required": ["name", "config_yaml"], "title": "BackendInfoYAMLRequest"}, "BackendType": {"type": "string", "enum": ["amddevcloud", "aws", "azure", "cloudrift", "cudo", "datacrunch", "digitalocean", "dstack", "gcp", "hotaisle", "kubernetes", "lambda", "local", "remote", "nebius", "oci", "runpod", "tensordock", "vastai", "verda", "vultr"], "title": "BackendType", "description": "Attributes:\n AMDDEVCLOUD (BackendType): AMD Developer Cloud\n AWS (BackendType): Amazon Web Services\n AZURE (BackendType): Microsoft Azure\n CLOUDRIFT (BackendType): CloudRift\n CUDO (BackendType): Cudo\n DATACRUNCH (BackendType): DataCrunch (for backward compatibility)\n DIGITALOCEAN (BackendType): DigitalOcean\n DSTACK (BackendType): dstack Sky\n GCP (BackendType): Google Cloud Platform\n HOTAISLE (BackendType): Hot Aisle\n KUBERNETES (BackendType): Kubernetes\n LAMBDA (BackendType): Lambda Cloud\n NEBIUS (BackendType): Nebius AI Cloud\n OCI (BackendType): Oracle Cloud Infrastructure\n RUNPOD (BackendType): Runpod Cloud\n TENSORDOCK (BackendType): TensorDock Marketplace\n VASTAI (BackendType): Vast.ai Marketplace\n VERDA (BackendType): Verda Cloud\n VULTR (BackendType): Vultr"}, "BadRequestDetailsModelRequest": {"properties": {"code": {"allOf": [{"$ref": "#/components/schemas/ServerClientErrorCode"}], "default": "error"}, "msg": {"type": "string", "title": "Msg"}}, "additionalProperties": false, "type": "object", "required": ["msg"], "title": "BadRequestDetailsModelRequest"}, "BadRequestErrorModelRequest": {"properties": {"detail": {"$ref": "#/components/schemas/BadRequestDetailsModelRequest"}}, "additionalProperties": false, "type": "object", "required": ["detail"], "title": "BadRequestErrorModelRequest"}, "BaseDigitalOceanAPIKeyCredsRequest": {"properties": {"type": {"type": "string", "enum": ["api_key"], "title": "Type", "description": "The type of credentials", "default": "api_key"}, "api_key": {"type": "string", "title": "Api Key", "description": "The API key"}}, "additionalProperties": false, "type": "object", "required": ["api_key"], "title": "BaseDigitalOceanAPIKeyCredsRequest"}, "BaseDigitalOceanBackendConfigRequest": {"properties": {"type": {"type": "string", "enum": ["amddevcloud", "digitalocean"], "title": "Type", "description": "The type of backend"}, "project_name": {"type": "string", "title": "Project Name", "description": "The name of the project"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of regions. Omit to use all regions"}}, "additionalProperties": false, "type": "object", "required": ["type"], "title": "BaseDigitalOceanBackendConfigRequest"}, "BaseDigitalOceanBackendConfigWithCredsRequest": {"properties": {"type": {"type": "string", "enum": ["amddevcloud", "digitalocean"], "title": "Type", "description": "The type of backend"}, "project_name": {"type": "string", "title": "Project Name", "description": "The name of the project"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of regions. Omit to use all regions"}, "creds": {"allOf": [{"$ref": "#/components/schemas/BaseDigitalOceanAPIKeyCredsRequest"}], "title": "Creds", "description": "The credentials"}}, "additionalProperties": false, "type": "object", "required": ["type", "creds"], "title": "BaseDigitalOceanBackendConfigWithCredsRequest"}, "Body_upload_archive_api_files_upload_archive_post": {"properties": {"file": {"type": "string", "format": "binary", "title": "File"}}, "type": "object", "required": ["file"], "title": "Body_upload_archive_api_files_upload_archive_post"}, "Body_upload_code_api_project__project_name__repos_upload_code_post": {"properties": {"file": {"type": "string", "format": "binary", "title": "File"}}, "type": "object", "required": ["file"], "title": "Body_upload_code_api_project__project_name__repos_upload_code_post"}, "CPUArchitecture": {"type": "string", "enum": ["x86", "arm"], "title": "CPUArchitecture", "description": "An enumeration."}, "CPUSpecRequest": {"properties": {"arch": {"allOf": [{"$ref": "#/components/schemas/CPUArchitecture"}], "description": "The CPU architecture, one of: `x86`, `arm`"}, "count": {"anyOf": [{"$ref": "#/components/schemas/Range_int_"}, {"type": "integer"}, {"type": "string"}], "title": "Count", "description": "The number of CPU cores", "default": {"min": 2}}}, "additionalProperties": false, "type": "object", "title": "CPUSpecRequest"}, "ChatCompletionsChoiceRequest": {"properties": {"finish_reason": {"type": "string", "title": "Finish Reason"}, "index": {"type": "integer", "title": "Index"}, "message": {"$ref": "#/components/schemas/ChatMessageRequest"}}, "additionalProperties": false, "type": "object", "required": ["finish_reason", "index", "message"], "title": "ChatCompletionsChoiceRequest"}, "ChatCompletionsRequestRequest": {"properties": {"messages": {"items": {"$ref": "#/components/schemas/ChatMessageRequest"}, "type": "array", "title": "Messages"}, "model": {"type": "string", "title": "Model"}, "frequency_penalty": {"type": "number", "title": "Frequency Penalty", "default": 0.0}, "logit_bias": {"additionalProperties": {"type": "number"}, "type": "object", "title": "Logit Bias", "default": {}}, "max_tokens": {"type": "integer", "title": "Max Tokens"}, "n": {"type": "integer", "title": "N", "default": 1}, "presence_penalty": {"type": "number", "title": "Presence Penalty", "default": 0.0}, "response_format": {"type": "object", "title": "Response Format"}, "seed": {"type": "integer", "title": "Seed"}, "stop": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "string"}], "title": "Stop"}, "stream": {"type": "boolean", "title": "Stream", "default": false}, "temperature": {"type": "number", "title": "Temperature", "default": 1.0}, "top_p": {"type": "number", "title": "Top P", "default": 1.0}, "tools": {"items": {}, "type": "array", "title": "Tools", "default": []}, "tool_choice": {"anyOf": [{"type": "string", "enum": ["none", "auto"]}, {"type": "object"}], "title": "Tool Choice", "default": {}}, "user": {"type": "string", "title": "User"}}, "additionalProperties": false, "type": "object", "required": ["messages", "model"], "title": "ChatCompletionsRequestRequest"}, "ChatCompletionsResponseRequest": {"properties": {"id": {"type": "string", "title": "Id"}, "choices": {"items": {"$ref": "#/components/schemas/ChatCompletionsChoiceRequest"}, "type": "array", "title": "Choices"}, "created": {"type": "integer", "title": "Created"}, "model": {"type": "string", "title": "Model"}, "system_fingerprint": {"type": "string", "title": "System Fingerprint", "default": ""}, "object": {"type": "string", "enum": ["chat.completion"], "title": "Object", "default": "chat.completion"}, "usage": {"$ref": "#/components/schemas/ChatCompletionsUsageRequest"}}, "additionalProperties": false, "type": "object", "required": ["id", "choices", "created", "model", "usage"], "title": "ChatCompletionsResponseRequest"}, "ChatCompletionsUsageRequest": {"properties": {"completion_tokens": {"type": "integer", "title": "Completion Tokens"}, "prompt_tokens": {"type": "integer", "title": "Prompt Tokens"}, "total_tokens": {"type": "integer", "title": "Total Tokens"}}, "additionalProperties": false, "type": "object", "required": ["completion_tokens", "prompt_tokens", "total_tokens"], "title": "ChatCompletionsUsageRequest"}, "ChatMessageRequest": {"properties": {"role": {"type": "string", "title": "Role"}, "content": {"type": "string", "title": "Content"}}, "additionalProperties": false, "type": "object", "required": ["role", "content"], "title": "ChatMessageRequest"}, "CloudRiftAPIKeyCredsRequest": {"properties": {"type": {"type": "string", "enum": ["api_key"], "title": "Type", "description": "The type of credentials", "default": "api_key"}, "api_key": {"type": "string", "title": "Api Key", "description": "The API key"}}, "additionalProperties": false, "type": "object", "required": ["api_key"], "title": "CloudRiftAPIKeyCredsRequest"}, "CloudRiftBackendConfigRequest": {"properties": {"type": {"type": "string", "enum": ["cloudrift"], "title": "Type", "description": "The type of backend", "default": "cloudrift"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of CloudRift regions. Omit to use all regions"}}, "additionalProperties": false, "type": "object", "title": "CloudRiftBackendConfigRequest"}, "CloudRiftBackendConfigWithCredsRequest": {"properties": {"type": {"type": "string", "enum": ["cloudrift"], "title": "Type", "description": "The type of backend", "default": "cloudrift"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of CloudRift regions. Omit to use all regions"}, "creds": {"allOf": [{"$ref": "#/components/schemas/CloudRiftAPIKeyCredsRequest"}], "title": "Creds", "description": "The credentials"}}, "additionalProperties": false, "type": "object", "required": ["creds"], "title": "CloudRiftBackendConfigWithCredsRequest"}, "CreateBackendYAMLRequestRequest": {"properties": {"config_yaml": {"type": "string", "title": "Config Yaml"}}, "additionalProperties": false, "type": "object", "required": ["config_yaml"], "title": "CreateBackendYAMLRequestRequest"}, "CreateFleetRequestRequest": {"properties": {"spec": {"$ref": "#/components/schemas/FleetSpecRequest"}}, "additionalProperties": false, "type": "object", "required": ["spec"], "title": "CreateFleetRequestRequest"}, "CreateGatewayRequestRequest": {"properties": {"configuration": {"$ref": "#/components/schemas/GatewayConfigurationRequest"}}, "additionalProperties": false, "type": "object", "required": ["configuration"], "title": "CreateGatewayRequestRequest"}, "CreateOrUpdateSecretRequestRequest": {"properties": {"name": {"type": "string", "title": "Name"}, "value": {"type": "string", "title": "Value"}}, "additionalProperties": false, "type": "object", "required": ["name", "value"], "title": "CreateOrUpdateSecretRequestRequest"}, "CreateProjectRequestRequest": {"properties": {"project_name": {"type": "string", "title": "Project Name"}, "is_public": {"type": "boolean", "title": "Is Public", "default": false}}, "additionalProperties": false, "type": "object", "required": ["project_name"], "title": "CreateProjectRequestRequest"}, "CreateUserRequestRequest": {"properties": {"username": {"type": "string", "title": "Username"}, "global_role": {"$ref": "#/components/schemas/GlobalRole"}, "email": {"type": "string", "title": "Email"}, "active": {"type": "boolean", "title": "Active", "default": true}}, "additionalProperties": false, "type": "object", "required": ["username", "global_role"], "title": "CreateUserRequestRequest"}, "CreateVolumeRequestRequest": {"properties": {"configuration": {"$ref": "#/components/schemas/VolumeConfigurationRequest"}}, "additionalProperties": false, "type": "object", "required": ["configuration"], "title": "CreateVolumeRequestRequest"}, "CreationPolicy": {"type": "string", "enum": ["reuse", "reuse-or-create"], "title": "CreationPolicy", "description": "An enumeration."}, "CudoAPIKeyCredsRequest": {"properties": {"type": {"type": "string", "enum": ["api_key"], "title": "Type", "description": "The type of credentials", "default": "api_key"}, "api_key": {"type": "string", "title": "Api Key", "description": "The API key"}}, "additionalProperties": false, "type": "object", "required": ["api_key"], "title": "CudoAPIKeyCredsRequest"}, "CudoBackendConfigRequest": {"properties": {"type": {"type": "string", "enum": ["cudo"], "title": "Type", "description": "The type of backend", "default": "cudo"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of Cudo regions. Omit to use all regions"}, "project_id": {"type": "string", "title": "Project Id", "description": "The project ID"}}, "additionalProperties": false, "type": "object", "required": ["project_id"], "title": "CudoBackendConfigRequest"}, "CudoBackendConfigWithCredsRequest": {"properties": {"type": {"type": "string", "enum": ["cudo"], "title": "Type", "description": "The type of backend", "default": "cudo"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of Cudo regions. Omit to use all regions"}, "project_id": {"type": "string", "title": "Project Id", "description": "The project ID"}, "creds": {"allOf": [{"$ref": "#/components/schemas/CudoAPIKeyCredsRequest"}], "title": "Creds", "description": "The credentials"}}, "additionalProperties": false, "type": "object", "required": ["project_id", "creds"], "title": "CudoBackendConfigWithCredsRequest"}, "DeleteBackendsRequestRequest": {"properties": {"backends_names": {"items": {"$ref": "#/components/schemas/BackendType"}, "type": "array"}}, "additionalProperties": false, "type": "object", "required": ["backends_names"], "title": "DeleteBackendsRequestRequest"}, "DeleteFleetInstancesRequestRequest": {"properties": {"name": {"type": "string", "title": "Name"}, "instance_nums": {"items": {"type": "integer"}, "type": "array", "title": "Instance Nums"}}, "additionalProperties": false, "type": "object", "required": ["name", "instance_nums"], "title": "DeleteFleetInstancesRequestRequest"}, "DeleteFleetsRequestRequest": {"properties": {"names": {"items": {"type": "string"}, "type": "array", "title": "Names"}}, "additionalProperties": false, "type": "object", "required": ["names"], "title": "DeleteFleetsRequestRequest"}, "DeleteGatewaysRequestRequest": {"properties": {"names": {"items": {"type": "string"}, "type": "array", "title": "Names"}}, "additionalProperties": false, "type": "object", "required": ["names"], "title": "DeleteGatewaysRequestRequest"}, "DeleteProjectsRequestRequest": {"properties": {"projects_names": {"items": {"type": "string"}, "type": "array", "title": "Projects Names"}}, "additionalProperties": false, "type": "object", "required": ["projects_names"], "title": "DeleteProjectsRequestRequest"}, "DeleteReposRequestRequest": {"properties": {"repos_ids": {"items": {"type": "string"}, "type": "array", "title": "Repos Ids"}}, "additionalProperties": false, "type": "object", "required": ["repos_ids"], "title": "DeleteReposRequestRequest"}, "DeleteRunsRequestRequest": {"properties": {"runs_names": {"items": {"type": "string"}, "type": "array", "title": "Runs Names"}}, "additionalProperties": false, "type": "object", "required": ["runs_names"], "title": "DeleteRunsRequestRequest"}, "DeleteSecretsRequestRequest": {"properties": {"secrets_names": {"items": {"type": "string"}, "type": "array", "title": "Secrets Names"}}, "additionalProperties": false, "type": "object", "required": ["secrets_names"], "title": "DeleteSecretsRequestRequest"}, "DeleteUsersRequestRequest": {"properties": {"users": {"items": {"type": "string"}, "type": "array", "title": "Users"}}, "additionalProperties": false, "type": "object", "required": ["users"], "title": "DeleteUsersRequestRequest"}, "DeleteVolumesRequestRequest": {"properties": {"names": {"items": {"type": "string"}, "type": "array", "title": "Names"}}, "additionalProperties": false, "type": "object", "required": ["names"], "title": "DeleteVolumesRequestRequest"}, "DevEnvironmentConfigurationRequest": {"properties": {"ide": {"anyOf": [{"type": "string", "enum": ["vscode"]}, {"type": "string", "enum": ["cursor"]}, {"type": "string", "enum": ["windsurf"]}], "title": "Ide", "description": "The IDE to run. Supported values include `vscode`, `cursor`, and `windsurf`"}, "version": {"type": "string", "title": "Version", "description": "The version of the IDE. For `windsurf`, the version is in the format `version@commit`"}, "init": {"items": {"type": "string"}, "type": "array", "title": "Init", "description": "The shell commands to run on startup", "default": []}, "inactivity_duration": {"anyOf": [{"type": "string", "enum": ["off"]}, {"type": "integer"}, {"type": "boolean"}, {"type": "string"}], "title": "Inactivity Duration", "description": "The maximum amount of time the dev environment can be inactive (e.g., `2h`, `1d`, etc). After it elapses, the dev environment is automatically stopped. Inactivity is defined as the absence of SSH connections to the dev environment, including VS Code connections, `ssh ` shells, and attached `dstack apply` or `dstack attach` commands. Use `off` for unlimited duration. Can be updated in-place. Defaults to `off`"}, "ports": {"items": {"anyOf": [{"type": "integer", "maximum": 65536.0, "exclusiveMinimum": 0.0}, {"type": "string", "pattern": "^(?:[0-9]+|\\*):[0-9]+$"}, {"$ref": "#/components/schemas/PortMappingRequest"}]}, "type": "array", "title": "Ports", "description": "Port numbers/mapping to expose", "default": []}, "type": {"type": "string", "enum": ["dev-environment"], "title": "Type", "default": "dev-environment"}, "name": {"type": "string", "title": "Name", "description": "The run name. If not specified, a random name is generated"}, "image": {"type": "string", "title": "Image", "description": "The name of the Docker image to run"}, "user": {"type": "string", "title": "User", "description": "The user inside the container, `user_name_or_id[:group_name_or_id]` (e.g., `ubuntu`, `1000:1000`). Defaults to the default user from the `image`"}, "privileged": {"type": "boolean", "title": "Privileged", "description": "Run the container in privileged mode", "default": false}, "entrypoint": {"type": "string", "title": "Entrypoint", "description": "The Docker entrypoint"}, "working_dir": {"type": "string", "title": "Working Dir", "description": "The absolute path to the working directory inside the container. Defaults to the `image`'s default working directory"}, "home_dir": {"type": "string", "title": "Home Dir", "default": "/root"}, "registry_auth": {"allOf": [{"$ref": "#/components/schemas/RegistryAuthRequest"}], "title": "Registry Auth", "description": "Credentials for pulling a private Docker image"}, "python": {"allOf": [{"$ref": "#/components/schemas/PythonVersion"}], "description": "The major version of Python. Mutually exclusive with `image` and `docker`"}, "nvcc": {"type": "boolean", "title": "Nvcc", "description": "Use image with NVIDIA CUDA Compiler (NVCC) included. Mutually exclusive with `image` and `docker`"}, "single_branch": {"type": "boolean", "title": "Single Branch", "description": "Whether to clone and track only the current branch or all remote branches. Relevant only when using remote Git repos. Defaults to `false` for dev environments and to `true` for tasks and services"}, "env": {"allOf": [{"$ref": "#/components/schemas/Env"}], "title": "Env", "description": "The mapping or the list of environment variables", "default": {"__root__": {}}}, "shell": {"type": "string", "title": "Shell", "description": "The shell used to run commands. Allowed values are `sh`, `bash`, or an absolute path, e.g., `/usr/bin/zsh`. Defaults to `/bin/sh` if the `image` is specified, `/bin/bash` otherwise"}, "resources": {"allOf": [{"$ref": "#/components/schemas/ResourcesSpecRequest"}], "title": "Resources", "description": "The resources requirements to run the configuration", "default": {"cpu": {"min": 2}, "memory": {"min": 8.0}, "disk": {"size": {"min": 100.0}}}}, "priority": {"type": "integer", "maximum": 100.0, "minimum": 0.0, "title": "Priority", "description": "The priority of the run, an integer between `0` and `100`. `dstack` tries to provision runs with higher priority first. Defaults to `0`"}, "volumes": {"items": {"anyOf": [{"$ref": "#/components/schemas/VolumeMountPointRequest"}, {"$ref": "#/components/schemas/InstanceMountPointRequest"}, {"type": "string"}]}, "type": "array", "title": "Volumes", "description": "The volumes mount points", "default": []}, "docker": {"type": "boolean", "title": "Docker", "description": "Use Docker inside the container. Mutually exclusive with `image`, `python`, and `nvcc`. Overrides `privileged`"}, "repos": {"items": {"$ref": "#/components/schemas/RepoSpecRequest"}, "type": "array", "title": "Repos", "description": "The list of Git repos", "default": []}, "files": {"items": {"anyOf": [{"$ref": "#/components/schemas/FilePathMappingRequest"}, {"type": "string"}]}, "type": "array", "title": "Files", "description": "The local to container file path mappings", "default": []}, "setup": {"items": {"type": "string"}, "type": "array", "title": "Setup", "default": []}, "backends": {"items": {"$ref": "#/components/schemas/BackendType"}, "type": "array", "description": "The backends to consider for provisioning (e.g., `[aws, gcp]`)"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The regions to consider for provisioning (e.g., `[eu-west-1, us-west4, westeurope]`)"}, "availability_zones": {"items": {"type": "string"}, "type": "array", "title": "Availability Zones", "description": "The availability zones to consider for provisioning (e.g., `[eu-west-1a, us-west4-a]`)"}, "instance_types": {"items": {"type": "string"}, "type": "array", "title": "Instance Types", "description": "The cloud-specific instance types to consider for provisioning (e.g., `[p3.8xlarge, n1-standard-4]`)"}, "reservation": {"type": "string", "title": "Reservation", "description": "The existing reservation to use for instance provisioning. Supports AWS Capacity Reservations, AWS Capacity Blocks, and GCP reservations"}, "spot_policy": {"allOf": [{"$ref": "#/components/schemas/SpotPolicy"}], "description": "The policy for provisioning spot or on-demand instances: `spot`, `on-demand`, `auto`. Defaults to `on-demand`"}, "retry": {"anyOf": [{"$ref": "#/components/schemas/ProfileRetryRequest"}, {"type": "boolean"}], "title": "Retry", "description": "The policy for resubmitting the run. Defaults to `false`"}, "max_duration": {"anyOf": [{"type": "string", "enum": ["off"]}, {"type": "integer"}, {"type": "boolean"}, {"type": "string"}], "title": "Max Duration", "description": "The maximum duration of a run (e.g., `2h`, `1d`, etc) in a running state, excluding provisioning and pulling. After it elapses, the run is automatically stopped. Use `off` for unlimited duration. Defaults to `off`"}, "stop_duration": {"anyOf": [{"type": "string", "enum": ["off"]}, {"type": "integer"}, {"type": "boolean"}, {"type": "string"}], "title": "Stop Duration", "description": "The maximum duration of a run graceful stopping. After it elapses, the run is automatically forced stopped. This includes force detaching volumes used by the run. Use `off` for unlimited duration. Defaults to `5m`"}, "max_price": {"type": "number", "exclusiveMinimum": 0.0, "title": "Max Price", "description": "The maximum instance price per hour, in dollars"}, "creation_policy": {"allOf": [{"$ref": "#/components/schemas/CreationPolicy"}], "description": "The policy for using instances from fleets: `reuse`, `reuse-or-create`. Defaults to `reuse-or-create`"}, "idle_duration": {"anyOf": [{"type": "integer"}, {"type": "string"}], "title": "Idle Duration", "description": "Time to wait before terminating idle instances. Instances are not terminated if the fleet is already at `nodes.min`. Defaults to `5m` for runs and `3d` for fleets. Use `off` for unlimited duration"}, "utilization_policy": {"allOf": [{"$ref": "#/components/schemas/UtilizationPolicyRequest"}], "title": "Utilization Policy", "description": "Run termination policy based on utilization"}, "startup_order": {"allOf": [{"$ref": "#/components/schemas/StartupOrder"}], "description": "The order in which master and workers jobs are started: `any`, `master-first`, `workers-first`. Defaults to `any`"}, "stop_criteria": {"allOf": [{"$ref": "#/components/schemas/StopCriteria"}], "description": "The criteria determining when a multi-node run should be considered finished: `all-done`, `master-done`. Defaults to `all-done`"}, "schedule": {"allOf": [{"$ref": "#/components/schemas/ScheduleRequest"}], "title": "Schedule", "description": "The schedule for starting the run at specified time"}, "fleets": {"items": {"type": "string"}, "type": "array", "title": "Fleets", "description": "The fleets considered for reuse"}, "tags": {"additionalProperties": {"type": "string"}, "type": "object", "title": "Tags", "description": "The custom tags to associate with the resource. The tags are also propagated to the underlying backend resources. If there is a conflict with backend-level tags, does not override them"}}, "additionalProperties": false, "type": "object", "required": ["ide"], "title": "DevEnvironmentConfigurationRequest"}, "DiskRequest": {"properties": {"size_mib": {"type": "integer", "title": "Size Mib"}}, "additionalProperties": false, "type": "object", "required": ["size_mib"], "title": "DiskRequest"}, "DiskSpecRequest": {"properties": {"size": {"anyOf": [{"$ref": "#/components/schemas/Range_Memory_"}, {"type": "integer"}, {"type": "string"}], "title": "Size", "description": "Disk size"}}, "additionalProperties": false, "type": "object", "required": ["size"], "title": "DiskSpecRequest"}, "DstackBackendConfigRequest": {"properties": {"type": {"type": "string", "enum": ["dstack"], "title": "Type", "default": "dstack"}, "base_backends": {"items": {"type": "string"}, "type": "array", "title": "Base Backends"}}, "additionalProperties": false, "type": "object", "required": ["base_backends"], "title": "DstackBackendConfigRequest", "description": "This is a config model of DstackBackend stored in BackendModel.config and used by DstackConfigurator."}, "DstackBaseBackendConfigRequest": {"properties": {"type": {"type": "string", "title": "Type"}}, "additionalProperties": false, "type": "object", "required": ["type"], "title": "DstackBaseBackendConfigRequest"}, "Env": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"additionalProperties": {"anyOf": [{"type": "string"}, {"$ref": "#/components/schemas/EnvSentinelRequest"}]}, "type": "object"}], "title": "Env", "description": "Env represents a mapping of process environment variables, as in environ(7).\nEnvironment values may be omitted, in that case the :class:`EnvSentinel`\nobject is used as a placeholder.\n\nTo create an instance from a `dict[str, str]` or a `list[str]` use pydantic's\n:meth:`BaseModel.parse_obj(dict | list)` method.\n\nNB: this is *NOT* a CoreModel, pydantic-duality, which is used as a base\nfor the CoreModel, doesn't play well with custom root models.", "default": {}}, "EnvSentinelRequest": {"properties": {"key": {"type": "string", "title": "Key"}}, "additionalProperties": false, "type": "object", "required": ["key"], "title": "EnvSentinelRequest"}, "EventRequest": {"properties": {"id": {"type": "string", "format": "uuid", "title": "Id"}, "message": {"type": "string", "title": "Message"}, "recorded_at": {"type": "string", "format": "date-time", "title": "Recorded At"}, "actor_user_id": {"type": "string", "format": "uuid", "title": "Actor User Id", "description": "ID of the user who performed the action that triggered the event, or `null` if the action was performed by the system"}, "actor_user": {"type": "string", "title": "Actor User", "description": "Name of the user who performed the action that triggered the event, or `null` if the action was performed by the system"}, "is_actor_user_deleted": {"type": "boolean", "title": "Is Actor User Deleted", "description": "Whether the user who performed the action that triggered the event is deleted, or `null` if the action was performed by the system"}, "targets": {"items": {"$ref": "#/components/schemas/EventTargetRequest"}, "type": "array", "title": "Targets", "description": "List of entities affected by the event"}}, "additionalProperties": false, "type": "object", "required": ["id", "message", "recorded_at", "targets"], "title": "EventRequest"}, "EventTargetRequest": {"properties": {"type": {"type": "string", "title": "Type", "description": "Type of the target entity. One of: `project`, `user`, `fleet`, `instance`, `run`, `job`, `volume`, `gateway`, `secret`"}, "project_id": {"type": "string", "format": "uuid", "title": "Project Id", "description": "ID of the project the target entity belongs to, or `null` for target types not bound to a project (e.g., users)"}, "project_name": {"type": "string", "title": "Project Name", "description": "Name of the project the target entity belongs to, or `null` for target types not bound to a project (e.g., users)"}, "is_project_deleted": {"type": "boolean", "title": "Is Project Deleted", "description": "Whether the project the target entity belongs to is deleted, or `null` for target types not bound to a project (e.g., users)"}, "id": {"type": "string", "format": "uuid", "title": "Id", "description": "ID of the target entity"}, "name": {"type": "string", "title": "Name", "description": "Name of the target entity"}}, "additionalProperties": false, "type": "object", "required": ["type", "id", "name"], "title": "EventTargetRequest"}, "EventTargetType": {"type": "string", "enum": ["project", "user", "fleet", "instance", "run", "job", "volume", "gateway", "secret"], "title": "EventTargetType", "description": "An enumeration."}, "FileArchiveMappingRequest": {"properties": {"id": {"type": "string", "format": "uuid", "title": "Id", "description": "The File archive ID"}, "path": {"type": "string", "title": "Path", "description": "The path in the container"}}, "additionalProperties": false, "type": "object", "required": ["id", "path"], "title": "FileArchiveMappingRequest"}, "FileArchiveRequest": {"properties": {"id": {"type": "string", "format": "uuid", "title": "Id"}, "hash": {"type": "string", "title": "Hash"}}, "additionalProperties": false, "type": "object", "required": ["id", "hash"], "title": "FileArchiveRequest"}, "FilePathMappingRequest": {"properties": {"local_path": {"type": "string", "title": "Local Path", "description": "The path on the user's machine. Relative paths are resolved relative to the parent directory of the the configuration file"}, "path": {"type": "string", "title": "Path", "description": "The path in the container. Relative paths are resolved relative to the working directory"}}, "additionalProperties": false, "type": "object", "required": ["local_path", "path"], "title": "FilePathMappingRequest"}, "FleetConfigurationRequest": {"properties": {"type": {"type": "string", "enum": ["fleet"], "title": "Type", "default": "fleet"}, "name": {"type": "string", "title": "Name", "description": "The fleet name"}, "env": {"allOf": [{"$ref": "#/components/schemas/Env"}], "title": "Env", "description": "The mapping or the list of environment variables", "default": {"__root__": {}}}, "ssh_config": {"allOf": [{"$ref": "#/components/schemas/SSHParamsRequest"}], "title": "Ssh Config", "description": "The parameters for adding instances via SSH"}, "nodes": {"anyOf": [{"$ref": "#/components/schemas/FleetNodesSpecRequest"}, {"type": "integer"}, {"type": "string"}], "title": "Nodes", "description": "The number of instances in cloud fleet"}, "placement": {"allOf": [{"$ref": "#/components/schemas/InstanceGroupPlacement"}], "description": "The placement of instances: `any` or `cluster`"}, "reservation": {"type": "string", "title": "Reservation", "description": "The existing reservation to use for instance provisioning. Supports AWS Capacity Reservations, AWS Capacity Blocks, and GCP reservations"}, "resources": {"allOf": [{"$ref": "#/components/schemas/ResourcesSpecRequest"}], "title": "Resources", "description": "The resources requirements", "default": {"cpu": {"min": 2}, "memory": {"min": 8.0}, "disk": {"size": {"min": 100.0}}}}, "blocks": {"anyOf": [{"type": "string", "enum": ["auto"]}, {"type": "integer", "minimum": 1.0}], "title": "Blocks", "description": "The amount of blocks to split the instance into, a number or `auto`. `auto` means as many as possible. The number of GPUs and CPUs must be divisible by the number of blocks. Defaults to `1`, i.e. do not split", "default": 1}, "backends": {"items": {"$ref": "#/components/schemas/BackendType"}, "type": "array", "description": "The backends to consider for provisioning (e.g., `[aws, gcp]`)"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The regions to consider for provisioning (e.g., `[eu-west-1, us-west4, westeurope]`)"}, "availability_zones": {"items": {"type": "string"}, "type": "array", "title": "Availability Zones", "description": "The availability zones to consider for provisioning (e.g., `[eu-west-1a, us-west4-a]`)"}, "instance_types": {"items": {"type": "string"}, "type": "array", "title": "Instance Types", "description": "The cloud-specific instance types to consider for provisioning (e.g., `[p3.8xlarge, n1-standard-4]`)"}, "spot_policy": {"allOf": [{"$ref": "#/components/schemas/SpotPolicy"}], "description": "The policy for provisioning spot or on-demand instances: `spot`, `on-demand`, `auto`. Defaults to `on-demand`"}, "retry": {"anyOf": [{"$ref": "#/components/schemas/ProfileRetryRequest"}, {"type": "boolean"}], "title": "Retry", "description": "The policy for provisioning retry. Defaults to `false`"}, "max_price": {"type": "number", "exclusiveMinimum": 0.0, "title": "Max Price", "description": "The maximum instance price per hour, in dollars"}, "idle_duration": {"anyOf": [{"type": "integer"}, {"type": "string"}], "title": "Idle Duration", "description": "Time to wait before terminating idle instances. Instances are not terminated if the fleet is already at `nodes.min`. Defaults to `5m` for runs and `3d` for fleets. Use `off` for unlimited duration"}, "tags": {"additionalProperties": {"type": "string"}, "type": "object", "title": "Tags", "description": "The custom tags to associate with the resource. The tags are also propagated to the underlying backend resources. If there is a conflict with backend-level tags, does not override them"}}, "additionalProperties": false, "type": "object", "title": "FleetConfigurationRequest"}, "FleetNodesSpecRequest": {"properties": {"min": {"type": "integer", "title": "Min", "description": "The minimum number of instances to maintain in the fleet"}, "target": {"type": "integer", "title": "Target", "description": "The number of instances to provision on fleet apply. `min` <= `target` <= `max` Defaults to `min`"}, "max": {"type": "integer", "title": "Max", "description": "The maximum number of instances allowed in the fleet. Unlimited if not specified"}}, "additionalProperties": false, "type": "object", "required": ["min", "target"], "title": "FleetNodesSpecRequest"}, "FleetPlanRequest": {"properties": {"project_name": {"type": "string", "title": "Project Name"}, "user": {"type": "string", "title": "User"}, "spec": {"$ref": "#/components/schemas/FleetSpecRequest"}, "effective_spec": {"$ref": "#/components/schemas/FleetSpecRequest"}, "current_resource": {"$ref": "#/components/schemas/FleetRequest"}, "offers": {"items": {"$ref": "#/components/schemas/InstanceOfferWithAvailabilityRequest"}, "type": "array", "title": "Offers"}, "total_offers": {"type": "integer", "title": "Total Offers"}, "max_offer_price": {"type": "number", "title": "Max Offer Price"}, "action": {"$ref": "#/components/schemas/ApplyAction"}}, "additionalProperties": false, "type": "object", "required": ["project_name", "user", "spec", "offers", "total_offers"], "title": "FleetPlanRequest"}, "FleetRequest": {"properties": {"id": {"type": "string", "format": "uuid", "title": "Id"}, "name": {"type": "string", "title": "Name"}, "project_name": {"type": "string", "title": "Project Name"}, "spec": {"$ref": "#/components/schemas/FleetSpecRequest"}, "created_at": {"type": "string", "format": "date-time", "title": "Created At"}, "status": {"$ref": "#/components/schemas/FleetStatus"}, "status_message": {"type": "string", "title": "Status Message"}, "instances": {"items": {"$ref": "#/components/schemas/InstanceRequest"}, "type": "array", "title": "Instances"}}, "additionalProperties": false, "type": "object", "required": ["id", "name", "project_name", "spec", "created_at", "status", "instances"], "title": "FleetRequest"}, "FleetSpecRequest": {"properties": {"configuration": {"$ref": "#/components/schemas/FleetConfigurationRequest"}, "configuration_path": {"type": "string", "title": "Configuration Path"}, "profile": {"$ref": "#/components/schemas/ProfileRequest"}, "autocreated": {"type": "boolean", "title": "Autocreated", "default": false}}, "additionalProperties": false, "type": "object", "required": ["configuration", "profile"], "title": "FleetSpecRequest"}, "FleetStatus": {"type": "string", "enum": ["submitted", "active", "terminating", "terminated", "failed"], "title": "FleetStatus", "description": "An enumeration."}, "GCPBackendConfigRequest": {"properties": {"type": {"type": "string", "enum": ["gcp"], "title": "Type", "description": "The type of backend", "default": "gcp"}, "project_id": {"type": "string", "title": "Project Id", "description": "The project ID"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of GCP regions. Omit to use all regions"}, "vpc_name": {"type": "string", "title": "Vpc Name", "description": "The name of a custom VPC. If not specified, the default VPC is used"}, "extra_vpcs": {"items": {"type": "string"}, "type": "array", "title": "Extra Vpcs", "description": "The names of additional VPCs used for multi-NIC instances, such as those that support GPUDirect. Specify eight VPCs to maximize bandwidth in clusters with eight-GPU instances. Each VPC must have a subnet and a firewall rule allowing internal traffic across all subnets"}, "roce_vpcs": {"items": {"type": "string"}, "type": "array", "maxItems": 1, "title": "Roce Vpcs", "description": "The names of additional VPCs with the RoCE network profile. Used for RDMA on GPU instances that support the MRDMA interface type. A VPC should have eight subnets to maximize the bandwidth in clusters with eight-GPU instances."}, "vpc_project_id": {"type": "string", "title": "Vpc Project Id", "description": "The shared VPC hosted project ID. Required for shared VPC only"}, "public_ips": {"type": "boolean", "title": "Public Ips", "description": "A flag to enable/disable public IP assigning on instances. Defaults to `true`"}, "nat_check": {"type": "boolean", "title": "Nat Check", "description": "A flag to enable/disable a check that Cloud NAT is configured for the VPC. This should be set to `false` when `public_ips: false` and outbound internet connectivity is provided by a mechanism other than Cloud NAT such as a third-party NAT appliance. Defaults to `true`"}, "vm_service_account": {"type": "string", "title": "Vm Service Account", "description": "The service account to associate with provisioned VMs"}, "tags": {"additionalProperties": {"type": "string"}, "type": "object", "title": "Tags", "description": "The tags (labels) that will be assigned to resources created by `dstack`"}, "preview_features": {"items": {"type": "string", "enum": ["g4"]}, "type": "array", "maxItems": 1, "title": "Preview Features", "description": "The list of preview GCP features to enable. There are currently no preview features"}}, "additionalProperties": false, "type": "object", "required": ["project_id"], "title": "GCPBackendConfigRequest"}, "GCPBackendConfigWithCredsRequest": {"properties": {"type": {"type": "string", "enum": ["gcp"], "title": "Type", "description": "The type of backend", "default": "gcp"}, "project_id": {"type": "string", "title": "Project Id", "description": "The project ID"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of GCP regions. Omit to use all regions"}, "vpc_name": {"type": "string", "title": "Vpc Name", "description": "The name of a custom VPC. If not specified, the default VPC is used"}, "extra_vpcs": {"items": {"type": "string"}, "type": "array", "title": "Extra Vpcs", "description": "The names of additional VPCs used for multi-NIC instances, such as those that support GPUDirect. Specify eight VPCs to maximize bandwidth in clusters with eight-GPU instances. Each VPC must have a subnet and a firewall rule allowing internal traffic across all subnets"}, "roce_vpcs": {"items": {"type": "string"}, "type": "array", "maxItems": 1, "title": "Roce Vpcs", "description": "The names of additional VPCs with the RoCE network profile. Used for RDMA on GPU instances that support the MRDMA interface type. A VPC should have eight subnets to maximize the bandwidth in clusters with eight-GPU instances."}, "vpc_project_id": {"type": "string", "title": "Vpc Project Id", "description": "The shared VPC hosted project ID. Required for shared VPC only"}, "public_ips": {"type": "boolean", "title": "Public Ips", "description": "A flag to enable/disable public IP assigning on instances. Defaults to `true`"}, "nat_check": {"type": "boolean", "title": "Nat Check", "description": "A flag to enable/disable a check that Cloud NAT is configured for the VPC. This should be set to `false` when `public_ips: false` and outbound internet connectivity is provided by a mechanism other than Cloud NAT such as a third-party NAT appliance. Defaults to `true`"}, "vm_service_account": {"type": "string", "title": "Vm Service Account", "description": "The service account to associate with provisioned VMs"}, "tags": {"additionalProperties": {"type": "string"}, "type": "object", "title": "Tags", "description": "The tags (labels) that will be assigned to resources created by `dstack`"}, "preview_features": {"items": {"type": "string", "enum": ["g4"]}, "type": "array", "maxItems": 1, "title": "Preview Features", "description": "The list of preview GCP features to enable. There are currently no preview features"}, "creds": {"oneOf": [{"$ref": "#/components/schemas/GCPServiceAccountCredsRequest"}, {"$ref": "#/components/schemas/GCPDefaultCredsRequest"}], "title": "Creds", "description": "The credentials", "discriminator": {"propertyName": "type", "mapping": {"service_account": "#/components/schemas/GCPServiceAccountCredsRequest", "default": "#/components/schemas/GCPDefaultCredsRequest"}}}}, "additionalProperties": false, "type": "object", "required": ["project_id", "creds"], "title": "GCPBackendConfigWithCredsRequest"}, "GCPDefaultCredsRequest": {"properties": {"type": {"type": "string", "enum": ["default"], "title": "Type", "default": "default"}}, "additionalProperties": false, "type": "object", "title": "GCPDefaultCredsRequest"}, "GCPServiceAccountCredsRequest": {"properties": {"type": {"type": "string", "enum": ["service_account"], "title": "Type", "description": "The type of credentials", "default": "service_account"}, "filename": {"type": "string", "title": "Filename", "description": "The path to the service account file", "default": ""}, "data": {"type": "string", "title": "Data", "description": "The contents of the service account file"}}, "additionalProperties": false, "type": "object", "required": ["data"], "title": "GCPServiceAccountCredsRequest"}, "GPUSpecRequest": {"properties": {"vendor": {"allOf": [{"$ref": "#/components/schemas/AcceleratorVendor"}], "description": "The vendor of the GPU/accelerator, one of: `nvidia`, `amd`, `google` (alias: `tpu`), `intel`"}, "name": {"anyOf": [{"type": "array"}, {"type": "string"}], "items": {"type": "string"}, "title": "Name", "description": "The name of the GPU (e.g., `A100` or `H100`)"}, "count": {"anyOf": [{"$ref": "#/components/schemas/Range_int_"}, {"type": "integer"}, {"type": "string"}], "title": "Count", "description": "The number of GPUs", "default": {"min": 1}}, "memory": {"anyOf": [{"$ref": "#/components/schemas/Range_Memory_"}, {"type": "integer"}, {"type": "string"}], "title": "Memory", "description": "The RAM size (e.g., `16GB`). Can be set to a range (e.g. `16GB..`, or `16GB..80GB`)"}, "total_memory": {"anyOf": [{"$ref": "#/components/schemas/Range_Memory_"}, {"type": "integer"}, {"type": "string"}], "title": "Total Memory", "description": "The total RAM size (e.g., `32GB`). Can be set to a range (e.g. `16GB..`, or `16GB..80GB`)"}, "compute_capability": {"items": {}, "type": "array", "title": "Compute Capability", "description": "The minimum compute capability of the GPU (e.g., `7.5`)"}}, "additionalProperties": false, "type": "object", "title": "GPUSpecRequest"}, "GatewayConfigurationRequest": {"properties": {"type": {"type": "string", "enum": ["gateway"], "title": "Type", "default": "gateway"}, "name": {"type": "string", "title": "Name", "description": "The gateway name"}, "default": {"type": "boolean", "title": "Default", "description": "Make the gateway default", "default": false}, "backend": {"allOf": [{"$ref": "#/components/schemas/BackendType"}], "description": "The gateway backend"}, "region": {"type": "string", "title": "Region", "description": "The gateway region"}, "instance_type": {"type": "string", "minLength": 1, "title": "Instance Type", "description": "Backend-specific instance type to use for the gateway instance. Omit to use the backend's default, which is typically a small non-GPU instance"}, "router": {"allOf": [{"$ref": "#/components/schemas/SGLangRouterConfigRequest"}], "title": "Router", "description": "The router configuration"}, "domain": {"type": "string", "title": "Domain", "description": "The gateway domain, e.g. `example.com`"}, "public_ip": {"type": "boolean", "title": "Public Ip", "description": "Allocate public IP for the gateway", "default": true}, "certificate": {"anyOf": [{"$ref": "#/components/schemas/LetsEncryptGatewayCertificateRequest"}, {"$ref": "#/components/schemas/ACMGatewayCertificateRequest"}], "title": "Certificate", "description": "The SSL certificate configuration. Defaults to `type: lets-encrypt`", "default": {"type": "lets-encrypt"}}, "tags": {"additionalProperties": {"type": "string"}, "type": "object", "title": "Tags", "description": "The custom tags to associate with the gateway. The tags are also propagated to the underlying backend resources. If there is a conflict with backend-level tags, does not override them"}}, "additionalProperties": false, "type": "object", "required": ["backend", "region"], "title": "GatewayConfigurationRequest"}, "GatewayRequest": {"properties": {"id": {"type": "string", "format": "uuid", "title": "Id"}, "name": {"type": "string", "title": "Name"}, "configuration": {"$ref": "#/components/schemas/GatewayConfigurationRequest"}, "created_at": {"type": "string", "format": "date-time", "title": "Created At"}, "status": {"$ref": "#/components/schemas/GatewayStatus"}, "status_message": {"type": "string", "title": "Status Message"}, "hostname": {"type": "string", "title": "Hostname"}, "ip_address": {"type": "string", "title": "Ip Address"}, "instance_id": {"type": "string", "title": "Instance Id"}, "wildcard_domain": {"type": "string", "title": "Wildcard Domain"}, "default": {"type": "boolean", "title": "Default"}, "backend": {"$ref": "#/components/schemas/BackendType"}, "region": {"type": "string", "title": "Region"}}, "additionalProperties": false, "type": "object", "required": ["name", "configuration", "created_at", "status", "default"], "title": "GatewayRequest"}, "GatewayStatus": {"type": "string", "enum": ["submitted", "provisioning", "running", "failed"], "title": "GatewayStatus", "description": "An enumeration."}, "GetFileArchiveByHashRequestRequest": {"properties": {"hash": {"type": "string", "title": "Hash"}}, "additionalProperties": false, "type": "object", "required": ["hash"], "title": "GetFileArchiveByHashRequestRequest"}, "GetFleetPlanRequestRequest": {"properties": {"spec": {"$ref": "#/components/schemas/FleetSpecRequest"}}, "additionalProperties": false, "type": "object", "required": ["spec"], "title": "GetFleetPlanRequestRequest"}, "GetFleetRequestRequest": {"properties": {"name": {"type": "string", "title": "Name"}, "id": {"type": "string", "format": "uuid", "title": "Id"}}, "additionalProperties": false, "type": "object", "title": "GetFleetRequestRequest"}, "GetGatewayRequestRequest": {"properties": {"name": {"type": "string", "title": "Name"}}, "additionalProperties": false, "type": "object", "required": ["name"], "title": "GetGatewayRequestRequest"}, "GetInstanceHealthChecksRequestRequest": {"properties": {"fleet_name": {"type": "string", "title": "Fleet Name"}, "instance_num": {"type": "integer", "title": "Instance Num"}, "after": {"type": "string", "format": "date-time", "title": "After"}, "before": {"type": "string", "format": "date-time", "title": "Before"}, "limit": {"type": "integer", "title": "Limit"}}, "additionalProperties": false, "type": "object", "required": ["fleet_name", "instance_num"], "title": "GetInstanceHealthChecksRequestRequest"}, "GetInstanceHealthChecksResponseRequest": {"properties": {"health_checks": {"items": {"$ref": "#/components/schemas/HealthCheckRequest"}, "type": "array", "title": "Health Checks"}}, "additionalProperties": false, "type": "object", "required": ["health_checks"], "title": "GetInstanceHealthChecksResponseRequest"}, "GetRepoRequestRequest": {"properties": {"repo_id": {"type": "string", "title": "Repo Id", "description": "A unique identifier of the repo"}, "include_creds": {"type": "boolean", "title": "Include Creds"}}, "additionalProperties": false, "type": "object", "required": ["repo_id", "include_creds"], "title": "GetRepoRequestRequest"}, "GetRunPlanRequestRequest": {"properties": {"run_spec": {"$ref": "#/components/schemas/RunSpecRequest"}, "max_offers": {"type": "integer", "maximum": 10000.0, "minimum": 1.0, "title": "Max Offers", "description": "The maximum number of offers to return"}}, "additionalProperties": false, "type": "object", "required": ["run_spec"], "title": "GetRunPlanRequestRequest"}, "GetRunRequestRequest": {"properties": {"run_name": {"type": "string", "title": "Run Name"}, "id": {"type": "string", "format": "uuid", "title": "Id"}}, "additionalProperties": false, "type": "object", "title": "GetRunRequestRequest"}, "GetSecretRequestRequest": {"properties": {"name": {"type": "string", "title": "Name"}}, "additionalProperties": false, "type": "object", "required": ["name"], "title": "GetSecretRequestRequest"}, "GetUserRequestRequest": {"properties": {"username": {"type": "string", "title": "Username"}}, "additionalProperties": false, "type": "object", "required": ["username"], "title": "GetUserRequestRequest"}, "GetVolumeRequestRequest": {"properties": {"name": {"type": "string", "title": "Name"}}, "additionalProperties": false, "type": "object", "required": ["name"], "title": "GetVolumeRequestRequest"}, "GlobalRole": {"type": "string", "enum": ["admin", "user"], "title": "GlobalRole", "description": "An enumeration."}, "GpuGroupRequest": {"properties": {"name": {"type": "string", "title": "Name"}, "memory_mib": {"type": "integer", "title": "Memory Mib"}, "vendor": {"$ref": "#/components/schemas/AcceleratorVendor"}, "availability": {"items": {"$ref": "#/components/schemas/InstanceAvailability"}, "type": "array"}, "spot": {"items": {"type": "string", "enum": ["spot", "on-demand"]}, "type": "array", "title": "Spot"}, "count": {"$ref": "#/components/schemas/Range_int_"}, "price": {"$ref": "#/components/schemas/Range_float_"}, "backends": {"items": {"$ref": "#/components/schemas/BackendType"}, "type": "array"}, "backend": {"$ref": "#/components/schemas/BackendType"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions"}, "region": {"type": "string", "title": "Region"}}, "additionalProperties": false, "type": "object", "required": ["name", "memory_mib", "vendor", "availability", "spot", "count", "price"], "title": "GpuGroupRequest", "description": "GPU group that can handle all grouping scenarios."}, "GpuRequest": {"properties": {"name": {"type": "string", "title": "Name"}, "memory_mib": {"type": "integer", "title": "Memory Mib"}, "vendor": {"$ref": "#/components/schemas/AcceleratorVendor"}}, "additionalProperties": false, "type": "object", "required": ["name", "memory_mib"], "title": "GpuRequest"}, "HTTPHeaderSpecRequest": {"properties": {"name": {"type": "string", "maxLength": 256, "minLength": 1, "title": "Name", "description": "The name of the HTTP header"}, "value": {"type": "string", "maxLength": 2048, "minLength": 1, "title": "Value", "description": "The value of the HTTP header"}}, "additionalProperties": false, "type": "object", "required": ["name", "value"], "title": "HTTPHeaderSpecRequest"}, "HTTPValidationError": {"properties": {"detail": {"items": {"$ref": "#/components/schemas/ValidationError"}, "type": "array", "title": "Detail"}}, "type": "object", "title": "HTTPValidationError"}, "HeaderPartitioningKeyRequest": {"properties": {"type": {"type": "string", "enum": ["header"], "title": "Type", "description": "Partitioning type", "default": "header"}, "header": {"type": "string", "maxLength": 500, "pattern": "^[a-zA-Z0-9-_]+$", "title": "Header", "description": "Name of the header to use for partitioning"}}, "additionalProperties": false, "type": "object", "required": ["header"], "title": "HeaderPartitioningKeyRequest"}, "HealthCheckRequest": {"properties": {"collected_at": {"type": "string", "format": "date-time", "title": "Collected At"}, "status": {"$ref": "#/components/schemas/HealthStatus"}, "events": {"items": {"$ref": "#/components/schemas/HealthEventRequest"}, "type": "array", "title": "Events"}}, "additionalProperties": false, "type": "object", "required": ["collected_at", "status", "events"], "title": "HealthCheckRequest"}, "HealthEventRequest": {"properties": {"timestamp": {"type": "string", "format": "date-time", "title": "Timestamp"}, "status": {"$ref": "#/components/schemas/HealthStatus"}, "message": {"type": "string", "title": "Message"}}, "additionalProperties": false, "type": "object", "required": ["timestamp", "status", "message"], "title": "HealthEventRequest"}, "HealthStatus": {"type": "string", "enum": ["healthy", "warning", "failure"], "title": "HealthStatus", "description": "An enumeration."}, "HotAisleAPIKeyCredsRequest": {"properties": {"type": {"type": "string", "enum": ["api_key"], "title": "Type", "description": "The type of credentials", "default": "api_key"}, "api_key": {"type": "string", "title": "Api Key", "description": "The Hot Aisle API key"}}, "additionalProperties": false, "type": "object", "required": ["api_key"], "title": "HotAisleAPIKeyCredsRequest"}, "HotAisleBackendConfigRequest": {"properties": {"type": {"type": "string", "enum": ["hotaisle"], "title": "Type", "description": "The type of backend", "default": "hotaisle"}, "team_handle": {"type": "string", "title": "Team Handle", "description": "The Hot Aisle team handle"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of Hot Aisle regions. Omit to use all regions"}}, "additionalProperties": false, "type": "object", "required": ["team_handle"], "title": "HotAisleBackendConfigRequest"}, "HotAisleBackendConfigWithCredsRequest": {"properties": {"type": {"type": "string", "enum": ["hotaisle"], "title": "Type", "description": "The type of backend", "default": "hotaisle"}, "team_handle": {"type": "string", "title": "Team Handle", "description": "The Hot Aisle team handle"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of Hot Aisle regions. Omit to use all regions"}, "creds": {"allOf": [{"$ref": "#/components/schemas/HotAisleAPIKeyCredsRequest"}], "title": "Creds", "description": "The credentials"}}, "additionalProperties": false, "type": "object", "required": ["team_handle", "creds"], "title": "HotAisleBackendConfigWithCredsRequest"}, "IPAddressPartitioningKeyRequest": {"properties": {"type": {"type": "string", "enum": ["ip_address"], "title": "Type", "description": "Partitioning type", "default": "ip_address"}}, "additionalProperties": false, "type": "object", "title": "IPAddressPartitioningKeyRequest"}, "InstanceAvailability": {"enum": ["unknown", "available", "not_available", "no_quota", "no_balance", "idle", "busy"], "title": "InstanceAvailability", "description": "An enumeration."}, "InstanceGroupPlacement": {"type": "string", "enum": ["any", "cluster"], "title": "InstanceGroupPlacement", "description": "An enumeration."}, "InstanceMountPointRequest": {"properties": {"instance_path": {"type": "string", "title": "Instance Path", "description": "The absolute path on the instance (host)"}, "path": {"type": "string", "title": "Path", "description": "The absolute path in the container"}, "optional": {"type": "boolean", "title": "Optional", "description": "Allow running without this volume in backends that do not support instance volumes", "default": false}}, "additionalProperties": false, "type": "object", "required": ["instance_path", "path"], "title": "InstanceMountPointRequest"}, "InstanceOfferWithAvailabilityRequest": {"properties": {"backend": {"$ref": "#/components/schemas/BackendType"}, "instance": {"$ref": "#/components/schemas/InstanceTypeRequest"}, "region": {"type": "string", "title": "Region"}, "price": {"type": "number", "title": "Price"}, "backend_data": {"type": "object", "title": "Backend Data", "default": {}}, "availability": {"$ref": "#/components/schemas/InstanceAvailability"}, "availability_zones": {"items": {"type": "string"}, "type": "array", "title": "Availability Zones"}, "instance_runtime": {"allOf": [{"$ref": "#/components/schemas/InstanceRuntime"}], "default": "shim"}, "blocks": {"type": "integer", "title": "Blocks", "default": 1}, "total_blocks": {"type": "integer", "title": "Total Blocks", "default": 1}}, "additionalProperties": false, "type": "object", "required": ["backend", "instance", "region", "price", "availability"], "title": "InstanceOfferWithAvailabilityRequest"}, "InstanceRequest": {"properties": {"id": {"type": "string", "format": "uuid", "title": "Id"}, "project_name": {"type": "string", "title": "Project Name"}, "backend": {"$ref": "#/components/schemas/BackendType"}, "instance_type": {"$ref": "#/components/schemas/InstanceTypeRequest"}, "name": {"type": "string", "title": "Name"}, "fleet_id": {"type": "string", "format": "uuid", "title": "Fleet Id"}, "fleet_name": {"type": "string", "title": "Fleet Name"}, "instance_num": {"type": "integer", "title": "Instance Num"}, "job_name": {"type": "string", "title": "Job Name"}, "hostname": {"type": "string", "title": "Hostname"}, "status": {"$ref": "#/components/schemas/InstanceStatus"}, "unreachable": {"type": "boolean", "title": "Unreachable", "default": false}, "health_status": {"allOf": [{"$ref": "#/components/schemas/HealthStatus"}], "default": "healthy"}, "termination_reason": {"type": "string", "title": "Termination Reason"}, "termination_reason_message": {"type": "string", "title": "Termination Reason Message"}, "created": {"type": "string", "format": "date-time", "title": "Created"}, "region": {"type": "string", "title": "Region"}, "availability_zone": {"type": "string", "title": "Availability Zone"}, "price": {"type": "number", "title": "Price"}, "total_blocks": {"type": "integer", "title": "Total Blocks"}, "busy_blocks": {"type": "integer", "title": "Busy Blocks", "default": 0}}, "additionalProperties": false, "type": "object", "required": ["id", "project_name", "name", "instance_num", "status", "created"], "title": "InstanceRequest"}, "InstanceRuntime": {"enum": ["shim", "runner"], "title": "InstanceRuntime", "description": "An enumeration."}, "InstanceStatus": {"type": "string", "enum": ["pending", "provisioning", "idle", "busy", "terminating", "terminated"], "title": "InstanceStatus", "description": "An enumeration."}, "InstanceTypeRequest": {"properties": {"name": {"type": "string", "title": "Name"}, "resources": {"$ref": "#/components/schemas/ResourcesRequest"}}, "additionalProperties": false, "type": "object", "required": ["name", "resources"], "title": "InstanceTypeRequest"}, "JobMetricsRequest": {"properties": {"metrics": {"items": {"$ref": "#/components/schemas/MetricRequest"}, "type": "array", "title": "Metrics"}}, "additionalProperties": false, "type": "object", "required": ["metrics"], "title": "JobMetricsRequest"}, "JobPlanRequest": {"properties": {"job_spec": {"$ref": "#/components/schemas/JobSpecRequest"}, "offers": {"items": {"$ref": "#/components/schemas/InstanceOfferWithAvailabilityRequest"}, "type": "array", "title": "Offers"}, "total_offers": {"type": "integer", "title": "Total Offers"}, "max_price": {"type": "number", "title": "Max Price"}}, "additionalProperties": false, "type": "object", "required": ["job_spec", "offers", "total_offers"], "title": "JobPlanRequest"}, "JobProvisioningDataRequest": {"properties": {"backend": {"$ref": "#/components/schemas/BackendType"}, "base_backend": {"$ref": "#/components/schemas/BackendType"}, "instance_type": {"$ref": "#/components/schemas/InstanceTypeRequest"}, "instance_id": {"type": "string", "title": "Instance Id"}, "hostname": {"type": "string", "title": "Hostname"}, "internal_ip": {"type": "string", "title": "Internal Ip"}, "public_ip_enabled": {"type": "boolean", "title": "Public Ip Enabled", "default": true}, "instance_network": {"type": "string", "title": "Instance Network"}, "region": {"type": "string", "title": "Region"}, "availability_zone": {"type": "string", "title": "Availability Zone"}, "reservation": {"type": "string", "title": "Reservation"}, "price": {"type": "number", "title": "Price"}, "username": {"type": "string", "title": "Username"}, "ssh_port": {"type": "integer", "title": "Ssh Port"}, "dockerized": {"type": "boolean", "title": "Dockerized"}, "ssh_proxy": {"$ref": "#/components/schemas/SSHConnectionParamsRequest"}, "backend_data": {"type": "string", "title": "Backend Data"}}, "additionalProperties": false, "type": "object", "required": ["backend", "instance_type", "instance_id", "region", "price", "username", "dockerized"], "title": "JobProvisioningDataRequest"}, "JobRequest": {"properties": {"job_spec": {"$ref": "#/components/schemas/JobSpecRequest"}, "job_submissions": {"items": {"$ref": "#/components/schemas/JobSubmissionRequest"}, "type": "array", "title": "Job Submissions"}}, "additionalProperties": false, "type": "object", "required": ["job_spec", "job_submissions"], "title": "JobRequest"}, "JobRuntimeDataRequest": {"properties": {"network_mode": {"$ref": "#/components/schemas/NetworkMode"}, "gpu": {"type": "integer", "title": "Gpu"}, "cpu": {"type": "number", "title": "Cpu"}, "memory": {"type": "number", "title": "Memory"}, "ports": {"additionalProperties": {"type": "integer"}, "type": "object", "title": "Ports"}, "volume_names": {"items": {"type": "string"}, "type": "array", "title": "Volume Names"}, "offer": {"$ref": "#/components/schemas/InstanceOfferWithAvailabilityRequest"}}, "additionalProperties": false, "type": "object", "required": ["network_mode"], "title": "JobRuntimeDataRequest", "description": "Holds various information only available after the job is submitted, such as:\n * offer (depends on the instance)\n * volumes used by the job\n * resource constraints for container (depend on the instance)\n * port mapping (reported by the shim only after the container is started)\n\nSome fields are mutable, for example, `ports` only available when the shim starts\nthe container."}, "JobSSHKeyRequest": {"properties": {"private": {"type": "string", "title": "Private"}, "public": {"type": "string", "title": "Public"}}, "additionalProperties": false, "type": "object", "required": ["private", "public"], "title": "JobSSHKeyRequest"}, "JobSpecRequest": {"properties": {"replica_num": {"type": "integer", "title": "Replica Num", "default": 0}, "job_num": {"type": "integer", "title": "Job Num"}, "job_name": {"type": "string", "title": "Job Name"}, "jobs_per_replica": {"type": "integer", "title": "Jobs Per Replica", "default": 1}, "replica_group": {"type": "string", "title": "Replica Group", "default": "0"}, "app_specs": {"items": {"$ref": "#/components/schemas/AppSpecRequest"}, "type": "array", "title": "App Specs"}, "user": {"$ref": "#/components/schemas/UnixUserRequest"}, "commands": {"items": {"type": "string"}, "type": "array", "title": "Commands"}, "env": {"additionalProperties": {"type": "string"}, "type": "object", "title": "Env"}, "home_dir": {"type": "string", "title": "Home Dir"}, "image_name": {"type": "string", "title": "Image Name"}, "privileged": {"type": "boolean", "title": "Privileged", "default": false}, "single_branch": {"type": "boolean", "title": "Single Branch"}, "max_duration": {"type": "integer", "title": "Max Duration"}, "stop_duration": {"type": "integer", "title": "Stop Duration"}, "utilization_policy": {"$ref": "#/components/schemas/UtilizationPolicyRequest"}, "registry_auth": {"$ref": "#/components/schemas/RegistryAuthRequest"}, "requirements": {"$ref": "#/components/schemas/RequirementsRequest"}, "retry": {"$ref": "#/components/schemas/RetryRequest"}, "volumes": {"items": {"anyOf": [{"$ref": "#/components/schemas/VolumeMountPointRequest"}, {"$ref": "#/components/schemas/InstanceMountPointRequest"}]}, "type": "array", "title": "Volumes"}, "ssh_key": {"$ref": "#/components/schemas/JobSSHKeyRequest"}, "working_dir": {"type": "string", "title": "Working Dir"}, "repo_data": {"oneOf": [{"$ref": "#/components/schemas/RemoteRunRepoDataRequest"}, {"$ref": "#/components/schemas/LocalRunRepoDataRequest"}, {"$ref": "#/components/schemas/VirtualRunRepoDataRequest"}], "title": "Repo Data", "discriminator": {"propertyName": "repo_type", "mapping": {"remote": "#/components/schemas/RemoteRunRepoDataRequest", "local": "#/components/schemas/LocalRunRepoDataRequest", "virtual": "#/components/schemas/VirtualRunRepoDataRequest"}}}, "repo_code_hash": {"type": "string", "title": "Repo Code Hash"}, "repo_dir": {"type": "string", "title": "Repo Dir", "default": "/workflow"}, "repo_exists_action": {"$ref": "#/components/schemas/RepoExistsAction"}, "file_archives": {"items": {"$ref": "#/components/schemas/FileArchiveMappingRequest"}, "type": "array", "title": "File Archives", "default": []}, "service_port": {"type": "integer", "title": "Service Port"}, "probes": {"items": {"$ref": "#/components/schemas/ProbeSpecRequest"}, "type": "array", "title": "Probes", "default": []}}, "additionalProperties": false, "type": "object", "required": ["job_num", "job_name", "commands", "env", "image_name", "requirements"], "title": "JobSpecRequest"}, "JobStatus": {"type": "string", "enum": ["submitted", "provisioning", "pulling", "running", "terminating", "terminated", "aborted", "failed", "done"], "title": "JobStatus", "description": "An enumeration."}, "JobSubmissionLogsRequest": {"properties": {"logs": {"items": {"$ref": "#/components/schemas/LogEventRequest"}, "type": "array", "title": "Logs"}, "external_url": {"type": "string", "title": "External Url"}, "next_token": {"type": "string", "title": "Next Token"}}, "additionalProperties": false, "type": "object", "required": ["logs"], "title": "JobSubmissionLogsRequest"}, "JobSubmissionRequest": {"properties": {"id": {"type": "string", "format": "uuid4", "title": "Id"}, "submission_num": {"type": "integer", "title": "Submission Num"}, "deployment_num": {"type": "integer", "title": "Deployment Num", "default": 0}, "submitted_at": {"type": "string", "format": "date-time", "title": "Submitted At"}, "last_processed_at": {"type": "string", "format": "date-time", "title": "Last Processed At"}, "finished_at": {"type": "string", "format": "date-time", "title": "Finished At"}, "inactivity_secs": {"type": "integer", "title": "Inactivity Secs"}, "status": {"$ref": "#/components/schemas/JobStatus"}, "status_message": {"type": "string", "title": "Status Message", "default": ""}, "termination_reason": {"type": "string", "title": "Termination Reason"}, "termination_reason_message": {"type": "string", "title": "Termination Reason Message"}, "exit_status": {"type": "integer", "title": "Exit Status"}, "job_provisioning_data": {"$ref": "#/components/schemas/JobProvisioningDataRequest"}, "job_runtime_data": {"$ref": "#/components/schemas/JobRuntimeDataRequest"}, "error": {"type": "string", "title": "Error"}, "probes": {"items": {"$ref": "#/components/schemas/ProbeRequest"}, "type": "array", "title": "Probes", "default": []}}, "additionalProperties": false, "type": "object", "required": ["id", "submission_num", "submitted_at", "last_processed_at", "status"], "title": "JobSubmissionRequest"}, "KubeconfigConfigRequest": {"properties": {"filename": {"type": "string", "title": "Filename", "description": "The path to the kubeconfig file", "default": ""}, "data": {"type": "string", "title": "Data", "description": "The contents of the kubeconfig file"}}, "additionalProperties": false, "type": "object", "required": ["data"], "title": "KubeconfigConfigRequest"}, "KubernetesBackendConfigRequest": {"properties": {"type": {"type": "string", "enum": ["kubernetes"], "title": "Type", "description": "The type of backend", "default": "kubernetes"}, "proxy_jump": {"allOf": [{"$ref": "#/components/schemas/KubernetesProxyJumpConfigRequest"}], "title": "Proxy Jump", "description": "The SSH proxy jump configuration"}, "namespace": {"type": "string", "title": "Namespace", "description": "The namespace for resources managed by `dstack`", "default": "default"}}, "additionalProperties": false, "type": "object", "title": "KubernetesBackendConfigRequest"}, "KubernetesBackendConfigWithCredsRequest": {"properties": {"type": {"type": "string", "enum": ["kubernetes"], "title": "Type", "description": "The type of backend", "default": "kubernetes"}, "proxy_jump": {"allOf": [{"$ref": "#/components/schemas/KubernetesProxyJumpConfigRequest"}], "title": "Proxy Jump", "description": "The SSH proxy jump configuration"}, "namespace": {"type": "string", "title": "Namespace", "description": "The namespace for resources managed by `dstack`", "default": "default"}, "kubeconfig": {"allOf": [{"$ref": "#/components/schemas/KubeconfigConfigRequest"}], "title": "Kubeconfig", "description": "The kubeconfig configuration"}}, "additionalProperties": false, "type": "object", "required": ["kubeconfig"], "title": "KubernetesBackendConfigWithCredsRequest"}, "KubernetesProxyJumpConfigRequest": {"properties": {"hostname": {"type": "string", "title": "Hostname", "description": "The external IP address or hostname of any node"}, "port": {"type": "integer", "title": "Port", "description": "Any port accessible outside of the cluster"}}, "additionalProperties": false, "type": "object", "title": "KubernetesProxyJumpConfigRequest"}, "LambdaAPIKeyCredsRequest": {"properties": {"type": {"type": "string", "enum": ["api_key"], "title": "Type", "description": "The type of credentials", "default": "api_key"}, "api_key": {"type": "string", "title": "Api Key", "description": "The API key"}}, "additionalProperties": false, "type": "object", "required": ["api_key"], "title": "LambdaAPIKeyCredsRequest"}, "LambdaBackendConfigRequest": {"properties": {"type": {"type": "string", "enum": ["lambda"], "title": "Type", "description": "The type of backend", "default": "lambda"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of Lambda regions. Omit to use all regions"}}, "additionalProperties": false, "type": "object", "title": "LambdaBackendConfigRequest"}, "LambdaBackendConfigWithCredsRequest": {"properties": {"type": {"type": "string", "enum": ["lambda"], "title": "Type", "description": "The type of backend", "default": "lambda"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of Lambda regions. Omit to use all regions"}, "creds": {"allOf": [{"$ref": "#/components/schemas/LambdaAPIKeyCredsRequest"}], "title": "Creds", "description": "The credentials"}}, "additionalProperties": false, "type": "object", "required": ["creds"], "title": "LambdaBackendConfigWithCredsRequest"}, "LetsEncryptGatewayCertificateRequest": {"properties": {"type": {"type": "string", "enum": ["lets-encrypt"], "title": "Type", "description": "Automatic certificates by Let's Encrypt", "default": "lets-encrypt"}}, "additionalProperties": false, "type": "object", "title": "LetsEncryptGatewayCertificateRequest"}, "ListEventsRequestRequest": {"properties": {"target_projects": {"items": {"type": "string", "format": "uuid"}, "type": "array", "maxItems": 16, "minItems": 1, "title": "Target Projects", "description": "List of project IDs. The response will only include events that target the specified projects"}, "target_users": {"items": {"type": "string", "format": "uuid"}, "type": "array", "maxItems": 16, "minItems": 1, "title": "Target Users", "description": "List of user IDs. The response will only include events that target the specified users"}, "target_fleets": {"items": {"type": "string", "format": "uuid"}, "type": "array", "maxItems": 16, "minItems": 1, "title": "Target Fleets", "description": "List of fleet IDs. The response will only include events that target the specified fleets"}, "target_instances": {"items": {"type": "string", "format": "uuid"}, "type": "array", "maxItems": 16, "minItems": 1, "title": "Target Instances", "description": "List of instance IDs. The response will only include events that target the specified instances"}, "target_runs": {"items": {"type": "string", "format": "uuid"}, "type": "array", "maxItems": 16, "minItems": 1, "title": "Target Runs", "description": "List of run IDs. The response will only include events that target the specified runs"}, "target_jobs": {"items": {"type": "string", "format": "uuid"}, "type": "array", "maxItems": 16, "minItems": 1, "title": "Target Jobs", "description": "List of job IDs. The response will only include events that target the specified jobs"}, "target_volumes": {"items": {"type": "string", "format": "uuid"}, "type": "array", "maxItems": 16, "minItems": 1, "title": "Target Volumes", "description": "List of volume IDs. The response will only include events that target the specified volumes"}, "target_gateways": {"items": {"type": "string", "format": "uuid"}, "type": "array", "maxItems": 16, "minItems": 1, "title": "Target Gateways", "description": "List of gateway IDs. The response will only include events that target the specified gateways"}, "target_secrets": {"items": {"type": "string", "format": "uuid"}, "type": "array", "maxItems": 16, "minItems": 1, "title": "Target Secrets", "description": "List of secret IDs. The response will only include events that target the specified secrets"}, "within_projects": {"items": {"type": "string", "format": "uuid"}, "type": "array", "maxItems": 16, "minItems": 1, "title": "Within Projects", "description": "List of project IDs. The response will only include events that target the specified projects or any entities within those projects"}, "within_fleets": {"items": {"type": "string", "format": "uuid"}, "type": "array", "maxItems": 16, "minItems": 1, "title": "Within Fleets", "description": "List of fleet IDs. The response will only include events that target the specified fleets or instances within those fleets"}, "within_runs": {"items": {"type": "string", "format": "uuid"}, "type": "array", "maxItems": 16, "minItems": 1, "title": "Within Runs", "description": "List of run IDs. The response will only include events that target the specified runs or jobs within those runs"}, "include_target_types": {"items": {"$ref": "#/components/schemas/EventTargetType"}, "type": "array", "maxItems": 16, "minItems": 1, "description": "List of target types. The response will only include events that have a target of one of the specified types"}, "actors": {"items": {"type": "string", "format": "uuid"}, "type": "array", "maxItems": 16, "minItems": 1, "title": "Actors", "description": "List of user IDs or `null` values. The response will only include events about actions performed by the specified users, or performed by the system if `null` is specified"}, "prev_recorded_at": {"type": "string", "format": "date-time", "title": "Prev Recorded At"}, "prev_id": {"type": "string", "format": "uuid", "title": "Prev Id"}, "limit": {"type": "integer", "maximum": 100.0, "minimum": 1.0, "title": "Limit", "default": 100}, "ascending": {"type": "boolean", "title": "Ascending", "default": false}}, "additionalProperties": false, "type": "object", "title": "ListEventsRequestRequest"}, "ListFleetsRequestRequest": {"properties": {"project_name": {"type": "string", "title": "Project Name"}, "only_active": {"type": "boolean", "title": "Only Active", "default": false}, "prev_created_at": {"type": "string", "format": "date-time", "title": "Prev Created At"}, "prev_id": {"type": "string", "format": "uuid", "title": "Prev Id"}, "limit": {"type": "integer", "maximum": 100.0, "minimum": 0.0, "title": "Limit", "default": 100}, "ascending": {"type": "boolean", "title": "Ascending", "default": false}}, "additionalProperties": false, "type": "object", "title": "ListFleetsRequestRequest"}, "ListGpusRequestRequest": {"properties": {"run_spec": {"$ref": "#/components/schemas/RunSpecRequest"}, "group_by": {"items": {"type": "string", "enum": ["backend", "region", "count"]}, "type": "array", "title": "Group By", "description": "List of fields to group by. Valid values: 'backend', 'region', 'count'. Note: 'region' can only be used together with 'backend'."}}, "additionalProperties": false, "type": "object", "required": ["run_spec"], "title": "ListGpusRequestRequest", "description": "Request for listing GPUs with optional grouping."}, "ListGpusResponseRequest": {"properties": {"gpus": {"items": {"$ref": "#/components/schemas/GpuGroupRequest"}, "type": "array", "title": "Gpus", "description": "List of GPU specifications, grouped according to the group_by parameter"}}, "additionalProperties": false, "type": "object", "required": ["gpus"], "title": "ListGpusResponseRequest", "description": "Response containing GPU specifications."}, "ListInstancesRequestRequest": {"properties": {"project_names": {"items": {"type": "string"}, "type": "array", "title": "Project Names"}, "fleet_ids": {"items": {"type": "string", "format": "uuid"}, "type": "array", "title": "Fleet Ids"}, "only_active": {"type": "boolean", "title": "Only Active", "default": false}, "prev_created_at": {"type": "string", "format": "date-time", "title": "Prev Created At"}, "prev_id": {"type": "string", "format": "uuid", "title": "Prev Id"}, "limit": {"type": "integer", "title": "Limit", "default": 1000}, "ascending": {"type": "boolean", "title": "Ascending", "default": false}}, "additionalProperties": false, "type": "object", "title": "ListInstancesRequestRequest"}, "ListProjectsRequestRequest": {"properties": {"include_not_joined": {"type": "boolean", "title": "Include Not Joined", "description": "Include public projects where user is not a member.", "default": true}, "return_total_count": {"type": "boolean", "title": "Return Total Count", "description": "Return `total_count` with the total number of projects.", "default": false}, "name_pattern": {"type": "string", "pattern": "^[a-zA-Z0-9-_]*$", "title": "Name Pattern", "description": "Include only projects with the name containing `name_pattern`."}, "prev_created_at": {"type": "string", "format": "date-time", "title": "Prev Created At", "description": "Paginate projects by specifying `created_at` of the last (first) project in previous batch for descending (ascending)."}, "prev_id": {"type": "string", "format": "uuid", "title": "Prev Id", "description": "Paginate projects by specifying `id` of the last (first) project in previous batch for descending (ascending). Must be used together with `prev_created_at`."}, "limit": {"type": "integer", "maximum": 2000.0, "minimum": 0.0, "title": "Limit", "description": "Limit number of projects returned.", "default": 2000}, "ascending": {"type": "boolean", "title": "Ascending", "description": "Return projects sorted by `created_at` in ascending order. Defaults to descending.", "default": false}}, "additionalProperties": false, "type": "object", "title": "ListProjectsRequestRequest"}, "ListRunsRequestRequest": {"properties": {"project_name": {"type": "string", "title": "Project Name"}, "repo_id": {"type": "string", "title": "Repo Id"}, "username": {"type": "string", "title": "Username"}, "only_active": {"type": "boolean", "title": "Only Active", "default": false}, "include_jobs": {"type": "boolean", "title": "Include Jobs", "description": "Whether to include `jobs` in the response", "default": true}, "job_submissions_limit": {"type": "integer", "minimum": 0.0, "title": "Job Submissions Limit", "description": "Limit number of job submissions returned per job to avoid large responses.Drops older job submissions. No effect with `include_jobs: false`"}, "prev_submitted_at": {"type": "string", "format": "date-time", "title": "Prev Submitted At"}, "prev_run_id": {"type": "string", "format": "uuid", "title": "Prev Run Id"}, "limit": {"type": "integer", "maximum": 100.0, "minimum": 0.0, "title": "Limit", "default": 100}, "ascending": {"type": "boolean", "title": "Ascending", "default": false}}, "additionalProperties": false, "type": "object", "title": "ListRunsRequestRequest"}, "ListUsersRequestRequest": {"properties": {"return_total_count": {"type": "boolean", "title": "Return Total Count", "description": "Return `total_count` with the total number of users.", "default": false}, "name_pattern": {"type": "string", "pattern": "^[a-zA-Z0-9-_]*$", "title": "Name Pattern", "description": "Include only users with the name containing `name_pattern`."}, "prev_created_at": {"type": "string", "format": "date-time", "title": "Prev Created At", "description": "Paginate users by specifying `created_at` of the last (first) user in previous batch for descending (ascending)."}, "prev_id": {"type": "string", "format": "uuid", "title": "Prev Id", "description": "Paginate users by specifying `id` of the last (first) user in previous batch for descending (ascending). Must be used together with `prev_created_at`."}, "limit": {"type": "integer", "maximum": 2000.0, "minimum": 0.0, "title": "Limit", "description": "Limit number of users returned.", "default": 2000}, "ascending": {"type": "boolean", "title": "Ascending", "description": "Return users sorted by `created_at` in ascending order. Defaults to descending.", "default": false}}, "additionalProperties": false, "type": "object", "title": "ListUsersRequestRequest"}, "ListVolumesRequestRequest": {"properties": {"project_name": {"type": "string", "title": "Project Name"}, "only_active": {"type": "boolean", "title": "Only Active", "default": false}, "prev_created_at": {"type": "string", "format": "date-time", "title": "Prev Created At"}, "prev_id": {"type": "string", "format": "uuid", "title": "Prev Id"}, "limit": {"type": "integer", "maximum": 100.0, "minimum": 0.0, "title": "Limit", "default": 100}, "ascending": {"type": "boolean", "title": "Ascending", "default": false}}, "additionalProperties": false, "type": "object", "title": "ListVolumesRequestRequest"}, "LocalRepoInfoRequest": {"properties": {"repo_type": {"type": "string", "enum": ["local"], "title": "Repo Type", "default": "local"}, "repo_dir": {"type": "string", "title": "Repo Dir"}}, "additionalProperties": false, "type": "object", "required": ["repo_dir"], "title": "LocalRepoInfoRequest"}, "LocalRunRepoDataRequest": {"properties": {"repo_type": {"type": "string", "enum": ["local"], "title": "Repo Type", "default": "local"}, "repo_dir": {"type": "string", "title": "Repo Dir"}}, "additionalProperties": false, "type": "object", "required": ["repo_dir"], "title": "LocalRunRepoDataRequest"}, "LogEventRequest": {"properties": {"timestamp": {"type": "string", "format": "date-time", "title": "Timestamp"}, "log_source": {"$ref": "#/components/schemas/LogEventSource"}, "message": {"type": "string", "title": "Message"}}, "additionalProperties": false, "type": "object", "required": ["timestamp", "log_source", "message"], "title": "LogEventRequest"}, "LogEventSource": {"type": "string", "enum": ["stdout", "stderr"], "title": "LogEventSource", "description": "An enumeration."}, "MemberPermissionsRequest": {"properties": {"can_manage_ssh_fleets": {"type": "boolean", "title": "Can Manage Ssh Fleets"}}, "additionalProperties": false, "type": "object", "required": ["can_manage_ssh_fleets"], "title": "MemberPermissionsRequest"}, "MemberRequest": {"properties": {"user": {"$ref": "#/components/schemas/UserRequest"}, "project_role": {"$ref": "#/components/schemas/ProjectRole"}, "permissions": {"$ref": "#/components/schemas/MemberPermissionsRequest"}}, "additionalProperties": false, "type": "object", "required": ["user", "project_role", "permissions"], "title": "MemberRequest"}, "MemberSettingRequest": {"properties": {"username": {"type": "string", "title": "Username", "description": "The username or email of the user"}, "project_role": {"$ref": "#/components/schemas/ProjectRole"}}, "additionalProperties": false, "type": "object", "required": ["username", "project_role"], "title": "MemberSettingRequest"}, "MetricRequest": {"properties": {"name": {"type": "string", "title": "Name"}, "timestamps": {"items": {"type": "string", "format": "date-time"}, "type": "array", "title": "Timestamps"}, "values": {"items": {}, "type": "array", "title": "Values"}}, "additionalProperties": false, "type": "object", "required": ["name", "timestamps", "values"], "title": "MetricRequest"}, "ModelRequest": {"properties": {"object": {"type": "string", "enum": ["model"], "title": "Object", "default": "model"}, "id": {"type": "string", "title": "Id"}, "created": {"type": "integer", "title": "Created"}, "owned_by": {"type": "string", "title": "Owned By"}}, "additionalProperties": false, "type": "object", "required": ["id", "created", "owned_by"], "title": "ModelRequest"}, "ModelsResponseRequest": {"properties": {"object": {"type": "string", "enum": ["list"], "title": "Object", "default": "list"}, "data": {"items": {"$ref": "#/components/schemas/ModelRequest"}, "type": "array", "title": "Data"}}, "additionalProperties": false, "type": "object", "required": ["data"], "title": "ModelsResponseRequest"}, "NebiusBackendConfigRequest": {"properties": {"type": {"type": "string", "enum": ["nebius"], "title": "Type", "description": "The type of backend", "default": "nebius"}, "projects": {"items": {"type": "string"}, "type": "array", "title": "Projects", "description": "The list of allowed Nebius project IDs. Omit to use the default project in each region. The project is considered default if it is the only project in the region or if its name starts with `default`"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of allowed Nebius regions. Omit to allow all regions"}, "fabrics": {"items": {"type": "string"}, "type": "array", "title": "Fabrics", "description": "The list of allowed fabrics for InfiniBand clusters. Omit to allow all fabrics"}, "tags": {"additionalProperties": {"type": "string"}, "type": "object", "title": "Tags", "description": "The tags (labels) that will be assigned to resources created by `dstack`"}}, "additionalProperties": false, "type": "object", "title": "NebiusBackendConfigRequest", "description": "The backend config used in the API, server/config.yml, `NebiusConfigurator`.\nIt also serves as a base class for other backend config models.\nShould not include creds."}, "NebiusBackendConfigWithCredsRequest": {"properties": {"type": {"type": "string", "enum": ["nebius"], "title": "Type", "description": "The type of backend", "default": "nebius"}, "projects": {"items": {"type": "string"}, "type": "array", "title": "Projects", "description": "The list of allowed Nebius project IDs. Omit to use the default project in each region. The project is considered default if it is the only project in the region or if its name starts with `default`"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of allowed Nebius regions. Omit to allow all regions"}, "fabrics": {"items": {"type": "string"}, "type": "array", "title": "Fabrics", "description": "The list of allowed fabrics for InfiniBand clusters. Omit to allow all fabrics"}, "tags": {"additionalProperties": {"type": "string"}, "type": "object", "title": "Tags", "description": "The tags (labels) that will be assigned to resources created by `dstack`"}, "creds": {"allOf": [{"$ref": "#/components/schemas/NebiusServiceAccountCredsRequest"}], "title": "Creds", "description": "The credentials"}}, "additionalProperties": false, "type": "object", "required": ["creds"], "title": "NebiusBackendConfigWithCredsRequest", "description": "Same as `NebiusBackendConfig` but also includes creds."}, "NebiusServiceAccountCredsRequest": {"properties": {"type": {"type": "string", "enum": ["service_account"], "title": "Type", "description": "The type of credentials", "default": "service_account"}, "service_account_id": {"type": "string", "title": "Service Account Id", "description": "Service account ID"}, "public_key_id": {"type": "string", "title": "Public Key Id", "description": "ID of the service account public key"}, "private_key_file": {"type": "string", "title": "Private Key File", "description": "Path to the service account private key"}, "private_key_content": {"type": "string", "title": "Private Key Content", "description": "Content of the service account private key. When configuring via `server/config.yml`, it's automatically filled from `private_key_file`. When configuring via UI, it has to be specified explicitly."}, "filename": {"type": "string", "title": "Filename", "description": "The path to the service account credentials file"}}, "additionalProperties": false, "type": "object", "required": ["service_account_id", "public_key_id", "private_key_content"], "title": "NebiusServiceAccountCredsRequest"}, "NetworkMode": {"type": "string", "enum": ["host", "bridge"], "title": "NetworkMode", "description": "An enumeration."}, "OAuthGetNextRedirectRequestRequest": {"properties": {"code": {"type": "string", "title": "Code", "description": "The OAuth2 authorization code received from the provider in the redirect URL."}, "state": {"type": "string", "title": "State", "description": "The state parameter received from the provider in the redirect URL."}}, "additionalProperties": false, "type": "object", "required": ["code", "state"], "title": "OAuthGetNextRedirectRequestRequest"}, "OAuthGetNextRedirectResponseRequest": {"properties": {"redirect_url": {"type": "string", "title": "Redirect Url", "description": "The URL that the user needs to be redirected to. If `null`, there is no next redirect."}}, "additionalProperties": false, "type": "object", "title": "OAuthGetNextRedirectResponseRequest"}, "OAuthProviderInfoRequest": {"properties": {"name": {"type": "string", "title": "Name", "description": "The OAuth2 provider name."}, "enabled": {"type": "boolean", "title": "Enabled", "description": "Whether the provider is configured on the server."}}, "additionalProperties": false, "type": "object", "required": ["name", "enabled"], "title": "OAuthProviderInfoRequest"}, "OCIBackendConfigRequest": {"properties": {"type": {"type": "string", "enum": ["oci"], "title": "Type", "description": "The type of backend", "default": "oci"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of OCI regions. Omit to use all regions"}, "compartment_id": {"type": "string", "title": "Compartment Id", "description": "Compartment where `dstack` will create all resources. Omit to instruct `dstack` to create a new compartment"}}, "additionalProperties": false, "type": "object", "title": "OCIBackendConfigRequest"}, "OCIBackendConfigWithCredsRequest": {"properties": {"type": {"type": "string", "enum": ["oci"], "title": "Type", "description": "The type of backend", "default": "oci"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of OCI regions. Omit to use all regions"}, "compartment_id": {"type": "string", "title": "Compartment Id", "description": "Compartment where `dstack` will create all resources. Omit to instruct `dstack` to create a new compartment"}, "creds": {"oneOf": [{"$ref": "#/components/schemas/OCIClientCredsRequest"}, {"$ref": "#/components/schemas/OCIDefaultCredsRequest"}], "title": "Creds", "description": "The credentials", "discriminator": {"propertyName": "type", "mapping": {"client": "#/components/schemas/OCIClientCredsRequest", "default": "#/components/schemas/OCIDefaultCredsRequest"}}}}, "additionalProperties": false, "type": "object", "required": ["creds"], "title": "OCIBackendConfigWithCredsRequest"}, "OCIClientCredsRequest": {"properties": {"type": {"type": "string", "enum": ["client"], "title": "Type", "description": "The type of credentials", "default": "client"}, "user": {"type": "string", "title": "User", "description": "User OCID"}, "tenancy": {"type": "string", "title": "Tenancy", "description": "Tenancy OCID"}, "key_file": {"type": "string", "title": "Key File", "description": "Path to the user's private PEM key. Either this or `key_content` should be set"}, "key_content": {"type": "string", "title": "Key Content", "description": "Content of the user's private PEM key. Either this or `key_file` should be set"}, "pass_phrase": {"type": "string", "title": "Pass Phrase", "description": "Passphrase for the private PEM key if it is encrypted"}, "fingerprint": {"type": "string", "title": "Fingerprint", "description": "User's public key fingerprint"}, "region": {"type": "string", "title": "Region", "description": "Name or key of any region the tenancy is subscribed to"}}, "additionalProperties": false, "type": "object", "required": ["user", "tenancy", "fingerprint", "region"], "title": "OCIClientCredsRequest"}, "OCIDefaultCredsRequest": {"properties": {"type": {"type": "string", "enum": ["default"], "title": "Type", "description": "The type of credentials", "default": "default"}, "file": {"type": "string", "title": "File", "description": "Path to the OCI CLI-compatible config file", "default": "~/.oci/config"}, "profile": {"type": "string", "title": "Profile", "description": "Profile to load from the config file", "default": "DEFAULT"}}, "additionalProperties": false, "type": "object", "title": "OCIDefaultCredsRequest"}, "OpenAIChatModelRequest": {"properties": {"type": {"type": "string", "enum": ["chat"], "title": "Type", "description": "The type of the model", "default": "chat"}, "name": {"type": "string", "title": "Name", "description": "The name of the model"}, "format": {"type": "string", "enum": ["openai"], "title": "Format", "description": "The serving format. Must be set to `openai`"}, "prefix": {"type": "string", "title": "Prefix", "description": "The `base_url` prefix (after hostname)", "default": "/v1"}}, "additionalProperties": false, "type": "object", "required": ["name", "format"], "title": "OpenAIChatModelRequest", "description": "Mapping of the model for the OpenAI-compatible endpoint.\n\nAttributes:\n type (str): The type of the model, e.g. \"chat\"\n name (str): The name of the model. This name will be used both to load model configuration from the HuggingFace Hub and in the OpenAI-compatible endpoint.\n format (str): The format of the model, i.e. \"openai\".\n prefix (str): The `base_url` prefix: `http://hostname/{prefix}/chat/completions`. Defaults to `/v1`."}, "PollLogsRequestRequest": {"properties": {"run_name": {"type": "string", "title": "Run Name"}, "job_submission_id": {"type": "string", "format": "uuid4", "title": "Job Submission Id"}, "start_time": {"type": "string", "format": "date-time", "title": "Start Time"}, "end_time": {"type": "string", "format": "date-time", "title": "End Time"}, "descending": {"type": "boolean", "title": "Descending", "default": false}, "next_token": {"type": "string", "title": "Next Token"}, "limit": {"type": "integer", "maximum": 1000.0, "minimum": 0.0, "title": "Limit", "default": 100}, "diagnose": {"type": "boolean", "title": "Diagnose", "default": false}}, "additionalProperties": false, "type": "object", "required": ["run_name", "job_submission_id"], "title": "PollLogsRequestRequest"}, "PortMappingRequest": {"properties": {"local_port": {"type": "integer", "maximum": 65536.0, "exclusiveMinimum": 0.0, "title": "Local Port"}, "container_port": {"type": "integer", "maximum": 65536.0, "exclusiveMinimum": 0.0, "title": "Container Port"}}, "additionalProperties": false, "type": "object", "required": ["container_port"], "title": "PortMappingRequest"}, "ProbeConfigRequest": {"properties": {"type": {"type": "string", "enum": ["http"], "title": "Type"}, "url": {"type": "string", "title": "Url", "description": "The URL to request. Defaults to `/`"}, "method": {"type": "string", "enum": ["get", "post", "put", "delete", "patch", "head"], "title": "Method", "description": "The HTTP method to use for the probe (e.g., `get`, `post`, etc.). Defaults to `get`"}, "headers": {"items": {"$ref": "#/components/schemas/HTTPHeaderSpecRequest"}, "type": "array", "maxItems": 16, "title": "Headers", "description": "A list of HTTP headers to include in the request", "default": []}, "body": {"type": "string", "maxLength": 2048, "minLength": 1, "title": "Body", "description": "The HTTP request body to send with the probe"}, "timeout": {"anyOf": [{"type": "integer"}, {"type": "string"}], "title": "Timeout", "description": "Maximum amount of time the HTTP request is allowed to take. Defaults to `10s`"}, "interval": {"anyOf": [{"type": "integer"}, {"type": "string"}], "title": "Interval", "description": "Minimum amount of time between the end of one probe execution and the start of the next. Defaults to `15s`"}, "ready_after": {"type": "integer", "minimum": 1.0, "title": "Ready After", "description": "The number of consecutive successful probe executions required for the replica to be considered ready. Used during rolling deployments. Defaults to `1`"}}, "additionalProperties": false, "type": "object", "required": ["type"], "title": "ProbeConfigRequest"}, "ProbeRequest": {"properties": {"success_streak": {"type": "integer", "title": "Success Streak"}}, "additionalProperties": false, "type": "object", "required": ["success_streak"], "title": "ProbeRequest"}, "ProbeSpecRequest": {"properties": {"type": {"type": "string", "enum": ["http"], "title": "Type"}, "url": {"type": "string", "title": "Url"}, "method": {"type": "string", "enum": ["get", "post", "put", "delete", "patch", "head"], "title": "Method", "default": "get"}, "headers": {"items": {"$ref": "#/components/schemas/HTTPHeaderSpecRequest"}, "type": "array", "title": "Headers", "default": []}, "body": {"type": "string", "title": "Body"}, "timeout": {"type": "integer", "title": "Timeout"}, "interval": {"type": "integer", "title": "Interval"}, "ready_after": {"type": "integer", "title": "Ready After"}}, "additionalProperties": false, "type": "object", "required": ["type", "url", "timeout", "interval", "ready_after"], "title": "ProbeSpecRequest"}, "ProfileRequest": {"properties": {"backends": {"items": {"$ref": "#/components/schemas/BackendType"}, "type": "array", "description": "The backends to consider for provisioning (e.g., `[aws, gcp]`)"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The regions to consider for provisioning (e.g., `[eu-west-1, us-west4, westeurope]`)"}, "availability_zones": {"items": {"type": "string"}, "type": "array", "title": "Availability Zones", "description": "The availability zones to consider for provisioning (e.g., `[eu-west-1a, us-west4-a]`)"}, "instance_types": {"items": {"type": "string"}, "type": "array", "title": "Instance Types", "description": "The cloud-specific instance types to consider for provisioning (e.g., `[p3.8xlarge, n1-standard-4]`)"}, "reservation": {"type": "string", "title": "Reservation", "description": "The existing reservation to use for instance provisioning. Supports AWS Capacity Reservations, AWS Capacity Blocks, and GCP reservations"}, "spot_policy": {"allOf": [{"$ref": "#/components/schemas/SpotPolicy"}], "description": "The policy for provisioning spot or on-demand instances: `spot`, `on-demand`, `auto`. Defaults to `on-demand`"}, "retry": {"anyOf": [{"$ref": "#/components/schemas/ProfileRetryRequest"}, {"type": "boolean"}], "title": "Retry", "description": "The policy for resubmitting the run. Defaults to `false`"}, "max_duration": {"anyOf": [{"type": "string", "enum": ["off"]}, {"type": "integer"}, {"type": "boolean"}, {"type": "string"}], "title": "Max Duration", "description": "The maximum duration of a run (e.g., `2h`, `1d`, etc) in a running state, excluding provisioning and pulling. After it elapses, the run is automatically stopped. Use `off` for unlimited duration. Defaults to `off`"}, "stop_duration": {"anyOf": [{"type": "string", "enum": ["off"]}, {"type": "integer"}, {"type": "boolean"}, {"type": "string"}], "title": "Stop Duration", "description": "The maximum duration of a run graceful stopping. After it elapses, the run is automatically forced stopped. This includes force detaching volumes used by the run. Use `off` for unlimited duration. Defaults to `5m`"}, "max_price": {"type": "number", "exclusiveMinimum": 0.0, "title": "Max Price", "description": "The maximum instance price per hour, in dollars"}, "creation_policy": {"allOf": [{"$ref": "#/components/schemas/CreationPolicy"}], "description": "The policy for using instances from fleets: `reuse`, `reuse-or-create`. Defaults to `reuse-or-create`"}, "idle_duration": {"anyOf": [{"type": "integer"}, {"type": "string"}], "title": "Idle Duration", "description": "Time to wait before terminating idle instances. Instances are not terminated if the fleet is already at `nodes.min`. Defaults to `5m` for runs and `3d` for fleets. Use `off` for unlimited duration"}, "utilization_policy": {"allOf": [{"$ref": "#/components/schemas/UtilizationPolicyRequest"}], "title": "Utilization Policy", "description": "Run termination policy based on utilization"}, "startup_order": {"allOf": [{"$ref": "#/components/schemas/StartupOrder"}], "description": "The order in which master and workers jobs are started: `any`, `master-first`, `workers-first`. Defaults to `any`"}, "stop_criteria": {"allOf": [{"$ref": "#/components/schemas/StopCriteria"}], "description": "The criteria determining when a multi-node run should be considered finished: `all-done`, `master-done`. Defaults to `all-done`"}, "schedule": {"allOf": [{"$ref": "#/components/schemas/ScheduleRequest"}], "title": "Schedule", "description": "The schedule for starting the run at specified time"}, "fleets": {"items": {"type": "string"}, "type": "array", "title": "Fleets", "description": "The fleets considered for reuse"}, "tags": {"additionalProperties": {"type": "string"}, "type": "object", "title": "Tags", "description": "The custom tags to associate with the resource. The tags are also propagated to the underlying backend resources. If there is a conflict with backend-level tags, does not override them"}, "name": {"type": "string", "title": "Name", "description": "The name of the profile that can be passed as `--profile` to `dstack apply`", "default": ""}, "default": {"type": "boolean", "title": "Default", "description": "If set to true, `dstack apply` will use this profile by default.", "default": false}}, "additionalProperties": false, "type": "object", "title": "ProfileRequest"}, "ProfileRetryRequest": {"properties": {"on_events": {"items": {"$ref": "#/components/schemas/RetryEvent"}, "type": "array", "description": "The list of events that should be handled with retry. Supported events are `no-capacity`, `interruption`, `error`. Omit to retry on all events"}, "duration": {"anyOf": [{"type": "integer"}, {"type": "string"}], "title": "Duration", "description": "The maximum period of retrying the run, e.g., `4h` or `1d`. The period is calculated as a run age for `no-capacity` event and as a time passed since the last `interruption` and `error` for `interruption` and `error` events."}}, "additionalProperties": false, "type": "object", "title": "ProfileRetryRequest"}, "ProjectRequest": {"properties": {"project_id": {"type": "string", "format": "uuid4", "title": "Project Id"}, "project_name": {"type": "string", "title": "Project Name"}, "owner": {"$ref": "#/components/schemas/UserRequest"}, "created_at": {"type": "string", "format": "date-time", "title": "Created At"}, "backends": {"items": {"$ref": "#/components/schemas/BackendInfoRequest"}, "type": "array", "title": "Backends"}, "members": {"items": {"$ref": "#/components/schemas/MemberRequest"}, "type": "array", "title": "Members"}, "is_public": {"type": "boolean", "title": "Is Public", "default": false}}, "additionalProperties": false, "type": "object", "required": ["project_id", "project_name", "owner", "backends", "members"], "title": "ProjectRequest"}, "ProjectRole": {"type": "string", "enum": ["admin", "manager", "user"], "title": "ProjectRole", "description": "An enumeration."}, "ProjectsInfoListRequest": {"properties": {"total_count": {"type": "integer", "title": "Total Count"}, "projects": {"items": {"$ref": "#/components/schemas/ProjectRequest"}, "type": "array", "title": "Projects"}}, "additionalProperties": false, "type": "object", "required": ["projects"], "title": "ProjectsInfoListRequest"}, "PythonVersion": {"type": "string", "enum": ["3.9", "3.10", "3.11", "3.12", "3.13"], "title": "PythonVersion", "description": "An enumeration."}, "Range_Memory_": {"properties": {"min": {"type": "number", "title": "Min"}, "max": {"type": "number", "title": "Max"}}, "additionalProperties": false, "type": "object", "title": "Range[Memory]"}, "Range_float_": {"properties": {"min": {"type": "number", "title": "Min"}, "max": {"type": "number", "title": "Max"}}, "additionalProperties": false, "type": "object", "title": "Range[float]"}, "Range_int_": {"properties": {"min": {"type": "integer", "title": "Min"}, "max": {"type": "integer", "title": "Max"}}, "additionalProperties": false, "type": "object", "title": "Range[int]"}, "RateLimitRequest": {"properties": {"prefix": {"type": "string", "maxLength": 4094, "pattern": "^/[^\\s\\\\{}]*$", "title": "Prefix", "description": "URL path prefix to which this limit is applied. If an incoming request matches several prefixes, the longest prefix is applied", "default": "/"}, "key": {"oneOf": [{"$ref": "#/components/schemas/IPAddressPartitioningKeyRequest"}, {"$ref": "#/components/schemas/HeaderPartitioningKeyRequest"}], "title": "Key", "description": "The partitioning key. Each incoming request belongs to a partition and rate limits are applied per partition. Defaults to partitioning by client IP address", "default": {"type": "ip_address"}, "discriminator": {"propertyName": "type", "mapping": {"ip_address": "#/components/schemas/IPAddressPartitioningKeyRequest", "header": "#/components/schemas/HeaderPartitioningKeyRequest"}}}, "rps": {"type": "number", "maximum": 1.5372286728091293e+17, "minimum": 0.016666666666666666, "title": "Rps", "description": "Max allowed number of requests per second. Requests are tracked at millisecond granularity. For example, `rps: 10` means at most 1 request per 100ms"}, "burst": {"type": "integer", "maximum": 9.223372036854776e+18, "minimum": 0.0, "title": "Burst", "description": "Max number of requests that can be passed to the service ahead of the rate limit", "default": 0}}, "additionalProperties": false, "type": "object", "required": ["rps"], "title": "RateLimitRequest"}, "RefreshTokenRequestRequest": {"properties": {"username": {"type": "string", "title": "Username"}}, "additionalProperties": false, "type": "object", "required": ["username"], "title": "RefreshTokenRequestRequest"}, "RegistryAuthRequest": {"properties": {"username": {"type": "string", "title": "Username", "description": "The username"}, "password": {"type": "string", "title": "Password", "description": "The password or access token"}}, "additionalProperties": false, "type": "object", "required": ["username", "password"], "title": "RegistryAuthRequest", "description": "Credentials for pulling a private Docker image.\n\nAttributes:\n username (str): The username\n password (str): The password or access token"}, "RemoteRepoCredsRequest": {"properties": {"clone_url": {"type": "string", "title": "Clone Url"}, "private_key": {"type": "string", "title": "Private Key"}, "oauth_token": {"type": "string", "title": "Oauth Token"}}, "additionalProperties": false, "type": "object", "required": ["clone_url"], "title": "RemoteRepoCredsRequest"}, "RemoteRepoInfoRequest": {"properties": {"repo_type": {"type": "string", "enum": ["remote"], "title": "Repo Type", "default": "remote"}, "repo_name": {"type": "string", "title": "Repo Name"}}, "additionalProperties": false, "type": "object", "required": ["repo_name"], "title": "RemoteRepoInfoRequest"}, "RemoteRunRepoDataRequest": {"properties": {"repo_type": {"type": "string", "enum": ["remote"], "title": "Repo Type", "default": "remote"}, "repo_name": {"type": "string", "title": "Repo Name"}, "repo_branch": {"type": "string", "title": "Repo Branch"}, "repo_hash": {"type": "string", "title": "Repo Hash"}, "repo_diff": {"type": "string", "title": "Repo Diff"}, "repo_config_name": {"type": "string", "title": "Repo Config Name"}, "repo_config_email": {"type": "string", "title": "Repo Config Email"}}, "additionalProperties": false, "type": "object", "required": ["repo_name"], "title": "RemoteRunRepoDataRequest"}, "RemoveProjectMemberRequestRequest": {"properties": {"usernames": {"items": {"type": "string"}, "type": "array", "title": "Usernames"}}, "additionalProperties": false, "type": "object", "required": ["usernames"], "title": "RemoveProjectMemberRequestRequest"}, "ReplicaGroupRequest": {"properties": {"name": {"type": "string", "title": "Name", "description": "The name of the replica group. If not provided, defaults to '0', '1', etc. based on position."}, "count": {"allOf": [{"$ref": "#/components/schemas/Range_int_"}], "title": "Count", "description": "The number of replicas. Can be a number (e.g. `2`) or a range (`0..4` or `1..8`). If it's a range, the `scaling` property is required"}, "scaling": {"allOf": [{"$ref": "#/components/schemas/ScalingSpecRequest"}], "title": "Scaling", "description": "The auto-scaling rules. Required if `count` is set to a range"}, "resources": {"allOf": [{"$ref": "#/components/schemas/ResourcesSpecRequest"}], "title": "Resources", "description": "The resources requirements for replicas in this group", "default": {"cpu": {"min": 2}, "memory": {"min": 8.0}, "disk": {"size": {"min": 100.0}}}}, "commands": {"items": {"type": "string"}, "type": "array", "title": "Commands", "description": "The shell commands to run for replicas in this group", "default": []}}, "additionalProperties": false, "type": "object", "required": ["count"], "title": "ReplicaGroupRequest"}, "RepoExistsAction": {"type": "string", "enum": ["error", "skip"], "title": "RepoExistsAction", "description": "An enumeration."}, "RepoHeadRequest": {"properties": {"repo_id": {"type": "string", "title": "Repo Id"}, "repo_info": {"oneOf": [{"$ref": "#/components/schemas/RemoteRepoInfoRequest"}, {"$ref": "#/components/schemas/LocalRepoInfoRequest"}, {"$ref": "#/components/schemas/VirtualRepoInfoRequest"}], "title": "Repo Info", "discriminator": {"propertyName": "repo_type", "mapping": {"remote": "#/components/schemas/RemoteRepoInfoRequest", "local": "#/components/schemas/LocalRepoInfoRequest", "virtual": "#/components/schemas/VirtualRepoInfoRequest"}}}}, "additionalProperties": false, "type": "object", "required": ["repo_id", "repo_info"], "title": "RepoHeadRequest"}, "RepoHeadWithCredsRequest": {"properties": {"repo_id": {"type": "string", "title": "Repo Id"}, "repo_info": {"oneOf": [{"$ref": "#/components/schemas/RemoteRepoInfoRequest"}, {"$ref": "#/components/schemas/LocalRepoInfoRequest"}, {"$ref": "#/components/schemas/VirtualRepoInfoRequest"}], "title": "Repo Info", "discriminator": {"propertyName": "repo_type", "mapping": {"remote": "#/components/schemas/RemoteRepoInfoRequest", "local": "#/components/schemas/LocalRepoInfoRequest", "virtual": "#/components/schemas/VirtualRepoInfoRequest"}}}, "repo_creds": {"$ref": "#/components/schemas/RemoteRepoCredsRequest"}}, "additionalProperties": false, "type": "object", "required": ["repo_id", "repo_info"], "title": "RepoHeadWithCredsRequest"}, "RepoSpecRequest": {"properties": {"local_path": {"type": "string", "title": "Local Path", "description": "The path to the Git repo on the user's machine. Relative paths are resolved relative to the parent directory of the the configuration file. Mutually exclusive with `url`"}, "url": {"type": "string", "title": "Url", "description": "The Git repo URL. Mutually exclusive with `local_path`"}, "branch": {"type": "string", "title": "Branch", "description": "The repo branch. Defaults to the active branch for local paths and the default branch for URLs"}, "hash": {"type": "string", "title": "Hash", "description": "The commit hash"}, "path": {"type": "string", "title": "Path", "description": "The repo path inside the run container. Relative paths are resolved relative to the working directory", "default": "."}, "if_exists": {"allOf": [{"$ref": "#/components/schemas/RepoExistsAction"}], "description": "The action to be taken if `path` exists and is not empty. One of: `error`, `skip`", "default": "error"}}, "additionalProperties": false, "type": "object", "title": "RepoSpecRequest"}, "RequirementsRequest": {"properties": {"resources": {"$ref": "#/components/schemas/ResourcesSpecRequest"}, "max_price": {"type": "number", "title": "Max Price"}, "spot": {"type": "boolean", "title": "Spot"}, "reservation": {"type": "string", "title": "Reservation"}, "multinode": {"type": "boolean", "title": "Multinode"}}, "additionalProperties": false, "type": "object", "required": ["resources"], "title": "RequirementsRequest"}, "ResourcesRequest": {"properties": {"cpus": {"type": "integer", "title": "Cpus"}, "memory_mib": {"type": "integer", "title": "Memory Mib"}, "gpus": {"items": {"$ref": "#/components/schemas/GpuRequest"}, "type": "array", "title": "Gpus"}, "spot": {"type": "boolean", "title": "Spot"}, "disk": {"allOf": [{"$ref": "#/components/schemas/DiskRequest"}], "title": "Disk", "default": {"size_mib": 102400}}, "cpu_arch": {"$ref": "#/components/schemas/CPUArchitecture"}, "description": {"type": "string", "title": "Description", "default": ""}}, "additionalProperties": false, "type": "object", "required": ["cpus", "memory_mib", "gpus", "spot"], "title": "ResourcesRequest"}, "ResourcesSpecRequest": {"properties": {"cpu": {"anyOf": [{"$ref": "#/components/schemas/CPUSpecRequest"}, {"$ref": "#/components/schemas/Range_int_"}, {"type": "integer"}, {"type": "string"}], "title": "Cpu", "description": "The CPU requirements", "default": {"count": {"min": 2}}}, "memory": {"anyOf": [{"$ref": "#/components/schemas/Range_Memory_"}, {"type": "integer"}, {"type": "string"}], "title": "Memory", "description": "The RAM size (e.g., `8GB`)", "default": {"min": 8.0}}, "shm_size": {"anyOf": [{"type": "number"}, {"type": "integer"}, {"type": "string"}], "title": "Shm Size", "description": "The size of shared memory (e.g., `8GB`). If you are using parallel communicating processes (e.g., dataloaders in PyTorch), you may need to configure this"}, "gpu": {"anyOf": [{"$ref": "#/components/schemas/GPUSpecRequest"}, {"type": "integer"}, {"type": "string"}], "title": "Gpu", "description": "The GPU requirements"}, "disk": {"anyOf": [{"$ref": "#/components/schemas/DiskSpecRequest"}, {"type": "integer"}, {"type": "string"}], "title": "Disk", "description": "The disk resources", "default": {"size": {"min": 100.0}}}}, "additionalProperties": false, "type": "object", "title": "ResourcesSpecRequest"}, "RetryEvent": {"type": "string", "enum": ["no-capacity", "interruption", "error"], "title": "RetryEvent", "description": "An enumeration."}, "RetryRequest": {"properties": {"on_events": {"items": {"$ref": "#/components/schemas/RetryEvent"}, "type": "array"}, "duration": {"type": "integer", "title": "Duration"}}, "additionalProperties": false, "type": "object", "required": ["on_events", "duration"], "title": "RetryRequest"}, "RunFleetRequest": {"properties": {"id": {"type": "string", "format": "uuid4", "title": "Id"}, "name": {"type": "string", "title": "Name"}}, "additionalProperties": false, "type": "object", "required": ["id", "name"], "title": "RunFleetRequest"}, "RunPlanRequest": {"properties": {"project_name": {"type": "string", "title": "Project Name"}, "user": {"type": "string", "title": "User"}, "run_spec": {"$ref": "#/components/schemas/RunSpecRequest"}, "effective_run_spec": {"$ref": "#/components/schemas/RunSpecRequest"}, "job_plans": {"items": {"$ref": "#/components/schemas/JobPlanRequest"}, "type": "array", "title": "Job Plans"}, "current_resource": {"$ref": "#/components/schemas/RunRequest"}, "action": {"$ref": "#/components/schemas/ApplyAction"}}, "additionalProperties": false, "type": "object", "required": ["project_name", "user", "run_spec", "job_plans", "action"], "title": "RunPlanRequest"}, "RunRequest": {"properties": {"id": {"type": "string", "format": "uuid4", "title": "Id"}, "project_name": {"type": "string", "title": "Project Name"}, "user": {"type": "string", "title": "User"}, "fleet": {"$ref": "#/components/schemas/RunFleetRequest"}, "submitted_at": {"type": "string", "format": "date-time", "title": "Submitted At"}, "last_processed_at": {"type": "string", "format": "date-time", "title": "Last Processed At"}, "status": {"$ref": "#/components/schemas/RunStatus"}, "status_message": {"type": "string", "title": "Status Message", "default": ""}, "termination_reason": {"type": "string", "title": "Termination Reason"}, "run_spec": {"$ref": "#/components/schemas/RunSpecRequest"}, "jobs": {"items": {"$ref": "#/components/schemas/JobRequest"}, "type": "array", "title": "Jobs"}, "latest_job_submission": {"$ref": "#/components/schemas/JobSubmissionRequest"}, "cost": {"type": "number", "title": "Cost", "default": 0}, "service": {"$ref": "#/components/schemas/ServiceSpecRequest"}, "deployment_num": {"type": "integer", "title": "Deployment Num", "default": 0}, "error": {"type": "string", "title": "Error"}, "deleted": {"type": "boolean", "title": "Deleted"}, "next_triggered_at": {"type": "string", "format": "date-time", "title": "Next Triggered At"}}, "additionalProperties": false, "type": "object", "required": ["id", "project_name", "user", "submitted_at", "last_processed_at", "status", "run_spec", "jobs"], "title": "RunRequest"}, "RunSpecRequest": {"properties": {"run_name": {"type": "string", "title": "Run Name", "description": "The run name. If not set, the run name is generated automatically."}, "repo_id": {"type": "string", "title": "Repo Id", "description": "Same `repo_id` that is specified when initializing the repo by calling the `/api/project/{project_name}/repos/init` endpoint. If not specified, a default virtual repo is used."}, "repo_data": {"oneOf": [{"$ref": "#/components/schemas/RemoteRunRepoDataRequest"}, {"$ref": "#/components/schemas/LocalRunRepoDataRequest"}, {"$ref": "#/components/schemas/VirtualRunRepoDataRequest"}], "title": "Repo Data", "description": "The repo data such as the current branch and commit.", "discriminator": {"propertyName": "repo_type", "mapping": {"remote": "#/components/schemas/RemoteRunRepoDataRequest", "local": "#/components/schemas/LocalRunRepoDataRequest", "virtual": "#/components/schemas/VirtualRunRepoDataRequest"}}}, "repo_code_hash": {"type": "string", "title": "Repo Code Hash", "description": "The hash of the repo diff. Can be omitted if there is no repo diff."}, "repo_dir": {"type": "string", "title": "Repo Dir", "description": "The repo path inside the container. Relative paths are resolved relative to the working directory."}, "file_archives": {"items": {"$ref": "#/components/schemas/FileArchiveMappingRequest"}, "type": "array", "title": "File Archives", "description": "The list of file archive ID to container path mappings.", "default": []}, "working_dir": {"type": "string", "title": "Working Dir"}, "configuration_path": {"type": "string", "title": "Configuration Path", "description": "The path to the run configuration YAML file. It can be omitted when using the programmatic API."}, "configuration": {"oneOf": [{"$ref": "#/components/schemas/DevEnvironmentConfigurationRequest"}, {"$ref": "#/components/schemas/TaskConfigurationRequest"}, {"$ref": "#/components/schemas/ServiceConfigurationRequest"}], "title": "Configuration", "discriminator": {"propertyName": "type", "mapping": {"dev-environment": "#/components/schemas/DevEnvironmentConfigurationRequest", "task": "#/components/schemas/TaskConfigurationRequest", "service": "#/components/schemas/ServiceConfigurationRequest"}}}, "profile": {"allOf": [{"$ref": "#/components/schemas/ProfileRequest"}], "title": "Profile", "description": "The profile parameters"}, "ssh_key_pub": {"type": "string", "title": "Ssh Key Pub", "description": "The contents of the SSH public key that will be used to connect to the run. Can be empty only before the run is submitted."}}, "additionalProperties": false, "type": "object", "required": ["configuration"], "title": "RunSpecRequest"}, "RunStatus": {"type": "string", "enum": ["pending", "submitted", "provisioning", "running", "terminating", "terminated", "failed", "done"], "title": "RunStatus", "description": "An enumeration."}, "RunpodAPIKeyCredsRequest": {"properties": {"type": {"type": "string", "enum": ["api_key"], "title": "Type", "default": "api_key"}, "api_key": {"type": "string", "title": "Api Key", "description": "The API key"}}, "additionalProperties": false, "type": "object", "required": ["api_key"], "title": "RunpodAPIKeyCredsRequest"}, "RunpodBackendConfigRequest": {"properties": {"type": {"type": "string", "enum": ["runpod"], "title": "Type", "default": "runpod"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of RunPod regions. Omit to use all regions"}, "community_cloud": {"type": "boolean", "title": "Community Cloud", "description": "Whether Community Cloud offers can be suggested in addition to Secure Cloud. Defaults to `true`"}}, "additionalProperties": false, "type": "object", "title": "RunpodBackendConfigRequest"}, "RunpodBackendConfigWithCredsRequest": {"properties": {"type": {"type": "string", "enum": ["runpod"], "title": "Type", "default": "runpod"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of RunPod regions. Omit to use all regions"}, "community_cloud": {"type": "boolean", "title": "Community Cloud", "description": "Whether Community Cloud offers can be suggested in addition to Secure Cloud. Defaults to `true`"}, "creds": {"allOf": [{"$ref": "#/components/schemas/RunpodAPIKeyCredsRequest"}], "title": "Creds", "description": "The credentials"}}, "additionalProperties": false, "type": "object", "required": ["creds"], "title": "RunpodBackendConfigWithCredsRequest"}, "SGLangRouterConfigRequest": {"properties": {"type": {"type": "string", "enum": ["sglang"], "title": "Type", "description": "The router type", "default": "sglang"}, "policy": {"type": "string", "enum": ["random", "round_robin", "cache_aware", "power_of_two"], "title": "Policy", "description": "The routing policy. Options: `random`, `round_robin`, `cache_aware`, `power_of_two`", "default": "cache_aware"}}, "additionalProperties": false, "type": "object", "title": "SGLangRouterConfigRequest"}, "SSHConnectionParamsRequest": {"properties": {"hostname": {"type": "string", "title": "Hostname"}, "username": {"type": "string", "title": "Username"}, "port": {"type": "integer", "title": "Port"}}, "additionalProperties": false, "type": "object", "required": ["hostname", "username", "port"], "title": "SSHConnectionParamsRequest"}, "SSHHostParamsRequest": {"properties": {"hostname": {"type": "string", "title": "Hostname", "description": "The IP address or domain to connect to"}, "port": {"type": "integer", "title": "Port", "description": "The SSH port to connect to for this host"}, "user": {"type": "string", "title": "User", "description": "The user to log in with for this host"}, "identity_file": {"type": "string", "title": "Identity File", "description": "The private key to use for this host"}, "proxy_jump": {"allOf": [{"$ref": "#/components/schemas/SSHProxyParamsRequest"}], "title": "Proxy Jump", "description": "The SSH proxy configuration for this host"}, "internal_ip": {"type": "string", "title": "Internal Ip", "description": "The internal IP of the host used for communication inside the cluster. If not specified, `dstack` will use the IP address from `network` or from the first found internal network."}, "ssh_key": {"$ref": "#/components/schemas/SSHKeyRequest"}, "blocks": {"anyOf": [{"type": "string", "enum": ["auto"]}, {"type": "integer", "minimum": 1.0}], "title": "Blocks", "description": "The amount of blocks to split the instance into, a number or `auto`. `auto` means as many as possible. The number of GPUs and CPUs must be divisible by the number of blocks. Defaults to `1`, i.e. do not split", "default": 1}}, "additionalProperties": false, "type": "object", "required": ["hostname"], "title": "SSHHostParamsRequest"}, "SSHKeyRequest": {"properties": {"public": {"type": "string", "title": "Public"}, "private": {"type": "string", "title": "Private"}}, "additionalProperties": false, "type": "object", "required": ["public"], "title": "SSHKeyRequest"}, "SSHParamsRequest": {"properties": {"user": {"type": "string", "title": "User", "description": "The user to log in with on all hosts"}, "port": {"type": "integer", "title": "Port", "description": "The SSH port to connect to"}, "identity_file": {"type": "string", "title": "Identity File", "description": "The private key to use for all hosts"}, "ssh_key": {"$ref": "#/components/schemas/SSHKeyRequest"}, "proxy_jump": {"allOf": [{"$ref": "#/components/schemas/SSHProxyParamsRequest"}], "title": "Proxy Jump", "description": "The SSH proxy configuration for all hosts"}, "hosts": {"items": {"anyOf": [{"$ref": "#/components/schemas/SSHHostParamsRequest"}, {"type": "string"}]}, "type": "array", "title": "Hosts", "description": "The per host connection parameters: a hostname or an object that overrides default ssh parameters"}, "network": {"type": "string", "title": "Network", "description": "The network address for cluster setup in the format `/`. `dstack` will use IP addresses from this network for communication between hosts. If not specified, `dstack` will use IPs from the first found internal network."}}, "additionalProperties": false, "type": "object", "required": ["hosts"], "title": "SSHParamsRequest"}, "SSHProxyParamsRequest": {"properties": {"hostname": {"type": "string", "title": "Hostname", "description": "The IP address or domain of proxy host"}, "port": {"type": "integer", "title": "Port", "description": "The SSH port of proxy host"}, "user": {"type": "string", "title": "User", "description": "The user to log in with for proxy host"}, "identity_file": {"type": "string", "title": "Identity File", "description": "The private key to use for proxy host"}, "ssh_key": {"$ref": "#/components/schemas/SSHKeyRequest"}}, "additionalProperties": false, "type": "object", "required": ["hostname", "user", "identity_file"], "title": "SSHProxyParamsRequest"}, "SaveRepoCredsRequestRequest": {"properties": {"repo_id": {"type": "string", "title": "Repo Id", "description": "A unique identifier of the repo"}, "repo_info": {"anyOf": [{"$ref": "#/components/schemas/RemoteRepoInfoRequest"}, {"$ref": "#/components/schemas/LocalRepoInfoRequest"}, {"$ref": "#/components/schemas/VirtualRepoInfoRequest"}], "title": "Repo Info"}, "repo_creds": {"allOf": [{"$ref": "#/components/schemas/RemoteRepoCredsRequest"}], "title": "Repo Creds", "description": "The repo creds for accessing private remote repo"}}, "additionalProperties": false, "type": "object", "required": ["repo_id", "repo_info"], "title": "SaveRepoCredsRequestRequest"}, "ScalingSpecRequest": {"properties": {"metric": {"type": "string", "enum": ["rps"], "title": "Metric", "description": "The target metric to track. Currently, the only supported value is `rps` (meaning requests per second)"}, "target": {"type": "number", "exclusiveMinimum": 0.0, "title": "Target", "description": "The target value of the metric. The number of replicas is calculated based on this number and automatically adjusts (scales up or down) as this metric changes"}, "scale_up_delay": {"type": "integer", "title": "Scale Up Delay", "description": "The delay in seconds before scaling up", "default": 300}, "scale_down_delay": {"type": "integer", "title": "Scale Down Delay", "description": "The delay in seconds before scaling down", "default": 600}}, "additionalProperties": false, "type": "object", "required": ["metric", "target"], "title": "ScalingSpecRequest"}, "ScheduleRequest": {"properties": {"cron": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "string"}], "title": "Cron", "description": "A cron expression or a list of cron expressions specifying the UTC time when the run needs to be started"}}, "additionalProperties": false, "type": "object", "required": ["cron"], "title": "ScheduleRequest"}, "SecretRequest": {"properties": {"id": {"type": "string", "format": "uuid", "title": "Id"}, "name": {"type": "string", "title": "Name"}, "value": {"type": "string", "title": "Value"}}, "additionalProperties": false, "type": "object", "required": ["id", "name"], "title": "SecretRequest"}, "ServerClientErrorCode": {"type": "string", "enum": ["error", "resource_exists", "resource_not_exists", "invalid_credentials", "backend_not_available", "repo_does_not_exist", "gateway_error"], "title": "ServerClientErrorCode", "description": "An enumeration."}, "ServerInfoRequest": {"properties": {"server_version": {"type": "string", "title": "Server Version"}}, "additionalProperties": false, "type": "object", "title": "ServerInfoRequest"}, "ServiceConfigurationRequest": {"properties": {"port": {"anyOf": [{"type": "integer", "maximum": 65536.0, "exclusiveMinimum": 0.0}, {"type": "string", "pattern": "^[0-9]+:[0-9]+$"}, {"$ref": "#/components/schemas/PortMappingRequest"}], "title": "Port", "description": "The port the application listens on"}, "gateway": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "title": "Gateway", "description": "The name of the gateway. Specify boolean `false` to run without a gateway. Specify boolean `true` to run with the default gateway. Omit to run with the default gateway if there is one, or without a gateway otherwise"}, "strip_prefix": {"type": "boolean", "title": "Strip Prefix", "description": "Strip the `/proxy/services///` path prefix when forwarding requests to the service. Only takes effect when running the service without a gateway", "default": true}, "model": {"anyOf": [{"$ref": "#/components/schemas/TGIChatModelRequest"}, {"$ref": "#/components/schemas/OpenAIChatModelRequest"}, {"type": "string"}], "title": "Model", "description": "Mapping of the model for the OpenAI-compatible endpoint provided by `dstack`. Can be a full model format definition or just a model name. If it's a name, the service is expected to expose an OpenAI-compatible API at the `/v1` path"}, "https": {"type": "boolean", "title": "Https", "description": "Enable HTTPS if running with a gateway", "default": true}, "auth": {"type": "boolean", "title": "Auth", "description": "Enable the authorization", "default": true}, "scaling": {"allOf": [{"$ref": "#/components/schemas/ScalingSpecRequest"}], "title": "Scaling", "description": "The auto-scaling rules. Required if `replicas` is set to a range"}, "rate_limits": {"items": {"$ref": "#/components/schemas/RateLimitRequest"}, "type": "array", "title": "Rate Limits", "description": "Rate limiting rules", "default": []}, "probes": {"items": {"$ref": "#/components/schemas/ProbeConfigRequest"}, "type": "array", "title": "Probes", "description": "List of probes used to determine job health", "default": []}, "replicas": {"anyOf": [{"items": {"$ref": "#/components/schemas/ReplicaGroupRequest"}, "type": "array"}, {"$ref": "#/components/schemas/Range_int_"}, {"type": "integer"}, {"type": "string"}], "title": "Replicas", "description": "The number of replicas or a list of replica groups. Can be an integer (e.g., `2`), a range (e.g., `0..4`), or a list of replica groups. Each replica group defines replicas with shared configuration (commands, resources, scaling). When `replicas` is a list of replica groups, top-level `scaling`, `commands`, and `resources` are not allowed and must be specified in each replica group instead. "}, "commands": {"items": {"type": "string"}, "type": "array", "title": "Commands", "description": "The shell commands to run", "default": []}, "type": {"type": "string", "enum": ["service"], "title": "Type", "default": "service"}, "name": {"type": "string", "title": "Name", "description": "The run name. If not specified, a random name is generated"}, "image": {"type": "string", "title": "Image", "description": "The name of the Docker image to run"}, "user": {"type": "string", "title": "User", "description": "The user inside the container, `user_name_or_id[:group_name_or_id]` (e.g., `ubuntu`, `1000:1000`). Defaults to the default user from the `image`"}, "privileged": {"type": "boolean", "title": "Privileged", "description": "Run the container in privileged mode", "default": false}, "entrypoint": {"type": "string", "title": "Entrypoint", "description": "The Docker entrypoint"}, "working_dir": {"type": "string", "title": "Working Dir", "description": "The absolute path to the working directory inside the container. Defaults to the `image`'s default working directory"}, "home_dir": {"type": "string", "title": "Home Dir", "default": "/root"}, "registry_auth": {"allOf": [{"$ref": "#/components/schemas/RegistryAuthRequest"}], "title": "Registry Auth", "description": "Credentials for pulling a private Docker image"}, "python": {"allOf": [{"$ref": "#/components/schemas/PythonVersion"}], "description": "The major version of Python. Mutually exclusive with `image` and `docker`"}, "nvcc": {"type": "boolean", "title": "Nvcc", "description": "Use image with NVIDIA CUDA Compiler (NVCC) included. Mutually exclusive with `image` and `docker`"}, "single_branch": {"type": "boolean", "title": "Single Branch", "description": "Whether to clone and track only the current branch or all remote branches. Relevant only when using remote Git repos. Defaults to `false` for dev environments and to `true` for tasks and services"}, "env": {"allOf": [{"$ref": "#/components/schemas/Env"}], "title": "Env", "description": "The mapping or the list of environment variables", "default": {"__root__": {}}}, "shell": {"type": "string", "title": "Shell", "description": "The shell used to run commands. Allowed values are `sh`, `bash`, or an absolute path, e.g., `/usr/bin/zsh`. Defaults to `/bin/sh` if the `image` is specified, `/bin/bash` otherwise"}, "resources": {"allOf": [{"$ref": "#/components/schemas/ResourcesSpecRequest"}], "title": "Resources", "description": "The resources requirements to run the configuration", "default": {"cpu": {"min": 2}, "memory": {"min": 8.0}, "disk": {"size": {"min": 100.0}}}}, "priority": {"type": "integer", "maximum": 100.0, "minimum": 0.0, "title": "Priority", "description": "The priority of the run, an integer between `0` and `100`. `dstack` tries to provision runs with higher priority first. Defaults to `0`"}, "volumes": {"items": {"anyOf": [{"$ref": "#/components/schemas/VolumeMountPointRequest"}, {"$ref": "#/components/schemas/InstanceMountPointRequest"}, {"type": "string"}]}, "type": "array", "title": "Volumes", "description": "The volumes mount points", "default": []}, "docker": {"type": "boolean", "title": "Docker", "description": "Use Docker inside the container. Mutually exclusive with `image`, `python`, and `nvcc`. Overrides `privileged`"}, "repos": {"items": {"$ref": "#/components/schemas/RepoSpecRequest"}, "type": "array", "title": "Repos", "description": "The list of Git repos", "default": []}, "files": {"items": {"anyOf": [{"$ref": "#/components/schemas/FilePathMappingRequest"}, {"type": "string"}]}, "type": "array", "title": "Files", "description": "The local to container file path mappings", "default": []}, "setup": {"items": {"type": "string"}, "type": "array", "title": "Setup", "default": []}, "backends": {"items": {"$ref": "#/components/schemas/BackendType"}, "type": "array", "description": "The backends to consider for provisioning (e.g., `[aws, gcp]`)"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The regions to consider for provisioning (e.g., `[eu-west-1, us-west4, westeurope]`)"}, "availability_zones": {"items": {"type": "string"}, "type": "array", "title": "Availability Zones", "description": "The availability zones to consider for provisioning (e.g., `[eu-west-1a, us-west4-a]`)"}, "instance_types": {"items": {"type": "string"}, "type": "array", "title": "Instance Types", "description": "The cloud-specific instance types to consider for provisioning (e.g., `[p3.8xlarge, n1-standard-4]`)"}, "reservation": {"type": "string", "title": "Reservation", "description": "The existing reservation to use for instance provisioning. Supports AWS Capacity Reservations, AWS Capacity Blocks, and GCP reservations"}, "spot_policy": {"allOf": [{"$ref": "#/components/schemas/SpotPolicy"}], "description": "The policy for provisioning spot or on-demand instances: `spot`, `on-demand`, `auto`. Defaults to `on-demand`"}, "retry": {"anyOf": [{"$ref": "#/components/schemas/ProfileRetryRequest"}, {"type": "boolean"}], "title": "Retry", "description": "The policy for resubmitting the run. Defaults to `false`"}, "max_duration": {"anyOf": [{"type": "string", "enum": ["off"]}, {"type": "integer"}, {"type": "boolean"}, {"type": "string"}], "title": "Max Duration", "description": "The maximum duration of a run (e.g., `2h`, `1d`, etc) in a running state, excluding provisioning and pulling. After it elapses, the run is automatically stopped. Use `off` for unlimited duration. Defaults to `off`"}, "stop_duration": {"anyOf": [{"type": "string", "enum": ["off"]}, {"type": "integer"}, {"type": "boolean"}, {"type": "string"}], "title": "Stop Duration", "description": "The maximum duration of a run graceful stopping. After it elapses, the run is automatically forced stopped. This includes force detaching volumes used by the run. Use `off` for unlimited duration. Defaults to `5m`"}, "max_price": {"type": "number", "exclusiveMinimum": 0.0, "title": "Max Price", "description": "The maximum instance price per hour, in dollars"}, "creation_policy": {"allOf": [{"$ref": "#/components/schemas/CreationPolicy"}], "description": "The policy for using instances from fleets: `reuse`, `reuse-or-create`. Defaults to `reuse-or-create`"}, "idle_duration": {"anyOf": [{"type": "integer"}, {"type": "string"}], "title": "Idle Duration", "description": "Time to wait before terminating idle instances. Instances are not terminated if the fleet is already at `nodes.min`. Defaults to `5m` for runs and `3d` for fleets. Use `off` for unlimited duration"}, "utilization_policy": {"allOf": [{"$ref": "#/components/schemas/UtilizationPolicyRequest"}], "title": "Utilization Policy", "description": "Run termination policy based on utilization"}, "startup_order": {"allOf": [{"$ref": "#/components/schemas/StartupOrder"}], "description": "The order in which master and workers jobs are started: `any`, `master-first`, `workers-first`. Defaults to `any`"}, "stop_criteria": {"allOf": [{"$ref": "#/components/schemas/StopCriteria"}], "description": "The criteria determining when a multi-node run should be considered finished: `all-done`, `master-done`. Defaults to `all-done`"}, "schedule": {"allOf": [{"$ref": "#/components/schemas/ScheduleRequest"}], "title": "Schedule", "description": "The schedule for starting the run at specified time"}, "fleets": {"items": {"type": "string"}, "type": "array", "title": "Fleets", "description": "The fleets considered for reuse"}, "tags": {"additionalProperties": {"type": "string"}, "type": "object", "title": "Tags", "description": "The custom tags to associate with the resource. The tags are also propagated to the underlying backend resources. If there is a conflict with backend-level tags, does not override them"}}, "additionalProperties": false, "type": "object", "required": ["port"], "title": "ServiceConfigurationRequest"}, "ServiceModelSpecRequest": {"properties": {"name": {"type": "string", "title": "Name"}, "base_url": {"type": "string", "title": "Base Url", "description": "Full URL or path relative to dstack-server's base URL"}, "type": {"type": "string", "title": "Type"}}, "additionalProperties": false, "type": "object", "required": ["name", "base_url", "type"], "title": "ServiceModelSpecRequest"}, "ServiceSpecRequest": {"properties": {"url": {"type": "string", "title": "Url", "description": "Full URL or path relative to dstack-server's base URL"}, "model": {"$ref": "#/components/schemas/ServiceModelSpecRequest"}, "options": {"type": "object", "title": "Options", "default": {}}}, "additionalProperties": false, "type": "object", "required": ["url"], "title": "ServiceSpecRequest"}, "SetDefaultGatewayRequestRequest": {"properties": {"name": {"type": "string", "title": "Name"}}, "additionalProperties": false, "type": "object", "required": ["name"], "title": "SetDefaultGatewayRequestRequest"}, "SetProjectMembersRequestRequest": {"properties": {"members": {"items": {"$ref": "#/components/schemas/MemberSettingRequest"}, "type": "array", "title": "Members"}}, "additionalProperties": false, "type": "object", "required": ["members"], "title": "SetProjectMembersRequestRequest"}, "SetWildcardDomainRequestRequest": {"properties": {"name": {"type": "string", "title": "Name"}, "wildcard_domain": {"type": "string", "title": "Wildcard Domain"}}, "additionalProperties": false, "type": "object", "required": ["name", "wildcard_domain"], "title": "SetWildcardDomainRequestRequest"}, "SpotPolicy": {"type": "string", "enum": ["spot", "on-demand", "auto"], "title": "SpotPolicy", "description": "An enumeration."}, "StartupOrder": {"type": "string", "enum": ["any", "master-first", "workers-first"], "title": "StartupOrder", "description": "An enumeration."}, "StopCriteria": {"type": "string", "enum": ["all-done", "master-done"], "title": "StopCriteria", "description": "An enumeration."}, "StopRunsRequestRequest": {"properties": {"runs_names": {"items": {"type": "string"}, "type": "array", "title": "Runs Names"}, "abort": {"type": "boolean", "title": "Abort", "description": "Do not wait for a graceful shutdown."}}, "additionalProperties": false, "type": "object", "required": ["runs_names", "abort"], "title": "StopRunsRequestRequest"}, "SubmitRunRequestRequest": {"properties": {"run_spec": {"$ref": "#/components/schemas/RunSpecRequest"}}, "additionalProperties": false, "type": "object", "required": ["run_spec"], "title": "SubmitRunRequestRequest"}, "TGIChatModelRequest": {"properties": {"type": {"type": "string", "enum": ["chat"], "title": "Type", "description": "The type of the model", "default": "chat"}, "name": {"type": "string", "title": "Name", "description": "The name of the model"}, "format": {"type": "string", "enum": ["tgi"], "title": "Format", "description": "The serving format. Must be set to `tgi`"}, "chat_template": {"type": "string", "title": "Chat Template", "description": "The custom prompt template for the model. If not specified, the default prompt template from the HuggingFace Hub configuration will be used"}, "eos_token": {"type": "string", "title": "Eos Token", "description": "The custom end of sentence token. If not specified, the default end of sentence token from the HuggingFace Hub configuration will be used"}}, "additionalProperties": false, "type": "object", "required": ["name", "format"], "title": "TGIChatModelRequest", "description": "Mapping of the model for the OpenAI-compatible endpoint.\n\nAttributes:\n type (str): The type of the model, e.g. \"chat\"\n name (str): The name of the model. This name will be used both to load model configuration from the HuggingFace Hub and in the OpenAI-compatible endpoint.\n format (str): The format of the model, e.g. \"tgi\" if the model is served with HuggingFace's Text Generation Inference.\n chat_template (Optional[str]): The custom prompt template for the model. If not specified, the default prompt template from the HuggingFace Hub configuration will be used.\n eos_token (Optional[str]): The custom end of sentence token. If not specified, the default end of sentence token from the HuggingFace Hub configuration will be used."}, "TaskConfigurationRequest": {"properties": {"nodes": {"type": "integer", "minimum": 1.0, "title": "Nodes", "description": "Number of nodes", "default": 1}, "ports": {"items": {"anyOf": [{"type": "integer", "maximum": 65536.0, "exclusiveMinimum": 0.0}, {"type": "string", "pattern": "^(?:[0-9]+|\\*):[0-9]+$"}, {"$ref": "#/components/schemas/PortMappingRequest"}]}, "type": "array", "title": "Ports", "description": "Port numbers/mapping to expose", "default": []}, "commands": {"items": {"type": "string"}, "type": "array", "title": "Commands", "description": "The shell commands to run", "default": []}, "type": {"type": "string", "enum": ["task"], "title": "Type", "default": "task"}, "name": {"type": "string", "title": "Name", "description": "The run name. If not specified, a random name is generated"}, "image": {"type": "string", "title": "Image", "description": "The name of the Docker image to run"}, "user": {"type": "string", "title": "User", "description": "The user inside the container, `user_name_or_id[:group_name_or_id]` (e.g., `ubuntu`, `1000:1000`). Defaults to the default user from the `image`"}, "privileged": {"type": "boolean", "title": "Privileged", "description": "Run the container in privileged mode", "default": false}, "entrypoint": {"type": "string", "title": "Entrypoint", "description": "The Docker entrypoint"}, "working_dir": {"type": "string", "title": "Working Dir", "description": "The absolute path to the working directory inside the container. Defaults to the `image`'s default working directory"}, "home_dir": {"type": "string", "title": "Home Dir", "default": "/root"}, "registry_auth": {"allOf": [{"$ref": "#/components/schemas/RegistryAuthRequest"}], "title": "Registry Auth", "description": "Credentials for pulling a private Docker image"}, "python": {"allOf": [{"$ref": "#/components/schemas/PythonVersion"}], "description": "The major version of Python. Mutually exclusive with `image` and `docker`"}, "nvcc": {"type": "boolean", "title": "Nvcc", "description": "Use image with NVIDIA CUDA Compiler (NVCC) included. Mutually exclusive with `image` and `docker`"}, "single_branch": {"type": "boolean", "title": "Single Branch", "description": "Whether to clone and track only the current branch or all remote branches. Relevant only when using remote Git repos. Defaults to `false` for dev environments and to `true` for tasks and services"}, "env": {"allOf": [{"$ref": "#/components/schemas/Env"}], "title": "Env", "description": "The mapping or the list of environment variables", "default": {"__root__": {}}}, "shell": {"type": "string", "title": "Shell", "description": "The shell used to run commands. Allowed values are `sh`, `bash`, or an absolute path, e.g., `/usr/bin/zsh`. Defaults to `/bin/sh` if the `image` is specified, `/bin/bash` otherwise"}, "resources": {"allOf": [{"$ref": "#/components/schemas/ResourcesSpecRequest"}], "title": "Resources", "description": "The resources requirements to run the configuration", "default": {"cpu": {"min": 2}, "memory": {"min": 8.0}, "disk": {"size": {"min": 100.0}}}}, "priority": {"type": "integer", "maximum": 100.0, "minimum": 0.0, "title": "Priority", "description": "The priority of the run, an integer between `0` and `100`. `dstack` tries to provision runs with higher priority first. Defaults to `0`"}, "volumes": {"items": {"anyOf": [{"$ref": "#/components/schemas/VolumeMountPointRequest"}, {"$ref": "#/components/schemas/InstanceMountPointRequest"}, {"type": "string"}]}, "type": "array", "title": "Volumes", "description": "The volumes mount points", "default": []}, "docker": {"type": "boolean", "title": "Docker", "description": "Use Docker inside the container. Mutually exclusive with `image`, `python`, and `nvcc`. Overrides `privileged`"}, "repos": {"items": {"$ref": "#/components/schemas/RepoSpecRequest"}, "type": "array", "title": "Repos", "description": "The list of Git repos", "default": []}, "files": {"items": {"anyOf": [{"$ref": "#/components/schemas/FilePathMappingRequest"}, {"type": "string"}]}, "type": "array", "title": "Files", "description": "The local to container file path mappings", "default": []}, "setup": {"items": {"type": "string"}, "type": "array", "title": "Setup", "default": []}, "backends": {"items": {"$ref": "#/components/schemas/BackendType"}, "type": "array", "description": "The backends to consider for provisioning (e.g., `[aws, gcp]`)"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The regions to consider for provisioning (e.g., `[eu-west-1, us-west4, westeurope]`)"}, "availability_zones": {"items": {"type": "string"}, "type": "array", "title": "Availability Zones", "description": "The availability zones to consider for provisioning (e.g., `[eu-west-1a, us-west4-a]`)"}, "instance_types": {"items": {"type": "string"}, "type": "array", "title": "Instance Types", "description": "The cloud-specific instance types to consider for provisioning (e.g., `[p3.8xlarge, n1-standard-4]`)"}, "reservation": {"type": "string", "title": "Reservation", "description": "The existing reservation to use for instance provisioning. Supports AWS Capacity Reservations, AWS Capacity Blocks, and GCP reservations"}, "spot_policy": {"allOf": [{"$ref": "#/components/schemas/SpotPolicy"}], "description": "The policy for provisioning spot or on-demand instances: `spot`, `on-demand`, `auto`. Defaults to `on-demand`"}, "retry": {"anyOf": [{"$ref": "#/components/schemas/ProfileRetryRequest"}, {"type": "boolean"}], "title": "Retry", "description": "The policy for resubmitting the run. Defaults to `false`"}, "max_duration": {"anyOf": [{"type": "string", "enum": ["off"]}, {"type": "integer"}, {"type": "boolean"}, {"type": "string"}], "title": "Max Duration", "description": "The maximum duration of a run (e.g., `2h`, `1d`, etc) in a running state, excluding provisioning and pulling. After it elapses, the run is automatically stopped. Use `off` for unlimited duration. Defaults to `off`"}, "stop_duration": {"anyOf": [{"type": "string", "enum": ["off"]}, {"type": "integer"}, {"type": "boolean"}, {"type": "string"}], "title": "Stop Duration", "description": "The maximum duration of a run graceful stopping. After it elapses, the run is automatically forced stopped. This includes force detaching volumes used by the run. Use `off` for unlimited duration. Defaults to `5m`"}, "max_price": {"type": "number", "exclusiveMinimum": 0.0, "title": "Max Price", "description": "The maximum instance price per hour, in dollars"}, "creation_policy": {"allOf": [{"$ref": "#/components/schemas/CreationPolicy"}], "description": "The policy for using instances from fleets: `reuse`, `reuse-or-create`. Defaults to `reuse-or-create`"}, "idle_duration": {"anyOf": [{"type": "integer"}, {"type": "string"}], "title": "Idle Duration", "description": "Time to wait before terminating idle instances. Instances are not terminated if the fleet is already at `nodes.min`. Defaults to `5m` for runs and `3d` for fleets. Use `off` for unlimited duration"}, "utilization_policy": {"allOf": [{"$ref": "#/components/schemas/UtilizationPolicyRequest"}], "title": "Utilization Policy", "description": "Run termination policy based on utilization"}, "startup_order": {"allOf": [{"$ref": "#/components/schemas/StartupOrder"}], "description": "The order in which master and workers jobs are started: `any`, `master-first`, `workers-first`. Defaults to `any`"}, "stop_criteria": {"allOf": [{"$ref": "#/components/schemas/StopCriteria"}], "description": "The criteria determining when a multi-node run should be considered finished: `all-done`, `master-done`. Defaults to `all-done`"}, "schedule": {"allOf": [{"$ref": "#/components/schemas/ScheduleRequest"}], "title": "Schedule", "description": "The schedule for starting the run at specified time"}, "fleets": {"items": {"type": "string"}, "type": "array", "title": "Fleets", "description": "The fleets considered for reuse"}, "tags": {"additionalProperties": {"type": "string"}, "type": "object", "title": "Tags", "description": "The custom tags to associate with the resource. The tags are also propagated to the underlying backend resources. If there is a conflict with backend-level tags, does not override them"}}, "additionalProperties": false, "type": "object", "title": "TaskConfigurationRequest"}, "TensorDockAPIKeyCredsRequest": {"properties": {"type": {"type": "string", "enum": ["api_key"], "title": "Type", "description": "The type of credentials", "default": "api_key"}, "api_key": {"type": "string", "title": "Api Key", "description": "The API key"}, "api_token": {"type": "string", "title": "Api Token", "description": "The API token"}}, "additionalProperties": false, "type": "object", "required": ["api_key", "api_token"], "title": "TensorDockAPIKeyCredsRequest"}, "TensorDockBackendConfigRequest": {"properties": {"type": {"type": "string", "enum": ["tensordock"], "title": "Type", "description": "The type of backend", "default": "tensordock"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of TensorDock regions. Omit to use all regions"}}, "additionalProperties": false, "type": "object", "title": "TensorDockBackendConfigRequest"}, "TensorDockBackendConfigWithCredsRequest": {"properties": {"type": {"type": "string", "enum": ["tensordock"], "title": "Type", "description": "The type of backend", "default": "tensordock"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of TensorDock regions. Omit to use all regions"}, "creds": {"allOf": [{"$ref": "#/components/schemas/TensorDockAPIKeyCredsRequest"}], "title": "Creds", "description": "The credentials"}}, "additionalProperties": false, "type": "object", "required": ["creds"], "title": "TensorDockBackendConfigWithCredsRequest"}, "UnixUserRequest": {"properties": {"uid": {"type": "integer", "minimum": 0.0, "title": "Uid", "description": "User ID"}, "gid": {"type": "integer", "minimum": 0.0, "title": "Gid", "description": "Group ID"}, "username": {"type": "string", "minLength": 1, "title": "Username", "description": "User name"}, "groupname": {"type": "string", "minLength": 1, "title": "Groupname", "description": "Group name"}}, "additionalProperties": false, "type": "object", "title": "UnixUserRequest"}, "UpdateBackendYAMLRequestRequest": {"properties": {"config_yaml": {"type": "string", "title": "Config Yaml"}}, "additionalProperties": false, "type": "object", "required": ["config_yaml"], "title": "UpdateBackendYAMLRequestRequest"}, "UpdateProjectRequestRequest": {"properties": {"is_public": {"type": "boolean", "title": "Is Public"}}, "additionalProperties": false, "type": "object", "required": ["is_public"], "title": "UpdateProjectRequestRequest"}, "UserPermissionsRequest": {"properties": {"can_create_projects": {"type": "boolean", "title": "Can Create Projects"}}, "additionalProperties": false, "type": "object", "required": ["can_create_projects"], "title": "UserPermissionsRequest"}, "UserRequest": {"properties": {"id": {"type": "string", "format": "uuid4", "title": "Id"}, "username": {"type": "string", "title": "Username"}, "created_at": {"type": "string", "format": "date-time", "title": "Created At"}, "global_role": {"$ref": "#/components/schemas/GlobalRole"}, "email": {"type": "string", "title": "Email"}, "active": {"type": "boolean", "title": "Active"}, "permissions": {"$ref": "#/components/schemas/UserPermissionsRequest"}, "ssh_public_key": {"type": "string", "title": "Ssh Public Key"}}, "additionalProperties": false, "type": "object", "required": ["id", "username", "global_role", "active", "permissions"], "title": "UserRequest"}, "UserTokenCredsRequest": {"properties": {"token": {"type": "string", "title": "Token"}}, "additionalProperties": false, "type": "object", "required": ["token"], "title": "UserTokenCredsRequest"}, "UserWithCredsRequest": {"properties": {"id": {"type": "string", "format": "uuid4", "title": "Id"}, "username": {"type": "string", "title": "Username"}, "created_at": {"type": "string", "format": "date-time", "title": "Created At"}, "global_role": {"$ref": "#/components/schemas/GlobalRole"}, "email": {"type": "string", "title": "Email"}, "active": {"type": "boolean", "title": "Active"}, "permissions": {"$ref": "#/components/schemas/UserPermissionsRequest"}, "ssh_public_key": {"type": "string", "title": "Ssh Public Key"}, "creds": {"$ref": "#/components/schemas/UserTokenCredsRequest"}, "ssh_private_key": {"type": "string", "title": "Ssh Private Key"}}, "additionalProperties": false, "type": "object", "required": ["id", "username", "global_role", "active", "permissions", "creds"], "title": "UserWithCredsRequest"}, "UsersInfoListRequest": {"properties": {"total_count": {"type": "integer", "title": "Total Count"}, "users": {"items": {"$ref": "#/components/schemas/UserRequest"}, "type": "array", "title": "Users"}}, "additionalProperties": false, "type": "object", "required": ["users"], "title": "UsersInfoListRequest"}, "UtilizationPolicyRequest": {"properties": {"min_gpu_utilization": {"type": "integer", "maximum": 100.0, "minimum": 0.0, "title": "Min Gpu Utilization", "description": "Minimum required GPU utilization, percent. If any GPU has utilization below specified value during the whole time window, the run is terminated"}, "time_window": {"anyOf": [{"type": "integer"}, {"type": "string"}], "title": "Time Window", "description": "The time window of metric samples taking into account to measure utilization (e.g., `30m`, `1h`). Minimum is `5m`"}}, "additionalProperties": false, "type": "object", "required": ["min_gpu_utilization", "time_window"], "title": "UtilizationPolicyRequest"}, "ValidationError": {"properties": {"loc": {"items": {"anyOf": [{"type": "string"}, {"type": "integer"}]}, "type": "array", "title": "Location"}, "msg": {"type": "string", "title": "Message"}, "type": {"type": "string", "title": "Error Type"}}, "type": "object", "required": ["loc", "msg", "type"], "title": "ValidationError"}, "VastAIAPIKeyCredsRequest": {"properties": {"type": {"type": "string", "enum": ["api_key"], "title": "Type", "description": "The type of credentials", "default": "api_key"}, "api_key": {"type": "string", "title": "Api Key", "description": "The API key"}}, "additionalProperties": false, "type": "object", "required": ["api_key"], "title": "VastAIAPIKeyCredsRequest"}, "VastAIBackendConfigRequest": {"properties": {"type": {"type": "string", "enum": ["vastai"], "title": "Type", "description": "The type of backend", "default": "vastai"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of VastAI regions. Omit to use all regions"}}, "additionalProperties": false, "type": "object", "title": "VastAIBackendConfigRequest"}, "VastAIBackendConfigWithCredsRequest": {"properties": {"type": {"type": "string", "enum": ["vastai"], "title": "Type", "description": "The type of backend", "default": "vastai"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of VastAI regions. Omit to use all regions"}, "creds": {"allOf": [{"$ref": "#/components/schemas/VastAIAPIKeyCredsRequest"}], "title": "Creds", "description": "The credentials"}}, "additionalProperties": false, "type": "object", "required": ["creds"], "title": "VastAIBackendConfigWithCredsRequest"}, "VerdaAPIKeyCredsRequest": {"properties": {"type": {"type": "string", "enum": ["api_key"], "title": "Type", "description": "The type of credentials", "default": "api_key"}, "client_id": {"type": "string", "title": "Client Id", "description": "The client ID"}, "client_secret": {"type": "string", "title": "Client Secret", "description": "The client secret"}}, "additionalProperties": false, "type": "object", "required": ["client_id", "client_secret"], "title": "VerdaAPIKeyCredsRequest"}, "VerdaBackendConfigRequest": {"properties": {"type": {"type": "string", "enum": ["verda", "datacrunch"], "title": "Type", "description": "The type of backend"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of Verda regions. Omit to use all regions"}}, "additionalProperties": false, "type": "object", "required": ["type"], "title": "VerdaBackendConfigRequest"}, "VerdaBackendConfigWithCredsRequest": {"properties": {"type": {"type": "string", "enum": ["verda", "datacrunch"], "title": "Type", "description": "The type of backend"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of Verda regions. Omit to use all regions"}, "creds": {"allOf": [{"$ref": "#/components/schemas/VerdaAPIKeyCredsRequest"}], "title": "Creds", "description": "The credentials"}}, "additionalProperties": false, "type": "object", "required": ["type", "creds"], "title": "VerdaBackendConfigWithCredsRequest"}, "VirtualRepoInfoRequest": {"properties": {"repo_type": {"type": "string", "enum": ["virtual"], "title": "Repo Type", "default": "virtual"}}, "additionalProperties": false, "type": "object", "title": "VirtualRepoInfoRequest"}, "VirtualRunRepoDataRequest": {"properties": {"repo_type": {"type": "string", "enum": ["virtual"], "title": "Repo Type", "default": "virtual"}}, "additionalProperties": false, "type": "object", "title": "VirtualRunRepoDataRequest"}, "VolumeAttachmentDataRequest": {"properties": {"device_name": {"type": "string", "title": "Device Name"}}, "additionalProperties": false, "type": "object", "title": "VolumeAttachmentDataRequest"}, "VolumeAttachmentRequest": {"properties": {"instance": {"$ref": "#/components/schemas/VolumeInstanceRequest"}, "attachment_data": {"$ref": "#/components/schemas/VolumeAttachmentDataRequest"}}, "additionalProperties": false, "type": "object", "required": ["instance"], "title": "VolumeAttachmentRequest"}, "VolumeConfigurationRequest": {"properties": {"type": {"type": "string", "enum": ["volume"], "title": "Type", "default": "volume"}, "name": {"type": "string", "title": "Name", "description": "The volume name"}, "backend": {"allOf": [{"$ref": "#/components/schemas/BackendType"}], "description": "The volume backend"}, "region": {"type": "string", "title": "Region", "description": "The volume region"}, "availability_zone": {"type": "string", "title": "Availability Zone", "description": "The volume availability zone"}, "size": {"type": "number", "title": "Size", "description": "The volume size. Must be specified when creating new volumes"}, "volume_id": {"type": "string", "title": "Volume Id", "description": "The volume ID. Must be specified when registering external volumes"}, "auto_cleanup_duration": {"anyOf": [{"type": "integer"}, {"type": "string"}], "title": "Auto Cleanup Duration", "description": "Time to wait after volume is no longer used by any job before deleting it. Defaults to keep the volume indefinitely. Use the value 'off' or -1 to disable auto-cleanup."}, "tags": {"additionalProperties": {"type": "string"}, "type": "object", "title": "Tags", "description": "The custom tags to associate with the volume. The tags are also propagated to the underlying backend resources. If there is a conflict with backend-level tags, does not override them"}}, "additionalProperties": false, "type": "object", "required": ["backend", "region"], "title": "VolumeConfigurationRequest"}, "VolumeInstanceRequest": {"properties": {"name": {"type": "string", "title": "Name"}, "fleet_name": {"type": "string", "title": "Fleet Name"}, "instance_num": {"type": "integer", "title": "Instance Num"}, "instance_id": {"type": "string", "title": "Instance Id"}}, "additionalProperties": false, "type": "object", "required": ["name", "instance_num"], "title": "VolumeInstanceRequest"}, "VolumeMountPointRequest": {"properties": {"name": {"anyOf": [{"type": "string"}, {"items": {"type": "string"}, "type": "array"}], "title": "Name", "description": "The network volume name or the list of network volume names to mount. If a list is specified, one of the volumes in the list will be mounted. Specify volumes from different backends/regions to increase availability"}, "path": {"type": "string", "title": "Path", "description": "The absolute container path to mount the volume at"}}, "additionalProperties": false, "type": "object", "required": ["name", "path"], "title": "VolumeMountPointRequest"}, "VolumeProvisioningDataRequest": {"properties": {"backend": {"$ref": "#/components/schemas/BackendType"}, "volume_id": {"type": "string", "title": "Volume Id"}, "size_gb": {"type": "integer", "title": "Size Gb"}, "availability_zone": {"type": "string", "title": "Availability Zone"}, "price": {"type": "number", "title": "Price"}, "attachable": {"type": "boolean", "title": "Attachable", "default": true}, "detachable": {"type": "boolean", "title": "Detachable", "default": true}, "backend_data": {"type": "string", "title": "Backend Data"}}, "additionalProperties": false, "type": "object", "required": ["volume_id", "size_gb"], "title": "VolumeProvisioningDataRequest"}, "VolumeRequest": {"properties": {"id": {"type": "string", "format": "uuid", "title": "Id"}, "name": {"type": "string", "title": "Name"}, "user": {"type": "string", "title": "User"}, "project_name": {"type": "string", "title": "Project Name"}, "configuration": {"$ref": "#/components/schemas/VolumeConfigurationRequest"}, "external": {"type": "boolean", "title": "External"}, "created_at": {"type": "string", "format": "date-time", "title": "Created At"}, "last_processed_at": {"type": "string", "format": "date-time", "title": "Last Processed At"}, "status": {"$ref": "#/components/schemas/VolumeStatus"}, "status_message": {"type": "string", "title": "Status Message"}, "deleted": {"type": "boolean", "title": "Deleted"}, "deleted_at": {"type": "string", "format": "date-time", "title": "Deleted At"}, "volume_id": {"type": "string", "title": "Volume Id"}, "provisioning_data": {"$ref": "#/components/schemas/VolumeProvisioningDataRequest"}, "cost": {"type": "number", "title": "Cost", "default": 0}, "attachments": {"items": {"$ref": "#/components/schemas/VolumeAttachmentRequest"}, "type": "array", "title": "Attachments"}, "attachment_data": {"$ref": "#/components/schemas/VolumeAttachmentDataRequest"}}, "additionalProperties": false, "type": "object", "required": ["id", "name", "user", "project_name", "configuration", "external", "created_at", "last_processed_at", "status", "deleted"], "title": "VolumeRequest"}, "VolumeStatus": {"type": "string", "enum": ["submitted", "provisioning", "active", "failed"], "title": "VolumeStatus", "description": "An enumeration."}, "VultrAPIKeyCredsRequest": {"properties": {"type": {"type": "string", "enum": ["api_key"], "title": "Type", "description": "The type of credentials", "default": "api_key"}, "api_key": {"type": "string", "title": "Api Key", "description": "The API key"}}, "additionalProperties": false, "type": "object", "required": ["api_key"], "title": "VultrAPIKeyCredsRequest"}, "VultrBackendConfigRequest": {"properties": {"type": {"type": "string", "enum": ["vultr"], "title": "Type", "description": "The type of backend", "default": "vultr"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of Vultr regions. Omit to use all regions"}}, "additionalProperties": false, "type": "object", "title": "VultrBackendConfigRequest"}, "VultrBackendConfigWithCredsRequest": {"properties": {"type": {"type": "string", "enum": ["vultr"], "title": "Type", "description": "The type of backend", "default": "vultr"}, "regions": {"items": {"type": "string"}, "type": "array", "title": "Regions", "description": "The list of Vultr regions. Omit to use all regions"}, "creds": {"allOf": [{"$ref": "#/components/schemas/VultrAPIKeyCredsRequest"}], "title": "Creds", "description": "The credentials"}}, "additionalProperties": false, "type": "object", "required": ["creds"], "title": "VultrBackendConfigWithCredsRequest"}}, "securitySchemes": {"HTTPBearer": {"type": "http", "scheme": "bearer"}}}} diff --git a/docs/examples.md b/docs/examples.md index 6032e72a8b..575c747ca2 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -1,4 +1,6 @@ --- +title: Examples +description: Collection of examples for training, inference, and clusters #template: examples.html hide: - navigation diff --git a/examples/accelerators/amd/README.md b/examples/accelerators/amd/README.md index 863a0462bf..a660acddc7 100644 --- a/examples/accelerators/amd/README.md +++ b/examples/accelerators/amd/README.md @@ -1,3 +1,8 @@ +--- +title: AMD +description: Deploying and fine-tuning models on AMD MI300X GPUs using TGI, vLLM, and Axolotl +--- + # AMD `dstack` supports running dev environments, tasks, and services on AMD GPUs. diff --git a/examples/accelerators/intel/README.md b/examples/accelerators/intel/README.md index 0220a74ce8..0e2a629f2f 100644 --- a/examples/accelerators/intel/README.md +++ b/examples/accelerators/intel/README.md @@ -1,6 +1,11 @@ +--- +title: Intel Gaudi +description: Deploying and fine-tuning models on Intel Gaudi accelerators using TGI, vLLM, and Optimum +--- + # Intel Gaudi -`dstack` supports running dev environments, tasks, and services on Intel Gaudi GPUs via +`dstack` supports running dev environments, tasks, and services on Intel Gaudi GPUs via [SSH fleets](https://dstack.ai/docs/concepts/fleets#ssh-fleets). ## Deployment diff --git a/examples/accelerators/tenstorrent/README.md b/examples/accelerators/tenstorrent/README.md index bbb0b2207e..95f3f2b6c9 100644 --- a/examples/accelerators/tenstorrent/README.md +++ b/examples/accelerators/tenstorrent/README.md @@ -1,12 +1,11 @@ --- -title: "Tenstorrent" -description: "You can now use SSH fleets to run dev environments, tasks, and services on Tenstorrent." -image: https://dstack.ai/static-assets/static-assets/images/dstack-tenstorrent-min.png +title: Tenstorrent +description: Running dev environments, tasks, and services on Tenstorrent Wormhole accelerators --- # Tenstorrent -`dstack` supports running dev environments, tasks, and services on Tenstorrent +`dstack` supports running dev environments, tasks, and services on Tenstorrent [Wormwhole](https://tenstorrent.com/en/hardware/wormhole) accelerators via SSH fleets. diff --git a/examples/accelerators/tpu/README.md b/examples/accelerators/tpu/README.md index da16326586..98982a919a 100644 --- a/examples/accelerators/tpu/README.md +++ b/examples/accelerators/tpu/README.md @@ -1,3 +1,8 @@ +--- +title: TPU +description: Deploying and fine-tuning models on Google Cloud TPUs using Optimum TPU and vLLM +--- + # TPU If you've configured the `gcp` backend in `dstack`, you can run dev environments, tasks, and services on [TPUs](https://cloud.google.com/tpu/docs/intro-to-tpu). diff --git a/examples/clusters/aws/README.md b/examples/clusters/aws/README.md index f7cb622704..b6319e214e 100644 --- a/examples/clusters/aws/README.md +++ b/examples/clusters/aws/README.md @@ -1,6 +1,11 @@ +--- +title: AWS +description: High-performance distributed training on AWS using Elastic Fabric Adapter (EFA) +--- + # AWS -In this guide, we’ll walk through how to run high-performance distributed training on AWS using [Amazon Elastic Fabric Adapter (EFA)](https://aws.amazon.com/hpc/efa/) with `dstack`. +In this guide, we'll walk through how to run high-performance distributed training on AWS using [Amazon Elastic Fabric Adapter (EFA)](https://aws.amazon.com/hpc/efa/) with `dstack`. ## Overview diff --git a/examples/clusters/crusoe/README.md b/examples/clusters/crusoe/README.md index fb6f4b1a7f..b34c4aef34 100644 --- a/examples/clusters/crusoe/README.md +++ b/examples/clusters/crusoe/README.md @@ -1,5 +1,6 @@ --- -title: Distributed workload orchestration on Crusoe with dstack +title: Crusoe +description: Setting up Crusoe clusters using Managed Kubernetes or VMs with InfiniBand support --- # Crusoe diff --git a/examples/clusters/gcp/README.md b/examples/clusters/gcp/README.md index 9f7bad984d..a4610235b2 100644 --- a/examples/clusters/gcp/README.md +++ b/examples/clusters/gcp/README.md @@ -1,3 +1,8 @@ +--- +title: GCP +description: Creating and using GPU clusters on GCP with GPUDirect-TCPX and RoCE support +--- + # GCP This example shows how to create and use clusters on GCP. diff --git a/examples/clusters/lambda/README.md b/examples/clusters/lambda/README.md index a78465fbac..50a98bf6ed 100644 --- a/examples/clusters/lambda/README.md +++ b/examples/clusters/lambda/README.md @@ -1,5 +1,6 @@ --- -title: Distributed workload orchestration on Lambda with dstack +title: Lambda +description: Setting up Lambda clusters using Kubernetes or 1-Click Clusters with fast interconnect --- # Lambda diff --git a/examples/clusters/nccl-rccl-tests/README.md b/examples/clusters/nccl-rccl-tests/README.md index 0a2a138b1a..1d9166591e 100644 --- a/examples/clusters/nccl-rccl-tests/README.md +++ b/examples/clusters/nccl-rccl-tests/README.md @@ -1,3 +1,8 @@ +--- +title: NCCL/RCCL tests +description: Running NCCL and RCCL tests to validate cluster network bandwidth +--- + # NCCL/RCCL tests This example shows how to run [NCCL](https://github.com/NVIDIA/nccl-tests) or [RCCL](https://github.com/ROCm/rccl-tests) tests on a cluster using [distributed tasks](https://dstack.ai/docs/concepts/tasks#distributed-tasks). diff --git a/examples/distributed-training/axolotl/README.md b/examples/distributed-training/axolotl/README.md index 1454732ad5..593d4142b2 100644 --- a/examples/distributed-training/axolotl/README.md +++ b/examples/distributed-training/axolotl/README.md @@ -1,3 +1,8 @@ +--- +title: Axolotl +description: Distributed fine-tuning with Axolotl and FSDP across multiple nodes +--- + # Axolotl This example walks you through how to run distributed fine-tune using [Axolotl](https://github.com/axolotl-ai-cloud/axolotl) and [distributed tasks](https://dstack.ai/docs/concepts/tasks#distributed-tasks). diff --git a/examples/distributed-training/ray-ragen/README.md b/examples/distributed-training/ray-ragen/README.md index 32ce0173fd..f7bd80d5c2 100644 --- a/examples/distributed-training/ray-ragen/README.md +++ b/examples/distributed-training/ray-ragen/README.md @@ -1,6 +1,11 @@ +--- +title: Ray + RAGEN +description: Multi-node agent fine-tuning using RAGEN with Ray and verl for reinforcement learning +--- + # Ray + RAGEN -This example shows how use `dstack` and [RAGEN](https://github.com/RAGEN-AI/RAGEN) +This example shows how use `dstack` and [RAGEN](https://github.com/RAGEN-AI/RAGEN) to fine-tune an agent on multiple nodes. Under the hood `RAGEN` uses [verl](https://github.com/volcengine/verl) for Reinforcement Learning and [Ray](https://docs.ray.io/en/latest/) for distributed training. diff --git a/examples/distributed-training/trl/README.md b/examples/distributed-training/trl/README.md index 9df482da52..84ac7dd6ba 100644 --- a/examples/distributed-training/trl/README.md +++ b/examples/distributed-training/trl/README.md @@ -1,3 +1,8 @@ +--- +title: TRL +description: Distributed fine-tuning with TRL, Accelerate, and DeepSpeed +--- + # TRL This example walks you through how to run distributed fine-tune using [TRL](https://github.com/huggingface/trl), [Accelerate](https://github.com/huggingface/accelerate) and [Deepspeed](https://github.com/deepspeedai/DeepSpeed). diff --git a/examples/inference/nim/README.md b/examples/inference/nim/README.md index 1b125dda83..ec323beb94 100644 --- a/examples/inference/nim/README.md +++ b/examples/inference/nim/README.md @@ -1,6 +1,6 @@ --- title: NVIDIA NIM -description: "This example shows how to deploy DeepSeek-R1-Distill-Llama-8B to any cloud or on-premises environment using NVIDIA NIM and dstack." +description: Deploying DeepSeek-R1-Distill-Llama-8B using NVIDIA NIM --- # NVIDIA NIM diff --git a/examples/inference/sglang/README.md b/examples/inference/sglang/README.md index d0c42bf2ee..bc95adc042 100644 --- a/examples/inference/sglang/README.md +++ b/examples/inference/sglang/README.md @@ -1,3 +1,8 @@ +--- +title: SGLang +description: Deploying DeepSeek-R1-Distill-Llama models using SGLang on NVIDIA and AMD GPUs +--- + # SGLang This example shows how to deploy DeepSeek-R1-Distill-Llama 8B and 70B using [SGLang](https://github.com/sgl-project/sglang) and `dstack`. diff --git a/examples/inference/tgi/README.md b/examples/inference/tgi/README.md index 6984ec2ff6..971929bf61 100644 --- a/examples/inference/tgi/README.md +++ b/examples/inference/tgi/README.md @@ -1,6 +1,6 @@ --- title: HuggingFace TGI -description: "This example shows how to deploy Llama 4 Scout to any cloud or on-premises environment using HuggingFace TGI and dstack." +description: Deploying Llama 4 Scout using HuggingFace Text Generation Inference --- # HuggingFace TGI diff --git a/examples/inference/trtllm/README.md b/examples/inference/trtllm/README.md index 02ae55f464..58f0d97ebb 100644 --- a/examples/inference/trtllm/README.md +++ b/examples/inference/trtllm/README.md @@ -1,6 +1,6 @@ --- title: TensorRT-LLM -description: "This example shows how to deploy Deepseek models to any cloud or on-premises environment using NVIDIA TensorRT-LLM and dstack." +description: Deploying DeepSeek R1 and distilled models using NVIDIA TensorRT-LLM with Triton --- # TensorRT-LLM diff --git a/examples/inference/vllm/README.md b/examples/inference/vllm/README.md index 12bfd18ac1..c5a635b3a4 100644 --- a/examples/inference/vllm/README.md +++ b/examples/inference/vllm/README.md @@ -1,5 +1,6 @@ --- -description: "This example shows how to deploy Llama 3.1 to any cloud or on-premises environment using vLLM and dstack." +title: vLLM +description: Deploying Llama 3.1 8B using vLLM with OpenAI-compatible API --- # vLLM diff --git a/examples/models/wan22/README.md b/examples/models/wan22/README.md index 47e9f4230d..07d3b2c1ee 100644 --- a/examples/models/wan22/README.md +++ b/examples/models/wan22/README.md @@ -1,3 +1,8 @@ +--- +title: Wan2.2 +description: Text-to-video generation using the Wan2.2 T2V-A14B foundational video model +--- + # Wan2.2 [Wan2.2](https://github.com/Wan-Video/Wan2.2) is an open-source SOTA foundational video model. This example shows how to run the T2V-A14B model variant via `dstack` for text-to-video generation. diff --git a/examples/single-node-training/axolotl/README.md b/examples/single-node-training/axolotl/README.md index c9c7917f0a..f8ae04f7ce 100644 --- a/examples/single-node-training/axolotl/README.md +++ b/examples/single-node-training/axolotl/README.md @@ -1,3 +1,8 @@ +--- +title: Axolotl +description: Fine-tuning models with Axolotl using FSDP and QLoRA +--- + # Axolotl This example shows how to use [Axolotl](https://github.com/OpenAccess-AI-Collective/axolotl) with `dstack` to fine-tune 4-bit Quantized `Llama-4-Scout-17B-16E` using SFT with FSDP and QLoRA. diff --git a/examples/single-node-training/trl/README.md b/examples/single-node-training/trl/README.md index 2084082818..f5cf7f5a4a 100644 --- a/examples/single-node-training/trl/README.md +++ b/examples/single-node-training/trl/README.md @@ -1,3 +1,8 @@ +--- +title: TRL +description: Fine-tuning Llama with TRL using SFT and QLoRA +--- + # TRL This example walks you through how to use [TRL](https://github.com/huggingface/trl) to fine-tune `Llama-3.1-8B` with `dstack` using SFT with QLoRA. diff --git a/mkdocs.yml b/mkdocs.yml index c7afe30256..c98af0a2dd 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -13,6 +13,9 @@ edit_uri: edit/master/docs/ #Copyright copyright: © 2025 dstack +hooks: + - scripts/docs/hooks.py + # Configuration theme: name: material @@ -60,44 +63,6 @@ theme: # Plugins plugins: - - llmstxt-md: - enable_copy_button: false - sections: - Getting started: - - docs/index.md: What dstack is - - docs/installation/index.md: How to set up the dstack server and the dstack CLI - - docs/quickstart.md: How to get started and submit your first run - Concepts: - - docs/concepts/backends.md: How to configure backends - to connect dstack to cloud providers, Kubernetes clusters, etc - - docs/concepts/fleets.md: How to create and manage fleets - required before submitting runs - - docs/concepts/dev-environments.md: How to create dev environments - for interactive development using a desktop IDE - - docs/concepts/tasks.md: How to run tasks - for training or fine-tuning, including distributed tasks - - docs/concepts/services.md: How to deploy services - for model inference or web apps - - docs/concepts/volumes.md: How to manage volumes - for persistent storage or caching - - docs/concepts/gateways.md: How to manage gateways - enabling auto-scaling, rate limits, and custom domains - - docs/concepts/secrets.md: How to manage secrets - for API keys or other sensitive data - - docs/concepts/projects.md: How to manage projects - for managing separate teams - - docs/concepts/metrics.md: How to access metrics - for monitoring of runs/jobs/fleets, hardware usage (e.g. GPU util), etc - - docs/concepts/events.md: How to access events - aka audit log - for tracking state changes, resource creation/deletion, etc - Guides: - - docs/guides/server-deployment.md: Detailed guide on how to deploy the dstack server - - docs/guides/troubleshooting.md: Common issues and how to troubleshoot them - - docs/guides/protips.md: Pro tips - tips and tricks to use dstack more efficiently - Examples: - - examples/single-node-training/trl/index.md: TRL - - examples/single-node-training/axolotl/index.md: Axolotl - - examples/distributed-training/trl/index.md: TRL - - examples/distributed-training/axolotl/index.md: Axolotl - - examples/distributed-training/ray-ragen/index.md: Ray+RAGEN - - examples/clusters/nccl-rccl-tests/index.md: NCCL/RCCL tests - - examples/inference/sglang/index.md: SGLang - - examples/inference/vllm/index.md: vLLM - - examples/inference/nim/index.md: NIM - - examples/inference/trtllm/index.md: TensorRT-LLM - Accelerators: - - examples/accelerators/amd/index.md: AMD - - examples/accelerators/tpu/index.md: TPU - - examples/accelerators/tenstorrent/index.md: Tenstorrent - blog: blog_dir: blog post_url_format: "{slug}" @@ -172,11 +137,10 @@ plugins: "docs/guides/migration.md": "docs/guides/upgrade.md" - typeset - gen-files: + # TODO: convert these to hooks (schema reference migrated) scripts: # always relative to mkdocs.yml - - scripts/docs/gen_examples.py - scripts/docs/gen_cli_reference.py - scripts/docs/gen_openapi_reference.py - - scripts/docs/gen_schema_reference.py - scripts/docs/gen_rest_plugin_spec_reference.py - mkdocstrings: handlers: @@ -184,7 +148,8 @@ plugins: options: docstring_style: google show_source: false - - render_swagger + - render_swagger: + allow_arbitrary_locations: true # Extensions markdown_extensions: @@ -258,7 +223,7 @@ nav: - Docs: - Getting started: - Overview: docs/index.md - - Installation: docs/installation/index.md + - Installation: docs/installation.md - Quickstart: docs/quickstart.md - Concepts: - Backends: docs/concepts/backends.md @@ -316,6 +281,7 @@ nav: - Python API: docs/reference/plugins/python/index.md - REST API: docs/reference/plugins/rest/index.md - llms-full.txt: https://dstack.ai/llms-full.txt + - skill.md: https://dstack.ai/skill.md - Examples: - examples.md - Single-node training: diff --git a/pyproject.toml b/pyproject.toml index 748b5211a1..d9becf693e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -161,7 +161,6 @@ dev = [ "mkdocs-gen-files; python_version >= '3.11'", "mkdocstrings[python]; python_version >= '3.11'", "mkdocs-render-swagger-plugin; python_version >= '3.11'", - "mkdocs-llmstxt-md; python_version >= '3.11'" ] [project.optional-dependencies] diff --git a/scripts/docs/gen_llms_files.py b/scripts/docs/gen_llms_files.py new file mode 100644 index 0000000000..a7eee100ce --- /dev/null +++ b/scripts/docs/gen_llms_files.py @@ -0,0 +1,243 @@ +""" +Generate llms.txt and llms-full.txt from documentation files. + +llms.txt: Generated from mkdocs nav structure with descriptions from page frontmatter +llms-full.txt: Full concatenation of all markdown content +""" + +import os +from pathlib import Path +from typing import Any, Dict, List, Optional + +import yaml + +# Configuration for which sections to include/exclude +INCLUDE_SECTIONS = ["Getting started", "Concepts", "Guides", "Examples"] +EXCLUDE_SECTIONS = ["Reference"] + + +def read_frontmatter(file_path: Path) -> Dict[str, Any]: + """Read YAML frontmatter from markdown file.""" + try: + content = file_path.read_text(encoding="utf-8") + if content.startswith("---"): + parts = content.split("---", 2) + if len(parts) >= 3: + frontmatter = yaml.safe_load(parts[1]) + if isinstance(frontmatter, dict): + return frontmatter + except Exception as e: + print(f"Warning: Failed to read frontmatter from {file_path}: {e}") + return {} + + +def get_page_info(page_path: str, docs_dir: Path, repo_root: Path) -> Optional[Dict[str, str]]: + """Get title and description for a page from its frontmatter.""" + # page_path is relative to docs_dir + full_path = docs_dir / page_path + + # For examples/**/index.md, read from README.md at repo root (same logic as hooks.py) + if page_path.startswith("examples/") and page_path.endswith("index.md"): + example_dir = Path(page_path).parent + readme_path = repo_root / example_dir / "README.md" + if readme_path.exists(): + full_path = readme_path + + if not full_path.exists(): + return None + + frontmatter = read_frontmatter(full_path) + + # Get title from frontmatter or filename + title = frontmatter.get("title") + if not title: + # Use filename as fallback + title = full_path.stem.replace("-", " ").title() + + # Get description from frontmatter + description = frontmatter.get("description", "") + + return {"title": title, "description": description} + + +def parse_mkdocs_nav(mkdocs_config: Dict[str, Any], repo_root: str) -> List[Dict[str, Any]]: + """Parse mkdocs nav structure and extract relevant sections.""" + nav = mkdocs_config.get("nav", []) + sections = [] + + # Get docs_dir from config + docs_dir = Path(repo_root) / mkdocs_config.get("docs_dir", "docs") + repo_root_path = Path(repo_root) + + def extract_pages(content_list): + """Recursively extract all pages from a section's content, including nested subsections.""" + items = [] + for item in content_list: + if isinstance(item, str): + # Plain string path like "examples.md" + page_info = get_page_info(item, docs_dir, repo_root_path) + if page_info: + items.append( + { + "type": "page", + "title": page_info["title"], + "path": item, + "description": page_info["description"], + } + ) + elif isinstance(item, dict): + for title, path in item.items(): + if isinstance(path, str): + # Page with title + page_info = get_page_info(path, docs_dir, repo_root_path) + if page_info: + items.append( + { + "type": "page", + "title": title, # Use title from nav + "path": path, + "description": page_info["description"], + } + ) + elif isinstance(path, list): + # Nested subsection - create subsection with its pages + subsection_items = extract_pages(path) + if subsection_items: + items.append( + { + "type": "subsection", + "title": title, + "items": subsection_items, + } + ) + return items + + def process_nav_items(nav_items): + """Recursively process nav items to find matching sections.""" + for item in nav_items: + if isinstance(item, dict): + for section_name, section_content in item.items(): + # Check if this section should be included + if section_name in INCLUDE_SECTIONS and section_name not in EXCLUDE_SECTIONS: + # Extract all pages from this section, including nested subsections + items = [] + if isinstance(section_content, list): + items = extract_pages(section_content) + + if items: + sections.append( + { + "title": section_name, + "items": items, + } + ) + + # Recursively process nested sections + elif isinstance(section_content, list): + process_nav_items(section_content) + + process_nav_items(nav) + return sections + + +def generate_llms_txt(repo_root: str, mkdocs_config: Dict[str, Any], output_path: str) -> None: + """Generate llms.txt from mkdocs nav structure.""" + # Get title, description, and base_url from mkdocs config + title = mkdocs_config.get("site_name", "") + description = mkdocs_config.get("site_description", "") + base_url = mkdocs_config.get("site_url", "").rstrip("/") + + lines = [] + + # Title and description + lines.append(f"# {title}\n") + lines.append(f"> {description}\n") + + # Parse sections from mkdocs nav + sections = parse_mkdocs_nav(mkdocs_config, repo_root) + + # Generate sections + def render_items(items, indent_level=0): + """Render items (pages and subsections) with proper formatting.""" + rendered = [] + for item in items: + if item["type"] == "page": + # Use .md paths as-is since hooks.py copies them to site + url = f"{base_url}/{item['path']}" + if item["description"]: + rendered.append(f"- [{item['title']}]({url}): {item['description']}") + else: + rendered.append(f"- [{item['title']}]({url})") + elif item["type"] == "subsection": + # Render subsection header + rendered.append(f"\n### {item['title']}\n") + # Render subsection items + rendered.extend(render_items(item["items"], indent_level + 1)) + return rendered + + for section in sections: + lines.append(f"## {section['title']}\n") + lines.extend(render_items(section["items"])) + lines.append("") + + # Write to file + with open(output_path, "w", encoding="utf-8") as f: + f.write("\n".join(lines)) + + +def generate_llms_full_txt( + repo_root: str, mkdocs_config: Dict[str, Any], output_path: str +) -> None: + """Generate llms-full.txt by concatenating all pages from llms.txt sections.""" + content_parts = [] + + # Get docs_dir from config + docs_dir = Path(repo_root) / mkdocs_config.get("docs_dir", "docs") + + # Parse sections from mkdocs nav (same as llms.txt) + sections = parse_mkdocs_nav(mkdocs_config, repo_root) + + def extract_page_paths(items): + """Recursively extract all page paths from items (including nested subsections).""" + paths = [] + for item in items: + if item["type"] == "page": + paths.append(item["path"]) + elif item["type"] == "subsection": + paths.extend(extract_page_paths(item["items"])) + return paths + + # Concatenate all pages from all sections + for section in sections: + for page_path in extract_page_paths(section["items"]): + full_path = docs_dir / page_path + + if full_path.is_file(): + try: + content = full_path.read_text(encoding="utf-8") + content_parts.append(f"# {page_path}\n\n{content}\n\n") + except Exception as e: + print(f"Warning: Failed to read {page_path}: {e}") + else: + print(f"Warning: File not found: {page_path}") + + # Write to file + if content_parts: + with open(output_path, "w", encoding="utf-8") as f: + f.write("".join(content_parts)) + else: + print("Warning: No content found for llms-full.txt") + + +def generate_llms_files(repo_root: str, site_dir: str, mkdocs_config: Dict[str, Any]) -> None: + """Generate both llms.txt and llms-full.txt.""" + llms_txt_path = os.path.join(site_dir, "llms.txt") + llms_full_txt_path = os.path.join(site_dir, "llms-full.txt") + + print("Generating llms.txt from mkdocs nav...") + generate_llms_txt(repo_root, mkdocs_config, llms_txt_path) + print("Generated llms.txt") + + print("Generating llms-full.txt...") + generate_llms_full_txt(repo_root, mkdocs_config, llms_full_txt_path) + print("Generated llms-full.txt") diff --git a/scripts/docs/gen_schema_reference.py b/scripts/docs/gen_schema_reference.py index e7c2cd62e6..8f25283181 100644 --- a/scripts/docs/gen_schema_reference.py +++ b/scripts/docs/gen_schema_reference.py @@ -150,6 +150,15 @@ def sub_schema_reference(match: re.Match) -> str: ) +def expand_schema_references(text: str) -> str: + """Expand #SCHEMA# placeholders in markdown text. Used by hooks when gen-files is not used.""" + return re.sub( + r"( *)#SCHEMA#\s+(dstack\.[.a-z_0-9A-Z]+)\s*((?:\n {4}[^\n]+)*)\n", + sub_schema_reference, + text, + ) + + def process_file(file: File): if not fnmatch(file.src_uri, FILE_PATTERN): return @@ -161,11 +170,7 @@ def process_file(file: File): # overrides: # name: # required: true - text = re.sub( - r"( *)#SCHEMA#\s+(dstack\.[.a-z_0-9A-Z]+)\s*((?:\n {4}[^\n]+)*)\n", - sub_schema_reference, - text, - ) + text = expand_schema_references(text) with mkdocs_gen_files.open(file.src_uri, "w") as f: f.write(text) diff --git a/scripts/docs/hooks.py b/scripts/docs/hooks.py new file mode 100644 index 0000000000..4530172d1a --- /dev/null +++ b/scripts/docs/hooks.py @@ -0,0 +1,225 @@ +import importlib.util +import json +import logging +import mimetypes +import os +import shutil +import sys + +import yaml + +mimetypes.add_type("text/plain", ".md") + +log = logging.getLogger("mkdocs") + +WELL_KNOWN_SKILLS_DIR = ".well-known/skills" +SKILL_PATH = ("skills", "dstack", "SKILL.md") +DISABLE_EXAMPLES_ENV = "DSTACK_DOCS_DISABLE_EXAMPLES" +SCHEMA_REFERENCE_PREFIX = "docs/reference/" + + +def _expand_schema_references(text: str) -> str: + """Lazy load gen_schema_reference by file path so it works regardless of sys.path.""" + hooks_dir = os.path.dirname(os.path.abspath(__file__)) + gen_path = os.path.join(hooks_dir, "gen_schema_reference.py") + spec = importlib.util.spec_from_file_location("gen_schema_reference", gen_path) + if spec is None or spec.loader is None: + raise ImportError(f"Cannot load {gen_path}") + module = importlib.util.module_from_spec(spec) + sys.modules["gen_schema_reference"] = module + spec.loader.exec_module(module) + return module.expand_schema_references(text) + + +def _get_schema_expanded_content(rel_path, config, src_path=None): + """Return expanded markdown for reference/**/*.md that contain #SCHEMA#, else None. + If src_path is given (e.g. from on_post_build loop), read from it; else build path from config. + """ + if not rel_path.startswith(SCHEMA_REFERENCE_PREFIX) or not rel_path.endswith(".md"): + log.debug(f"Skipping {rel_path}: not in {SCHEMA_REFERENCE_PREFIX} or not .md") + return None + if src_path is None: + repo_root = os.path.dirname(config["config_file_path"]) + docs_dir = config["docs_dir"] + if not os.path.isabs(docs_dir): + docs_dir = os.path.join(repo_root, docs_dir) + src_path = os.path.join(docs_dir, rel_path.replace("/", os.sep)) + if not os.path.isfile(src_path): + log.debug(f"Skipping {rel_path}: source file not found at {src_path}") + return None + try: + with open(src_path, "r", encoding="utf-8") as f: + text = f.read() + except OSError as e: + log.debug(f"Skipping {rel_path}: error reading file: {e}") + return None + if "#SCHEMA#" not in text: + log.debug(f"Skipping {rel_path}: no #SCHEMA# placeholders found") + return None + log.debug(f"Expanding schema references in {rel_path}") + return _expand_schema_references(text) + + +def _get_materialized_content(rel_path, config): + """Return README content for examples/**/index.md stubs, else None.""" + if os.environ.get(DISABLE_EXAMPLES_ENV): + return None + + if rel_path.startswith("examples/") and rel_path.endswith("index.md"): + repo_root = os.path.dirname(config["config_file_path"]) + example_dir = os.path.dirname(rel_path) + readme_path = os.path.join(repo_root, example_dir, "README.md") + + if os.path.isfile(readme_path): + with open(readme_path, "r", encoding="utf-8") as f: + return f.read() + return None + + +def on_page_read_source(page, config): + """Use README content for example stubs and expanded schema for reference docs when rendering HTML.""" + rel_path = page.file.src_uri + content = _get_materialized_content(rel_path, config) + if content is not None: + return content + content = _get_schema_expanded_content(rel_path, config) + if content is not None: + return content + return None + + +def on_page_context(context, page, config, nav): + """Override edit_url only for example stubs so Edit points to the README; other pages use theme default from edit_uri.""" + repo_url = (config.get("repo_url") or "").rstrip("/") + edit_uri = (config.get("edit_uri") or "edit/master/docs/").strip("/") + if not repo_url: + return context + # edit_uri is e.g. "edit/master/docs" -> branch is second segment + edit_parts = edit_uri.split("/") + branch = edit_parts[1] if len(edit_parts) >= 2 else "master" + + rel_path = page.file.src_uri + if rel_path.startswith("examples/") and rel_path.endswith("index.md"): + example_dir = os.path.dirname(rel_path) + page.edit_url = f"{repo_url}/edit/{branch}/{example_dir}/README.md" + + return context + + +def on_post_build(config): + """Copy .md files to site (raw) and write .well-known/skills index.""" + site_dir = config["site_dir"] + docs_dir = config["docs_dir"] + + # Create .nojekyll to prevent GitHub Pages from ignoring .well-known directory + nojekyll_path = os.path.join(site_dir, ".nojekyll") + with open(nojekyll_path, "w") as f: + f.write("") + + # Create _config.yml to explicitly include .well-known directory + # This ensures Jekyll (if it runs) includes the .well-known directory + config_yml_path = os.path.join(site_dir, "_config.yml") + with open(config_yml_path, "w") as f: + f.write('include: [".well-known"]\n') + + for root, _, files in os.walk(docs_dir): + for file in files: + if not file.endswith(".md"): + continue + + src_path = os.path.join(root, file) + rel_path = os.path.relpath(src_path, docs_dir).replace(os.sep, "/") + content = _get_materialized_content(rel_path, config) + + if content: + clean_name = os.path.dirname(rel_path) + ".md" + dest_path = os.path.join(site_dir, clean_name) + os.makedirs(os.path.dirname(dest_path), exist_ok=True) + with open(dest_path, "w", encoding="utf-8") as f: + f.write(content) + else: + # Check if this is a schema reference file that needs expansion + content = _get_schema_expanded_content(rel_path, config, src_path=src_path) + dest_path = os.path.join(site_dir, rel_path) + os.makedirs(os.path.dirname(dest_path), exist_ok=True) + if content is not None: + # Write expanded schema content + log.info(f"Expanding schema references in {rel_path}") + with open(dest_path, "w", encoding="utf-8") as f: + f.write(content) + else: + # Just copy the file as-is + shutil.copy2(src_path, dest_path) + + _write_well_known_skills(config, site_dir) + _generate_llms_files(config, site_dir) + + +def _write_well_known_skills(config, site_dir): + """Parse skills/dstack/SKILL.md and write .well-known/skills/index.json. name and description come from frontmatter only.""" + repo_root = os.path.dirname(config["config_file_path"]) + skill_src = os.path.join(repo_root, *SKILL_PATH) + if not os.path.isfile(skill_src): + return + + name = None + description = None + try: + with open(skill_src, "r", encoding="utf-8") as f: + text = f.read() + if text.startswith("---"): + parts = text.split("---", 2) + if len(parts) >= 3: + data = yaml.safe_load(parts[1]) + if isinstance(data, dict): + name = data.get("name") + description = data.get("description") + except Exception as e: + log.error(f"Skill parsing error: {e}") + + if not name or not description: + log.warning( + "skills/dstack/SKILL.md missing name or description in frontmatter; skipping .well-known/skills" + ) + return + + out_dir = os.path.join(site_dir, WELL_KNOWN_SKILLS_DIR, name) + os.makedirs(out_dir, exist_ok=True) + shutil.copy2(skill_src, os.path.join(out_dir, "SKILL.md")) + # Serve skill at site root (both skill.md and SKILL.md) from skills/dstack/SKILL.md + shutil.copy2(skill_src, os.path.join(site_dir, "skill.md")) + shutil.copy2(skill_src, os.path.join(site_dir, "SKILL.md")) + + index_path = os.path.join(site_dir, WELL_KNOWN_SKILLS_DIR, "index.json") + index = { + "skills": [ + {"name": name, "description": description.strip()[:1024], "files": ["SKILL.md"]} + ] + } + with open(index_path, "w", encoding="utf-8") as f: + json.dump(index, f, indent=2) + + log.info(f"Published skill: {name}") + + +def _generate_llms_files(config, site_dir): + """Generate llms.txt and llms-full.txt using external script.""" + repo_root = os.path.dirname(config["config_file_path"]) + + # Import and run the generator + hooks_dir = os.path.dirname(os.path.abspath(__file__)) + gen_path = os.path.join(hooks_dir, "gen_llms_files.py") + spec = importlib.util.spec_from_file_location("gen_llms_files", gen_path) + if spec is None or spec.loader is None: + log.error(f"Cannot load {gen_path}") + return + module = importlib.util.module_from_spec(spec) + sys.modules["gen_llms_files"] = module + spec.loader.exec_module(module) + + try: + # Pass mkdocs config to generator + module.generate_llms_files(repo_root, site_dir, config) + log.info("Generated llms.txt and llms-full.txt") + except Exception as e: + log.error(f"Failed to generate llms files: {e}") diff --git a/skills/dstack/SKILL.md b/skills/dstack/SKILL.md new file mode 100644 index 0000000000..e1d641c9a1 --- /dev/null +++ b/skills/dstack/SKILL.md @@ -0,0 +1,546 @@ +--- +name: dstack +description: | + dstack is an open-source control plane for GPU provisioning and orchestration across GPU clouds, Kubernetes, and on-prem clusters. +--- + +# dstack + +## Overview + +`dstack` is a tool that allows to provision and orchestrate GPU workloads across [GPU clouds and Kubernetes clusters](https://dstack.ai/docs/concepts/backends.md) or on-prem clusters (SSH fleets). + +**When to use this skill:** +- Running/managing GPU workloads (dev environments, tasks for training or other batch jobs, services to run inference or deploy web apps) +- Creating, editing, and running `dstack` configurations +- Managing fleets of compute (instances/clusters) + +## How it works + +`dstack` operates through three core components: + +1. `dstack` server - Can run locally, remotely, or via dstack Sky (managed) +2. `dstack` CLI - For applying configurations and managing resources; CLI can be pointed to the server and a particular default project (`~/.dstack/config.yml` or via `dstack project` CLI command); other CLI commands use the default project +3. `dstack` configuration files - YAML files ending with `.dstack.yml` + +**Typical workflow:** +```bash +# 1. Define configuration in YAML file (e.g., train.dstack.yml, .dstack.yml, llama-serve.dstack.yml) +# 2. Apply configuration +dstack apply -f train.dstack.yml + +# 3. dstack prepares a plan, and once confirmed, provisions instances (according to created fleets) and runs workloads +# 4. Monitor with `dstack ps`, `dstack logs`, `dstack attach`, etc. (these commands support various options). +``` + +By default, `dstack apply` requires a confirmation, and once first job within the run is `running` - it "attaches" establishes an SSH tunnel, forwards ports if any and streams logs in real-time; if you pass `-d`, it runs in the detached mode and exits once the run is submitted. + +**CRITICAL: Never propose `dstack` CLI commands or YAML syntaxes that don't exist.** +- Only use CLI commands and YAML syntax explicitly documented in this skill file or verified via `--help` +- If uncertain about a command or its syntax, check the links or use `--help` + +**NEVER do the following:** +- Invent CLI flags not documented here or shown in `--help` +- Guess YAML property names - verify in configuration reference links +- Run `dstack apply` for runs without `-d` in automated contexts (blocks indefinitely) +- Retry failed commands without addressing the underlying error +- Summarize or reformat tabular CLI output - show it as-is +- Use `echo "y" |` when `-y` flag is available +- Assume a command succeeded without checking output for errors + +## Agent execution guidelines + +**This section provides critical guidance for AI agents executing dstack commands.** + +### Output accuracy +- **NEVER reformat, summarize, or paraphrase CLI output.** Display tables, status output, and error messages exactly as returned. +- When showing command results, use code blocks to preserve formatting. +- If output is truncated due to length, indicate this clearly (e.g., "Output truncated. Full output shows X entries."). + +### Verification before execution +- **When uncertain about any CLI flag or YAML property, run `dstack --help` first.** +- Never guess or invent flags. Example verification commands: + ```bash + dstack --help # List all commands + dstack apply --help # Flags for apply per configuration type (dev-environment, task, service, fleet, etc) + dstack fleet --help # Fleet subcommands + dstack ps --help # Flags for ps + ``` +- If a command or flag isn't documented, it doesn't exist. + +### Command timing and confirmation handling + +**Commands that run indefinitely (agents should avoid these):** +- `dstack attach` - maintains connection until interrupted +- `dstack apply` without `-d` for runs - streams logs after provisioning +- `dstack ps -w` - watch mode, auto-refreshes until interrupted + +Instead, use `dstack ps -v` to check status, or `dstack apply -d` for detached mode. + +**All other commands:** Use 10-60s timeout. Most complete within this range. **While waiting, monitor the output** - it may contain errors, warnings, or prompts requiring attention. + +**Confirmation handling:** +- `dstack apply`, `dstack stop`, `dstack fleet delete` require confirmation +- Use `-y` flag to auto-confirm when user has already approved +- Use `echo "n" |` to preview `dstack apply` plan without executing (avoid `echo "y" |`, prefer `-y`) + +**Best practices:** +- Prefer modifying configuration files over passing parameters to `dstack apply` (unless it's an exception) +- When user confirms deletion/stop operations, use `-y` flag to skip confirmation prompts +- Avoid waiting indefinitely; display essential output once command is finished (even if by timeout) + +## Configuration types + +`dstack` supports five main configuration types, each with specific use cases. Configuration files can be named `.dstack.yml` or simply `.dstack.yml`. + +**Common parameters:** All run configurations (dev environments, tasks, services) support many parameters including: +- **Git integration:** Clone repos automatically (`repo`), mount existing repos (`repos`), upload local files (`working_dir`) +- **Docker support:** Use custom Docker images (`image`); Also if needed, use `docker: true` if you want to use `docker` from inside the container (VM-based backends only) +- **Environment & secrets:** Set environment variables (`env`), reference secrets +- **Storage:** Persistent network volumes (`volumes`), specify disk size +- **Resources:** Define GPU, CPU, memory, and disk requirements + +**Best practices:** + - Prefer giving configurations a `name` property for easier management + +See configuration reference pages for complete parameter lists. + +### 1. Dev environments +**Use for:** Interactive development with IDE integration (VS Code, Cursor, etc.). + +```yaml +type: dev-environment +name: cursor + +python: "3.12" +ide: vscode + +resources: + gpu: 80GB + disk: 500GB +``` + +[Concept documentation](https://dstack.ai/docs/concepts/dev-environments.md) | [Configuration reference](https://dstack.ai/docs/reference/dstack.yml/dev-environment.md) + +### 2. Tasks +**Use for:** Batch jobs, training runs, fine-tuning, web applications, any executable workload. + +**Key features:** Distributed training (multi-node), port forwarding for web apps. + +```yaml +type: task +name: train + +python: "3.12" +env: + - HUGGING_FACE_HUB_TOKEN +commands: + - uv pip install -r requirements.txt + - uv run python train.py +ports: + - 8501 # Optional: expose ports for web apps + +resources: + gpu: A100:40GB:2 # Two 40GB A100s + disk: 200GB +``` + +**Port forwarding:** When you specify `ports`, `dstack apply` automatically forwards them to `localhost` while attached. Use `dstack attach ` to reconnect and restore port forwarding. The run name becomes an SSH alias (e.g., `ssh `) for direct access. + +**Examples:** +- [Single-node training (TRL)](https://dstack.ai/examples/single-node-training/trl/index.md) +- [Single-node training (Axolotl)](https://dstack.ai/examples/single-node-training/axolotl/index.md) +- [Distributed training (TRL)](https://dstack.ai/examples/distributed-training/trl/index.md) +- [Distributed training (Axolotl)](https://dstack.ai/examples/distributed-training/axolotl/index.md) +- [Distributed training (Ray+RAGEN)](https://dstack.ai/examples/distributed-training/ray-ragen/index.md) +- [NCCL/RCCL tests](https://dstack.ai/examples/clusters/nccl-rccl-tests/index.md) + +[Concept documentation](https://dstack.ai/docs/concepts/tasks.md) | [Configuration reference](https://dstack.ai/docs/reference/dstack.yml/task.md) + +### 3. Services +**Use for:** Deploying models or web applications as production endpoints. + +**Key features:** OpenAI-compatible model serving, auto-scaling (RPS/queue), custom gateways with HTTPS. + +```yaml +type: service +name: llama31 + +python: "3.12" +env: + - HF_TOKEN +commands: + - uv pip install vllm + - uv run vllm serve meta-llama/Meta-Llama-3.1-8B-Instruct +port: 8000 +model: meta-llama/Meta-Llama-3.1-8B-Instruct + +resources: + gpu: 80GB + disk: 200GB + +``` + +Once a service is `running` and its health probes are green: + +**Service endpoints:** +- Without gateway: `/proxy/services///` +- With gateway: `https://./` + +**Example:** +```bash +curl http://localhost:3000/proxy/services///v1/chat/completions \ + -H 'Content-Type: application/json' \ + -H 'Authorization: Bearer ' \ + -d '{"model": "meta-llama/Meta-Llama-3.1-8B-Instruct", "messages": [{"role": "user", "content": "Hello!"}]}' +``` + +**Gateways:** Set up a [gateway](https://dstack.ai/docs/concepts/gateways.md) before running services to enable custom domains, HTTPS, auto-scaling rate limits, and production-grade endpoint management. Use the `dstack gateway` CLI command to manage gateways. + +**Examples:** +- [SGLang](https://dstack.ai/examples/inference/sglang/index.md) +- [vLLM](https://dstack.ai/examples/inference/vllm/index.md) +- [NIM](https://dstack.ai/examples/inference/nim/index.md) +- [TensorRT-LLM](https://dstack.ai/examples/inference/trtllm/index.md) + +[Concept documentation](https://dstack.ai/docs/concepts/services.md) | [Configuration reference](https://dstack.ai/docs/reference/dstack.yml/service.md) + +### 4. Fleets +**Use for:** Pre-provisioning infrastructure for workloads, managing on-premises GPU servers, creating auto-scaling instance pools. + +**Important:** Workloads (dev environments, tasks, services) only run if their resource requirements match at least one configured fleet. Without matching fleets, provisioning will fail. + +dstack supports two fleet types: + +#### Backend fleets (Cloud/Kubernetes) +Dynamically provision instances from configured [backends](https://dstack.ai/docs/concepts/backends.md). Use the `nodes` property for on-demand scaling: + +```yaml +type: fleet +name: my-fleet +nodes: 0..2 # Range: creates template when starting with 0, provisions on-demand + +resources: + gpu: 24GB.. # 24GB or more + disk: 200GB + +spot_policy: auto # auto (default), spot, or on-demand +idle_duration: 5m # Terminate idle instances after 5 minutes +``` + +**On-demand provisioning:** When `nodes` is a range (e.g., `0..2`, `1..10`), dstack creates an instance template. Instances are provisioned automatically when workloads need them, scaling between min and max. Set `idle_duration` to terminate idle instances. + +**Additional options:** Fleets support many configuration options including `placement: cluster` for multi-node distributed workloads requiring inter-node communication (e.g., multi-GPU training), `blocks` for resource isolation, environment variables, and more. See the configuration reference for complete details. + +#### SSH fleets (on-prem or pre-provisioned clusters) +Use existing GPU servers accessible via SSH: + +```yaml +type: fleet +name: on-prem-fleet + +ssh_config: + user: ubuntu + identity_file: ~/.ssh/id_rsa + hosts: + - 192.168.1.10 + - 192.168.1.11 +``` + +[Concept documentation](https://dstack.ai/docs/concepts/fleets.md) | [Configuration reference](https://dstack.ai/docs/reference/dstack.yml/fleet.md) + +### 5. Volumes +**Use for:** Persistent storage for datasets, model checkpoints, training artifacts that persist across runs and can be shared between workloads. + +dstack supports two types of volumes: + +#### Network Volumes +Backend-specific persistent volumes (AWS EBS, GCP Persistent Disk, etc.) that can be attached to any dev environment, task, or service. + +**Define a network volume:** +```yaml +type: volume +name: my-volume + +backend: aws +region: us-east-1 + +resources: + disk: 500GB +``` + +**Attach to workloads via `volumes` property:** +```yaml +type: task +# ... other config +volumes: + - name: my-volume + path: /volume_data +``` + +#### Instance Volumes +Faster local volumes using the instance's root disk. Ideal for ephemeral storage, caching, or maximum I/O performance without persistence across instances. + +**Attach instance volumes via `volumes` property:** +```yaml +type: dev-environment +# ... other config +volumes: + - name: my-instance-volume + path: /cache_data +``` + +**Note:** Volumes can be attached to dev environments, tasks, and services using the `volumes` property. Network volumes persist independently, while instance volumes are tied to the instance lifecycle. + +[Concept documentation](https://dstack.ai/docs/concepts/volumes.md) | [Configuration reference](https://dstack.ai/docs/reference/dstack.yml/volume.md) + +## Essential CLI commands + +### Apply configurations + +**Important behavior:** +- `dstack apply` shows a plan with estimated costs and may ask for confirmation (respond with `y` or use `-y` flag to skip) +- Once confirmed, it provisions infrastructure and streams real-time output to the terminal +- In attached mode (default), the terminal blocks and shows output - use timeout or Ctrl+C to interrupt if you need to continue with other commands +- In detached mode (`-d`), runs in background without blocking the terminal + +**Workflow for applying configurations:** + +> **Critical for agents:** Always show the plan first, wait for user confirmation, THEN execute. Never auto-execute without user approval. + +**Step-by-step for run configurations (dev-environment, task, service):** + +1. **Show plan:** + ```bash + echo "n" | dstack apply -f config.dstack.yml + ``` + Display the FULL output including the offers table and cost estimate. **Do NOT summarize or reformat.** + +2. **Wait for user confirmation.** Do NOT proceed if: + - Output shows "No offers found" or similar errors + - Output shows validation errors + - User has not explicitly confirmed + +3. **Execute (only after user confirms):** + ```bash + dstack apply -f config.dstack.yml -y -d + ``` + +4. **Verify apply status:** + ```bash + dstack ps -v + ``` + Show the run status. Look for the run name and status column. + +**Step-by-step for infrastructure (fleet, volume, gateway):** + +1. **Show plan:** + ```bash + echo "n" | dstack apply -f fleet.dstack.yml + ``` + Display the FULL output. **Do NOT summarize or reformat.** + +2. **Wait for user confirmation.** + +3. **Execute:** + ```bash + dstack apply -f fleet.dstack.yml -y + ``` + +4. **Verify:** Use `dstack fleet`, `dstack volume`, or `dstack gateway` respectively. + +**Common apply patterns:** +```bash +# Apply and attach (interactive, blocks terminal with port forwarding) +dstack apply -f train.dstack.yml + +# Apply with automatic confirmation +dstack apply -f train.dstack.yml -y + +# Apply detached (background, no attachment) +dstack apply -f serve.dstack.yml -d + +# Force rerun (recreates even if run with same name exists) +dstack apply -f finetune.dstack.yml --force + +# Override defaults (prefer modifying config file instead, unless it's an exception) +dstack apply -f .dstack.yml --max-price 2.5 +``` + +### Fleet Management + +```bash +# Create/update fleet +dstack apply -f fleet.dstack.yml + +# List fleets +dstack fleet + +# Get fleet details +dstack fleet get my-fleet + +# Get fleet details as JSON (for troubleshooting) +dstack fleet get my-fleet --json + +# Delete entire fleet (use -y when user already confirmed) +dstack fleet delete my-fleet -y + +# IMPORTANT: When asked to delete an instance, always use -i - do NOT delete the entire fleet (use -y when user already confirmed) +dstack fleet delete my-fleet -i -y +``` + +### Monitor runs + +```bash +# List all runs +dstack ps + +# JSON output (for troubleshooting/scripting) +dstack ps --json + +# Verbose output with full details +dstack ps -v + +# Get specific run details as JSON +dstack run get my-run-name --json +``` + +### Attach to runs + +**What is attaching?** Attaching connects to an existing run to restore port forwarding (for tasks/services with ports) and enable SSH access. The run name becomes an SSH alias (e.g., `ssh my-run-name`) configured in `~/.dstack/ssh/config` (included to `~/.ssh/config`). + +**Note:** `dstack apply` automatically attaches when run completes provisioning. Use `dstack attach` to reconnect after detaching or to access detached runs. + +```bash +# Attach and replay logs from start (preferred, unless asked otherwise) +dstack attach my-run-name --logs + +# Attach without replaying logs (restores port forwarding + SSH only) +dstack attach my-run-name +``` + +### View logs + +```bash +# Stream logs (tail mode) +dstack logs my-run-name + +# Debug mode (includes additional runner logs) +dstack logs my-run-name -d + +# Fetch logs from specific replica (multi-node runs) +dstack logs my-run-name --replica 1 + +# Fetch logs from specific job +dstack logs my-run-name --job 0 +``` + +### Stop runs + +```bash +# Stop specific run +dstack stop my-run-name + +# Stop with confirmation skipped (use when user already confirmed) +dstack stop my-run-name -y + +# Abort (force stop) +dstack stop my-run-name --abort +``` + +### Check available resources + +**Use `dstack offer` to verify GPU availability before provisioning:** + +```bash +# List all available offers across backends +dstack offer --json + +# Filter by specific backend +dstack offer --backend aws + +# Filter by GPU type +dstack offer --gpu A100 + +# Filter by GPU memory +dstack offer --gpu 24GB..80GB + +# JSON output for detailed inspection +dstack offer --json + +# Combine filters +dstack offer --backend aws --gpu A100:80GB +``` + +**Note:** `dstack offer` shows all available GPU instances from configured backends, not just those matching configured fleets. Use it to check backend availability, but remember: an offer appearing here doesn't guarantee a fleet will provision it - fleets have their own resource constraints. + +### Expected Output Formats + +**Agents should display these tables as-is, preserving column alignment.** + +## Troubleshooting + +When diagnosing issues with dstack workloads or infrastructure: + +1. **Use JSON output for detailed inspection:** + ```bash + dstack fleet get my-fleet --json | jq . + dstack run get my-run --json | jq . + dstack ps -n 10 --json | jq . + ``` + +2. **Check verbose run status:** + ```bash + dstack ps -v # Shows provisioning state, instance details, errors + ``` + +3. **Examine logs with debug output:** + ```bash + dstack logs my-run -d # Includes additional runner logs + ``` + +4. **Attach with log replay:** + ```bash + dstack attach my-run --logs # See full output from start + ``` + +5. **Verify resource availability:** + ```bash + dstack offer --backend aws --gpu A100 --spot-auto --json # Check if resources exist + ``` + +Common issues: +- **No offers:** Check `dstack offer` and ensure that at least one fleet matches requirements +- **No fleet:** Ensure at least one fleet is created +- **Configuration errors:** Validate YAML syntax; check `dstack apply` output for specific errors +- **Provisioning timeouts:** Use `dstack ps -v` to see provisioning status; consider spot vs on-demand +- **Connection issues:** Verify server status, check authentication, ensure network access to backends + +**When errors occur:** +1. Display the full error message unchanged +2. Do NOT retry the same command without addressing the error +3. Refer to the [Troubleshooting guide](https://dstack.ai/docs/guides/troubleshooting.md) for guidance + +## Additional Resources + +**Core documentation:** +- [Overview](https://dstack.ai/docs/overview.md) +- [Installation](https://dstack.ai/docs/installation.md) +- [Quickstart](https://dstack.ai/docs/quickstart.md) + +**Additional concepts:** +- [Secrets](https://dstack.ai/docs/concepts/secrets.md) - Manage sensitive credentials +- [Projects](https://dstack.ai/docs/concepts/projects.md) - Projects isolate the resources of different teams +- [Metrics](https://dstack.ai/docs/concepts/metrics.md) - Track GPU utilization +- [Events](https://dstack.ai/docs/concepts/events.md) - Monitor system events + +**Guides:** +- [Server deployment](https://dstack.ai/docs/guides/server-deployment.md) (for server administration) +- [Pro tips](https://dstack.ai/docs/guides/protips.md) + +**Accelerator-specific examples:** +- [AMD](https://dstack.ai/examples/accelerators/amd/index.md) +- [Google TPU](https://dstack.ai/examples/accelerators/tpu/index.md) +- [Tenstorrent](https://dstack.ai/examples/accelerators/tenstorrent/index.md) + +**Full documentation:** https://dstack.ai/llms-full.txt