dstack 0.19.12__py3-none-any.whl → 0.19.13__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of dstack might be problematic. Click here for more details.

Files changed (33) hide show
  1. dstack/_internal/cli/services/configurators/run.py +1 -6
  2. dstack/_internal/cli/utils/run.py +5 -1
  3. dstack/_internal/core/backends/aws/compute.py +22 -9
  4. dstack/_internal/core/backends/aws/resources.py +26 -0
  5. dstack/_internal/core/backends/base/offers.py +0 -1
  6. dstack/_internal/core/compatibility/__init__.py +0 -0
  7. dstack/_internal/core/compatibility/fleets.py +72 -0
  8. dstack/_internal/core/compatibility/gateways.py +34 -0
  9. dstack/_internal/core/compatibility/runs.py +125 -0
  10. dstack/_internal/core/compatibility/volumes.py +32 -0
  11. dstack/_internal/core/models/instances.py +51 -12
  12. dstack/_internal/core/models/runs.py +41 -0
  13. dstack/_internal/server/app.py +1 -1
  14. dstack/_internal/server/services/storage/__init__.py +38 -0
  15. dstack/_internal/server/services/storage/base.py +27 -0
  16. dstack/_internal/server/services/storage/gcs.py +44 -0
  17. dstack/_internal/server/services/{storage.py → storage/s3.py} +4 -27
  18. dstack/_internal/server/settings.py +7 -3
  19. dstack/_internal/server/statics/index.html +1 -1
  20. dstack/_internal/server/statics/{main-b0e80f8e26a168c129e9.js → main-2066f1f22ddb4557bcde.js} +1615 -31
  21. dstack/_internal/server/statics/{main-b0e80f8e26a168c129e9.js.map → main-2066f1f22ddb4557bcde.js.map} +1 -1
  22. dstack/_internal/server/statics/{main-8f9c66f404e9c7e7e020.css → main-f39c418b05fe14772dd8.css} +1 -1
  23. dstack/api/server/_fleets.py +9 -73
  24. dstack/api/server/_gateways.py +3 -14
  25. dstack/api/server/_runs.py +4 -124
  26. dstack/api/server/_volumes.py +3 -14
  27. dstack/plugins/builtin/rest_plugin/_plugin.py +24 -5
  28. dstack/version.py +2 -2
  29. {dstack-0.19.12.dist-info → dstack-0.19.13.dist-info}/METADATA +1 -1
  30. {dstack-0.19.12.dist-info → dstack-0.19.13.dist-info}/RECORD +33 -25
  31. {dstack-0.19.12.dist-info → dstack-0.19.13.dist-info}/WHEEL +0 -0
  32. {dstack-0.19.12.dist-info → dstack-0.19.13.dist-info}/entry_points.txt +0 -0
  33. {dstack-0.19.12.dist-info → dstack-0.19.13.dist-info}/licenses/LICENSE.md +0 -0
@@ -1,9 +1,13 @@
1
- from typing import Any, Dict, List, Optional, Union
1
+ from typing import List, Union
2
2
 
3
3
  from pydantic import parse_obj_as
4
4
 
5
+ from dstack._internal.core.compatibility.fleets import (
6
+ get_apply_plan_excludes,
7
+ get_create_fleet_excludes,
8
+ get_get_plan_excludes,
9
+ )
5
10
  from dstack._internal.core.models.fleets import ApplyFleetPlanInput, Fleet, FleetPlan, FleetSpec
6
- from dstack._internal.core.models.instances import Instance
7
11
  from dstack._internal.server.schemas.fleets import (
8
12
  ApplyFleetPlanRequest,
9
13
  CreateFleetRequest,
@@ -34,7 +38,7 @@ class FleetsAPIClient(APIClientGroup):
34
38
  spec: FleetSpec,
35
39
  ) -> FleetPlan:
36
40
  body = GetFleetPlanRequest(spec=spec)
37
- body_json = body.json(exclude=_get_get_plan_excludes(spec))
41
+ body_json = body.json(exclude=get_get_plan_excludes(spec))
38
42
  resp = self._request(f"/api/project/{project_name}/fleets/get_plan", body=body_json)
39
43
  return parse_obj_as(FleetPlan.__response__, resp.json())
40
44
 
@@ -46,7 +50,7 @@ class FleetsAPIClient(APIClientGroup):
46
50
  ) -> Fleet:
47
51
  plan_input = ApplyFleetPlanInput.__response__.parse_obj(plan)
48
52
  body = ApplyFleetPlanRequest(plan=plan_input, force=force)
49
- body_json = body.json(exclude=_get_apply_plan_excludes(plan_input))
53
+ body_json = body.json(exclude=get_apply_plan_excludes(plan_input))
50
54
  resp = self._request(f"/api/project/{project_name}/fleets/apply", body=body_json)
51
55
  return parse_obj_as(Fleet.__response__, resp.json())
52
56
 
@@ -66,74 +70,6 @@ class FleetsAPIClient(APIClientGroup):
66
70
  spec: FleetSpec,
67
71
  ) -> Fleet:
68
72
  body = CreateFleetRequest(spec=spec)
69
- body_json = body.json(exclude=_get_create_fleet_excludes(spec))
73
+ body_json = body.json(exclude=get_create_fleet_excludes(spec))
70
74
  resp = self._request(f"/api/project/{project_name}/fleets/create", body=body_json)
71
75
  return parse_obj_as(Fleet.__response__, resp.json())
