Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: dstackai/dstack
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 0.22.1
Choose a base ref
...
head repository: dstackai/dstack
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 0.22.2
Choose a head ref
  • 20 commits
  • 156 files changed
  • 9 contributors

Commits on Sep 21, 2026

  1. Refactor dstack for dstack Factory extension (#4303)

    * Parametrize register_routes with the statics package
    
    Lets extending servers reuse the statics mount and 404 handler
    instead of copying them.
    
    * Rename the factory UI flavor to enterprise
    
    * Add register_plugin extension point
    
    Lets extending servers register plugins that survive load_plugins, which
    replaces the plugin list from the server config.
    
    * Read the active Alembic config on each migration invocation
    
    * Add Factory UI flavor and shared provider-aware login
    r4victor authored Sep 21, 2026
    Configuration menu
    Copy the full SHA
    c7945c5 View commit details
    Browse the repository at this point in the history

Commits on Sep 22, 2026

  1. [Website] Updated product pages (#4304)

    * [Website] Update dstack Sky page
    
    * [Website] Enable React Router transition flag
    
    * [Website] Use thinner product selection outline
    
    * [Website] Align product links and docs hover states
    
    * [Website] Add product popup hover feedback
    
    * [Docs] Open dstack Sky in a new tab
    
    * [Website] Clarify dstack Sky hero description
    
    * [Website] Swap dstack Sky hero and marketplace titles
    
    * [Website] Refine dstack Sky marketplace heading
    
    * [Website] Shorten dstack Sky hero description
    
    * [Website] Align dstack Sky metadata and product copy
    
    * [Website] Refine hero copy and Get started links
    
    * [Website] Add dstack Factory landing page
    
    * [Website] Trim contributor notes
    
    ---------
    
    Co-authored-by: Andrey Cheptsov <[email protected]>
    peterschmidt85 and Andrey Cheptsov authored Sep 22, 2026
    Configuration menu
    Copy the full SHA
    3c0d048 View commit details
    Browse the repository at this point in the history

Commits on Sep 24, 2026

  1. Fix GCP a3-edgegpu-8g and a3-highgpu-8g (#4307)

    Upgrade the COS image used for these instance
    types to the currently
    [recommended](https://docs.cloud.google.com/compute/docs/gpus/gpudirect#create-high-edge-instances)
    `cos-121-lts` family that comes with a GLIBC
    version (2.37) compatible with `dstack-shim`.
    jvstme authored Sep 24, 2026
    Configuration menu
    Copy the full SHA
    40772a9 View commit details
    Browse the repository at this point in the history
  2. Fix errors in service router worker sync (#4305)

    * Fixed two `DetachedInstanceError` due to missing `RunModel.run_name`
      and `JobModel.job_name`.
    * Fixed `Could not fetch server_info for worker ...: ReadError('')`
      logged as an error with a traceback, repeating until the worker is
      ready. An SSH tunnel to a port nobody listens on yet fails with
      `httpx.ReadError`, so this is the normal startup path. Both
      `_probe_http_worker()` and `_get_router_workers()` now catch
      `httpx.RequestError` and log it at the debug level.
    
    Also:
    
    * `_get_router_workers()` returns `None` instead of `[]` when the
      response cannot be read. `[]` means "the router has no workers", so
      an unexpected status, an unparsable body, or a missing `workers` key
      made the sync re-register every worker.
    * Bare `except Exception` clauses are replaced with the exceptions
      actually expected, so a programming error is no longer reported as
      an unready replica. `sync_router_workers_for_run_model()` logs such
      errors itself instead of letting them escape to the pipeline worker,
      which leaves the sync row locked until the lock expires.
    * `_get_worker()` takes the replica address instead of two pre-built
      URLs, and each probe builds the URL it registers the worker under.
      `_get_http_worker()`, `_get_grpc_worker()`, and
      `_discover_grpc_server_info()` are folded into loops over the
      connection modes and the runtime types to probe.
    
    Fixes: #4300
    un-def authored Sep 24, 2026
    Configuration menu
    Copy the full SHA
    39b28c2 View commit details
    Browse the repository at this point in the history
  3. Configuration menu
    Copy the full SHA
    e3705ce View commit details
    Browse the repository at this point in the history
  4. Configuration menu
    Copy the full SHA
    fdfce0a View commit details
    Browse the repository at this point in the history

Commits on Sep 25, 2026

  1. Configuration menu
    Copy the full SHA
    7160f6b View commit details
    Browse the repository at this point in the history
  2. Don't require probes to pass in router worker sync (#4313)

    The sync only picked up router and worker jobs with
    `JobModel.ready`, i.e. with all probes passed. A router probe
    that depends on registered workers, such as `/health_generate`,
    never passed, since workers are only registered once the router
    is picked up, so the service deadlocked.
    
    The sync now takes all running jobs, filtered by `job_num == 0`
    instead. Workers are registered once the sync's own check
    (`/server_info` or `GetServerInfo`) reports them ready, so
    `probes` can no longer delay worker registration. As probes are
    configured per service, not per replica group, such gating only
    worked when the router and workers share the transport and API.
    
    The `job_num == 0` condition is a no-op for now, as services
    don't support multi-node replicas. Previously, it was implied by
    `ready`, which is only set for the first node.
    
    Fixes: #4310
    Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>
    un-def and claude authored Sep 25, 2026
    Configuration menu
    Copy the full SHA
    229f535 View commit details
    Browse the repository at this point in the history

Commits on Sep 28, 2026

  1. Polish landing pages (#4319)

    Co-authored-by: Andrey Cheptsov <[email protected]>
    peterschmidt85 and Andrey Cheptsov authored Sep 28, 2026
    Configuration menu
    Copy the full SHA
    9204e15 View commit details
    Browse the repository at this point in the history
  2. Configuration menu
    Copy the full SHA
    8d9559a View commit details
    Browse the repository at this point in the history

Commits on Sep 29, 2026

  1. Sync workers with every running router (#4320)

    During a rolling deployment, the replacement router runs alongside
    the old one, but the worker sync only picked the first running router
    job, which is always the old one. The replacement had no workers
    until the old router was scaled down and could not serve requests
    routed to it.
    
    The sync now reads the workers of every running router, probes the
    workers once, and updates each router that is out of sync, so an
    unreachable router no longer blocks the others. Router tunnels are no
    longer held while workers are probed, which may take minutes: each
    router is read first, and connected to again only if it needs an
    update, re-reading its workers before applying the changes.
    
    Also:
    
    * `_Worker` is renamed back to `_TargetWorker`, its fields are typed
      after SMG's `WorkerSpec`, and `_add_worker_to_router()` sends it as
      the `POST /workers` body as is.
    
    Fixes: #4315
    Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>
    un-def and claude authored Sep 29, 2026
    Configuration menu
    Copy the full SHA
    6e36024 View commit details
    Browse the repository at this point in the history
  2. Restore model probe for service routers (#4322)

    Since #4270, a router replica of a service with `model` and no
    `probes` was probed with `GET /health` instead of the chat completions
    request. The latter deadlocked: the router only answers it once
    workers are registered, and the worker sync skipped routers that were
    not ready. #4313 dropped the readiness check from the sync, so this
    deadlock is gone.
    
    `/health` passes before the router has any workers. In a rolling
    deployment, the replacement router was considered ready, and the old
    one was scaled down, before the replacement could serve requests. Now
    that #4320 syncs workers with every running router, the replacement
    passes the chat completions probe once it has workers.
    
    Workers behind a router still get no default probe, as they may not
    serve HTTP at all (gRPC workers).
    
    With a Dynamo router, a router rolling deployment now waits for the
    replacement indefinitely instead of scaling down the old router, as
    workers stay attached to the old router's etcd/NATS. Such deployments
    were broken before as well and are to be fixed separately.
    
    Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>
    un-def and claude authored Sep 29, 2026
    Configuration menu
    Copy the full SHA
    f3de2e5 View commit details
    Browse the repository at this point in the history
  3. [Presets] Update system_prompt for router usage (#4294)

    * [Presets] Update system_prompt.md for router usage
    
    * Resolve Review Comments
    
    * Require router on cluster fleets with a CPU-only instance
    
    ---------
    
    Co-authored-by: Bihan  Rana
    Bihan authored Sep 29, 2026
    Configuration menu
    Copy the full SHA
    85886c4 View commit details
    Browse the repository at this point in the history
  4. Configuration menu
    Copy the full SHA
    e7eb5f0 View commit details
    Browse the repository at this point in the history
  5. [UI] Fix job metrics tab (#4324)

    Previously, all jobs displayed metrics for replica_num=0
    un-def authored Sep 29, 2026
    Configuration menu
    Copy the full SHA
    a3496d2 View commit details
    Browse the repository at this point in the history

Commits on Sep 30, 2026

  1. Configuration menu
    Copy the full SHA
    deac309 View commit details
    Browse the repository at this point in the history
  2. Apply DSTACK_SERVICE_CLIENT_TIMEOUT to gateway nginx and app (#4327)

    * Apply DSTACK_SERVICE_CLIENT_TIMEOUT to gateway nginx and app
    
    The server now passes the timeout to gateways on service and entrypoint
    registration. The default is raised from 60 to 300 seconds to match the
    previous nginx timeout.
    
    * Fix docstrings
    
    * Clean up tests
    r4victor authored Sep 30, 2026
    Configuration menu
    Copy the full SHA
    878efad View commit details
    Browse the repository at this point in the history
  3. Add Daytona backend (#4321)

    * Add Daytona backend
    
    * Shorten Daytona volume documentation
    
    * Validate Daytona API key permissions
    
    Document required permissions and remove redundant Daytona tests.
    
    * Pin gpuhunt 0.1.31
    
    * Clarify Daytona volume sharing
    
    * Clarify Daytona volume documentation
    
    * Clean up Daytona docs, timeouts, and tests
    
    ---------
    
    Co-authored-by: Andrey Cheptsov <[email protected]>
    peterschmidt85 and Andrey Cheptsov authored Sep 30, 2026
    Configuration menu
    Copy the full SHA
    1284826 View commit details
    Browse the repository at this point in the history

Commits on Oct 1, 2026

  1. Pin Nebius spot price at provisioning time (#4328)

    Starting October 8, Nebius is introducing Dynamic
    Spot pricing for preemptible VMs. The price can
    change for existing instances during their
    lifetime.
    
    To prevent the price from increasing above the one
    `dstack` shows, `dstack` now caps the price at its
    current value at provisioning time using a pricing
    policy. If the price grows above the cap, the
    instance is interrupted by Nebius. The actual
    price may still drop below the one `dstack` shows.
    
    Preemptible L40S is still sold at a flat rate and
    is exempt from pricing policies.
    
    Full support for Nebius Dynamic Spot pricing
    (tracking the current price and showing it in
    `dstack`, user-specified caps, etc.) may be added
    later upon request.
    jvstme authored Oct 1, 2026
    Configuration menu
    Copy the full SHA
    4faf0ba View commit details
    Browse the repository at this point in the history
  2. Add OCI experimental_instance_types setting (#4329)

    Add an OCI backend setting that accepts a list of
    shape names to allow provisioning in addition to
    the standard supported instance families. Only
    works for shapes included in `dstack`'s pricing
    catalog (`gpuhunt`).
    
    This setting can be used to test various shapes
    that were not yet tested internally at `dstack`.
    
    ```yaml
    experimental_instance_types: [BM.GPU.RTXPRO.8]
    ```
    jvstme authored Oct 1, 2026
    Configuration menu
    Copy the full SHA
    70c2616 View commit details
    Browse the repository at this point in the history
Loading