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. |
ManifestOptionUI |
Class for UI attributes of options 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. |
ManifestValidation |
Class for validation rules for options in the manifest. |
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
911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 |
|
from_options
classmethod
¶
from_options(
options: Options, validation: OptionsEnforcement = None
) -> Manifest
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:
|
|
The validation rules for the options. This is used to set the
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
988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 |
|
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:
|
|
Optional UI attributes for the option. This is a dictionary that can
contain additional information about how the option should be displayed
in the Nextmv Cloud UI. This is not used in the local
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.
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
ui
class-attribute
instance-attribute
¶
ui: Optional[ManifestOptionUI] = None
Optional UI attributes for the option.
ManifestOptionUI
¶
Bases: BaseModel
UI attributes for an option in the manifest.
You can import the ManifestOptionUI
class directly from cloud
:
PARAMETER | DESCRIPTION |
---|---|
|
The type of control to use for the option in the Nextmv Cloud UI. This is
useful for defining how the option should be presented in the Nextmv
Cloud UI. Current control types include "input", "select", "slider", and
"toggle". This attribute is not used in the local
TYPE:
|
|
A list of team roles to which this option will be hidden in the UI. For
example, if you want to hide an option from the "operator" role, you can
pass
TYPE:
|
Examples:
>>> from nextmv.cloud import ManifestOptionUI
>>> ui_config = ManifestOptionUI(control_type="input")
>>> ui_config.control_type
'input'
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:
|
|
Optional validation rules for all options.
|
Examples:
>>> from nextmv.cloud import ManifestOptions, ManifestOption
>>> options_config = ManifestOptions(
... strict=True,
... validation=ManifestValidation(enforce="all"),
... 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
from_options
classmethod
¶
from_options(
options: Options, validation: OptionsEnforcement = None
) -> ManifestOptions
Create a ManifestOptions
from a nextmv.Options
.
PARAMETER | DESCRIPTION |
---|---|
|
The options to convert.
TYPE:
|
|
Optional validation rules for the options. If provided, it will be
used to set the
TYPE:
|
RETURNS | DESCRIPTION |
---|---|
ManifestOptions
|
The converted options. |
Examples:
>>> from nextmv.options import Options, Option
>>> from nextmv.cloud import ManifestOptions
>>> sdk_options = Options(Option("max_vehicles", int, 5))
>>> manifest_options = ManifestOptions.from_options(sdk_options)
>>> manifest_options.items[0].name
'max_vehicles'
Source code in nextmv/nextmv/cloud/manifest.py
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.
validation
class-attribute
instance-attribute
¶
validation: Optional[ManifestValidation] = None
Optional validation rules for all options.
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:
ManifestValidation
¶
Bases: BaseModel
Validation rules for options in the manifest.
You can import the ManifestValidation
class directly from cloud
:
PARAMETER | DESCRIPTION |
---|---|
|
The enforcement level for the validation rules. This can be set to "none" or "all". If set to "none", no validation will be performed on the options prior to creating a run. If set to "all", all validation rules will be enforced on the options, and runs will not be created if any of the rules of the options are violated.
TYPE:
|
Examples:
>>> from nextmv.cloud import ManifestValidation
>>> validation = ManifestValidation(enforce="all")
>>> validation.enforce
'all'
enforce
class-attribute
instance-attribute
¶
The enforcement level for the validation rules. This can be set to "none" or "all". If set to "none", no validation will be performed on the options prior to creating a run. If set to "all", all validation rules will be enforced on the options, and runs will not be created if any of the rules of the options are violated.