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 matchpraisonai_deploy/providers/base.py.
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.deploy doctor-style tooling.
DeployStatus.provider on a result from a plugin.
Best Practices
Return the built-in shapes
Return the built-in shapes
Return the same
DeployResult, DeployStatus, and DestroyResult models the built-ins return, so any tool that parses DeployStatus keeps working.Fail closed in doctor()
Fail closed in doctor()
No credentials means a
DoctorCheckResult(passed=False, ...). A report where every check passes should guarantee a deploy can start.Prefix the entry-point name with your vendor
Prefix the entry-point name with your vendor
Use a vendor-prefixed name like
acme-hetzner to avoid collisions with other plugins.Prefer a vendor-prefixed name over a built-in
Prefer a vendor-prefixed name over a built-in
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.Related
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

