Skip to content

flash deploy reports success for a client-mode (image=) app but provisions no endpoint #365

Description

@kbennett2000

Versions: runpod-flash 1.19.0, runpod 1.12.0, runpodctl 2.9.0-c094cac, Python 3.13.

What happens. An Endpoint declared in client mode — image= with no decorated functions — produces a build manifest with an empty resources map. flash deploy uploads the artifact, creates the app and the environment, prints ✓ deployed to production, and exits 0. No serverless endpoint is created.

Reproduce.

  1. Write an app with a single client-mode endpoint and nothing else:
# app.py
import os
from runpod_flash import Endpoint, GpuType, PodTemplate

imagegen = Endpoint(
    name="scriptorium-imagegen",
    image="ghcr.io/<owner>/<image>:<tag>",
    gpu=GpuType.NVIDIA_GEFORCE_RTX_4090,
    workers=(0, 1),
    idle_timeout=60,
    template=PodTemplate(containerDiskInGb=64,
                         containerRegistryAuthId=os.environ["RUNPOD_REGISTRY_AUTH_ID"]),
    flashboot=True,
)
  1. Deploy it:
$ flash deploy
✓ built flash-imagegen  8 files, 0 deps, 0.2 MB
No app 'flash-imagegen' found. Creating app and 'production' environment...
✓ uploaded  0.2 MB  1.5s
✓ deployed to production  1.5s
  1. Ask what was deployed:
$ flash env get production
  app     flash-imagegen
  build   cmsy0a16j000
  no resources. run flash deploy --env production

The remedy it suggests is the command that just ran.

  1. Confirm nothing exists:
$ runpodctl serverless list

No endpoint. The generated manifest (.flash/flash_manifest.json) shows why:

{
  "version": "1.0",
  "python_version": "3.12",
  "generated_at": "2026-08-18T01:50:30.695000Z",
  "project_name": "flash-imagegen",
  "resources": {},
  "function_registry": {},
  "source_fingerprint": "e0fa327a4ce42225c134a14d02dd3246f9ad42a1c4d728def119df2b53099458"
}

resources and function_registry are both empty, so the deploy has nothing to provision and reports success anyway.

Expected. Either the endpoint is provisioned, or the command says it did not provision one.

What actually provisions it. Client-mode endpoints are created lazily, inside Endpoint._ensure_endpoint_ready(), on first use. That is a reasonable design — but it is not what flash deploy reports, and a user following the deploy output has no way to learn it. Working around this needed a script that imports the app module and awaits that private method directly, which is not something a deploy path should require.

Suggestion. Either register the client-mode Endpoint as a resource so flash deploy provisions it, or detect the empty-resource case and say so — for example no deployable resources found; client-mode endpoints provision on first run() — instead of reporting a successful deployment.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions