Skip to main content
Ship a package that registers under the praisonai.deploy.providers entry-point group and praisonai deploy will list, validate, and run it just like a built-in.

Quick Start

1

Write a provider class

Implement the five methods and accept a CloudConfig in __init__.
2

Register it in pyproject.toml

3

Install and verify

4

Use it in agents.yaml

5

Deploy


How It Works

praisonai deploy validates the provider name against the registry, then resolves your class and calls its hooks.

The Provider Contract

Return the same models the built-in providers return. Signatures below match praisonai_deploy/providers/base.py.
Subclass praisonai_deploy.providers.BaseProvider to inherit the abstract contract and let Python flag any method you forget to implement.

Built-in provider names are protected. Publishing an entry point whose name (case-insensitive) matches a built-in deploy provider — aws, azure, gcp, fly, railway, render — is skipped, and the built-in is kept (a DEBUG line notes the collision). The rule applies whether the deploy registry comes from praisonai-code (guard from PR #4176) or from a standalone praisonai-deploy install (guard from PR #4184). Use runtime CloudProviderRegistry.default().register("aws", …, override=True) for a deliberate override. See Plugin Precedence.

Runtime Registration

For tests or notebooks that can’t install a package, register the class directly on the shared registry.

Validation Behavior

Provider names are normalised with .strip().lower(), so HETZNER, hetzner, and " hetzner " all resolve. Unknown names raise ValueError: Invalid cloud provider: X. Must be one of: …, where the list comes from the registry. Built-ins keep their enum identity (config.provider is CloudProvider.AWS); plugin providers are normalised strings.

Common Patterns

Deploy programmatically with a plugin provider.
List every provider for deploy doctor-style tooling.
Read DeployStatus.provider on a result from a plugin.

Best Practices

Return the same DeployResult, DeployStatus, and DestroyResult models the built-ins return, so any tool that parses DeployStatus keeps working.
No credentials means a DoctorCheckResult(passed=False, ...). A report where every check passes should guarantee a deploy can start.
Use a vendor-prefixed name like acme-hetzner to avoid collisions with other plugins.
A built-in name (aws, azure, gcp, fly, railway, render) is reserved — an entry point matching one is skipped, not honoured. Ship acme-aws instead, or use runtime register(..., override=True) when overriding a built-in is deliberate.

Overview

Deploy types and providers

CLI Reference

Every praisonai deploy subcommand

Python API

Deploy class and programmatic APIs

Config Reference

Every DeployConfig field and default