72
-
73
-
74
- def _get_get_plan_excludes(fleet_spec: FleetSpec) -> Dict:
75
- get_plan_excludes = {}
76
- spec_excludes = _get_fleet_spec_excludes(fleet_spec)
77
- if spec_excludes:
78
- get_plan_excludes["spec"] = spec_excludes
79
- return get_plan_excludes
80
-
81
-
82
- def _get_apply_plan_excludes(plan_input: ApplyFleetPlanInput) -> Dict:
83
- apply_plan_excludes = {}
84
- spec_excludes = _get_fleet_spec_excludes(plan_input.spec)
85
- if spec_excludes:
86
- apply_plan_excludes["spec"] = spec_excludes
87
- current_resource = plan_input.current_resource
88
- if current_resource is not None:
89
- current_resource_excludes = {}
90
- apply_plan_excludes["current_resource"] = current_resource_excludes
91
- if all(map(_should_exclude_instance_cpu_arch, current_resource.instances)):
92
- current_resource_excludes["instances"] = {
93
- "__all__": {"instance_type": {"resources": {"cpu_arch"}}}
94
- }
95
- return {"plan": apply_plan_excludes}
96
-
97
-
98
- def _should_exclude_instance_cpu_arch(instance: Instance) -> bool:
99
- try:
100
- return instance.instance_type.resources.cpu_arch is None
101
- except AttributeError:
102
- return True
103
-
104
-
105
- def _get_create_fleet_excludes(fleet_spec: FleetSpec) -> Dict:
106
- create_fleet_excludes = {}
107
- spec_excludes = _get_fleet_spec_excludes(fleet_spec)
108
- if spec_excludes:
109
- create_fleet_excludes["spec"] = spec_excludes
110
- return create_fleet_excludes
111
-
112
-
113
- def _get_fleet_spec_excludes(fleet_spec: FleetSpec) -> Optional[Dict]:
114
- """
115
- Returns `fleet_spec` exclude mapping to exclude certain fields from the request.
116
- Use this method to exclude new fields when they are not set to keep
117
- clients backward-compatibility with older servers.
118
- """
119
- spec_excludes: Dict[str, Any] = {}
120
- configuration_excludes: Dict[str, Any] = {}
121
- profile_excludes: set[str] = set()
122
- profile = fleet_spec.profile
123
- if profile.fleets is None:
124
- profile_excludes.add("fleets")
125
- if fleet_spec.configuration.tags is None:
126
- configuration_excludes["tags"] = True
127
- if profile.tags is None:
128
- profile_excludes.add("tags")
129
- if profile.startup_order is None:
130
- profile_excludes.add("startup_order")
131
- if profile.stop_criteria is None:
132
- profile_excludes.add("stop_criteria")
133
- if configuration_excludes:
134
- spec_excludes["configuration"] = configuration_excludes
135
- if profile_excludes:
136
- spec_excludes["profile"] = profile_excludes
137
- if spec_excludes:
138
- return spec_excludes
139
- return None
@@ -1,7 +1,8 @@
1
- from typing import Dict, List
1
+ from typing import List
2
2
 
3
3
  from pydantic import parse_obj_as
4
4
 
5
+ from dstack._internal.core.compatibility.gateways import get_create_gateway_excludes
5
6
  from dstack._internal.core.models.gateways import Gateway, GatewayConfiguration
6
7
  from dstack._internal.server.schemas.gateways import (
7
8
  CreateGatewayRequest,
@@ -31,7 +32,7 @@ class GatewaysAPIClient(APIClientGroup):
31
32
  body = CreateGatewayRequest(configuration=configuration)
32
33
  resp = self._request(
33
34
  f"/api/project/{project_name}/gateways/create",
34
- body=body.json(exclude=_get_gateway_configuration_excludes(configuration)),
35
+ body=body.json(exclude=get_create_gateway_excludes(configuration)),
35
36
  )
36
37
  return parse_obj_as(Gateway.__response__, resp.json())
37
38
 
@@ -51,15 +52,3 @@ class GatewaysAPIClient(APIClientGroup):
51
52
  f"/api/project/{project_name}/gateways/set_wildcard_domain", body=body.json()
52
53
  )
53
54
  return parse_obj_as(Gateway.__response__, resp.json())
54
-
55
-
56
- def _get_gateway_configuration_excludes(configuration: GatewayConfiguration) -> Dict:
57
- """
58
- Returns `configuration` exclude mapping to exclude certain fields from the request.
59
- Use this method to exclude new fields when they are not set to keep
60
- clients backward-compatibility with older servers.
61
- """
62
- configuration_excludes = {}
63
- if configuration.tags is None:
64
- configuration_excludes["tags"] = True
65
- return {"configuration": configuration_excludes}
@@ -1,13 +1,12 @@
1
1
  from datetime import datetime
2
- from typing import Any, Dict, List, Optional, Union
2
+ from typing import List, Optional, Union
3
3
  from uuid import UUID
4
4
 
5
5
  from pydantic import parse_obj_as
6
6
 
