Skip to content

Deploy a model

A deployment is solver code plus data, deployed under a name. Once it exists, anyone in your company can create a project from <company>/<name> and start solving.

The server expects two trees. The solver reads ../data/ at solve time, so the same solver can run against a different dataset.

  • Directoryrun/
    • pyproject.toml the solver package’s own metadata
    • run.py
    • Directorysrc/
      • Directorysolver/
        • **/*.py
  • Directorydata/
    • instances.json
    • distances.csv

checkDeployment validates this server-side and reports what is missing.

aura deploy reads a [tool.aura.deployment.<name>] table, normally in the model folder’s own pyproject.toml — the file that lands as run/pyproject.toml. Build backends ignore unknown tool tables, so the config travels with the artifact without affecting it.

pyproject.toml
[tool.aura.deployment.vrp]
model_folder = "." # uploaded under run/ (default ".")
data_folder = "../define/data" # uploaded under data/ (required)
include = ["pyproject.toml", "run.py", "src/solver/**"]
data_include = ["**"]
exclude = ["notes/**", "personal_infos.txt"]
Terminal window
aura init # scaffold the section above
aura deploy --dry-run # print exactly what would upload, change nothing
aura deploy # upload
aura deployment check # server-side run contract

Several deployments may live in one pyproject.toml; aura deploy <name> picks one, and the name is optional when only one is defined. aura deploy searches upward from the current directory for a pyproject.toml carrying a [tool.aura] table, or takes --config <path>.

include and data_include are glob lists relative to their folder; exclude applies to both and wins over include.

include = ["pyproject.toml", "run.py", "README.md", "src/solver/**"]
data_include = ["*.csv", "instances/**"]
exclude = ["**/scratch/**", "notes.md"]

Built-in excludes always apply on top: dot-prefixed files and directories (.git, .venv, .env, …), __pycache__, node_modules, dist, venv, *.pyc. The server additionally rejects dot-prefixed and executable paths.

Preview what would upload:

Terminal window
aura deploy --dry-run

Shipping the agent’s instructions with it

Section titled “Shipping the agent’s instructions with it”

Two optional config keys travel with the same aura deploy, describing how the agent should operate the model rather than what it is:

pyproject.toml
[tool.aura.deployment.vrp]
data_folder = "../define/data"
agents_md = "../agent-config/AGENTS.md"
skills_folder = "../agent-config/skills"

Keep both outside model_folder — with the default model_folder = "." and include = ["**"], anything beside the solver also uploads under run/. Instructions and skills covers what to write in them.

Remote run/ and data/ are made to match your local folders: after the uploads, remote files no longer present locally are removed, so renames and deletions leave nothing stale. If an upload fails, the sync stops without pruning.

That is aura deploy. The SDK helpers, deployFromFolder and deploy_from_folder, upload and nothing else — a file renamed or deleted locally keeps its old copy on the server. To sync from the SDK, diff listFiles / list_files against your folder and delete what is missing locally, or deploy with the CLI.

Agent config syncs only where you declared it: omitting agents_md or skills_folder leaves whatever is already uploaded alone rather than deleting it, while declaring a key makes the local tree authoritative and prunes remote entries missing locally.

  1. Check it is runnable:

    Terminal window
    aura deployment check vrp
  2. Create a project from the handle, <company>/<name>:

    Terminal window
    aura project create acme/vrp --name "vrp demo"
  3. Chat with it, or give the agent instructions and skills for operating it first.