dstack 0.19.20__py3-none-any.whl → 0.19.22__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 (93) hide show
  1. dstack/_internal/cli/commands/apply.py +8 -3
  2. dstack/_internal/cli/services/configurators/__init__.py +8 -0
  3. dstack/_internal/cli/services/configurators/fleet.py +1 -1
  4. dstack/_internal/cli/services/configurators/gateway.py +1 -1
  5. dstack/_internal/cli/services/configurators/run.py +11 -1
  6. dstack/_internal/cli/services/configurators/volume.py +1 -1
  7. dstack/_internal/cli/utils/common.py +48 -5
  8. dstack/_internal/cli/utils/fleet.py +5 -5
  9. dstack/_internal/cli/utils/run.py +32 -0
  10. dstack/_internal/core/backends/__init__.py +0 -65
  11. dstack/_internal/core/backends/configurators.py +9 -0
  12. dstack/_internal/core/backends/features.py +64 -0
  13. dstack/_internal/core/backends/hotaisle/__init__.py +1 -0
  14. dstack/_internal/core/backends/hotaisle/api_client.py +109 -0
  15. dstack/_internal/core/backends/hotaisle/backend.py +16 -0
  16. dstack/_internal/core/backends/hotaisle/compute.py +225 -0
  17. dstack/_internal/core/backends/hotaisle/configurator.py +60 -0
  18. dstack/_internal/core/backends/hotaisle/models.py +45 -0
  19. dstack/_internal/core/backends/lambdalabs/compute.py +2 -1
  20. dstack/_internal/core/backends/models.py +8 -0
  21. dstack/_internal/core/compatibility/fleets.py +2 -0
  22. dstack/_internal/core/compatibility/runs.py +12 -0
  23. dstack/_internal/core/models/backends/base.py +2 -0
  24. dstack/_internal/core/models/configurations.py +139 -1
  25. dstack/_internal/core/models/health.py +28 -0
  26. dstack/_internal/core/models/instances.py +2 -0
  27. dstack/_internal/core/models/logs.py +2 -1
  28. dstack/_internal/core/models/profiles.py +37 -0
  29. dstack/_internal/core/models/runs.py +21 -1
  30. dstack/_internal/core/services/ssh/tunnel.py +7 -0
  31. dstack/_internal/server/app.py +26 -10
  32. dstack/_internal/server/background/__init__.py +9 -6
  33. dstack/_internal/server/background/tasks/process_fleets.py +52 -38
  34. dstack/_internal/server/background/tasks/process_gateways.py +2 -2
  35. dstack/_internal/server/background/tasks/process_idle_volumes.py +5 -4
  36. dstack/_internal/server/background/tasks/process_instances.py +168 -103
  37. dstack/_internal/server/background/tasks/process_metrics.py +9 -2
  38. dstack/_internal/server/background/tasks/process_placement_groups.py +2 -0
  39. dstack/_internal/server/background/tasks/process_probes.py +164 -0
  40. dstack/_internal/server/background/tasks/process_prometheus_metrics.py +14 -2
  41. dstack/_internal/server/background/tasks/process_running_jobs.py +142 -124
  42. dstack/_internal/server/background/tasks/process_runs.py +84 -34
  43. dstack/_internal/server/background/tasks/process_submitted_jobs.py +12 -10
  44. dstack/_internal/server/background/tasks/process_terminating_jobs.py +12 -4
  45. dstack/_internal/server/background/tasks/process_volumes.py +4 -1
  46. dstack/_internal/server/migrations/versions/25479f540245_add_probes.py +43 -0
  47. dstack/_internal/server/migrations/versions/50dd7ea98639_index_status_columns.py +55 -0
  48. dstack/_internal/server/migrations/versions/728b1488b1b4_add_instance_health.py +50 -0
  49. dstack/_internal/server/migrations/versions/ec02a26a256c_add_runmodel_next_triggered_at.py +38 -0
  50. dstack/_internal/server/models.py +57 -16
  51. dstack/_internal/server/routers/instances.py +33 -5
  52. dstack/_internal/server/schemas/health/dcgm.py +56 -0
  53. dstack/_internal/server/schemas/instances.py +32 -0
  54. dstack/_internal/server/schemas/runner.py +5 -0
  55. dstack/_internal/server/services/fleets.py +19 -10
  56. dstack/_internal/server/services/gateways/__init__.py +17 -17
  57. dstack/_internal/server/services/instances.py +113 -15
  58. dstack/_internal/server/services/jobs/__init__.py +18 -13
  59. dstack/_internal/server/services/jobs/configurators/base.py +26 -0
  60. dstack/_internal/server/services/logging.py +4 -2
  61. dstack/_internal/server/services/logs/aws.py +13 -1
  62. dstack/_internal/server/services/logs/gcp.py +16 -1
  63. dstack/_internal/server/services/offers.py +3 -3
  64. dstack/_internal/server/services/probes.py +6 -0
  65. dstack/_internal/server/services/projects.py +51 -19
  66. dstack/_internal/server/services/prometheus/client_metrics.py +3 -0
  67. dstack/_internal/server/services/prometheus/custom_metrics.py +2 -3
  68. dstack/_internal/server/services/runner/client.py +52 -20
  69. dstack/_internal/server/services/runner/ssh.py +4 -4
  70. dstack/_internal/server/services/runs.py +115 -39
  71. dstack/_internal/server/services/services/__init__.py +4 -1
  72. dstack/_internal/server/services/ssh.py +66 -0
  73. dstack/_internal/server/services/users.py +2 -3
  74. dstack/_internal/server/services/volumes.py +11 -11
  75. dstack/_internal/server/settings.py +16 -0
  76. dstack/_internal/server/statics/index.html +1 -1
  77. dstack/_internal/server/statics/{main-8f9ee218d3eb45989682.css → main-03e818b110e1d5705378.css} +1 -1
  78. dstack/_internal/server/statics/{main-39a767528976f8078166.js → main-cc067b7fd1a8f33f97da.js} +26 -15
  79. dstack/_internal/server/statics/{main-39a767528976f8078166.js.map → main-cc067b7fd1a8f33f97da.js.map} +1 -1
  80. dstack/_internal/server/testing/common.py +51 -0
  81. dstack/_internal/{core/backends/remote → server/utils}/provisioning.py +22 -17
  82. dstack/_internal/server/utils/sentry_utils.py +12 -0
  83. dstack/_internal/settings.py +3 -0
  84. dstack/_internal/utils/common.py +15 -0
  85. dstack/_internal/utils/cron.py +5 -0
  86. dstack/api/server/__init__.py +1 -1
  87. dstack/version.py +1 -1
  88. {dstack-0.19.20.dist-info → dstack-0.19.22.dist-info}/METADATA +13 -22
  89. {dstack-0.19.20.dist-info → dstack-0.19.22.dist-info}/RECORD +93 -75
  90. /dstack/_internal/{core/backends/remote → server/schemas/health}/__init__.py +0 -0
  91. {dstack-0.19.20.dist-info → dstack-0.19.22.dist-info}/WHEEL +0 -0
  92. {dstack-0.19.20.dist-info → dstack-0.19.22.dist-info}/entry_points.txt +0 -0
  93. {dstack-0.19.20.dist-info → dstack-0.19.22.dist-info}/licenses/LICENSE.md +0 -0