7
- from dstack._internal.core.models.configurations import ServiceConfiguration
7
+ from dstack._internal.core.compatibility.runs import get_apply_plan_excludes, get_get_plan_excludes
8
8
  from dstack._internal.core.models.runs import (
9
9
  ApplyRunPlanInput,
10
- JobSubmission,
11
10
  Run,
12
11
  RunPlan,
13
12
  RunSpec,
@@ -60,7 +59,7 @@ class RunsAPIClient(APIClientGroup):
60
59
  body = GetRunPlanRequest(run_spec=run_spec, max_offers=max_offers)
61
60
  resp = self._request(
62
61
  f"/api/project/{project_name}/runs/get_plan",
63
- body=body.json(exclude=_get_get_plan_excludes(body)),
62
+ body=body.json(exclude=get_get_plan_excludes(body)),
64
63
  )
65
64
  return parse_obj_as(RunPlan.__response__, resp.json())
66
65
 
@@ -74,7 +73,7 @@ class RunsAPIClient(APIClientGroup):
74
73
  body = ApplyRunPlanRequest(plan=plan_input, force=force)
75
74
  resp = self._request(
76
75
  f"/api/project/{project_name}/runs/apply",
77
- body=body.json(exclude=_get_apply_plan_excludes(plan_input)),
76
+ body=body.json(exclude=get_apply_plan_excludes(plan_input)),
78
77
  )
79
78
  return parse_obj_as(Run.__response__, resp.json())
80
79
 
@@ -85,122 +84,3 @@ class RunsAPIClient(APIClientGroup):
85
84
  def delete(self, project_name: str, runs_names: List[str]):
86
85
  body = DeleteRunsRequest(runs_names=runs_names)
87
86
  self._request(f"/api/project/{project_name}/runs/delete", body=body.json())
88
-
89
-
90
- def _get_apply_plan_excludes(plan: ApplyRunPlanInput) -> Optional[Dict]:
91
- """
92
- Returns `plan` exclude mapping to exclude certain fields from the request.
93
- Use this method to exclude new fields when they are not set to keep
94
- clients backward-compatibility with older servers.
95
- """
96
- apply_plan_excludes = {}
97
- run_spec_excludes = _get_run_spec_excludes(plan.run_spec)
98
- if run_spec_excludes is not None:
99
- apply_plan_excludes["run_spec"] = run_spec_excludes
100
- current_resource = plan.current_resource
101
- if current_resource is not None:
102
- current_resource_excludes = {}
103
- apply_plan_excludes["current_resource"] = current_resource_excludes
104
- current_resource_excludes["run_spec"] = _get_run_spec_excludes(current_resource.run_spec)
105
- job_submissions_excludes = {}
106
- current_resource_excludes["jobs"] = {
107
- "__all__": {"job_submissions": {"__all__": job_submissions_excludes}}
108
- }
109
- job_submissions = [js for j in current_resource.jobs for js in j.job_submissions]
110
- if all(map(_should_exclude_job_submission_jpd_cpu_arch, job_submissions)):
111
- job_submissions_excludes["job_provisioning_data"] = {
112
- "instance_type": {"resources": {"cpu_arch"}}
113
- }
114
- if all(map(_should_exclude_job_submission_jrd_cpu_arch, job_submissions)):
115
- job_submissions_excludes["job_runtime_data"] = {
116
- "offer": {"instance": {"resources": {"cpu_arch"}}}
117
- }
118
- if all(js.exit_status is None for js in job_submissions):
119
- job_submissions_excludes["exit_status"] = True
120
- latest_job_submission = current_resource.latest_job_submission
121
- if latest_job_submission is not None:
122
- latest_job_submission_excludes = {}
123
- current_resource_excludes["latest_job_submission"] = latest_job_submission_excludes
124
- if _should_exclude_job_submission_jpd_cpu_arch(latest_job_submission):
125
- latest_job_submission_excludes["job_provisioning_data"] = {
126
- "instance_type": {"resources": {"cpu_arch"}}
127
- }
128
- if _should_exclude_job_submission_jrd_cpu_arch(latest_job_submission):
129
- latest_job_submission_excludes["job_runtime_data"] = {
130
- "offer": {"instance": {"resources": {"cpu_arch"}}}
131
- }
132
- if latest_job_submission.exit_status is None:
133
- latest_job_submission_excludes["exit_status"] = True
134
- return {"plan": apply_plan_excludes}
135
-
136
-
137
- def _should_exclude_job_submission_jpd_cpu_arch(job_submission: JobSubmission) -> bool:
138
- try:
139
- return job_submission.job_provisioning_data.instance_type.resources.cpu_arch is None
140
- except AttributeError:
141
- return True
142
-
143
-
144
- def _should_exclude_job_submission_jrd_cpu_arch(job_submission: JobSubmission) -> bool:
145
- try:
146
- return job_submission.job_runtime_data.offer.instance.resources.cpu_arch is None
147
- except AttributeError:
148
- return True
149
-
150
-
151
- def _get_get_plan_excludes(request: GetRunPlanRequest) -> Optional[Dict]:
152
- """
153
- Excludes new fields when they are not set to keep
154
- clients backward-compatibility with older servers.
155
- """
156
- get_plan_excludes = {}
157
- run_spec_excludes = _get_run_spec_excludes(request.run_spec)
158
- if run_spec_excludes is not None:
159
- get_plan_excludes["run_spec"] = run_spec_excludes
160
- if request.max_offers is None:
161
- get_plan_excludes["max_offers"] = True
162
- return get_plan_excludes
163
-
164
-
165
- def _get_run_spec_excludes(run_spec: RunSpec) -> Optional[Dict]:
166
- """
167
- Returns `run_spec` exclude mapping to exclude certain fields from the request.
168
- Use this method to exclude new fields when they are not set to keep
169
- clients backward-compatibility with older servers.
170
- """
171
- spec_excludes: dict[str, Any] = {}
172
- configuration_excludes: dict[str, Any] = {}
173
- profile_excludes: set[str] = set()
174
- configuration = run_spec.configuration
175
- profile = run_spec.profile
176
-
177
- if configuration.fleets is None:
178
- configuration_excludes["fleets"] = True
179
- if profile is not None and profile.fleets is None:
180
- profile_excludes.add("fleets")
181
- if configuration.tags is None:
182
- configuration_excludes["tags"] = True
183
- if profile is not None and profile.tags is None:
184
- profile_excludes.add("tags")
185
- if isinstance(configuration, ServiceConfiguration) and not configuration.rate_limits:
186
- configuration_excludes["rate_limits"] = True
187
- if configuration.shell is None:
188
- configuration_excludes["shell"] = True
189
- if configuration.priority is None:
190
- configuration_excludes["priority"] = True
191
- if configuration.startup_order is None:
192
- configuration_excludes["startup_order"] = True
193
- if profile is not None and profile.startup_order is None:
194
- profile_excludes.add("startup_order")
195
- if configuration.stop_criteria is None:
196
- configuration_excludes["stop_criteria"] = True
197
- if profile is not None and profile.stop_criteria is None:
198
- profile_excludes.add("stop_criteria")
199
-
200
- if configuration_excludes:
201
- spec_excludes["configuration"] = configuration_excludes
202
- if profile_excludes:
203
- spec_excludes["profile"] = profile_excludes
204
- if spec_excludes:
205
- return spec_excludes
206
- return None
@@ -1,7 +1,8 @@
1
- from typing import Dict, List
1
+ from typing import List
2
2
 
3
3
  from pydantic import parse_obj_as
4
4
 
5
+ from dstack._internal.core.compatibility.volumes import get_create_volume_excludes
5
6
  from dstack._internal.core.models.volumes import Volume, VolumeConfiguration
6
7
  from dstack._internal.server.schemas.volumes import (
7
8
  CreateVolumeRequest,
@@ -29,22 +30,10 @@ class VolumesAPIClient(APIClientGroup):
29
30
  body = CreateVolumeRequest(configuration=configuration)
30
31
  resp = self._request(
31
32
  f"/api/project/{project_name}/volumes/create",
32
- body=body.json(exclude=_get_volume_configuration_excludes(configuration)),
33
+ body=body.json(exclude=get_create_volume_excludes(configuration)),
33
34
  )
34
35
  return parse_obj_as(Volume.__response__, resp.json())
35
36
 
36
37
  def delete(self, project_name: str, names: List[str]) -> None:
37
38
  body = DeleteVolumesRequest(names=names)
38
39
  self._request(f"/api/project/{project_name}/volumes/delete", body=body.json())
39
-
40
-
41
- def _get_volume_configuration_excludes(configuration: VolumeConfiguration) -> Dict:
42
- """
43
- Returns `configuration` exclude mapping to exclude certain fields from the request.
44
- Use this method to exclude new fields when they are not set to keep
45
- clients backward-compatibility with older servers.
46
- """
47
- configuration_excludes = {}
48
- if configuration.tags is None:
49
- configuration_excludes["tags"] = True
50
- return {"configuration": configuration_excludes}
@@ -1,10 +1,14 @@
1
1
  import json
2
2
  import os
3
- from typing import Type
3
+ from typing import Dict, Optional, Type
4
4
 
5
5
  import requests
6
6
  from pydantic import ValidationError
7
7
 
8
+ from dstack._internal.core.compatibility.fleets import get_fleet_spec_excludes
9
+ from dstack._internal.core.compatibility.gateways import get_gateway_spec_excludes
10
+ from dstack._internal.core.compatibility.runs import get_run_spec_excludes
11
+ from dstack._internal.core.compatibility.volumes import get_volume_spec_excludes
8
12
  from dstack._internal.core.errors import ServerClientError
9
13
  from dstack._internal.core.models.fleets import FleetSpec
10
14
  from dstack._internal.core.models.gateways import GatewaySpec
@@ -44,12 +48,17 @@ class CustomApplyPolicy(ApplyPolicy):
44
48
  logger.error(f"Plugin service rejected apply request: {response.error}")
45
49
  raise ServerClientError(f"Apply request rejected: {response.error}")
46
50
 
47
- def _call_plugin_service(self, spec_request: SpecApplyRequest, endpoint: str) -> ApplySpec:
51
+ def _call_plugin_service(
52
+ self,
53
+ spec_request: SpecApplyRequest,
54
+ endpoint: str,
55
+ excludes: Optional[Dict],
56
+ ) -> ApplySpec:
48
57
  response = None
49
58
  try:
50
59
  response = requests.post(
51
60
  f"{self._plugin_service_uri}{endpoint}",
52
- json=spec_request.dict(),
61
+ json=spec_request.dict(exclude={"spec": excludes}),
53
62
  headers={"accept": "application/json", "Content-Type": "application/json"},
54
63
  timeout=PLUGIN_REQUEST_TIMEOUT_SEC,
55
64
  )
@@ -75,10 +84,11 @@ class CustomApplyPolicy(ApplyPolicy):
75
84
  user: str,
76
85
  project: str,
77
86
  spec: ApplySpec,
87
+ excludes: Optional[Dict] = None,
78
88
  ) -> ApplySpec:
79
89
  try:
80
90
  spec_request = request_cls(user=user, project=project, spec=spec)
81
- spec_json = self._call_plugin_service(spec_request, endpoint)
91
+ spec_json = self._call_plugin_service(spec_request, endpoint, excludes)
82
92
  response = response_cls(**spec_json)
83
93
  self._check_request_rejected(response)
84
94
  return response.spec
@@ -88,7 +98,13 @@ class CustomApplyPolicy(ApplyPolicy):
88
98
 
89
99
  def on_run_apply(self, user: str, project: str, spec: RunSpec) -> RunSpec:
90
100
  return self._on_apply(
91
- RunSpecRequest, RunSpecResponse, "/apply_policies/on_run_apply", user, project, spec
101
+ RunSpecRequest,
102
+ RunSpecResponse,
103
+ "/apply_policies/on_run_apply",
104
+ user,
105
+ project,
106
+ spec,
107
+ excludes=get_run_spec_excludes(spec),
92
108
  )
93
109
 
94
110
  def on_fleet_apply(self, user: str, project: str, spec: FleetSpec) -> FleetSpec:
@@ -99,6 +115,7 @@ class CustomApplyPolicy(ApplyPolicy):
99
115
  user,
100
116
  project,
101
117
  spec,
118
+ excludes=get_fleet_spec_excludes(spec),
102
119
  )
