Manifest Module¶
This section documents the manifest components of the Nextmv Cloud API.
manifest
¶
Module with the logic for handling an app manifest.
This module provides classes and functions for managing Nextmv app manifests. Manifest files (app.yaml) define how an application is built, run, and deployed on the Nextmv Cloud platform.
CLASS | DESCRIPTION |
---|---|
ManifestType |
Enum for application types based on programming language. |
ManifestRuntime |
Enum for runtime environments where apps run on Nextmv Cloud. |
ManifestBuild |
Class for build-specific attributes in the manifest. |
ManifestPythonModel |
Class for model-specific instructions for Python apps. |
ManifestPython |
Class for Python-specific instructions in the manifest. |
ManifestOption |
Class representing an option for the decision model in the manifest. |
ManifestOptions |
Class containing a list of options for the decision model. |
ManifestConfiguration |
Class for configuration settings for the decision model. |
Manifest |
Main class representing an app manifest for Nextmv Cloud. |
Constants
FILE_NAME Name of the app manifest file.
MANIFEST_FILE_NAME
module-attribute
¶
Manifest
¶
Bases: BaseModel
Represents an app manifest (app.yaml
) for Nextmv Cloud.
You can import the Manifest
class directly from cloud
:
An application that runs on the Nextmv Platform must contain a file named
app.yaml
which is known as the app manifest. This file is used to specify
the execution environment for the app.
This class represents the app manifest and allows you to load it from a file or create it programmatically.
PARAMETER | DESCRIPTION |
---|---|
|
The files to include (or exclude) in the app. This is mandatory.
TYPE:
|
|
The runtime to use for the app, it provides the environment in which the app runs. This is mandatory.
TYPE:
|
|
Type of application, based on the programming language. This is mandatory.
TYPE:
|
|
Build-specific attributes. The
TYPE:
|
|
A command to run before the app is pushed to the Nextmv Cloud.
This command can be used to compile a binary, run tests or similar tasks.
One difference with what is specified under build, is that the command
will be executed via the shell (i.e.,
TYPE:
|
|
Only for Python apps. Contains further Python-specific attributes.
TYPE:
|
|
A list of options for the decision model. An option is a parameter that configures the decision model.
TYPE:
|
Examples:
>>> from nextmv.cloud import Manifest, ManifestRuntime, ManifestType
>>> manifest = Manifest(
... files=["main.py", "model_logic/"],
... runtime=ManifestRuntime.PYTHON,
... type=ManifestType.PYTHON,
... )
>>> manifest.files
['main.py', 'model_logic/']
build
class-attribute
instance-attribute
¶
build: Optional[ManifestBuild] = None
Build-specific attributes.
The build.command
to run to build the app. This command will be executed
without a shell, i.e., directly. The command must exit with a status of 0
to continue the push process of the app to Nextmv Cloud. This command is
executed prior to the pre-push command. The build.environment
is used to
set environment variables when running the build command given as key-value
pairs.
configuration
class-attribute
instance-attribute
¶
configuration: Optional[ManifestConfiguration] = None
Configuration for the decision model.
A list of options for the decision model. An option is a parameter that configures the decision model.
extract_options
¶
Convert the manifest options to a nextmv.Options
object.
If the manifest does not have valid options defined in
.configuration.options.items
, this method returns None
.
RETURNS | DESCRIPTION |
---|---|
Optional[Options]
|
The options extracted from the manifest. If no options are found,
|
Examples:
>>> from nextmv.cloud import Manifest, ManifestConfiguration, ManifestOptions, ManifestOption
>>> manifest = Manifest(
... files=["main.py"],
... configuration=ManifestConfiguration(
... options=ManifestOptions(
... items=[
... ManifestOption(name="duration", option_type="string", default="10s")
... ]
... )
... )
... )
>>> sdk_options = manifest.extract_options()
>>> sdk_options.get_option("duration").default
'10s'
>>> empty_manifest = Manifest(files=["main.py"])
>>> empty_manifest.extract_options() is None
True
Source code in nextmv/nextmv/cloud/manifest.py
files
instance-attribute
¶
The files to include (or exclude) in the app. This is mandatory.
from_model_configuration
classmethod
¶
from_model_configuration(
model_configuration: ModelConfiguration,
) -> Manifest
Create a Python manifest from a nextmv.model.ModelConfiguration
.
Note that the ModelConfiguration
is almost always used in
conjunction with the nextmv.Model
class. If you are not
implementing an instance of nextmv.Model
, consider using the
from_options
method instead to initialize the manifest with the
options of the model.
The resulting manifest will have:
files
set to["main.py", f"{model_configuration.name}/**"]
runtime
set toManifestRuntime.PYTHON
type
set toManifestType.PYTHON
python.pip_requirements
set to the default requirements file name.python.model.name
set tomodel_configuration.name
.python.model.options
populated frommodel_configuration.options
.configuration.options
populated frommodel_configuration.options
.
PARAMETER | DESCRIPTION |
---|---|
|
The model configuration.
TYPE:
|
RETURNS | DESCRIPTION |
---|---|
Manifest
|
The Python manifest. |
Examples:
>>> from nextmv.model import ModelConfiguration, Options, Option
>>> from nextmv.cloud import Manifest
>>> opts = Options(Option(name="vehicle_count", option_type=int, default=5))
>>> mc = ModelConfiguration(name="vehicle_router", options=opts)
>>> manifest = Manifest.from_model_configuration(mc)
>>> manifest.python.model.name
'vehicle_router'
>>> manifest.files
['main.py', 'vehicle_router/**']
>>> manifest.configuration.options.items[0].name
'vehicle_count'
Source code in nextmv/nextmv/cloud/manifest.py
786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 |
|
from_options
classmethod
¶
Create a basic Python manifest from nextmv.options.Options
.
If you have more files than just a main.py
, make sure you modify
the .files
attribute of the resulting manifest. This method assumes
that requirements are specified in a requirements.txt
file. You may
also specify a different requirements file once you instantiate the
manifest.
The resulting manifest will have:
- files
set to ["main.py"]
- runtime
set to ManifestRuntime.PYTHON
- type
set to ManifestType.PYTHON
- python.pip_requirements
set to "requirements.txt"
.
- configuration.options
populated from the provided options
.
PARAMETER | DESCRIPTION |
---|---|
|
The options to include in the manifest.
TYPE:
|
RETURNS | DESCRIPTION |
---|---|
Manifest
|
The manifest with the given options. |
Examples:
>>> from nextmv.options import Options, Option
>>> from nextmv.cloud import Manifest
>>> opts = Options(
... Option(name="max_runtime", option_type=str, default="60s"),
... Option(name="use_heuristic", option_type=bool, default=True)
... )
>>> manifest = Manifest.from_options(opts)
>>> manifest.files
['main.py']
>>> manifest.python.pip_requirements
'requirements.txt'
>>> len(manifest.configuration.options.items)
2
>>> manifest.configuration.options.items[0].name
'max_runtime'
Source code in nextmv/nextmv/cloud/manifest.py
from_yaml
classmethod
¶
Load a manifest from a YAML file.
The YAML file is expected to be named app.yaml
and located in the
specified directory.
PARAMETER | DESCRIPTION |
---|---|
|
Path to the directory containing the
TYPE:
|
RETURNS | DESCRIPTION |
---|---|
Manifest
|
The loaded manifest. |
RAISES | DESCRIPTION |
---|---|
FileNotFoundError
|
If the |
YAMLError
|
If there is an error parsing the YAML file. |
Examples:
Assuming an app.yaml
file exists in ./my_app_dir
:
# ./my_app_dir/app.yaml
files:
- main.py
runtime: ghcr.io/nextmv-io/runtime/python:3.11
type: python
>>> from nextmv.cloud import Manifest
>>> # manifest = Manifest.from_yaml("./my_app_dir") # This would be run
>>> # assert manifest.type == "python"
Source code in nextmv/nextmv/cloud/manifest.py
pre_push
class-attribute
instance-attribute
¶
pre_push: Optional[str] = Field(
serialization_alias="pre-push",
validation_alias=AliasChoices("pre-push", "pre_push"),
default=None,
)
A command to run before the app is pushed to the Nextmv Cloud.
This command can be used to compile a binary, run tests or similar tasks.
One difference with what is specified under build, is that the command will
be executed via the shell (i.e., bash -c
on Linux & macOS or cmd /c
on
Windows). The command must exit with a status of 0 to continue the push
process. This command is executed just before the app gets bundled and
pushed (after the build command).
python
class-attribute
instance-attribute
¶
python: Optional[ManifestPython] = None
Python-specific attributes.
Only for Python apps. Contains further Python-specific attributes.
runtime
class-attribute
instance-attribute
¶
runtime: ManifestRuntime = PYTHON
The runtime to use for the app.
It provides the environment in which the app runs. This is mandatory.
to_yaml
¶
to_yaml(dirpath: str) -> None
Write the manifest to a YAML file.
The manifest will be written to a file named app.yaml
in the
specified directory.
PARAMETER | DESCRIPTION |
---|---|
|
Path to the directory where the
TYPE:
|
RAISES | DESCRIPTION |
---|---|
IOError
|
If there is an error writing the file. |
YAMLError
|
If there is an error serializing the manifest to YAML. |
Examples:
>>> from nextmv.cloud import Manifest
>>> manifest = Manifest(files=["solver.py"], type="python")
>>> # manifest.to_yaml("./output_dir") # This would create ./output_dir/app.yaml
Source code in nextmv/nextmv/cloud/manifest.py
type
class-attribute
instance-attribute
¶
type: ManifestType = PYTHON
Type of application, based on the programming language. This is mandatory.
ManifestBuild
¶
Bases: BaseModel
Build-specific attributes.
You can import the ManifestBuild
class directly from cloud
:
PARAMETER | DESCRIPTION |
---|---|
|
The command to run to build the app. This command will be executed without a shell, i.e., directly. The command must exit with a status of 0 to continue the push process of the app to Nextmv Cloud. This command is executed prior to the pre-push command.
TYPE:
|
|
Environment variables to set when running the build command given as key-value pairs.
TYPE:
|
Examples:
>>> from nextmv.cloud import ManifestBuild
>>> build_config = ManifestBuild(
... command="make build",
... environment={"DEBUG": "true"}
... )
>>> build_config.command
'make build'
command
class-attribute
instance-attribute
¶
The command to run to build the app.
This command will be executed without a shell, i.e., directly. The command must exit with a status of 0 to continue the push process of the app to Nextmv Cloud. This command is executed prior to the pre-push command.
environment
class-attribute
instance-attribute
¶
Environment variables to set when running the build command.
Given as key-value pairs.
environment_to_dict
¶
Convert the environment variables to a dictionary.
RETURNS | DESCRIPTION |
---|---|
dict[str, str]
|
The environment variables as a dictionary of string key-value pairs. Returns an empty dictionary if no environment variables are set. |
Examples:
>>> from nextmv.cloud import ManifestBuild
>>> build_config = ManifestBuild(environment={"COUNT": 1, "NAME": "test"})
>>> build_config.environment_to_dict()
{'COUNT': '1', 'NAME': 'test'}
>>> build_config_empty = ManifestBuild()
>>> build_config_empty.environment_to_dict()
{}
Source code in nextmv/nextmv/cloud/manifest.py
ManifestConfiguration
¶
Bases: BaseModel
Configuration for the decision model.
You can import the ManifestConfiguration
class directly from cloud
:
PARAMETER | DESCRIPTION |
---|---|
|
Options for the decision model.
TYPE:
|
Examples:
>>> from nextmv.cloud import ManifestConfiguration, ManifestOptions, ManifestOption
>>> model_config = ManifestConfiguration(
... options=ManifestOptions(
... items=[ManifestOption(name="debug_mode", option_type="bool", default=False)]
... )
... )
>>> model_config.options.items[0].name
'debug_mode'
ManifestOption
¶
Bases: BaseModel
An option for the decision model that is recorded in the manifest.
You can import the ManifestOption
class directly from cloud
:
PARAMETER | DESCRIPTION |
---|---|
|
The name of the option.
TYPE:
|
|
The type of the option. This is a string representation of the
TYPE:
|
|
The default value of the option.
TYPE:
|
|
The description of the option.
TYPE:
|
|
Whether the option is required or not.
TYPE:
|
|
Optional additional attributes for the option. The Nextmv Cloud may
perform validation on these attributes. For example, the maximum
length of a string or the maximum value of an integer. These
additional attributes will be shown in the help message of the
TYPE:
|
Examples:
>>> from nextmv.cloud import ManifestOption
>>> option = ManifestOption(
... name="solve.duration",
... option_type="string",
... default="30s",
... description="Maximum duration for the solver."
... )
>>> option.name
'solve.duration'
additional_attributes
class-attribute
instance-attribute
¶
Optional additional attributes for the option.
The Nextmv Cloud may perform validation on these attributes. For example,
the maximum length of a string or the maximum value of an integer. These
additional attributes will be shown in the help message of the Options
.
default
class-attribute
instance-attribute
¶
The default value of the option
description
class-attribute
instance-attribute
¶
The description of the option
from_option
classmethod
¶
from_option(option: Option) -> ManifestOption
Create a ManifestOption
from an Option
.
PARAMETER | DESCRIPTION |
---|---|
|
The option to convert.
TYPE:
|
RETURNS | DESCRIPTION |
---|---|
ManifestOption
|
The converted option. |
RAISES | DESCRIPTION |
---|---|
ValueError
|
If the |
Examples:
>>> from nextmv.options import Option
>>> from nextmv.cloud import ManifestOption
>>> sdk_option = Option(name="max_stops", option_type=int, default=100)
>>> manifest_opt = ManifestOption.from_option(sdk_option)
>>> manifest_opt.name
'max_stops'
>>> manifest_opt.option_type
'int'
Source code in nextmv/nextmv/cloud/manifest.py
option_type
class-attribute
instance-attribute
¶
option_type: str = Field(
serialization_alias="option_type",
validation_alias=AliasChoices("type", "option_type"),
)
The type of the option (e.g., "string", "int", "bool", "float).
required
class-attribute
instance-attribute
¶
Whether the option is required or not
to_option
¶
Convert the ManifestOption
to an Option
.
RETURNS | DESCRIPTION |
---|---|
Option
|
The converted option. |
RAISES | DESCRIPTION |
---|---|
ValueError
|
If the |
Examples:
>>> from nextmv.cloud import ManifestOption
>>> manifest_opt = ManifestOption(name="max_stops", option_type="int", default=100)
>>> sdk_option = manifest_opt.to_option()
>>> sdk_option.name
'max_stops'
>>> sdk_option.option_type
<class 'int'>
Source code in nextmv/nextmv/cloud/manifest.py
ManifestOptions
¶
Bases: BaseModel
Options for the decision model.
You can import the ManifestOptions
class directly from cloud
:
PARAMETER | DESCRIPTION |
---|---|
|
If strict is set to
TYPE:
|
|
The actual list of options for the decision model. An option is a parameter that configures the decision model.
TYPE:
|
Examples:
>>> from nextmv.cloud import ManifestOptions, ManifestOption
>>> options_config = ManifestOptions(
... strict=True,
... items=[
... ManifestOption(name="timeout", option_type="int", default=60),
... ManifestOption(name="vehicle_capacity", option_type="float", default=100.0)
... ]
... )
>>> options_config.strict
True
>>> len(options_config.items)
2
items
class-attribute
instance-attribute
¶
items: Optional[list[ManifestOption]] = None
The actual list of options for the decision model.
An option is a parameter that configures the decision model.
strict
class-attribute
instance-attribute
¶
If strict is set to True
, only the listed options will be allowed.
ManifestPython
¶
Bases: BaseModel
Python-specific instructions.
You can import the ManifestPython
class directly from cloud
:
PARAMETER | DESCRIPTION |
---|---|
|
Path to a requirements.txt file containing (additional) Python
dependencies that will be bundled with the app. Alternatively, you can provide a
list of strings, each representing a package to install, e.g.,
TYPE:
|
|
Information about an encoded decision model as handled via mlflow. This information is used to load the decision model from the app bundle.
TYPE:
|
Examples:
>>> from nextmv.cloud import ManifestPython, ManifestPythonModel
>>> python_config = ManifestPython(
... pip_requirements="requirements.txt",
... model=ManifestPythonModel(name="my_model")
... )
>>> python_config.pip_requirements
'requirements.txt'
model
class-attribute
instance-attribute
¶
model: Optional[ManifestPythonModel] = None
Information about an encoded decision model.
As handled via mlflow. This information is used to load the decision model from the app bundle.
pip_requirements
class-attribute
instance-attribute
¶
pip_requirements: Optional[Union[str, list[str]]] = Field(
serialization_alias="pip-requirements",
validation_alias=AliasChoices(
"pip-requirements", "pip_requirements"
),
default=None,
)
Path to a requirements.txt file.
Contains (additional) Python dependencies that will be bundled with the app.
ManifestPythonModel
¶
Bases: BaseModel
Model-specific instructions for a Python app.
You can import the ManifestPythonModel
class directly from cloud
:
PARAMETER | DESCRIPTION |
---|---|
|
The name of the decision model.
TYPE:
|
|
Options for the decision model. This is a data representation of the
TYPE:
|
Examples:
>>> from nextmv.cloud import ManifestPythonModel
>>> python_model_config = ManifestPythonModel(
... name="routing_model",
... options=[{"name": "max_vehicles", "type": "int", "default": 10}]
... )
>>> python_model_config.name
'routing_model'
options
class-attribute
instance-attribute
¶
Options for the decision model. This is a data representation of the
nextmv.Options
class. It consists of a list of dicts. Each dict
represents the nextmv.Option
class. It is used to be able to
reconstruct an Options object from data when loading a decision model.
ManifestRuntime
¶
Bases: str
, Enum
Runtime (environment) where the app will be run on Nextmv Cloud.
You can import the ManifestRuntime
class directly from cloud
:
This enum defines the supported runtime environments for applications that can be deployed on Nextmv Cloud.
ATTRIBUTE | DESCRIPTION |
---|---|
DEFAULT |
This runtime is used to run compiled applications such as Go binaries.
TYPE:
|
PYTHON |
This runtime is used as the basis for all other Python runtimes and Python applications.
TYPE:
|
JAVA |
This runtime is used to run Java applications.
TYPE:
|
PYOMO |
This runtime provisions Python packages to run Pyomo applications.
TYPE:
|
HEXALY |
This runtime provisions Python packages to run Hexaly applications.
TYPE:
|
Examples:
>>> from nextmv.cloud import ManifestRuntime
>>> runtime = ManifestRuntime.PYTHON
>>> runtime
<ManifestRuntime.PYTHON: 'ghcr.io/nextmv-io/runtime/python:3.11'>
>>> str(runtime)
'ghcr.io/nextmv-io/runtime/python:3.11'
DEFAULT
class-attribute
instance-attribute
¶
This runtime is used to run compiled applications such as Go binaries.
HEXALY
class-attribute
instance-attribute
¶
Based on the python runtime, it provisions (pre-installs) the Hexaly solver to run Python applications.
JAVA
class-attribute
instance-attribute
¶
This runtime is used to run Java applications.
PYOMO
class-attribute
instance-attribute
¶
This runtime provisions Python packages to run Pyomo applications.
PYTHON
class-attribute
instance-attribute
¶
This runtime is used as the basis for all other Python runtimes and Python applications.
ManifestType
¶
Bases: str
, Enum
Type of application in the manifest, based on the programming language.
You can import the ManifestType
class directly from cloud
:
This enum defines the supported programming languages for applications that can be deployed on Nextmv Cloud.
ATTRIBUTE | DESCRIPTION |
---|---|
PYTHON |
Python format, used for Python applications.
TYPE:
|
GO |
Go format, used for Go applications.
TYPE:
|
JAVA |
Java format, used for Java applications.
TYPE:
|
Examples: