dstack 0.19.4rc3__py3-none-any.whl → 0.19.6rc1__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.
- dstack/_internal/cli/commands/attach.py +22 -20
- dstack/_internal/cli/commands/offer.py +116 -0
- dstack/_internal/cli/main.py +2 -0
- dstack/_internal/cli/services/configurators/base.py +1 -2
- dstack/_internal/cli/services/configurators/fleet.py +43 -20
- dstack/_internal/cli/services/configurators/run.py +3 -3
- dstack/_internal/cli/utils/run.py +43 -38
- dstack/_internal/core/backends/aws/auth.py +1 -2
- dstack/_internal/core/backends/aws/compute.py +24 -9
- dstack/_internal/core/backends/aws/configurator.py +2 -3
- dstack/_internal/core/backends/aws/resources.py +10 -0
- dstack/_internal/core/backends/azure/auth.py +1 -2
- dstack/_internal/core/backends/azure/compute.py +15 -5
- dstack/_internal/core/backends/azure/configurator.py +4 -5
- dstack/_internal/core/backends/azure/resources.py +14 -0
- dstack/_internal/core/backends/base/compute.py +99 -31
- dstack/_internal/core/backends/gcp/auth.py +1 -2
- dstack/_internal/core/backends/gcp/compute.py +58 -14
- dstack/_internal/core/backends/gcp/configurator.py +2 -3
- dstack/_internal/core/backends/gcp/features/tcpx.py +31 -0
- dstack/_internal/core/backends/gcp/resources.py +10 -0
- dstack/_internal/core/backends/nebius/compute.py +6 -2
- dstack/_internal/core/backends/nebius/configurator.py +4 -10
- dstack/_internal/core/backends/nebius/models.py +14 -1
- dstack/_internal/core/backends/nebius/resources.py +91 -10
- dstack/_internal/core/backends/oci/auth.py +1 -2
- dstack/_internal/core/backends/oci/configurator.py +1 -2
- dstack/_internal/core/backends/runpod/compute.py +1 -1
- dstack/_internal/core/errors.py +4 -0
- dstack/_internal/core/models/common.py +2 -14
- dstack/_internal/core/models/configurations.py +24 -2
- dstack/_internal/core/models/envs.py +2 -2
- dstack/_internal/core/models/fleets.py +34 -3
- dstack/_internal/core/models/gateways.py +18 -4
- dstack/_internal/core/models/instances.py +2 -1
- dstack/_internal/core/models/profiles.py +12 -0
- dstack/_internal/core/models/runs.py +6 -0
- dstack/_internal/core/models/secrets.py +1 -1
- dstack/_internal/core/models/volumes.py +17 -1
- dstack/_internal/proxy/gateway/resources/nginx/service.jinja2 +3 -3
- dstack/_internal/proxy/gateway/services/nginx.py +0 -1
- dstack/_internal/proxy/gateway/services/registry.py +0 -1
- dstack/_internal/server/background/tasks/process_instances.py +12 -9
- dstack/_internal/server/background/tasks/process_running_jobs.py +66 -15
- dstack/_internal/server/routers/fleets.py +22 -0
- dstack/_internal/server/routers/runs.py +1 -0
- dstack/_internal/server/schemas/fleets.py +12 -2
- dstack/_internal/server/schemas/runner.py +6 -0
- dstack/_internal/server/schemas/runs.py +3 -0
- dstack/_internal/server/services/docker.py +1 -2
- dstack/_internal/server/services/fleets.py +30 -12
- dstack/_internal/server/services/gateways/__init__.py +1 -0
- dstack/_internal/server/services/instances.py +3 -1
- dstack/_internal/server/services/jobs/__init__.py +1 -2
- dstack/_internal/server/services/jobs/configurators/base.py +17 -8
- dstack/_internal/server/services/locking.py +16 -1
- dstack/_internal/server/services/projects.py +1 -2
- dstack/_internal/server/services/proxy/repo.py +1 -2
- dstack/_internal/server/services/runner/client.py +3 -0
- dstack/_internal/server/services/runs.py +19 -16
- dstack/_internal/server/services/services/__init__.py +1 -2
- dstack/_internal/server/services/volumes.py +29 -2
- dstack/_internal/server/statics/00a6e1fb461ed2929fb9.png +0 -0
- dstack/_internal/server/statics/0cae4d9f0a36034984a7.png +0 -0
- dstack/_internal/server/statics/391de232cc0e30cae513.png +0 -0
- dstack/_internal/server/statics/4e0eead8c1a73689ef9d.svg +1 -0
- dstack/_internal/server/statics/544afa2f63428c2235b0.png +0 -0
- dstack/_internal/server/statics/54a4f50f74c6b9381530.svg +7 -0
- dstack/_internal/server/statics/68dd1360a7d2611e0132.svg +4 -0
- dstack/_internal/server/statics/69544b4c81973b54a66f.png +0 -0
- dstack/_internal/server/statics/77a8b02b17af19e39266.png +0 -0
- dstack/_internal/server/statics/83a93a8871c219104367.svg +9 -0
- dstack/_internal/server/statics/8f28bb8e9999e5e6a48b.svg +4 -0
- dstack/_internal/server/statics/9124086961ab8c366bc4.svg +9 -0
- dstack/_internal/server/statics/9a9ebaeb54b025dbac0a.svg +5 -0
- dstack/_internal/server/statics/a3428392dc534f3b15c4.svg +7 -0
- dstack/_internal/server/statics/ae22625574d69361f72c.png +0 -0
- dstack/_internal/server/statics/assets/android-chrome-144x144.png +0 -0
- dstack/_internal/server/statics/assets/android-chrome-192x192.png +0 -0
- dstack/_internal/server/statics/assets/android-chrome-256x256.png +0 -0
- dstack/_internal/server/statics/assets/android-chrome-36x36.png +0 -0
- dstack/_internal/server/statics/assets/android-chrome-384x384.png +0 -0
- dstack/_internal/server/statics/assets/android-chrome-48x48.png +0 -0
- dstack/_internal/server/statics/assets/android-chrome-512x512.png +0 -0
- dstack/_internal/server/statics/assets/android-chrome-72x72.png +0 -0
- dstack/_internal/server/statics/assets/android-chrome-96x96.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-icon-1024x1024.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-icon-114x114.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-icon-120x120.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-icon-144x144.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-icon-152x152.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-icon-167x167.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-icon-180x180.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-icon-57x57.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-icon-60x60.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-icon-72x72.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-icon-76x76.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-icon-precomposed.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-icon.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-1125x2436.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-1136x640.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-1170x2532.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-1179x2556.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-1242x2208.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-1242x2688.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-1284x2778.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-1290x2796.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-1334x750.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-1488x2266.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-1536x2048.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-1620x2160.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-1640x2160.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-1668x2224.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-1668x2388.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-1792x828.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-2048x1536.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-2048x2732.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-2160x1620.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-2160x1640.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-2208x1242.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-2224x1668.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-2266x1488.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-2388x1668.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-2436x1125.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-2532x1170.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-2556x1179.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-2688x1242.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-2732x2048.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-2778x1284.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-2796x1290.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-640x1136.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-750x1334.png +0 -0
- dstack/_internal/server/statics/assets/apple-touch-startup-image-828x1792.png +0 -0
- dstack/_internal/server/statics/assets/browserconfig.xml +12 -0
- dstack/_internal/server/statics/assets/favicon-16x16.png +0 -0
- dstack/_internal/server/statics/assets/favicon-32x32.png +0 -0
- dstack/_internal/server/statics/assets/favicon-48x48.png +0 -0
- dstack/_internal/server/statics/assets/favicon.ico +0 -0
- dstack/_internal/server/statics/assets/manifest.webmanifest +67 -0
- dstack/_internal/server/statics/assets/mstile-144x144.png +0 -0
- dstack/_internal/server/statics/assets/mstile-150x150.png +0 -0
- dstack/_internal/server/statics/assets/mstile-310x150.png +0 -0
- dstack/_internal/server/statics/assets/mstile-310x310.png +0 -0
- dstack/_internal/server/statics/assets/mstile-70x70.png +0 -0
- dstack/_internal/server/statics/assets/yandex-browser-50x50.png +0 -0
- dstack/_internal/server/statics/assets/yandex-browser-manifest.json +9 -0
- dstack/_internal/server/statics/b7ae68f44193474fc578.png +0 -0
- dstack/_internal/server/statics/d2f008c75b2b5b191f3f.png +0 -0
- dstack/_internal/server/statics/d44c33e1b92e05c379fd.png +0 -0
- dstack/_internal/server/statics/dd43ff0552815179d7ab.png +0 -0
- dstack/_internal/server/statics/dd4e7166c0b9aac197d7.png +0 -0
- dstack/_internal/server/statics/e30b27916930d43d2271.png +0 -0
- dstack/_internal/server/statics/e467d7d60aae81ab198b.svg +6 -0
- dstack/_internal/server/statics/eb9b344b73818fe2b71a.png +0 -0
- dstack/_internal/server/statics/f517dd626eb964120de0.png +0 -0
- dstack/_internal/server/statics/f958aecddee5d8e3222c.png +0 -0
- dstack/_internal/server/statics/index.html +3 -0
- dstack/_internal/server/statics/main-8f9c66f404e9c7e7e020.css +3 -0
- dstack/_internal/server/statics/main-b4f65323f5df007e1664.js +136480 -0
- dstack/_internal/server/statics/main-b4f65323f5df007e1664.js.map +1 -0
- dstack/_internal/server/statics/manifest.json +16 -0
- dstack/_internal/server/statics/robots.txt +3 -0
- dstack/_internal/server/statics/static/media/entraID.d65d1f3e9486a8e56d24fc07b3230885.svg +9 -0
- dstack/_internal/server/statics/static/media/github.1f7102513534c83a9d8d735d2b8c12a2.svg +3 -0
- dstack/_internal/server/statics/static/media/logo.f602feeb138844eda97c8cb641461448.svg +124 -0
- dstack/_internal/server/statics/static/media/okta.12f178e6873a1100965f2a4dbd18fcec.svg +2 -0
- dstack/_internal/server/statics/static/media/theme.3994c817bb7dda191c1c9640dee0bf42.svg +3 -0
- dstack/_internal/server/testing/common.py +10 -0
- dstack/_internal/utils/tags.py +42 -0
- dstack/api/server/__init__.py +3 -1
- dstack/api/server/_fleets.py +52 -9
- dstack/api/server/_gateways.py +17 -2
- dstack/api/server/_runs.py +34 -11
- dstack/api/server/_volumes.py +2 -3
- dstack/version.py +1 -1
- {dstack-0.19.4rc3.dist-info → dstack-0.19.6rc1.dist-info}/METADATA +2 -2
- {dstack-0.19.4rc3.dist-info → dstack-0.19.6rc1.dist-info}/RECORD +180 -76
- dstack-0.19.4rc3.data/data/dstack/_internal/proxy/gateway/resources/nginx/00-log-format.conf +0 -1
- dstack-0.19.4rc3.data/data/dstack/_internal/proxy/gateway/resources/nginx/entrypoint.jinja2 +0 -27
- dstack-0.19.4rc3.data/data/dstack/_internal/proxy/gateway/resources/nginx/service.jinja2 +0 -88
- {dstack-0.19.4rc3.dist-info → dstack-0.19.6rc1.dist-info}/WHEEL +0 -0
- {dstack-0.19.4rc3.dist-info → dstack-0.19.6rc1.dist-info}/entry_points.txt +0 -0
- {dstack-0.19.4rc3.dist-info → dstack-0.19.6rc1.dist-info}/licenses/LICENSE.md +0 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"short_name": "dstack",
|
|
3
|
+
"name": "dstack",
|
|
4
|
+
"icons": [
|
|
5
|
+
{
|
|
6
|
+
"src": "favicon.ico",
|
|
7
|
+
"sizes": "64x64 32x32 24x24 16x16",
|
|
8
|
+
"type": "image/x-icon"
|
|
9
|
+
}
|
|
10
|
+
],
|
|
11
|
+
"start_url": ".",
|
|
12
|
+
"display": "standalone",
|
|
13
|
+
"theme_color": "#000000",
|
|
14
|
+
"background_color": "#ffffff",
|
|
15
|
+
"permissions": ["clipboardWrite", "clipboardRead"]
|
|
16
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg id="uuid-f8d4d392-7c12-4bd9-baff-66fbf7814b91" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 18 18">
|
|
3
|
+
<path d="m3.802,14.032c.388.242,1.033.511,1.715.511.621,0,1.198-.18,1.676-.487,0,0,.001,0,.002-.001l1.805-1.128v4.073c-.286,0-.574-.078-.824-.234l-4.374-2.734Z" fill="#225086"/>
|
|
4
|
+
<path d="m7.853,1.507L.353,9.967c-.579.654-.428,1.642.323,2.111,0,0,2.776,1.735,3.126,1.954.388.242,1.033.511,1.715.511.621,0,1.198-.18,1.676-.487,0,0,.001,0,.002-.001l1.805-1.128-4.364-2.728,4.365-4.924V1s0,0,0,0c-.424,0-.847.169-1.147.507Z" fill="#6df"/>
|
|
5
|
+
<polygon points="4.636 10.199 4.688 10.231 9 12.927 9.001 12.927 9.001 12.927 9.001 5.276 9 5.275 4.636 10.199" fill="#cbf8ff"/>
|
|
6
|
+
<path d="m17.324,12.078c.751-.469.902-1.457.323-2.111l-4.921-5.551c-.397-.185-.842-.291-1.313-.291-.925,0-1.752.399-2.302,1.026l-.109.123h0s4.364,4.924,4.364,4.924h0s0,0,0,0l-4.365,2.728v4.073c.287,0,.573-.078.823-.234l7.5-4.688Z" fill="#074793"/>
|
|
7
|
+
<path d="m9.001,1v4.275s.109-.123.109-.123c.55-.627,1.377-1.026,2.302-1.026.472,0,.916.107,1.313.291l-2.579-2.909c-.299-.338-.723-.507-1.146-.507Z" fill="#0294e4"/>
|
|
8
|
+
<polygon points="13.365 10.199 13.365 10.199 13.365 10.199 9.001 5.276 9.001 12.926 13.365 10.199" fill="#96bcc2"/>
|
|
9
|
+
</svg>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M7 0.34375C6.125 0.34375 5.27083 0.510417 4.4375 0.84375C3.625 1.17708 2.90625 1.65625 2.28125 2.28125C1.65625 2.90625 1.17708 3.63542 0.84375 4.46875C0.510417 5.28125 0.34375 6.125 0.34375 7C0.34375 8.45833 0.760417 9.77083 1.59375 10.9375C2.44792 12.0833 3.55208 12.8854 4.90625 13.3438C5.05208 13.3646 5.15625 13.3333 5.21875 13.25C5.30208 13.1875 5.34375 13.1042 5.34375 13V11.875C4.57292 12.0417 3.96875 11.9375 3.53125 11.5625C3.30208 11.3958 3.15625 11.1979 3.09375 10.9688C3.01042 10.7396 2.89583 10.5417 2.75 10.375C2.66667 10.25 2.57292 10.1562 2.46875 10.0938L2.34375 10C2.17708 9.875 2.09375 9.78125 2.09375 9.71875C2.09375 9.65625 2.14583 9.625 2.25 9.625L2.40625 9.59375C2.67708 9.61458 2.92708 9.73958 3.15625 9.96875C3.28125 10.0729 3.36458 10.1771 3.40625 10.2812C3.67708 10.7188 4.03125 10.9583 4.46875 11C4.73958 11.0208 5.04167 10.9688 5.375 10.8438C5.41667 10.4479 5.55208 10.1458 5.78125 9.9375C4.86458 9.83333 4.17708 9.58333 3.71875 9.1875C3.07292 8.64583 2.75 7.80208 2.75 6.65625C2.75 5.96875 2.97917 5.375 3.4375 4.875C3.35417 4.6875 3.3125 4.47917 3.3125 4.25C3.27083 3.875 3.33333 3.48958 3.5 3.09375H3.6875C3.85417 3.09375 4.05208 3.13542 4.28125 3.21875C4.61458 3.34375 4.96875 3.53125 5.34375 3.78125C5.86458 3.63542 6.41667 3.5625 7 3.5625C7.58333 3.5625 8.13542 3.63542 8.65625 3.78125C9.19792 3.42708 9.66667 3.20833 10.0625 3.125C10.2708 3.08333 10.4167 3.07292 10.5 3.09375C10.6667 3.48958 10.7292 3.875 10.6875 4.25C10.6875 4.47917 10.6458 4.6875 10.5625 4.875C11.0208 5.375 11.25 5.96875 11.25 6.65625C11.25 7.82292 10.9271 8.66667 10.2812 9.1875C9.80208 9.58333 9.11458 9.83333 8.21875 9.9375C8.51042 10.2083 8.65625 10.625 8.65625 11.1875V13C8.65625 13.1042 8.6875 13.1875 8.75 13.25C8.83333 13.3333 8.95833 13.3646 9.125 13.3438C10.4583 12.8854 11.5417 12.0833 12.375 10.9375C13.2292 9.77083 13.6562 8.45833 13.6562 7C13.6562 6.125 13.4896 5.28125 13.1562 4.46875C12.8229 3.63542 12.3438 2.90625 11.7188 2.28125C11.0938 1.65625 10.3646 1.17708 9.53125 0.84375C8.71875 0.510417 7.875 0.34375 7 0.34375Z" fill="currentColor"/>
|
|
3
|
+
</svg>
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
<svg width="88" height="21" viewBox="0 0 88 21" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
4
|
+
<path d="M20.8901 13.3026C20.8901 12.2132 21.1145 11.2484 21.5631 10.4084C22.025 9.56829 22.6452 8.91855 23.4237 8.45913C24.2154 7.9866 25.093 7.75033 26.0562 7.75033C26.7688 7.75033 27.4682 7.90784 28.1544 8.22287C28.8537 8.52477 29.4079 8.93167 29.817 9.44359V4.2063H32.0933V18.7762H29.817V17.142C29.4475 17.6671 28.9329 18.1002 28.2731 18.4415C27.6265 18.7828 26.881 18.9534 26.0364 18.9534C25.0864 18.9534 24.2154 18.7171 23.4237 18.2446C22.6452 17.7589 22.025 17.0895 21.5631 16.2363C21.1145 15.37 20.8901 14.3921 20.8901 13.3026ZM29.817 13.342C29.817 12.5938 29.6587 11.9441 29.342 11.3928C29.0385 10.8415 28.636 10.4215 28.1346 10.1327C27.6331 9.84393 27.0921 9.69955 26.5115 9.69955C25.9309 9.69955 25.3899 9.84393 24.8884 10.1327C24.387 10.4084 23.9779 10.8218 23.6612 11.3731C23.3577 11.9113 23.206 12.5545 23.206 13.3026C23.206 14.0508 23.3577 14.7071 23.6612 15.2716C23.9779 15.836 24.387 16.2691 24.8884 16.571C25.4031 16.8598 25.9441 17.0042 26.5115 17.0042C27.0921 17.0042 27.6331 16.8598 28.1346 16.571C28.636 16.2823 29.0385 15.8622 29.342 15.3109C29.6587 14.7465 29.817 14.0902 29.817 13.342Z" fill="#fff"/>
|
|
5
|
+
<path d="M39.0157 18.9534C38.158 18.9534 37.3861 18.8025 36.6999 18.5006C36.0269 18.1855 35.4925 17.7655 35.0966 17.2405C34.7007 16.7023 34.4896 16.1051 34.4632 15.4488H36.7988C36.8384 15.9082 37.0562 16.2954 37.452 16.6104C37.8611 16.9123 38.3691 17.0633 38.9761 17.0633C39.6095 17.0633 40.0978 16.9451 40.4409 16.7089C40.7971 16.4595 40.9753 16.1444 40.9753 15.7638C40.9753 15.3569 40.7773 15.055 40.3815 14.8581C39.9988 14.6612 39.3852 14.4446 38.5407 14.2083C37.7225 13.9852 37.0562 13.7686 36.5415 13.5586C36.0269 13.3486 35.5783 13.027 35.1956 12.5938C34.8261 12.1607 34.6414 11.5897 34.6414 10.8809C34.6414 10.3033 34.8129 9.7783 35.156 9.30576C35.4991 8.8201 35.9873 8.43945 36.6207 8.1638C37.2673 7.88815 38.0063 7.75033 38.8376 7.75033C40.078 7.75033 41.0742 8.06535 41.8264 8.6954C42.5917 9.31233 43.0008 10.159 43.0536 11.2353H40.7971C40.7575 10.7496 40.5596 10.3624 40.2033 10.0736C39.847 9.78487 39.3654 9.64048 38.7584 9.64048C38.1646 9.64048 37.7094 9.75205 37.3927 9.97519C37.076 10.1983 36.9176 10.4937 36.9176 10.8612C36.9176 11.15 37.0232 11.3928 37.2343 11.5897C37.4454 11.7866 37.7028 11.9441 38.0063 12.0622C38.3098 12.1672 38.7584 12.3051 39.3522 12.4757C40.144 12.6857 40.7905 12.9023 41.292 13.1254C41.8066 13.3355 42.2487 13.6505 42.6181 14.0705C42.9876 14.4905 43.179 15.0484 43.1922 15.7441C43.1922 16.361 43.0206 16.9123 42.6775 17.398C42.3344 17.8836 41.8462 18.2643 41.2128 18.5399C40.5926 18.8156 39.8602 18.9534 39.0157 18.9534Z" fill="#fff"/>
|
|
6
|
+
<path d="M48.2628 9.75861V15.7638C48.2628 16.1707 48.3552 16.466 48.5399 16.6498C48.7379 16.8204 49.0678 16.9057 49.5296 16.9057H50.9152V18.7762H49.1338C48.1177 18.7762 47.3391 18.5399 46.7981 18.0674C46.2571 17.5949 45.9866 16.827 45.9866 15.7638V9.75861H44.7V7.92753H45.9866V5.23013H48.2628V7.92753H50.9152V9.75861H48.2628Z" fill="#fff"/>
|
|
7
|
+
<path d="M52.2427 13.3026C52.2427 12.2132 52.4671 11.2484 52.9157 10.4084C53.3776 9.56829 53.9977 8.91855 54.7763 8.45913C55.568 7.9866 56.4389 7.75033 57.389 7.75033C58.2468 7.75033 58.9923 7.92097 59.6257 8.26224C60.2723 8.5904 60.7869 9.00387 61.1696 9.50265V7.92753H63.4458V18.7762H61.1696V17.1617C60.7869 17.6736 60.2657 18.1002 59.6059 18.4415C58.9461 18.7828 58.194 18.9534 57.3494 18.9534C56.4126 18.9534 55.5548 18.7171 54.7763 18.2446C53.9977 17.7589 53.3776 17.0895 52.9157 16.2363C52.4671 15.37 52.2427 14.3921 52.2427 13.3026ZM61.1696 13.342C61.1696 12.5938 61.0112 11.9441 60.6945 11.3928C60.391 10.8415 59.9886 10.4215 59.4871 10.1327C58.9857 9.84393 58.4447 9.69955 57.8641 9.69955C57.2835 9.69955 56.7424 9.84393 56.241 10.1327C55.7396 10.4084 55.3305 10.8218 55.0138 11.3731C54.7103 11.9113 54.5586 12.5545 54.5586 13.3026C54.5586 14.0508 54.7103 14.7071 55.0138 15.2716C55.3305 15.836 55.7396 16.2691 56.241 16.571C56.7556 16.8598 57.2967 17.0042 57.8641 17.0042C58.4447 17.0042 58.9857 16.8598 59.4871 16.571C59.9886 16.2823 60.391 15.8622 60.6945 15.3109C61.0112 14.7465 61.1696 14.0902 61.1696 13.342Z" fill="#fff"/>
|
|
8
|
+
<path d="M65.6575 13.342C65.6575 12.2263 65.8818 11.2484 66.3304 10.4084C66.7923 9.55516 67.4257 8.89886 68.2306 8.43945C69.0355 7.98004 69.9592 7.75033 71.0017 7.75033C72.3213 7.75033 73.4099 8.06535 74.2676 8.6954C75.1385 9.31233 75.7258 10.1983 76.0293 11.3534H73.5947C73.3967 10.8153 73.08 10.3952 72.6446 10.0933C72.2091 9.79143 71.6615 9.64048 71.0017 9.64048C70.078 9.64048 69.339 9.96863 68.7848 10.6249C68.2438 11.2681 67.9733 12.1738 67.9733 13.342C67.9733 14.5102 68.2438 15.4225 68.7848 16.0788C69.339 16.7351 70.078 17.0633 71.0017 17.0633C72.3081 17.0633 73.1724 16.4923 73.5947 15.3503H76.0293C75.7126 16.4529 75.1187 17.3323 74.2478 17.9886C73.3769 18.6318 72.2949 18.9534 71.0017 18.9534C69.9592 18.9534 69.0355 18.7237 68.2306 18.2643C67.4257 17.7917 66.7923 17.1354 66.3304 16.2954C65.8818 15.4422 65.6575 14.4577 65.6575 13.342Z" fill="#fff"/>
|
|
9
|
+
<path d="M82.593 13.3617L87.6205 18.7762H84.5723L80.5344 14.1099V18.7762H78.278V4.2063H80.5344V12.6726L84.4931 7.92753H87.6205L82.593 13.3617Z" fill="#fff"/>
|
|
10
|
+
<path d="M4.20035 8.6862C2.30151 9.02799 0.919922 10.6805 0.919922 12.6098L0.919922 20.0867H3.83327L3.83327 11.96C3.83327 10.6567 4.06327 9.58334 4.75327 8.58667L4.20035 8.6862Z" fill="url(#paint0_linear_8927_5693)"/>
|
|
11
|
+
<path d="M15.8861 11.4005C17.7849 11.0587 19.1665 9.40621 19.1665 7.47685L19.1665 -3.24249e-05H16.2532L16.2532 8.12666C16.2532 9.42999 16.0232 10.5033 15.3332 11.5L15.8861 11.4005Z" fill="url(#paint1_linear_8927_5693)"/>
|
|
12
|
+
<path d="M18.0932 2.45334C18.0932 2.70736 17.8873 2.91328 17.6333 2.91328C17.3793 2.91328 17.1733 2.70736 17.1733 2.45334C17.1733 2.19933 17.3793 1.99341 17.6333 1.99341C17.8873 1.99341 18.0932 2.19933 18.0932 2.45334Z" fill="#CF07D3"/>
|
|
13
|
+
<path d="M2.75972 17.6333C2.75972 17.8873 2.5538 18.0932 2.29978 18.0932C2.04576 18.0932 1.83984 17.8873 1.83984 17.6333C1.83984 17.3793 2.04576 17.1733 2.29978 17.1733C2.5538 17.1733 2.75972 17.3793 2.75972 17.6333Z" fill="#CF07D3"/>
|
|
14
|
+
<path d="M13.9359 2.9297C13.7761 2.7323 13.8065 2.44268 14.0039 2.28282C14.2013 2.12296 14.491 2.1534 14.6508 2.35081L15.9565 3.96325C16.0098 4.02905 15.9997 4.12559 15.9339 4.17888L15.4573 4.56481C15.3915 4.61809 15.2949 4.60795 15.2417 4.54214L13.9359 2.9297Z" fill="url(#paint2_linear_8927_5693)"/>
|
|
15
|
+
<path d="M15.4349 4.78052C15.3816 4.71472 15.3917 4.61818 15.4575 4.56489L15.9341 4.17897C15.9999 4.12568 16.0965 4.13583 16.1497 4.20163L17.3749 5.71459C17.5348 5.912 17.5043 6.20162 17.3069 6.36148C17.1095 6.52133 16.8199 6.49089 16.66 6.29349L15.4349 4.78052Z" fill="url(#paint3_linear_8927_5693)"/>
|
|
16
|
+
<path fill-rule="evenodd" clip-rule="evenodd" d="M8.58651 4.94307C8.58651 3.01372 9.96809 1.36124 11.8669 1.01945L12.4199 0.919922C11.7299 1.91659 11.4998 2.98993 11.4998 4.29327V11.3466H8.58651V4.94307ZM11.4998 15.1435C11.4998 17.0728 10.1183 18.7253 8.21942 19.0671L7.6665 19.1666C8.35651 18.17 8.58651 17.0966 8.58651 15.7933V11.3466H11.4998V15.1435Z" fill="url(#paint4_linear_8927_5693)"/>
|
|
17
|
+
<path d="M2.43593 14.4297C2.27607 14.2323 2.30651 13.9427 2.50392 13.7828C2.70133 13.623 2.99095 13.6534 3.15081 13.8508L4.45654 15.4633C4.50982 15.5291 4.49968 15.6256 4.43387 15.6789L3.95729 16.0648C3.89149 16.1181 3.79495 16.1079 3.74166 16.0421L2.43593 14.4297Z" fill="url(#paint5_linear_8927_5693)"/>
|
|
18
|
+
<path d="M3.93486 16.2805C3.88158 16.2147 3.89172 16.1182 3.95752 16.0649L4.43411 15.679C4.49991 15.6257 4.59645 15.6358 4.64974 15.7016L5.87491 17.2146C6.03477 17.412 6.00433 17.7016 5.80692 17.8615C5.60951 18.0213 5.31989 17.9909 5.16004 17.7935L3.93486 16.2805Z" fill="url(#paint6_linear_8927_5693)"/>
|
|
19
|
+
<path d="M3.35634 11.0564C3.19648 10.859 3.22692 10.5694 3.42433 10.4095C3.62174 10.2497 3.91136 10.2801 4.07122 10.4775L6.51342 13.4934C6.5667 13.5592 6.55656 13.6557 6.49076 13.709L6.01417 14.0949C5.94837 14.1482 5.85183 14.1381 5.79854 14.0723L3.35634 11.0564Z" fill="url(#paint7_linear_8927_5693)"/>
|
|
20
|
+
<path d="M5.99199 14.3113C5.9387 14.2455 5.94885 14.1489 6.01465 14.0957L6.49124 13.7097C6.55704 13.6564 6.65358 13.6666 6.70686 13.7324L9.01439 16.582C9.17425 16.7794 9.14381 17.069 8.9464 17.2288C8.749 17.3887 8.45938 17.3583 8.29952 17.1608L5.99199 14.3113Z" fill="url(#paint8_linear_8927_5693)"/>
|
|
21
|
+
<path d="M11.4005 15.8863C11.0587 17.7852 9.40621 19.1667 7.47685 19.1667H-3.14713e-05V16.2534H8.12666C9.42999 16.2534 10.5033 16.0234 11.5 15.3334L11.4005 15.8863Z" fill="url(#paint9_linear_8927_5693)"/>
|
|
22
|
+
<path d="M11.0228 3.54298C10.863 3.34558 10.8934 3.05596 11.0908 2.8961C11.2882 2.73624 11.5779 2.76668 11.7377 2.96409L14.1799 5.97996C14.2332 6.04576 14.2231 6.1423 14.1573 6.19559L13.6807 6.58152C13.6149 6.6348 13.5183 6.62466 13.465 6.55885L11.0228 3.54298Z" fill="url(#paint10_linear_8927_5693)"/>
|
|
23
|
+
<path d="M13.6585 6.79786C13.6052 6.73205 13.6154 6.63551 13.6812 6.58223L14.1577 6.1963C14.2235 6.14301 14.3201 6.15316 14.3734 6.21896L16.6809 9.06852C16.8408 9.26593 16.8103 9.55555 16.6129 9.71541C16.4155 9.87526 16.1259 9.84482 15.966 9.64742L13.6585 6.79786Z" fill="url(#paint11_linear_8927_5693)"/>
|
|
24
|
+
<path d="M6.26943 10.4431C6.10957 10.2457 6.14001 9.9561 6.33742 9.79625C6.53483 9.63639 6.82445 9.66683 6.9843 9.86424L8.29003 11.4767C8.34332 11.5425 8.33317 11.639 8.26737 11.6923L7.79079 12.0782C7.72498 12.1315 7.62844 12.1214 7.57516 12.0556L6.26943 10.4431Z" fill="url(#paint12_linear_8927_5693)"/>
|
|
25
|
+
<path d="M7.76836 12.294C7.71507 12.2281 7.72522 12.1316 7.79102 12.0783L8.2676 11.6924C8.33341 11.6391 8.42995 11.6493 8.48323 11.7151L9.70841 13.228C9.86826 13.4254 9.83782 13.715 9.64042 13.8749C9.44301 14.0348 9.15339 14.0043 8.99353 13.8069L7.76836 12.294Z" fill="url(#paint13_linear_8927_5693)"/>
|
|
26
|
+
<path d="M8.68644 4.20035C9.02823 2.30151 10.6807 0.919922 12.6101 0.919922H20.0869V3.83326H11.9603C10.6569 3.83326 9.58358 4.06326 8.58691 4.75327L8.68644 4.20035Z" fill="url(#paint14_linear_8927_5693)"/>
|
|
27
|
+
<path d="M9.9496 6.91628C9.78975 6.71887 9.82019 6.42925 10.0176 6.26939C10.215 6.10953 10.5046 6.13997 10.6645 6.33738L11.9702 7.94982C12.0235 8.01562 12.0133 8.11216 11.9475 8.16545L11.471 8.55138C11.4052 8.60467 11.3086 8.59452 11.2553 8.52872L9.9496 6.91628Z" fill="url(#paint15_linear_8927_5693)"/>
|
|
28
|
+
<path d="M11.4485 8.76709C11.3952 8.70129 11.4054 8.60475 11.4712 8.55147L11.9478 8.16554C12.0136 8.11225 12.1101 8.1224 12.1634 8.1882L13.3886 9.70116C13.5484 9.89857 13.518 10.1882 13.3206 10.348C13.1232 10.5079 12.8336 10.4775 12.6737 10.2801L11.4485 8.76709Z" fill="url(#paint16_linear_8927_5693)"/>
|
|
29
|
+
<path d="M10.4267 10.1198C10.4267 10.3739 10.2208 10.5798 9.96677 10.5798C9.71276 10.5798 9.50684 10.3739 9.50684 10.1198C9.50684 9.86583 9.71276 9.65991 9.96677 9.65991C10.2208 9.65991 10.4267 9.86583 10.4267 10.1198Z" fill="#22BADB"/>
|
|
30
|
+
<path fill-rule="evenodd" clip-rule="evenodd" d="M15.1434 11.4999C17.0727 11.4999 18.7252 10.1183 19.067 8.2195L19.1665 7.66658C18.1698 8.35658 17.0965 8.58658 15.7932 8.58658L8.73981 8.58658V11.4999L15.1434 11.4999ZM4.94293 8.58658C3.01357 8.58658 1.36109 9.96817 1.0193 11.867L0.919777 12.4199C1.91645 11.7299 2.98978 11.4999 4.29312 11.4999L8.7398 11.4999V8.58658L4.94293 8.58658Z" fill="url(#paint17_linear_8927_5693)"/>
|
|
31
|
+
<defs>
|
|
32
|
+
<linearGradient id="paint0_linear_8927_5693" x1="1.60992" y1="20.93" x2="1.68659" y2="8.58667" gradientUnits="userSpaceOnUse">
|
|
33
|
+
<stop offset="0.0428911" stop-color="#B019E6"/>
|
|
34
|
+
<stop offset="0.195594" stop-color="#9C2B9A"/>
|
|
35
|
+
<stop offset="0.430184" stop-color="#DC46D3"/>
|
|
36
|
+
<stop offset="0.627832" stop-color="#BD23CB"/>
|
|
37
|
+
<stop offset="1" stop-color="#570995"/>
|
|
38
|
+
</linearGradient>
|
|
39
|
+
<linearGradient id="paint1_linear_8927_5693" x1="17.7865" y1="10.7333" x2="17.7098" y2="-0.766704" gradientUnits="userSpaceOnUse">
|
|
40
|
+
<stop stop-color="#F139D2"/>
|
|
41
|
+
<stop offset="0.303464" stop-color="#D143B9"/>
|
|
42
|
+
<stop offset="0.501827" stop-color="#8226C9"/>
|
|
43
|
+
<stop offset="1" stop-color="#BF15DB"/>
|
|
44
|
+
</linearGradient>
|
|
45
|
+
<linearGradient id="paint2_linear_8927_5693" x1="13.8372" y1="2.7703" x2="15.6492" y2="4.44275" gradientUnits="userSpaceOnUse">
|
|
46
|
+
<stop stop-color="#5991D5"/>
|
|
47
|
+
<stop offset="1" stop-color="#11519E"/>
|
|
48
|
+
</linearGradient>
|
|
49
|
+
<linearGradient id="paint3_linear_8927_5693" x1="15.8697" y1="5.36633" x2="17.1729" y2="5.13636" gradientUnits="userSpaceOnUse">
|
|
50
|
+
<stop stop-color="#C050E8"/>
|
|
51
|
+
<stop offset="1" stop-color="#8022A2"/>
|
|
52
|
+
</linearGradient>
|
|
53
|
+
<linearGradient id="paint4_linear_8927_5693" x1="10.0432" y1="0.919922" x2="10.0432" y2="19.1666" gradientUnits="userSpaceOnUse">
|
|
54
|
+
<stop stop-color="#3CBACB" stop-opacity="0.87"/>
|
|
55
|
+
<stop offset="0.154499" stop-color="#0886BC"/>
|
|
56
|
+
<stop offset="0.334093" stop-color="#0CBCC7"/>
|
|
57
|
+
<stop offset="0.60681" stop-color="#14D6F0"/>
|
|
58
|
+
<stop offset="0.786865" stop-color="#0CA0C0"/>
|
|
59
|
+
<stop offset="1" stop-color="#0665BC"/>
|
|
60
|
+
</linearGradient>
|
|
61
|
+
<linearGradient id="paint5_linear_8927_5693" x1="4.59948" y1="15.6397" x2="2.10951" y2="14.7463" gradientUnits="userSpaceOnUse">
|
|
62
|
+
<stop stop-color="#C050E8"/>
|
|
63
|
+
<stop offset="1" stop-color="#8022A2"/>
|
|
64
|
+
</linearGradient>
|
|
65
|
+
<linearGradient id="paint6_linear_8927_5693" x1="3.83314" y1="16.5597" x2="6.13282" y2="17.3263" gradientUnits="userSpaceOnUse">
|
|
66
|
+
<stop stop-color="#F77FF5"/>
|
|
67
|
+
<stop offset="1" stop-color="#A22CA0"/>
|
|
68
|
+
</linearGradient>
|
|
69
|
+
<linearGradient id="paint7_linear_8927_5693" x1="6.82296" y1="13.2631" x2="3.68007" y2="11.8832" gradientUnits="userSpaceOnUse">
|
|
70
|
+
<stop stop-color="#5991D5"/>
|
|
71
|
+
<stop offset="1" stop-color="#11519E"/>
|
|
72
|
+
</linearGradient>
|
|
73
|
+
<linearGradient id="paint8_linear_8927_5693" x1="5.59689" y1="14.1067" x2="9.35304" y2="16.943" gradientUnits="userSpaceOnUse">
|
|
74
|
+
<stop stop-color="#77D3FB"/>
|
|
75
|
+
<stop offset="1" stop-color="#0A69C1"/>
|
|
76
|
+
</linearGradient>
|
|
77
|
+
<linearGradient id="paint9_linear_8927_5693" x1="11.5" y1="18.4767" x2="-0.306701" y2="18.4767" gradientUnits="userSpaceOnUse">
|
|
78
|
+
<stop stop-color="#055BAB" stop-opacity="0.49"/>
|
|
79
|
+
<stop offset="0.196658" stop-color="#0794C0" stop-opacity="0.88"/>
|
|
80
|
+
<stop offset="0.371414" stop-color="#05B4D0" stop-opacity="0.96"/>
|
|
81
|
+
<stop offset="0.536277" stop-color="#30C2D8" stop-opacity="0.86"/>
|
|
82
|
+
<stop offset="0.806654" stop-color="#1FBFD0" stop-opacity="0.8"/>
|
|
83
|
+
<stop offset="1" stop-color="#0CC6D9" stop-opacity="0.87"/>
|
|
84
|
+
</linearGradient>
|
|
85
|
+
<linearGradient id="paint10_linear_8927_5693" x1="14.4895" y1="5.74963" x2="11.3466" y2="4.36982" gradientUnits="userSpaceOnUse">
|
|
86
|
+
<stop stop-color="#5991D5"/>
|
|
87
|
+
<stop offset="1" stop-color="#11519E"/>
|
|
88
|
+
</linearGradient>
|
|
89
|
+
<linearGradient id="paint11_linear_8927_5693" x1="13.2634" y1="6.5933" x2="17.0195" y2="9.42956" gradientUnits="userSpaceOnUse">
|
|
90
|
+
<stop stop-color="#77D3FB"/>
|
|
91
|
+
<stop offset="1" stop-color="#0A69C1"/>
|
|
92
|
+
</linearGradient>
|
|
93
|
+
<linearGradient id="paint12_linear_8927_5693" x1="8.63435" y1="11.2893" x2="6.80081" y2="10.0598" gradientUnits="userSpaceOnUse">
|
|
94
|
+
<stop stop-color="#5991D5"/>
|
|
95
|
+
<stop offset="1" stop-color="#11519E"/>
|
|
96
|
+
</linearGradient>
|
|
97
|
+
<linearGradient id="paint13_linear_8927_5693" x1="7.66663" y1="12.5731" x2="9.96632" y2="13.3397" gradientUnits="userSpaceOnUse">
|
|
98
|
+
<stop stop-color="#FD7EFC"/>
|
|
99
|
+
<stop offset="1" stop-color="#3D57B5"/>
|
|
100
|
+
</linearGradient>
|
|
101
|
+
<linearGradient id="paint14_linear_8927_5693" x1="8.58691" y1="2.75993" x2="21.1603" y2="2.75993" gradientUnits="userSpaceOnUse">
|
|
102
|
+
<stop stop-color="#0397C6" stop-opacity="0.73"/>
|
|
103
|
+
<stop offset="0.304027" stop-color="#31D0E1" stop-opacity="0.87"/>
|
|
104
|
+
<stop offset="0.526955" stop-color="#43E1ED" stop-opacity="0.82"/>
|
|
105
|
+
<stop offset="0.783942" stop-color="#1DB0C8" stop-opacity="0.71"/>
|
|
106
|
+
<stop offset="1" stop-color="#098A9F"/>
|
|
107
|
+
</linearGradient>
|
|
108
|
+
<linearGradient id="paint15_linear_8927_5693" x1="12.1132" y1="8.12632" x2="9.62318" y2="7.23284" gradientUnits="userSpaceOnUse">
|
|
109
|
+
<stop stop-color="#C050E8"/>
|
|
110
|
+
<stop offset="1" stop-color="#8022A2"/>
|
|
111
|
+
</linearGradient>
|
|
112
|
+
<linearGradient id="paint16_linear_8927_5693" x1="11.3468" y1="9.04628" x2="13.6465" y2="9.81283" gradientUnits="userSpaceOnUse">
|
|
113
|
+
<stop stop-color="#C77FF7"/>
|
|
114
|
+
<stop offset="1" stop-color="#A22CA0" stop-opacity="0.25"/>
|
|
115
|
+
</linearGradient>
|
|
116
|
+
<linearGradient id="paint17_linear_8927_5693" x1="19.1665" y1="10.0432" x2="0.919777" y2="10.0432" gradientUnits="userSpaceOnUse">
|
|
117
|
+
<stop stop-color="#A724A5"/>
|
|
118
|
+
<stop offset="0.240046" stop-color="#E344E3" stop-opacity="0.76"/>
|
|
119
|
+
<stop offset="0.651048" stop-color="#FE7CE6" stop-opacity="0.76"/>
|
|
120
|
+
<stop offset="0.756859" stop-color="#EE6FEE" stop-opacity="0.93"/>
|
|
121
|
+
<stop offset="1" stop-color="#BE0595" stop-opacity="0.9"/>
|
|
122
|
+
</linearGradient>
|
|
123
|
+
</defs>
|
|
124
|
+
</svg>
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
<svg width="14px" height="14px" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" fill="none"><path fill="currentColor" d="M8 1C4.143 1 1 4.12 1 8s3.121 7 7 7 7-3.121 7-7-3.143-7-7-7zm0 10.5c-1.94 0-3.5-1.56-3.5-3.5S6.06 4.5 8 4.5s3.5 1.56 3.5 3.5-1.56 3.5-3.5 3.5z"/></svg>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
|
|
2
|
+
<path d="M12.8166 9.79921C12.8417 9.75608 12.7942 9.70771 12.7497 9.73041C11.9008 10.164 10.9392 10.4085 9.92054 10.4085C6.48046 10.4085 3.69172 7.61979 3.69172 4.17971C3.69172 3.16099 3.93628 2.19938 4.36989 1.3504C4.39259 1.30596 4.34423 1.25842 4.3011 1.28351C2.44675 2.36242 1.2002 4.37123 1.2002 6.67119C1.2002 10.1113 3.98893 12.9 7.42901 12.9C9.72893 12.9 11.7377 11.6535 12.8166 9.79921Z" fill="currentColor" stroke="currentColor" stroke-width="2"/>
|
|
3
|
+
</svg>
|
|
@@ -692,6 +692,7 @@ async def create_volume(
|
|
|
692
692
|
user: UserModel,
|
|
693
693
|
status: VolumeStatus = VolumeStatus.SUBMITTED,
|
|
694
694
|
created_at: datetime = datetime(2023, 1, 2, 3, 4, tzinfo=timezone.utc),
|
|
695
|
+
last_processed_at: Optional[datetime] = None,
|
|
695
696
|
configuration: Optional[VolumeConfiguration] = None,
|
|
696
697
|
volume_provisioning_data: Optional[VolumeProvisioningData] = None,
|
|
697
698
|
deleted_at: Optional[datetime] = None,
|
|
@@ -700,12 +701,15 @@ async def create_volume(
|
|
|
700
701
|
) -> VolumeModel:
|
|
701
702
|
if configuration is None:
|
|
702
703
|
configuration = get_volume_configuration(backend=backend, region=region)
|
|
704
|
+
if last_processed_at is None:
|
|
705
|
+
last_processed_at = created_at
|
|
703
706
|
vm = VolumeModel(
|
|
704
707
|
project=project,
|
|
705
708
|
user_id=user.id,
|
|
706
709
|
name=configuration.name,
|
|
707
710
|
status=status,
|
|
708
711
|
created_at=created_at,
|
|
712
|
+
last_processed_at=last_processed_at,
|
|
709
713
|
configuration=configuration.json(),
|
|
710
714
|
volume_provisioning_data=volume_provisioning_data.json()
|
|
711
715
|
if volume_provisioning_data
|
|
@@ -727,9 +731,11 @@ def get_volume(
|
|
|
727
731
|
configuration: Optional[VolumeConfiguration] = None,
|
|
728
732
|
external: bool = False,
|
|
729
733
|
created_at: datetime = datetime(2023, 1, 2, 3, 4, tzinfo=timezone.utc),
|
|
734
|
+
last_processed_at: datetime = datetime(2023, 1, 2, 3, 4, tzinfo=timezone.utc),
|
|
730
735
|
status: VolumeStatus = VolumeStatus.ACTIVE,
|
|
731
736
|
status_message: Optional[str] = None,
|
|
732
737
|
deleted: bool = False,
|
|
738
|
+
deleted_at: Optional[datetime] = None,
|
|
733
739
|
volume_id: Optional[str] = None,
|
|
734
740
|
provisioning_data: Optional[VolumeProvisioningData] = None,
|
|
735
741
|
attachments: Optional[List[VolumeAttachment]] = None,
|
|
@@ -748,9 +754,11 @@ def get_volume(
|
|
|
748
754
|
configuration=configuration,
|
|
749
755
|
external=external,
|
|
750
756
|
created_at=created_at,
|
|
757
|
+
last_processed_at=last_processed_at,
|
|
751
758
|
status=status,
|
|
752
759
|
status_message=status_message,
|
|
753
760
|
deleted=deleted,
|
|
761
|
+
deleted_at=deleted_at,
|
|
754
762
|
volume_id=volume_id,
|
|
755
763
|
provisioning_data=provisioning_data,
|
|
756
764
|
attachments=attachments,
|
|
@@ -777,6 +785,7 @@ def get_volume_provisioning_data(
|
|
|
777
785
|
volume_id: str = "vol-1234",
|
|
778
786
|
size_gb: int = 100,
|
|
779
787
|
availability_zone: Optional[str] = None,
|
|
788
|
+
price: Optional[float] = 1.0,
|
|
780
789
|
backend_data: Optional[str] = None,
|
|
781
790
|
backend: Optional[BackendType] = None,
|
|
782
791
|
) -> VolumeProvisioningData:
|
|
@@ -785,6 +794,7 @@ def get_volume_provisioning_data(
|
|
|
785
794
|
volume_id=volume_id,
|
|
786
795
|
size_gb=size_gb,
|
|
787
796
|
availability_zone=availability_zone,
|
|
797
|
+
price=price,
|
|
788
798
|
backend_data=backend_data,
|
|
789
799
|
)
|
|
790
800
|
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import re
|
|
2
|
+
from typing import Dict, Optional
|
|
3
|
+
|
|
4
|
+
# dstack resource tags allow alphanumeric tags with some special symbols in values.
|
|
5
|
+
# Should be valid across most backends (e.g. AWS).
|
|
6
|
+
# Does not guarantee that they are valid across all backends (e.g. GCP).
|
|
7
|
+
# So backends need to filter bad tags out.
|
|
8
|
+
TAG_KEY_PATTERN = re.compile(r"^[_\-a-zA-Z0-9]{1,60}$")
|
|
9
|
+
TAG_VALUE_PATTERN = re.compile(r"^[a-zA-Z0-9 .:/=_\-+@]{0,256}$")
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def tags_validator(tags: Optional[Dict[str, str]]) -> Optional[Dict[str, str]]:
|
|
13
|
+
if tags is None:
|
|
14
|
+
return
|
|
15
|
+
validate_tags(tags)
|
|
16
|
+
return tags
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def validate_tags(tags: Dict[str, str]):
|
|
20
|
+
for k, v in tags.items():
|
|
21
|
+
_validate_tag(k, v)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _validate_tag(key: str, value: str):
|
|
25
|
+
if not is_valid_tag_key(key):
|
|
26
|
+
raise ValueError(
|
|
27
|
+
f"Invalid tag key {key}. The key must match regex '{TAG_KEY_PATTERN.pattern}'"
|
|
28
|
+
)
|
|
29
|
+
if not is_valid_tag_value(value):
|
|
30
|
+
raise ValueError(
|
|
31
|
+
f"Invalid tag value {value}. The value must match regex '{TAG_VALUE_PATTERN.pattern}'"
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def is_valid_tag_key(name: str) -> bool:
|
|
36
|
+
match = re.match(TAG_KEY_PATTERN, name)
|
|
37
|
+
return match is not None
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def is_valid_tag_value(value: str) -> bool:
|
|
41
|
+
match = re.match(TAG_VALUE_PATTERN, value)
|
|
42
|
+
return match is not None
|
dstack/api/server/__init__.py
CHANGED
|
@@ -6,7 +6,7 @@ from typing import Dict, List, Optional, Type
|
|
|
6
6
|
import requests
|
|
7
7
|
|
|
8
8
|
from dstack import version
|
|
9
|
-
from dstack._internal.core.errors import ClientError, ServerClientError
|
|
9
|
+
from dstack._internal.core.errors import ClientError, ServerClientError, URLNotFoundError
|
|
10
10
|
from dstack._internal.utils.logging import get_logger
|
|
11
11
|
from dstack.api.server._backends import BackendsAPIClient
|
|
12
12
|
from dstack.api.server._fleets import FleetsAPIClient
|
|
@@ -154,6 +154,8 @@ class APIClient:
|
|
|
154
154
|
raise ClientError(
|
|
155
155
|
f"Access to {resp.request.url} is denied. Please check your access token"
|
|
156
156
|
)
|
|
157
|
+
if resp.status_code == 404:
|
|
158
|
+
raise URLNotFoundError(f"Status code 404 when requesting {resp.request.url}")
|
|
157
159
|
if 400 <= resp.status_code < 600:
|
|
158
160
|
raise ClientError(
|
|
159
161
|
f"Unexpected error: status code {resp.status_code}"
|
dstack/api/server/_fleets.py
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
from typing import Any, Dict, List, Optional
|
|
1
|
+
from typing import Any, Dict, List, Optional, Union
|
|
2
2
|
|
|
3
3
|
from pydantic import parse_obj_as
|
|
4
4
|
|
|
5
|
-
from dstack._internal.core.models.fleets import Fleet, FleetPlan, FleetSpec
|
|
5
|
+
from dstack._internal.core.models.fleets import ApplyFleetPlanInput, Fleet, FleetPlan, FleetSpec
|
|
6
6
|
from dstack._internal.server.schemas.fleets import (
|
|
7
|
+
ApplyFleetPlanRequest,
|
|
7
8
|
CreateFleetRequest,
|
|
8
9
|
DeleteFleetInstancesRequest,
|
|
9
10
|
DeleteFleetsRequest,
|
|
@@ -32,18 +33,20 @@ class FleetsAPIClient(APIClientGroup):
|
|
|
32
33
|
spec: FleetSpec,
|
|
33
34
|
) -> FleetPlan:
|
|
34
35
|
body = GetFleetPlanRequest(spec=spec)
|
|
35
|
-
body_json = body.json(exclude=
|
|
36
|
+
body_json = body.json(exclude=_get_get_plan_excludes(spec))
|
|
36
37
|
resp = self._request(f"/api/project/{project_name}/fleets/get_plan", body=body_json)
|
|
37
38
|
return parse_obj_as(FleetPlan.__response__, resp.json())
|
|
38
39
|
|
|
39
|
-
def
|
|
40
|
+
def apply_plan(
|
|
40
41
|
self,
|
|
41
42
|
project_name: str,
|
|
42
|
-
|
|
43
|
+
plan: Union[FleetPlan, ApplyFleetPlanInput],
|
|
44
|
+
force: bool = False,
|
|
43
45
|
) -> Fleet:
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
plan_input = ApplyFleetPlanInput.__response__.parse_obj(plan)
|
|
47
|
+
body = ApplyFleetPlanRequest(plan=plan_input, force=force)
|
|
48
|
+
body_json = body.json(exclude=_get_apply_plan_excludes(plan_input))
|
|
49
|
+
resp = self._request(f"/api/project/{project_name}/fleets/apply", body=body_json)
|
|
47
50
|
return parse_obj_as(Fleet.__response__, resp.json())
|
|
48
51
|
|
|
49
52
|
def delete(self, project_name: str, names: List[str]) -> None:
|
|
@@ -54,6 +57,42 @@ class FleetsAPIClient(APIClientGroup):
|
|
|
54
57
|
body = DeleteFleetInstancesRequest(name=name, instance_nums=instance_nums)
|
|
55
58
|
self._request(f"/api/project/{project_name}/fleets/delete_instances", body=body.json())
|
|
56
59
|
|
|
60
|
+
# Deprecated
|
|
61
|
+
# TODO: Remove in 0.20
|
|
62
|
+
def create(
|
|
63
|
+
self,
|
|
64
|
+
project_name: str,
|
|
65
|
+
spec: FleetSpec,
|
|
66
|
+
) -> Fleet:
|
|
67
|
+
body = CreateFleetRequest(spec=spec)
|
|
68
|
+
body_json = body.json(exclude=_get_create_fleet_excludes(spec))
|
|
69
|
+
resp = self._request(f"/api/project/{project_name}/fleets/create", body=body_json)
|
|
70
|
+
return parse_obj_as(Fleet.__response__, resp.json())
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _get_get_plan_excludes(fleet_spec: FleetSpec) -> Dict:
|
|
74
|
+
get_plan_excludes = {}
|
|
75
|
+
spec_excludes = _get_fleet_spec_excludes(fleet_spec)
|
|
76
|
+
if spec_excludes:
|
|
77
|
+
get_plan_excludes["spec"] = spec_excludes
|
|
78
|
+
return get_plan_excludes
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def _get_apply_plan_excludes(plan_input: ApplyFleetPlanInput) -> Dict:
|
|
82
|
+
apply_plan_excludes = {}
|
|
83
|
+
spec_excludes = _get_fleet_spec_excludes(plan_input.spec)
|
|
84
|
+
if spec_excludes:
|
|
85
|
+
apply_plan_excludes["spec"] = apply_plan_excludes
|
|
86
|
+
return {"plan": apply_plan_excludes}
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def _get_create_fleet_excludes(fleet_spec: FleetSpec) -> Dict:
|
|
90
|
+
create_fleet_excludes = {}
|
|
91
|
+
spec_excludes = _get_fleet_spec_excludes(fleet_spec)
|
|
92
|
+
if spec_excludes:
|
|
93
|
+
create_fleet_excludes["spec"] = spec_excludes
|
|
94
|
+
return create_fleet_excludes
|
|
95
|
+
|
|
57
96
|
|
|
58
97
|
def _get_fleet_spec_excludes(fleet_spec: FleetSpec) -> Optional[Dict]:
|
|
59
98
|
"""
|
|
@@ -67,10 +106,14 @@ def _get_fleet_spec_excludes(fleet_spec: FleetSpec) -> Optional[Dict]:
|
|
|
67
106
|
profile = fleet_spec.profile
|
|
68
107
|
if profile.fleets is None:
|
|
69
108
|
profile_excludes.add("fleets")
|
|
109
|
+
if fleet_spec.configuration.tags is None:
|
|
110
|
+
configuration_excludes["tags"] = True
|
|
111
|
+
if profile.tags is None:
|
|
112
|
+
profile_excludes.add("tags")
|
|
70
113
|
if configuration_excludes:
|
|
71
114
|
spec_excludes["configuration"] = configuration_excludes
|
|
72
115
|
if profile_excludes:
|
|
73
116
|
spec_excludes["profile"] = profile_excludes
|
|
74
117
|
if spec_excludes:
|
|
75
|
-
return
|
|
118
|
+
return spec_excludes
|
|
76
119
|
return None
|
dstack/api/server/_gateways.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import List
|
|
1
|
+
from typing import Dict, List
|
|
2
2
|
|
|
3
3
|
from pydantic import parse_obj_as
|
|
4
4
|
|
|
@@ -29,7 +29,10 @@ class GatewaysAPIClient(APIClientGroup):
|
|
|
29
29
|
configuration: GatewayConfiguration,
|
|
30
30
|
) -> Gateway:
|
|
31
31
|
body = CreateGatewayRequest(configuration=configuration)
|
|
32
|
-
resp = self._request(
|
|
32
|
+
resp = self._request(
|
|
33
|
+
f"/api/project/{project_name}/gateways/create",
|
|
34
|
+
body=body.json(exclude=_get_gateway_configuration_excludes(configuration)),
|
|
35
|
+
)
|
|
33
36
|
return parse_obj_as(Gateway.__response__, resp.json())
|
|
34
37
|
|
|
35
38
|
def delete(self, project_name: str, gateways_names: List[str]) -> None:
|
|
@@ -48,3 +51,15 @@ class GatewaysAPIClient(APIClientGroup):
|
|
|
48
51
|
f"/api/project/{project_name}/gateways/set_wildcard_domain", body=body.json()
|
|
49
52
|
)
|
|
50
53
|
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}
|
dstack/api/server/_runs.py
CHANGED
|
@@ -4,7 +4,6 @@ from uuid import UUID
|
|
|
4
4
|
|
|
5
5
|
from pydantic import parse_obj_as
|
|
6
6
|
|
|
7
|
-
from dstack._internal.core.models.common import is_core_model_instance
|
|
8
7
|
from dstack._internal.core.models.configurations import ServiceConfiguration
|
|
9
8
|
from dstack._internal.core.models.runs import (
|
|
10
9
|
ApplyRunPlanInput,
|
|
@@ -54,11 +53,13 @@ class RunsAPIClient(APIClientGroup):
|
|
|
54
53
|
resp = self._request(f"/api/project/{project_name}/runs/get", body=json_body)
|
|
55
54
|
return parse_obj_as(Run.__response__, resp.json())
|
|
56
55
|
|
|
57
|
-
def get_plan(
|
|
58
|
-
|
|
56
|
+
def get_plan(
|
|
57
|
+
self, project_name: str, run_spec: RunSpec, max_offers: Optional[int] = None
|
|
58
|
+
) -> RunPlan:
|
|
59
|
+
body = GetRunPlanRequest(run_spec=run_spec, max_offers=max_offers)
|
|
59
60
|
resp = self._request(
|
|
60
61
|
f"/api/project/{project_name}/runs/get_plan",
|
|
61
|
-
body=body.json(exclude=
|
|
62
|
+
body=body.json(exclude=_get_get_plan_excludes(body)),
|
|
62
63
|
)
|
|
63
64
|
return parse_obj_as(RunPlan.__response__, resp.json())
|
|
64
65
|
|
|
@@ -91,10 +92,29 @@ def _get_apply_plan_excludes(plan: ApplyRunPlanInput) -> Optional[Dict]:
|
|
|
91
92
|
Use this method to exclude new fields when they are not set to keep
|
|
92
93
|
clients backward-compatibility with older servers.
|
|
93
94
|
"""
|
|
95
|
+
apply_plan_excludes = {}
|
|
94
96
|
run_spec_excludes = _get_run_spec_excludes(plan.run_spec)
|
|
95
97
|
if run_spec_excludes is not None:
|
|
96
|
-
|
|
97
|
-
|
|
98
|
+
apply_plan_excludes["run_spec"] = run_spec_excludes
|
|
99
|
+
if plan.current_resource is not None:
|
|
100
|
+
apply_plan_excludes["current_resource"] = {
|
|
101
|
+
"run_spec": _get_run_spec_excludes(plan.current_resource.run_spec)
|
|
102
|
+
}
|
|
103
|
+
return {"plan": apply_plan_excludes}
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def _get_get_plan_excludes(request: GetRunPlanRequest) -> Optional[Dict]:
|
|
107
|
+
"""
|
|
108
|
+
Excludes new fields when they are not set to keep
|
|
109
|
+
clients backward-compatibility with older servers.
|
|
110
|
+
"""
|
|
111
|
+
get_plan_excludes = {}
|
|
112
|
+
run_spec_excludes = _get_run_spec_excludes(request.run_spec)
|
|
113
|
+
if run_spec_excludes is not None:
|
|
114
|
+
get_plan_excludes["run_spec"] = run_spec_excludes
|
|
115
|
+
if request.max_offers is None:
|
|
116
|
+
get_plan_excludes["max_offers"] = True
|
|
117
|
+
return get_plan_excludes
|
|
98
118
|
|
|
99
119
|
|
|
100
120
|
def _get_run_spec_excludes(run_spec: RunSpec) -> Optional[Dict]:
|
|
@@ -113,16 +133,19 @@ def _get_run_spec_excludes(run_spec: RunSpec) -> Optional[Dict]:
|
|
|
113
133
|
configuration_excludes["fleets"] = True
|
|
114
134
|
if profile is not None and profile.fleets is None:
|
|
115
135
|
profile_excludes.add("fleets")
|
|
116
|
-
if
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
136
|
+
if configuration.tags is None:
|
|
137
|
+
configuration_excludes["tags"] = True
|
|
138
|
+
if profile is not None and profile.tags is None:
|
|
139
|
+
profile_excludes.add("tags")
|
|
140
|
+
if isinstance(configuration, ServiceConfiguration) and not configuration.rate_limits:
|
|
120
141
|
configuration_excludes["rate_limits"] = True
|
|
142
|
+
if configuration.shell is None:
|
|
143
|
+
configuration_excludes["shell"] = True
|
|
121
144
|
|
|
122
145
|
if configuration_excludes:
|
|
123
146
|
spec_excludes["configuration"] = configuration_excludes
|
|
124
147
|
if profile_excludes:
|
|
125
148
|
spec_excludes["profile"] = profile_excludes
|
|
126
149
|
if spec_excludes:
|
|
127
|
-
return
|
|
150
|
+
return spec_excludes
|
|
128
151
|
return None
|
dstack/api/server/_volumes.py
CHANGED
|
@@ -45,7 +45,6 @@ def _get_volume_configuration_excludes(configuration: VolumeConfiguration) -> Di
|
|
|
45
45
|
clients backward-compatibility with older servers.
|
|
46
46
|
"""
|
|
47
47
|
configuration_excludes = {}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
# configuration_excludes["availability_zone"] = True
|
|
48
|
+
if configuration.tags is None:
|
|
49
|
+
configuration_excludes["tags"] = True
|
|
51
50
|
return {"configuration": configuration_excludes}
|
dstack/version.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dstack
|
|
3
|
-
Version: 0.19.
|
|
3
|
+
Version: 0.19.6rc1
|
|
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
|
|
@@ -21,7 +21,7 @@ Requires-Dist: cryptography
|
|
|
21
21
|
Requires-Dist: cursor
|
|
22
22
|
Requires-Dist: filelock
|
|
23
23
|
Requires-Dist: gitpython
|
|
24
|
-
Requires-Dist: gpuhunt<0.2.0,>=0.1.
|
|
24
|
+
Requires-Dist: gpuhunt<0.2.0,>=0.1.3
|
|
25
25
|
Requires-Dist: jsonschema
|
|
26
26
|
Requires-Dist: packaging
|
|
27
27
|
Requires-Dist: paramiko>=3.2.0
|