103
120
 
104
121
  def on_volume_apply(self, user: str, project: str, spec: VolumeSpec) -> VolumeSpec:
@@ -109,6 +126,7 @@ class CustomApplyPolicy(ApplyPolicy):
109
126
  user,
110
127
  project,
111
128
  spec,
129
+ excludes=get_volume_spec_excludes(spec),
112
130
  )
113
131
 
114
132
  def on_gateway_apply(self, user: str, project: str, spec: GatewaySpec) -> GatewaySpec:
@@ -119,6 +137,7 @@ class CustomApplyPolicy(ApplyPolicy):
119
137
  user,
120
138
  project,
121
139
  spec,
140
+ excludes=get_gateway_spec_excludes(spec),
122
141
  )
123
142
 
124
143
 
dstack/version.py CHANGED
@@ -1,3 +1,3 @@
1
- __version__ = "0.19.12"
1
+ __version__ = "0.19.13"
2
2
  __is_release__ = True
3
- base_image = "0.8"
3
+ base_image = "0.9"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dstack
3
- Version: 0.19.12
3
+ Version: 0.19.13
4
4
  Summary: dstack is an open-source orchestration engine for running AI workloads on any cloud or on-premises.
5
5
  Project-URL: Homepage, https://dstack.ai
6
6
  Project-URL: Source, https://github.com/dstackai/dstack
@@ -1,5 +1,5 @@
1
1
  dstack/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- dstack/version.py,sha256=eZrGQsCvpqosKeZL0aLtMA0YuPk3m-HVoj8LhGs7QMs,65
2
+ dstack/version.py,sha256=OwNbB8gHGF6BM_ok6ibCM0DP4eAejg2QWX9OL07NlV0,65
3
3
  dstack/_internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  dstack/_internal/compat.py,sha256=bF9U9fTMfL8UVhCouedoUSTYFl7UAOiU0WXrnRoByxw,40
5
5
  dstack/_internal/settings.py,sha256=GOqfcLEONWC1hGU36IYPuOhJXP_qC3Y6d2SQge_NdpY,953
@@ -32,14 +32,14 @@ dstack/_internal/cli/services/configurators/__init__.py,sha256=z94VPBFqybP8Zpwy3
32
32
  dstack/_internal/cli/services/configurators/base.py,sha256=bGfde2zoma28lLE8MUACO4-NKT1CdJJQJoXrzjpz0mQ,3360
33
33
  dstack/_internal/cli/services/configurators/fleet.py,sha256=jm4tNH6QQVplLdboCTlvRYUee3nZ0UYb_qLTrvtYVYM,14049
