Skip to content

Issue on docs: Title: VastAI.create_instance docs reference ssh=True/direct=True kwargs, but only create_template actually handles them #143

Description

@saintbarber

Path: /sdk/python/reference/create-instance

Environment

  • vastai 1.0.13
  • Python 3.14

Summary

The published docs for the Python SDK's create_instance (docs.vast.ai/sdk/python/reference/create-instance) suggest that ssh=True and direct=True can be passed as kwargs. In vastai==1.0.13 they're not handled by create_instance, they only get translated to the API's runtype field on create_template. Calling create_instance(..., ssh=True, direct=True) therefore does nothing useful (the kwargs are forwarded to instances.create_instance, which has no ssh/direct parameter).

Issue

The docs imply that create_instance accepts ssh=True, direct=True to provision an instance with a direct SSH port; without needing a template_hash.

What the SDK actually does:

vastai/sdk.py line 73

def create_instance(self, id: int, image: Optional[str] = None, disk: float = 10, **kwargs) -> dict:
        """Create a new instance from a contract offer ID."""
        return instances.create_instance(self.client, id, image=image, disk=disk, **kwargs)

The lower-level instances.create_instance has a fixed parameter list (no ssh, no direct), so the kwargs are either ignored or raise TypeError depending on what's passed.

vastai/api/instances.py line 71

def create_instance(client: VastClient, id, image=None, disk=10, env=None, price=None,
                    label=None, extra=None, onstart_cmd=None, login=None,
                    python_utf8=False, lang_utf8=False, jupyter_lab=False,
                    jupyter_dir=None, force=False, cancel_unavail=False,
                    template_hash=None, user=None, runtype=None, args=None,
                    volume_info=None) -> dict:

By contrast, create_template does translate the friendly kwargs:

vastai/sdk.py line 796

def create_template(self, **kwargs) -> dict:
        """Create a new template.

        Accepts user-friendly kwargs (jupyter, ssh, direct, login, etc.)
        and translates them to the API parameters.
        """
        jupyter = kwargs.pop("jupyter", False)
        ssh = kwargs.pop("ssh", False)
        direct = kwargs.pop("direct", False)
        login = kwargs.pop("login", None)
        hide_readme = kwargs.pop("hide_readme", False)
        public = kwargs.pop("public", False)
        jupyter_lab = kwargs.pop("jupyter_lab", False)
        # Remove kwargs not accepted by offers.create_template
        kwargs.pop("search_params", None)
        kwargs.pop("no_default", None)

        jup_direct = jupyter and direct
        ssh_direct = ssh and direct
        use_ssh = ssh or jupyter
        runtype = "jupyter" if jupyter else ("ssh" if ssh else "args")

And the CLI does the same translation for --ssh/--direct in get_runtype, feeding the resulting magic string into runtype on the instance-create request:

vastai/cli/commands/instances.py line 101

  elif args.ssh:
      runtype = 'ssh_direc ssh_proxy' if args.direct else 'ssh_proxy'

So the API path exists and the translation logic exists, it just isn't applied at the SDK's create_instance boundary.

The workaround I found is to simply provide the create_instance method the runtype parameter as it would with the CLI like so:

my own code

result = self.vast.create_instance(
            id=id,
            label=label,
            image=self.create_settings.get("image"),
            runtype="ssh_direc ssh_proxy",
            # direct=True,
            # ssh=True,
            disk=self.create_settings.get("disk", _DEFAULT_DISK),  # GB
        )

Reproduce Issue

from vastai import VastAI
v = VastAI(api_key="...")
v.create_instance(id=<offer_id>, image="vastai/base-image", ssh=True, direct=True)
# Does not produce an SSH-enabled instance; the ssh/direct kwargs are not
# translated. A template_hash or an explicit runtype="ssh_direc ssh_proxy"
# is required to actually get SSH+direct.

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