@@ -35,6 +35,7 @@ from dstack._internal.core.models.fleets import (
35
35
  SSHParams,
36
36
  )
37
37
  from dstack._internal.core.models.gateways import GatewayComputeConfiguration, GatewayStatus
38
+ from dstack._internal.core.models.health import HealthStatus
38
39
  from dstack._internal.core.models.instances import (
39
40
  Disk,
40
41
  Gpu,
@@ -68,6 +69,7 @@ from dstack._internal.core.models.runs import (
68
69
  Requirements,
69
70
  RunSpec,
70
71
  RunStatus,
72
+ RunTerminationReason,
71
73
  )
72
74
  from dstack._internal.core.models.users import GlobalRole
73
75
  from dstack._internal.core.models.volumes import (
@@ -84,11 +86,13 @@ from dstack._internal.server.models import (
84
86
  FleetModel,
85
87
  GatewayComputeModel,
86
88
  GatewayModel,
89
+ InstanceHealthCheckModel,
87
90
  InstanceModel,
88
91
  JobMetricsPoint,
89
92
  JobModel,
90
93
  JobPrometheusMetrics,
91
94
  PlacementGroupModel,
95
+ ProbeModel,
92
96
  ProjectModel,
93
97
  RepoCredsModel,
94
98
  RepoModel,
@@ -282,12 +286,15 @@ async def create_run(
282
286
  user: UserModel,
283
287
  run_name: str = "test-run",
284
288
  status: RunStatus = RunStatus.SUBMITTED,
289
+ termination_reason: Optional[RunTerminationReason] = None,
285
290
  submitted_at: datetime = datetime(2023, 1, 2, 3, 4, tzinfo=timezone.utc),
286
291
  run_spec: Optional[RunSpec] = None,
287
292
  run_id: Optional[UUID] = None,
288
293
  deleted: bool = False,
289
294
  priority: int = 0,
290
295
  deployment_num: int = 0,
296
+ resubmission_attempt: int = 0,
297
+ next_triggered_at: Optional[datetime] = None,
291
298
  ) -> RunModel:
292
299
  if run_spec is None:
293
300
  run_spec = get_run_spec(
@@ -305,12 +312,15 @@ async def create_run(
305
312
  submitted_at=submitted_at,
306
313
  run_name=run_name,
307
314
  status=status,
315
+ termination_reason=termination_reason,
308
316
  run_spec=run_spec.json(),
309
317
  last_processed_at=submitted_at,
310
318
  jobs=[],
311
319
  priority=priority,
312
320
  deployment_num=deployment_num,
313
321
  desired_replica_count=1,
322
+ resubmission_attempt=resubmission_attempt,
323
+ next_triggered_at=next_triggered_at,
314
324
  )
315
325
  session.add(run)
316
326
  await session.commit()
@@ -361,6 +371,7 @@ async def create_job(
361
371
  instance_assigned=instance_assigned,
362
372
  used_instance_id=instance.id if instance is not None else None,
363
373
  disconnected_at=disconnected_at,
374
+ probes=[],
364
375
  )
365
376
  session.add(job)
366
377
  await session.commit()
@@ -432,6 +443,26 @@ def get_job_runtime_data(
432
443
  )
433
444
 
434
445
 
446
+ async def create_probe(
447
+ session: AsyncSession,
448
+ job: JobModel,
449
+ probe_num: int = 0,
450
+ due: datetime = datetime(2025, 1, 2, 3, 4, tzinfo=timezone.utc),
451
+ success_streak: int = 0,
452
+ ) -> ProbeModel:
453
+ probe = ProbeModel(
454
+ name=f"{job.job_name}-{probe_num}",
455
+ job=job,
456
+ probe_num=probe_num,
457
+ due=due,
458
+ success_streak=success_streak,
459
+ active=True,
460
+ )
461
+ session.add(probe)
462
+ await session.commit()
463
+ return probe
464
+
465
+
435
466
  async def create_gateway(
436
467
  session: AsyncSession,
437
468
  project_id: UUID,
@@ -585,6 +616,7 @@ async def create_instance(
585
616
  fleet: Optional[FleetModel] = None,
586
617
  status: InstanceStatus = InstanceStatus.IDLE,
587
618
  unreachable: bool = False,
619
+ health_status: HealthStatus = HealthStatus.HEALTHY,
588
620
  created_at: datetime = datetime(2023, 1, 2, 3, 4, tzinfo=timezone.utc),
589
621
  finished_at: Optional[datetime] = None,
590
622
  spot: bool = False,
@@ -647,6 +679,7 @@ async def create_instance(
647
679
  status=status,
648
680
  last_processed_at=last_processed_at,
649
681
  unreachable=unreachable,
682
+ health=health_status,
650
683
  created_at=created_at,
651
684
  started_at=created_at,
652
685
  finished_at=finished_at,
@@ -767,6 +800,24 @@ def get_ssh_key() -> SSHKey:
767
800
  )
768
801
 
769
802
 
803
+ async def create_instance_health_check(
804
+ session: AsyncSession,
805
+ instance: InstanceModel,
806
+ collected_at: datetime = datetime(2023, 1, 2, 3, 4, tzinfo=timezone.utc),
807
+ status: HealthStatus = HealthStatus.HEALTHY,
808
+ response: str = "{}",
809
+ ) -> InstanceHealthCheckModel:
810
+ health_check = InstanceHealthCheckModel(
811
+ instance_id=instance.id,
812
+ collected_at=collected_at,
813
+ status=status,
814
+ response=response,
815
+ )
816
+ session.add(health_check)
817
+ await session.commit()
818
+ return health_check
819
+
820
+
770
821
  async def create_volume(
771
822
  session: AsyncSession,
772
823
  project: ProjectModel,
@@ -224,23 +224,28 @@ def get_shim_healthcheck(client: paramiko.SSHClient) -> str:
224
224
  retries = 20
225
225
  iter_delay = 3
226
226
  for _ in range(retries):
227
- try:
228
- _, stdout, stderr = client.exec_command(
229
- f"curl -s http://localhost:{DSTACK_SHIM_HTTP_PORT}/api/healthcheck", timeout=15
230
- )
231
- out = stdout.read().strip().decode()
232
- err = stderr.read().strip().decode()
233
- if err:
234
- raise ProvisioningError(
235
- f"The command 'get_shim_healthcheck' didn't work. stdout: {out}, stderr: {err}"
236
- )
237
- if not out:
238
- logger.debug("healthcheck is empty. retry")
239
- time.sleep(iter_delay)
240
- continue
241
- return out
242
- except (paramiko.SSHException, OSError) as e:
243
- raise ProvisioningError(f"get_shim_healthcheck failed: {e}") from e
227
+ healthcheck = _get_shim_healthcheck(client)
228
+ if healthcheck is not None:
229
+ return healthcheck
230
+ logger.debug("healthcheck is empty. retry")
231
+ time.sleep(iter_delay)
232
+ raise ProvisioningError("Cannot get HealthcheckResponse")
233
+
234
+
235
+ def _get_shim_healthcheck(client: paramiko.SSHClient) -> Optional[str]:
236
+ try:
237
+ _, stdout, stderr = client.exec_command(
238
+ f"curl -s http://localhost:{DSTACK_SHIM_HTTP_PORT}/api/healthcheck", timeout=15
239
+ )
240
+ out = stdout.read().strip().decode()
241
+ err = stderr.read().strip().decode()
242
+ except (paramiko.SSHException, OSError) as e:
243
+ raise ProvisioningError(f"get_shim_healthcheck failed: {e}") from e
244
+ if err:
245
+ raise ProvisioningError(f"get_shim_healthcheck didn't work. stdout: {out}, stderr: {err}")
246
+ if not out:
247
+ return None
248
+ return out
244
249
 
245
250
 
246
251
  def host_info_to_instance_type(host_info: Dict[str, Any], cpu_arch: GoArchType) -> InstanceType:
@@ -0,0 +1,12 @@
1
+ import functools
2
+
3
+ import sentry_sdk
4
+
5
+
6
+ def instrument_background_task(f):
7
+ @functools.wraps(f)
8
+ async def wrapper(*args, **kwargs):
9
+ with sentry_sdk.start_transaction(name=f"background.{f.__name__}"):
10
+ return await f(*args, **kwargs)
11
+
12
+ return wrapper
@@ -19,6 +19,9 @@ DSTACK_BASE_IMAGE_UBUNTU_VERSION = os.getenv(
19
19
  )
20
20
  DSTACK_DIND_IMAGE = os.getenv("DSTACK_DIND_IMAGE", "dstackai/dind")
21
21
 
22
+ CLI_LOG_LEVEL = os.getenv("DSTACK_CLI_LOG_LEVEL", "INFO").upper()
23
+ CLI_FILE_LOG_LEVEL = os.getenv("DSTACK_CLI_FILE_LOG_LEVEL", "DEBUG").upper()
24
+
22
25
  # Development settings
23
26
 
24
27
  LOCAL_BACKEND_ENABLED = os.getenv("DSTACK_LOCAL_BACKEND_ENABLED") is not None
@@ -222,6 +222,21 @@ def remove_prefix(text: str, prefix: str) -> str:
222
222
  return text
223
223
 
224
224
 
225
+ def has_duplicates(iterable: Iterable[Any]) -> bool:
226
+ """
227
+ Checks if there are any duplicate items in the given iterable.
228
+
229
+ O(n^2) implementation, but works with iterables with unhashable items.
230
+ For iterables with hashable items, prefer len(set(iterable)) != len(iterable).
231
+ """
232
+ seen = []
233
+ for item in iterable:
234
+ if item in seen:
235
+ return True
236
+ seen.append(item)
237
+ return False
238
+
239
+
225
240
  T = TypeVar("T")
226
241
 
227
242
 
@@ -0,0 +1,5 @@
1
+ from apscheduler.triggers.cron import CronTrigger
2
+
3
+
4
+ def validate_cron(cron_expr: str):
5
+ CronTrigger.from_crontab(cron_expr)
@@ -173,7 +173,7 @@ class APIClient:
173
173
  raise ClientError(
174
174
  f"Unexpected error: status code {resp.status_code}"
175
175
  f" when requesting {resp.request.url}."
176
- " Check server logs or run with DSTACK_CLI_LOG_LEVEL=DEBUG to see more details"
176
+ " Check the server logs for backend issues, and the CLI logs at (~/.dstack/logs/cli/latest.log) local CLI output"
177
177
  )
178
178
  return resp
179
179
 
dstack/version.py CHANGED
@@ -1,4 +1,4 @@
1
- __version__ = "0.19.20"
1
+ __version__ = "0.19.22"
2
2
  __is_release__ = True
3
3
  base_image = "0.10"
4
4
  base_image_ubuntu_version = "22.04"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dstack
3
- Version: 0.19.20
3
+ Version: 0.19.22
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
@@ -15,13 +15,14 @@ Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)
15
15
  Classifier: Programming Language :: Python :: 3
16
16
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
17
17
  Requires-Python: >=3.9
18
+ Requires-Dist: apscheduler<4
18
19
  Requires-Dist: argcomplete>=3.5.0
19
20
  Requires-Dist: cachetools
20
21
  Requires-Dist: cryptography
21
22
  Requires-Dist: cursor
22
23
  Requires-Dist: filelock
23
24
  Requires-Dist: gitpython
24
- Requires-Dist: gpuhunt==0.1.6
25
+ Requires-Dist: gpuhunt==0.1.7
25
26
  Requires-Dist: ignore-python>=0.2.0
26
27
  Requires-Dist: jsonschema
27
28
  Requires-Dist: orjson
@@ -46,7 +47,6 @@ Requires-Dist: aiorwlock; extra == 'all'
46
47
  Requires-Dist: aiosqlite; extra == 'all'
47
48
  Requires-Dist: alembic-postgresql-enum; extra == 'all'
48
49
  Requires-Dist: alembic>=1.10.2; extra == 'all'
49
- Requires-Dist: apscheduler<4; extra == 'all'
50
50
  Requires-Dist: asyncpg; extra == 'all'
51
51
  Requires-Dist: azure-identity>=1.12.0; extra == 'all'
52
52
  Requires-Dist: azure-mgmt-authorization>=3.0.0; extra == 'all'
@@ -79,7 +79,7 @@ Requires-Dist: prometheus-client; extra == 'all'
79
79
  Requires-Dist: pyopenssl>=23.2.0; extra == 'all'
80
80
  Requires-Dist: python-dxf==12.1.0; extra == 'all'
81
81
  Requires-Dist: python-json-logger>=3.1.0; extra == 'all'
82
- Requires-Dist: sentry-sdk[fastapi]; extra == 'all'
82
+ Requires-Dist: sentry-sdk[fastapi]>=2.27.0; extra == 'all'
83
83
  Requires-Dist: sqlalchemy-utils>=0.40.0; extra == 'all'
84
84
  Requires-Dist: sqlalchemy[asyncio]>=2.0.0; extra == 'all'
85
85
  Requires-Dist: starlette>=0.26.0; extra == 'all'
@@ -92,7 +92,6 @@ Requires-Dist: aiorwlock; extra == 'aws'
92
92
  Requires-Dist: aiosqlite; extra == 'aws'
93
93
  Requires-Dist: alembic-postgresql-enum; extra == 'aws'
94
94
  Requires-Dist: alembic>=1.10.2; extra == 'aws'
95
- Requires-Dist: apscheduler<4; extra == 'aws'
96
95
  Requires-Dist: asyncpg; extra == 'aws'
97
96
  Requires-Dist: backports-entry-points-selectable; extra == 'aws'
98
97
  Requires-Dist: boto3>=1.38.13; extra == 'aws'
@@ -105,7 +104,7 @@ Requires-Dist: jinja2; extra == 'aws'
105
104
  Requires-Dist: prometheus-client; extra == 'aws'
106
105
  Requires-Dist: python-dxf==12.1.0; extra == 'aws'
107
106
  Requires-Dist: python-json-logger>=3.1.0; extra == 'aws'
108
- Requires-Dist: sentry-sdk[fastapi]; extra == 'aws'
107
+ Requires-Dist: sentry-sdk[fastapi]>=2.27.0; extra == 'aws'
109
108
  Requires-Dist: sqlalchemy-utils>=0.40.0; extra == 'aws'
110
109
  Requires-Dist: sqlalchemy[asyncio]>=2.0.0; extra == 'aws'
111
110
  Requires-Dist: starlette>=0.26.0; extra == 'aws'
@@ -117,7 +116,6 @@ Requires-Dist: aiorwlock; extra == 'azure'
117
116
  Requires-Dist: aiosqlite; extra == 'azure'
118
117
  Requires-Dist: alembic-postgresql-enum; extra == 'azure'
119
118
  Requires-Dist: alembic>=1.10.2; extra == 'azure'
120
- Requires-Dist: apscheduler<4; extra == 'azure'
121
119
  Requires-Dist: asyncpg; extra == 'azure'
122
120
  Requires-Dist: azure-identity>=1.12.0; extra == 'azure'
123
121
  Requires-Dist: azure-mgmt-authorization>=3.0.0; extra == 'azure'
@@ -135,7 +133,7 @@ Requires-Dist: jinja2; extra == 'azure'
135
133
  Requires-Dist: prometheus-client; extra == 'azure'
136
134
  Requires-Dist: python-dxf==12.1.0; extra == 'azure'
137
135
  Requires-Dist: python-json-logger>=3.1.0; extra == 'azure'
138
- Requires-Dist: sentry-sdk[fastapi]; extra == 'azure'
136
+ Requires-Dist: sentry-sdk[fastapi]>=2.27.0; extra == 'azure'
139
137
  Requires-Dist: sqlalchemy-utils>=0.40.0; extra == 'azure'
140
138
  Requires-Dist: sqlalchemy[asyncio]>=2.0.0; extra == 'azure'
141
139
  Requires-Dist: starlette>=0.26.0; extra == 'azure'
@@ -147,7 +145,6 @@ Requires-Dist: aiorwlock; extra == 'datacrunch'
147
145
  Requires-Dist: aiosqlite; extra == 'datacrunch'
148
146
  Requires-Dist: alembic-postgresql-enum; extra == 'datacrunch'
149
147
  Requires-Dist: alembic>=1.10.2; extra == 'datacrunch'
150
- Requires-Dist: apscheduler<4; extra == 'datacrunch'
151
148
  Requires-Dist: asyncpg; extra == 'datacrunch'
152
149
  Requires-Dist: backports-entry-points-selectable; extra == 'datacrunch'
153
150
  Requires-Dist: datacrunch; extra == 'datacrunch'
@@ -159,7 +156,7 @@ Requires-Dist: jinja2; extra == 'datacrunch'
159
156
  Requires-Dist: prometheus-client; extra == 'datacrunch'
160
157
  Requires-Dist: python-dxf==12.1.0; extra == 'datacrunch'
161
158
  Requires-Dist: python-json-logger>=3.1.0; extra == 'datacrunch'
162
- Requires-Dist: sentry-sdk[fastapi]; extra == 'datacrunch'
159
+ Requires-Dist: sentry-sdk[fastapi]>=2.27.0; extra == 'datacrunch'
163
160
  Requires-Dist: sqlalchemy-utils>=0.40.0; extra == 'datacrunch'
164
161
  Requires-Dist: sqlalchemy[asyncio]>=2.0.0; extra == 'datacrunch'
165
162
  Requires-Dist: starlette>=0.26.0; extra == 'datacrunch'
@@ -179,7 +176,6 @@ Requires-Dist: aiorwlock; extra == 'gcp'
179
176
  Requires-Dist: aiosqlite; extra == 'gcp'
180
177
  Requires-Dist: alembic-postgresql-enum; extra == 'gcp'
181
178
  Requires-Dist: alembic>=1.10.2; extra == 'gcp'
182
- Requires-Dist: apscheduler<4; extra == 'gcp'
183
179
  Requires-Dist: asyncpg; extra == 'gcp'
184
180
  Requires-Dist: backports-entry-points-selectable; extra == 'gcp'
185
181
  Requires-Dist: docker>=6.0.0; extra == 'gcp'
@@ -197,7 +193,7 @@ Requires-Dist: jinja2; extra == 'gcp'
197
193
  Requires-Dist: prometheus-client; extra == 'gcp'
198
194
  Requires-Dist: python-dxf==12.1.0; extra == 'gcp'
199
195
  Requires-Dist: python-json-logger>=3.1.0; extra == 'gcp'
200
- Requires-Dist: sentry-sdk[fastapi]; extra == 'gcp'
196
+ Requires-Dist: sentry-sdk[fastapi]>=2.27.0; extra == 'gcp'
201
197
  Requires-Dist: sqlalchemy-utils>=0.40.0; extra == 'gcp'
202
198
  Requires-Dist: sqlalchemy[asyncio]>=2.0.0; extra == 'gcp'
203
199
  Requires-Dist: starlette>=0.26.0; extra == 'gcp'
@@ -209,7 +205,6 @@ Requires-Dist: aiorwlock; extra == 'kubernetes'
209
205
  Requires-Dist: aiosqlite; extra == 'kubernetes'
210
206
  Requires-Dist: alembic-postgresql-enum; extra == 'kubernetes'
211
207
  Requires-Dist: alembic>=1.10.2; extra == 'kubernetes'
212
- Requires-Dist: apscheduler<4; extra == 'kubernetes'
213
208
  Requires-Dist: asyncpg; extra == 'kubernetes'
214
209
  Requires-Dist: backports-entry-points-selectable; extra == 'kubernetes'
215
210
  Requires-Dist: docker>=6.0.0; extra == 'kubernetes'
@@ -221,7 +216,7 @@ Requires-Dist: kubernetes; extra == 'kubernetes'
221
216
  Requires-Dist: prometheus-client; extra == 'kubernetes'
222
217
  Requires-Dist: python-dxf==12.1.0; extra == 'kubernetes'
223
218
  Requires-Dist: python-json-logger>=3.1.0; extra == 'kubernetes'
224
- Requires-Dist: sentry-sdk[fastapi]; extra == 'kubernetes'
219
+ Requires-Dist: sentry-sdk[fastapi]>=2.27.0; extra == 'kubernetes'
225
220
  Requires-Dist: sqlalchemy-utils>=0.40.0; extra == 'kubernetes'
226
221
  Requires-Dist: sqlalchemy[asyncio]>=2.0.0; extra == 'kubernetes'
227
222
  Requires-Dist: starlette>=0.26.0; extra == 'kubernetes'
@@ -233,7 +228,6 @@ Requires-Dist: aiorwlock; extra == 'lambda'
233
228
  Requires-Dist: aiosqlite; extra == 'lambda'
234
229
  Requires-Dist: alembic-postgresql-enum; extra == 'lambda'
235
230
  Requires-Dist: alembic>=1.10.2; extra == 'lambda'
236
- Requires-Dist: apscheduler<4; extra == 'lambda'
237
231
  Requires-Dist: asyncpg; extra == 'lambda'
238
232
  Requires-Dist: backports-entry-points-selectable; extra == 'lambda'
239
233
  Requires-Dist: boto3>=1.38.13; extra == 'lambda'
@@ -246,7 +240,7 @@ Requires-Dist: jinja2; extra == 'lambda'
246
240
  Requires-Dist: prometheus-client; extra == 'lambda'
247
241
  Requires-Dist: python-dxf==12.1.0; extra == 'lambda'
248
242
  Requires-Dist: python-json-logger>=3.1.0; extra == 'lambda'
249
- Requires-Dist: sentry-sdk[fastapi]; extra == 'lambda'
243
+ Requires-Dist: sentry-sdk[fastapi]>=2.27.0; extra == 'lambda'
250
244
  Requires-Dist: sqlalchemy-utils>=0.40.0; extra == 'lambda'
251
245
  Requires-Dist: sqlalchemy[asyncio]>=2.0.0; extra == 'lambda'
252
246
  Requires-Dist: starlette>=0.26.0; extra == 'lambda'
@@ -258,7 +252,6 @@ Requires-Dist: aiorwlock; extra == 'nebius'
258
252
  Requires-Dist: aiosqlite; extra == 'nebius'
259
253
  Requires-Dist: alembic-postgresql-enum; extra == 'nebius'
260
254
  Requires-Dist: alembic>=1.10.2; extra == 'nebius'
261
- Requires-Dist: apscheduler<4; extra == 'nebius'
262
255
  Requires-Dist: asyncpg; extra == 'nebius'
263
256
  Requires-Dist: backports-entry-points-selectable; extra == 'nebius'
264
257
  Requires-Dist: docker>=6.0.0; extra == 'nebius'
@@ -270,7 +263,7 @@ Requires-Dist: nebius<0.3,>=0.2.19; (python_version >= '3.10') and extra == 'neb
270
263
  Requires-Dist: prometheus-client; extra == 'nebius'
271
264
  Requires-Dist: python-dxf==12.1.0; extra == 'nebius'
272
265
  Requires-Dist: python-json-logger>=3.1.0; extra == 'nebius'
273
- Requires-Dist: sentry-sdk[fastapi]; extra == 'nebius'
266
+ Requires-Dist: sentry-sdk[fastapi]>=2.27.0; extra == 'nebius'
274
267
  Requires-Dist: sqlalchemy-utils>=0.40.0; extra == 'nebius'
275
268
  Requires-Dist: sqlalchemy[asyncio]>=2.0.0; extra == 'nebius'
276
269
  Requires-Dist: starlette>=0.26.0; extra == 'nebius'
@@ -282,7 +275,6 @@ Requires-Dist: aiorwlock; extra == 'oci'
282
275
  Requires-Dist: aiosqlite; extra == 'oci'
283
276
  Requires-Dist: alembic-postgresql-enum; extra == 'oci'
284
277
  Requires-Dist: alembic>=1.10.2; extra == 'oci'
285
- Requires-Dist: apscheduler<4; extra == 'oci'
286
278
  Requires-Dist: asyncpg; extra == 'oci'
287
279
  Requires-Dist: backports-entry-points-selectable; extra == 'oci'
288
280
  Requires-Dist: cryptography>=44.0.3; extra == 'oci'
@@ -296,7 +288,7 @@ Requires-Dist: prometheus-client; extra == 'oci'
296
288
  Requires-Dist: pyopenssl>=23.2.0; extra == 'oci'
297
289
  Requires-Dist: python-dxf==12.1.0; extra == 'oci'
298
290
  Requires-Dist: python-json-logger>=3.1.0; extra == 'oci'
299
- Requires-Dist: sentry-sdk[fastapi]; extra == 'oci'
291
+ Requires-Dist: sentry-sdk[fastapi]>=2.27.0; extra == 'oci'
300
292
  Requires-Dist: sqlalchemy-utils>=0.40.0; extra == 'oci'
301
293
  Requires-Dist: sqlalchemy[asyncio]>=2.0.0; extra == 'oci'
302
294
  Requires-Dist: starlette>=0.26.0; extra == 'oci'
@@ -308,7 +300,6 @@ Requires-Dist: aiorwlock; extra == 'server'
308
300
  Requires-Dist: aiosqlite; extra == 'server'
309
301
  Requires-Dist: alembic-postgresql-enum; extra == 'server'
310
302
  Requires-Dist: alembic>=1.10.2; extra == 'server'
311
- Requires-Dist: apscheduler<4; extra == 'server'
312
303
  Requires-Dist: asyncpg; extra == 'server'
313
304
  Requires-Dist: backports-entry-points-selectable; extra == 'server'
314
305
  Requires-Dist: docker>=6.0.0; extra == 'server'
@@ -319,7 +310,7 @@ Requires-Dist: jinja2; extra == 'server'
319
310
  Requires-Dist: prometheus-client; extra == 'server'
320
311
  Requires-Dist: python-dxf==12.1.0; extra == 'server'
321
312
  Requires-Dist: python-json-logger>=3.1.0; extra == 'server'
322
- Requires-Dist: sentry-sdk[fastapi]; extra == 'server'
313
+ Requires-Dist: sentry-sdk[fastapi]>=2.27.0; extra == 'server'
323
314
  Requires-Dist: sqlalchemy-utils>=0.40.0; extra == 'server'
324
315
  Requires-Dist: sqlalchemy[asyncio]>=2.0.0; extra == 'server'
325
316
  Requires-Dist: starlette>=0.26.0; extra == 'server'