34
34
  dstack/_internal/cli/services/configurators/gateway.py,sha256=czB2s89s7IowOmWnpDwWErPAUlW3FvFMizImhrkQiBM,8927
35
- dstack/_internal/cli/services/configurators/run.py,sha256=oNjxxUeVzvuuEwot7WVjDbQqGxVfO6BoB7z6K-jKA2E,25248
35
+ dstack/_internal/cli/services/configurators/run.py,sha256=Dapy7YkwH88veiyYuhNg5PzJ0ubCOsrwIWgBaC8XcJ0,25056
36
36
  dstack/_internal/cli/services/configurators/volume.py,sha256=riMXLQbgvHIIFwLKdHfad-_0iE9wE3G_rUmXU5P3ZS8,8519
37
37
  dstack/_internal/cli/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
38
  dstack/_internal/cli/utils/common.py,sha256=rfmzqrsgR3rXW3wj0vxDdvrhUUg2aIy4A6E9MZbd55g,1763
39
39
  dstack/_internal/cli/utils/fleet.py,sha256=ch-LN1X9boSm-rFLW4mAJRmz0XliLhH0LvKD2DqSt2g,3942
40
40
  dstack/_internal/cli/utils/gateway.py,sha256=qMYa1NTAT_O98x2_mSyWDRbiHj5fqt6xUXFh9NIUwAM,1502
41
41
  dstack/_internal/cli/utils/rich.py,sha256=Gx1MJU929kMKsbdo9qF7XHARNta2426Ssb-xMLVhwbQ,5710
42
- dstack/_internal/cli/utils/run.py,sha256=X518VI3gjBkAfZt-1ErhuzQpCLATkZm8r_cf9L_Y6IE,8800
42
+ dstack/_internal/cli/utils/run.py,sha256=g4rOQ6OPfz2dRhuYKfUDJQD9QGWLqBPRTcdxAgsXTYY,8967
43
43
  dstack/_internal/cli/utils/updates.py,sha256=pGr5keEmHojnbY0ayjWL4GWTz4ParY6fP85tHpJ11pI,3043
44
44
  dstack/_internal/cli/utils/volume.py,sha256=mU9I06dVMFbpjfkefxrZNoSWadKLoib3U14rHudNQN4,1975
45
45
  dstack/_internal/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -51,10 +51,10 @@ dstack/_internal/core/backends/models.py,sha256=aKQOrDEStouuwY4MacSen7SkoyAa6HR6
51
51
  dstack/_internal/core/backends/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
52
  dstack/_internal/core/backends/aws/auth.py,sha256=BAe3HAedoAO42Fbv7YhpODKWlyil8M0PuRJsL-_u_kw,978
53
53
  dstack/_internal/core/backends/aws/backend.py,sha256=pjROH-S9pgrSMm-Eox_ocL7cTU6mIMRxvURq7Vi-2J8,876
54
- dstack/_internal/core/backends/aws/compute.py,sha256=GKxwfoDA_qVE1znwRGfvkPhvrl3XUDL9tAlFidB4SYs,36040
54
+ dstack/_internal/core/backends/aws/compute.py,sha256=fvFkB-SLgOHJNm-CgGcuuwsc3GtU5ctjW823KMA5D4k,36563
55
55
  dstack/_internal/core/backends/aws/configurator.py,sha256=gGynfTQW89hUt7acAjVnZnRtCbzhno7l4baCKnBEuQI,7499
56
56
  dstack/_internal/core/backends/aws/models.py,sha256=EUCHXHmZnshe3rwI9UtjilwcUMu1Z7MO4Y4-nlZ_IcA,4404
57
- dstack/_internal/core/backends/aws/resources.py,sha256=Wht_USG8ps9HQBhAYfxDxjaob9kUnr7_WDCaXNzCeE0,22837
57
+ dstack/_internal/core/backends/aws/resources.py,sha256=ccvdQd2H1DuUupdzMtqf86nkrenYPBJb1k3VgHu5Gp4,23610
58
58
  dstack/_internal/core/backends/azure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
59
  dstack/_internal/core/backends/azure/auth.py,sha256=CHp3QRNx3tIwkhyOY_l8WU-ElY4Pxhavoy9JSdwr15g,1259
60
60
  dstack/_internal/core/backends/azure/backend.py,sha256=XySTor8v_tLkZctDBryrFHrbVzQgNf_RUPkXQYplvwM,746
@@ -68,7 +68,7 @@ dstack/_internal/core/backends/base/backend.py,sha256=hdFMHED1RMV9GVfLSU0yGhGE-c
68
68
  dstack/_internal/core/backends/base/compute.py,sha256=D4rRxUHUZOkUfAhmDE6MaS4AyHEPdRVcnS4LxQ-DF9E,28719
69
69
  dstack/_internal/core/backends/base/configurator.py,sha256=OCv8N2oxcxy3In2zS1PKiCJ0a-COZwxGjBz2FYkQnfg,3807
70
70
  dstack/_internal/core/backends/base/models.py,sha256=Ij0osOl-T-ABsKLoVg2eY81DMkwdWkevAnjXj2QnLXI,532
71
- dstack/_internal/core/backends/base/offers.py,sha256=AzAAx5eSTaHv8CbWuGERTHS151x4oJuQn3tr_Bz9HKQ,6282
71
+ dstack/_internal/core/backends/base/offers.py,sha256=2BARohq0sJk0a9K0Z4OuIbpIQNSSq8ZTzAnO8pCxO4M,6228
72
72
  dstack/_internal/core/backends/cudo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
73
  dstack/_internal/core/backends/cudo/api_client.py,sha256=ygq1Gx7ZvwKaifdXtvzDSw4xR4ZH6UWd5J47BjuaGh0,3685
74
74
  dstack/_internal/core/backends/cudo/backend.py,sha256=i13YoAkUfIStc3Yyyt_3YmL30eVrKtrhwnE9_B1iBRI,546
@@ -153,6 +153,11 @@ dstack/_internal/core/backends/vultr/backend.py,sha256=WkPmbUxm3Ysv3_wJjuktQqvvN
153
153
  dstack/_internal/core/backends/vultr/compute.py,sha256=-6Mw7ADW6HaqzK34I3T5RVhreU9W9CIau1hj1Osi5B4,5957
154
154
  dstack/_internal/core/backends/vultr/configurator.py,sha256=YdBeMveKaUDiLESTG3AzpSpQRzevUGpdnCGJx4tUR7g,2190
155
155
  dstack/_internal/core/backends/vultr/models.py,sha256=TkqK_lW6w5k_7wsoFiKDb6NXuTrHL6ypVm59FoyaSFY,928
156
+ dstack/_internal/core/compatibility/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
157
+ dstack/_internal/core/compatibility/fleets.py,sha256=Ndrib4Wtam-az1o2O4unBrSj3MpNwIBfU3Q8uSPNGHc,2674
158
+ dstack/_internal/core/compatibility/gateways.py,sha256=gMAHSyhStn1ij51efEhEpUCZg7y8FPeppNITUctJqyU,1284
159
+ dstack/_internal/core/compatibility/runs.py,sha256=L_vo3vIEJ-8AFyHnHxPlGZPypxVmgyYjO7LNbfoRol0,5647
160
+ dstack/_internal/core/compatibility/volumes.py,sha256=WVsnAh3pWEkytFWp9irV4QPfkXCH-rfAUOcye7XDoDs,1252
156
161
  dstack/_internal/core/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
157
162
  dstack/_internal/core/models/common.py,sha256=XWd79dmFGMrdpTcStH5fVmNXCKE0s7FsIorPL0saQ8w,2138
158
163
  dstack/_internal/core/models/config.py,sha256=JJ7rT7dztzTWCY5TkoyxXxTvG5D4IFYhGe7EzwkLOWQ,581
@@ -160,14 +165,14 @@ dstack/_internal/core/models/configurations.py,sha256=PA_u1gdTBCwKKIiGo7tH95Wv_Z
160
165
  dstack/_internal/core/models/envs.py,sha256=yq84YRFBILOy4x3XnGcTgYpbZ69eFTCQPgBCr9Ndov4,4969
161
166
  dstack/_internal/core/models/fleets.py,sha256=aqDVlZMc71NjLrzwBF3qz-dHzocQT5Qip7QWl8ZbKuA,12263
162
167
  dstack/_internal/core/models/gateways.py,sha256=_O8EWwHWLdgNoWY4P4u71KM-uEr5DDp42LXfyv1qMDI,4054
163
- dstack/_internal/core/models/instances.py,sha256=Qh4QFZYQZxxn2HokafZiQyTiiwjiYuL9atxGlw6K980,5451
168
+ dstack/_internal/core/models/instances.py,sha256=Vwh-D3WB_NBdG_1BPHBEaX60n4MtYksN2gf7zA-icYs,6642
164
169
  dstack/_internal/core/models/logs.py,sha256=Lsmtd_NrnChMjBJahUZpFb1j8Xobix9FHWf1L47FOGs,443
165
170
  dstack/_internal/core/models/metrics.py,sha256=Xb8hCXUL-ncQ3PMsErIUAJTe9gwh5jyrQ4UQoZbibsc,269
166
171
  dstack/_internal/core/models/placement.py,sha256=WJVq5ENJykyRarQzL2EeYQag_9_jV7VSAtR_xoFvPVM,720
167
172
  dstack/_internal/core/models/profiles.py,sha256=SSbslQfKoa6Sg8A_Z26xDNTujGZc51we11G5rlqfBpY,11659
168
173
  dstack/_internal/core/models/projects.py,sha256=H5ZZRiyUEKifpTFAhl45KBi5ly7ooE0WmI329myK360,643
169
174
  dstack/_internal/core/models/resources.py,sha256=rsf6hAhi5bfSb_Z9VcS3UoEG0G8Ohl6ekyrOStLOAqw,14114
170
- dstack/_internal/core/models/runs.py,sha256=rOse2_uXcZL1poRI6OKegzC7N52OogpQ4r_pgByQ7J0,20796
175
+ dstack/_internal/core/models/runs.py,sha256=q7SZxavNuDippPXfJ_Qd4wWK7kyCrCO456toovwOyKc,22346
171
176
  dstack/_internal/core/models/secrets.py,sha256=IQyemsNpSzqOCB-VlVTuc4gyPFmXXO4mhko0Ur0ey3I,221
172
177
  dstack/_internal/core/models/server.py,sha256=Hkc1v2s3KOiwslsWVmhUOAzcSeREoG-HD1SzSX9WUGg,152
173
178
  dstack/_internal/core/models/services.py,sha256=2Hpi7j0Q1shaf_0wd0C0044AJAmuYi-D3qx3PH849oI,3076
@@ -247,12 +252,12 @@ dstack/_internal/proxy/lib/testing/auth.py,sha256=-firWTnis9Eogoi58BURv1S-te4Hf9
247
252
  dstack/_internal/proxy/lib/testing/common.py,sha256=5e2VYboMqjBnUxkvidaWLoQ-uaBGh_hnURb_VJc38q4,1518
248
253
  dstack/_internal/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
249
254
  dstack/_internal/server/alembic.ini,sha256=rTauBJC8Jxlw76KUygW061OFAGV7GhwAStinlaxoYGY,3166
250
- dstack/_internal/server/app.py,sha256=K2NojwUKdktdenrR61I21kXIMX6ars6zB9v6Ea-evzM,11491
255
+ dstack/_internal/server/app.py,sha256=SB2UUorR9OzvWOXBvK4g21kGWZHSu13IdefnnRKrIHQ,11536
251
256
  dstack/_internal/server/db.py,sha256=WjuqmjG3QAZmSMCeUaJ_ynbowlHuNAvYCZO649cTPHc,3210
252
257
  dstack/_internal/server/deps.py,sha256=31e8SU_ogPJWHIDLkgl7cuC_5V91xbJoLyAj17VanfM,670
253
258
  dstack/_internal/server/main.py,sha256=kztKhCYNoHSDyJJQScWfZXE0naNleJOCQULW6dd8SGw,109
254
259
  dstack/_internal/server/models.py,sha256=6F_w9kQ2UWfcp5s39zQtUjF9oNh7mCSULnqmmHC3c8M,29695
255
- dstack/_internal/server/settings.py,sha256=milGlyLfRaaMcnGUEYeKTnOzBLfmdsN2Jsd_aif38aM,4211
260
+ dstack/_internal/server/settings.py,sha256=7f2ur03yIElq2y6XvRtWMSOWWycx1jQMqCjksx0lgro,4432
256
261
  dstack/_internal/server/background/__init__.py,sha256=8kTbhEHCeXTibsOlHY1HwqIO6gGb4q8fUa2fcDrah1c,3893
257
262
  dstack/_internal/server/background/tasks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
258
263
  dstack/_internal/server/background/tasks/common.py,sha256=N7xSXbf2MoBWgbJ1e3AEzYBTf1Gn-pDXYND8Zr_YCJQ,970
@@ -386,7 +391,6 @@ dstack/_internal/server/services/prometheus.py,sha256=xq5G-Q2BJup9lS2F6__0wUVTs-
386
391
  dstack/_internal/server/services/repos.py,sha256=f9ztN7jz_2gvD9hXF5sJwWDVyG2-NHRfjIdSukowPh8,9342
387
392
  dstack/_internal/server/services/resources.py,sha256=VRFOih_cMJdc0c2m9nSGsX8vWAJQV3M6N87aqS_JXfw,699
388
393
  dstack/_internal/server/services/runs.py,sha256=7nj4iQ6CZT3SEW9h3Vb8CBV65MUSSeQfZwgP_J4YlMo,39179
389
- dstack/_internal/server/services/storage.py,sha256=6I0xI_3_RpJNbKZwHjDnjrEwXGdHfiaeb5li15T-M1I,1884
390
394
  dstack/_internal/server/services/users.py,sha256=W-5xL7zsHNjeG7BBK54RWGvIrBOrw-FF0NcG_z9qhoE,7466
391
395
  dstack/_internal/server/services/volumes.py,sha256=vxjFn3ijrvwi9-aXipT0iQgNjgebdwcBRn1mKFL9zAQ,16244
392
396
  dstack/_internal/server/services/backends/__init__.py,sha256=Aqo1GoqhZ_FsLEkCcBrvReKSq6E5w4QbBLrDXfGjiKU,13154
@@ -429,6 +433,10 @@ dstack/_internal/server/services/runner/ssh.py,sha256=H-X0015ZPwYq5tc31ytFF1uNaU
429
433
  dstack/_internal/server/services/services/__init__.py,sha256=HQz72SNN8W9gUQ5INyO_Wd8TR9j3V6qoHFGEDEI920w,10862
430
434
  dstack/_internal/server/services/services/autoscalers.py,sha256=0o_w9La-ex_P3VKG88w_XN3hkLkzryv5l1cH3pkZyAE,4315
431
435
  dstack/_internal/server/services/services/options.py,sha256=BEpZbRY4PKFVkNNWxLtY--QISqBL1_aPPzZYLPpRgvM,2234
436
+ dstack/_internal/server/services/storage/__init__.py,sha256=ZjlLdCQiclM7h_dKJM9HXjMJDKCFOAf3yI4iO6K3HHk,1384
437
+ dstack/_internal/server/services/storage/base.py,sha256=eK6wLny_QmRuTUDXo_WaZ8zdGpqduI0VeCO1n_-Yyxc,589
438
+ dstack/_internal/server/services/storage/gcs.py,sha256=XJrbYCiyd3QvxorOPxgT4cPmtDt-7xjWlNsP-ctJmfk,1094
439
+ dstack/_internal/server/services/storage/s3.py,sha256=CLVW4xhtuxmY9lCU_d6JAhcN5UWFB-HYtJ3qbOaZDvU,1311
432
440
  dstack/_internal/server/statics/00a6e1fb461ed2929fb9.png,sha256=OOtPkMkLAB5vm5pJZKBQWpRmXgSYgvxH8WgaXIbaJZM,427
433
441
  dstack/_internal/server/statics/0cae4d9f0a36034984a7.png,sha256=Z2vD7WPCpPCmSokeW4LcAdFaxYfOTF5UvGYPPhz6ry4,160
434
442
  dstack/_internal/server/statics/391de232cc0e30cae513.png,sha256=9JBIW86hk7re23qp3NFMRTzyQE25dJ8-K-6aK-hwfu4,109
@@ -454,10 +462,10 @@ dstack/_internal/server/statics/e467d7d60aae81ab198b.svg,sha256=_XHc9mfQZgGkcy4h
454
462
  dstack/_internal/server/statics/eb9b344b73818fe2b71a.png,sha256=2H14eOCQRyZhFGJ1Kn2LH1j70kTF1Qop4vH-tiKqyPI,85
455
463
  dstack/_internal/server/statics/f517dd626eb964120de0.png,sha256=4QQuNa8SqmcZ67HK6739OHCyjnAJseU1bkcn454KRQs,159
456
464
  dstack/_internal/server/statics/f958aecddee5d8e3222c.png,sha256=8CoZkVNgRfOAe62X1dU-AZDvwh_nESKaQblEmaX2Xrs,87
457
- dstack/_internal/server/statics/index.html,sha256=0WVNSeT_erId8atQuddi8_KDU9CkPZ-sSgKKYKpT1RM,10468
458
- dstack/_internal/server/statics/main-8f9c66f404e9c7e7e020.css,sha256=RC2sAxRMpIK3myvsxKEhLk4OsxTOt7DgWunCwyn-B34,1336694
459
- dstack/_internal/server/statics/main-b0e80f8e26a168c129e9.js,sha256=3gD82dvSvrkE0XhV35ENT8jfDemHl5uh_PWkS9F6LzE,6527495
460
- dstack/_internal/server/statics/main-b0e80f8e26a168c129e9.js.map,sha256=aajRK86uIUop4KlWzHkMCQ1eHR4-pMe86iw8hXxffaU,8567969
465
+ dstack/_internal/server/statics/index.html,sha256=E5vDpRhmK0lMacdC6HVyDb2wyQm75uRmsQ2EMwu-3iQ,10468
466
+ dstack/_internal/server/statics/main-2066f1f22ddb4557bcde.js,sha256=Fl7-1DvaGJV7YDrLwcdCdyGQHlh9FRVxVFFGWQYSLgs,6640579
467
+ dstack/_internal/server/statics/main-2066f1f22ddb4557bcde.js.map,sha256=Ip-VpaoYT1iHP6tirCf6RADiZ2rOy2AGGOuSUqNEL00,8709013
468
+ dstack/_internal/server/statics/main-f39c418b05fe14772dd8.css,sha256=Rpuq_7-gUuuWprZuHa4xN0Mkk08_65nmPAF4uXzuT8k,1355497
461
469
  dstack/_internal/server/statics/manifest.json,sha256=430w2BoWVmYYVr14lDvUxx-ROPt3VjigzeMqfLeiSCM,340
462
470
  dstack/_internal/server/statics/robots.txt,sha256=kNJLw79pisHhc3OVAimMzKcq3x9WT6sF9IS4xI0crdI,67
463
471
  dstack/_internal/server/statics/assets/android-chrome-144x144.png,sha256=tB3V-95O-VVEoawN5V1XFoMQRSK0I6gthraV8bATGaw,23414
@@ -566,17 +574,17 @@ dstack/api/_public/runs.py,sha256=e_-CqkzHJqeUvO_yXbLnmO8ADZEcgRtagZoL5fr2wmU,28
566
574
  dstack/api/huggingface/__init__.py,sha256=oIrEij3wttLZ1yrywEGvCMd6zswMQrX5pPjrqdSi0UA,2201
567
575
  dstack/api/server/__init__.py,sha256=Zyl1M51tifn4pB150yIsh39N96qUgMjg5XplcElHDxg,6097
568
576
  dstack/api/server/_backends.py,sha256=tSvJ4j-yp-S-4IYo7pKHluDaSsx6Xbwo08Ff6Do85fo,1639
569
- dstack/api/server/_fleets.py,sha256=fc5NQpm1xrQ0L8IerqtnPdNb-F_7AiCfk1EDLR2CZkk,5322
570
- dstack/api/server/_gateways.py,sha256=FAjSi1l6dj1H0mHuFwcCH-QbRxAxVzPI8xE2cmcvWqo,2688
577
+ dstack/api/server/_fleets.py,sha256=6Duz5-SF1HI4qIkgdJr8OikzDosYtavJZOEyMwyDu_8,2882
578
+ dstack/api/server/_gateways.py,sha256=2wyoERBl9R-uWtBI0AiRgLFLtNRlagQxlcgOWHkAlhA,2274
571
579
  dstack/api/server/_group.py,sha256=f9a_YvwZ7s1vDTQhOWHLwm3kO84C5R_zXToD4cxAnvY,432
572
580
  dstack/api/server/_logs.py,sha256=ng8QvFAIaoVOVChTK6Wuu5BeM6y7gAdx30KEYRsn9xA,500
573
581
  dstack/api/server/_metrics.py,sha256=OPb8sLhI_U605sHOPrELgy0_6cNFLJVfpvr-qkEukRM,670
574
582
  dstack/api/server/_projects.py,sha256=g6kNSU6jer8u7Kaut1I0Ft4wRMLBBCQShJf3fOB63hQ,1440
575
583
  dstack/api/server/_repos.py,sha256=bqsKuZWyiNLE8UAdSZrYNtk1J3Gu5MXXnTMIoM9jxpI,1770
576
- dstack/api/server/_runs.py,sha256=-19KLwzv_Gql-Qp7w3gauf7yXHQLQPMI4_mlB_uDTwc,8417
584
+ dstack/api/server/_runs.py,sha256=9XjsjH05Q26iagDwv8PZ4PbzG8KfSL1mEOHkem2FZ74,3086
577
585
  dstack/api/server/_secrets.py,sha256=VqLfrIcmBJtPxNDRkXTG44H5SWoY788YJapScUukvdY,1576
578
586
  dstack/api/server/_users.py,sha256=XzhgGKc5Tsr0-xkz3T6rGyWZ1tO7aYNhLux2eE7dAoY,1738
579
- dstack/api/server/_volumes.py,sha256=xxOt8o5G-bhMh6wSvF4BDFNoqVEhlM4BXQr2KvX0pN0,1937
587
+ dstack/api/server/_volumes.py,sha256=dL_DS0edjdXnW8vIjdDpxHhRMBdHAjjnyUhRFvQd0sE,1523
580
588
  dstack/api/server/utils.py,sha256=i1KX4CNXVeDj9CnytdzsJz0bxjvvfLRTb7xw8oqtEtQ,1040
581
589
  dstack/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
582
590
  dstack/plugins/__init__.py,sha256=buT1pcyORLgVbl89ATkRWJPhvejriVz7sNBjvuZRCRE,403
@@ -586,9 +594,9 @@ dstack/plugins/_utils.py,sha256=FqeWYb7zOrgZkO9Bd8caL5I81_TUEsysIzvxsULrmzk,392
586
594
  dstack/plugins/builtin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
587
595
  dstack/plugins/builtin/rest_plugin/__init__.py,sha256=lgTsq8Z6Km2F2UhPRChVB4vDM5ZpWtdk1iB1aa20ypA,440
588
596
  dstack/plugins/builtin/rest_plugin/_models.py,sha256=9hgVuU6OGSxidar88XhQnNo9izYWeQvVH45ciErv-Es,1910
589
- dstack/plugins/builtin/rest_plugin/_plugin.py,sha256=LbtjnXqd-51pR19Cr5rYxoIyDKjSOG4hIpXmv1Mpfnc,4615
590
- dstack-0.19.12.dist-info/METADATA,sha256=R0LNdikrlXFe0hhYPGnF1nTHOnRtyp0pe5Kmn18W_Bg,20513
591
- dstack-0.19.12.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
592
- dstack-0.19.12.dist-info/entry_points.txt,sha256=GnLrMS8hx3rWAySQjA7tPNhtixV6a-brRkmal1PKoHc,58
593
- dstack-0.19.12.dist-info/licenses/LICENSE.md,sha256=qDABaRGjSKVOib1U8viw2P_96sIK7Puo426784oD9f8,15976
594
- dstack-0.19.12.dist-info/RECORD,,
597
+ dstack/plugins/builtin/rest_plugin/_plugin.py,sha256=iv8TmQh959iEUZjCFTzmGnFW8fHukTVpPmD4iBzOfS4,5361
598
+ dstack-0.19.13.dist-info/METADATA,sha256=NGfazUY-dpac2klfg5O7t1cnoRu93oBi_2uaoFLXaXg,20513
599
+ dstack-0.19.13.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
600
+ dstack-0.19.13.dist-info/entry_points.txt,sha256=GnLrMS8hx3rWAySQjA7tPNhtixV6a-brRkmal1PKoHc,58
601
+ dstack-0.19.13.dist-info/licenses/LICENSE.md,sha256=qDABaRGjSKVOib1U8viw2P_96sIK7Puo426784oD9f8,15976
602
+ dstack-0.19.13.dist-info/RECORD,,