Review and repair an environment#

This tutorial treats an environment change as a review sequence. You will check the input locally, diagnose an infeasible pin, apply a suggested relaxation, compare two feasible results, and trace one transitive dependency.

Start a local server#

Use the latest-release installation from Quick start, then run the HTTP API in one terminal:

conda presto --serve

Set its URL in another terminal:

export CONDA_PRESTO_URL=http://127.0.0.1:8000
curl -sS "$CONDA_PRESTO_URL/health"

Check input quality#

Preflight checks syntax and local policy without contacting channels or running the solver:

curl -sS "$CONDA_PRESTO_URL/preflight" \
  --json '{
    "specs": ["python=3.13", "numpy", "numpy"],
    "channels": ["conda-forge"]
  }' | jq

The duplicate dependency produces a finding. A successful preflight means the request is well formed. It does not mean that the request can be solved.

Ask for a bounded repair#

Submit an intentionally unavailable exact version:

curl -sS "$CONDA_PRESTO_URL/repair?max_suggestions=2" \
  --json '{
    "specs": ["python==99", "numpy"],
    "channels": ["conda-forge"],
    "platforms": ["linux-64"]
  }' > repair.json

jq '{feasible, diagnosis, suggestions, completion_reason}' repair.json

Repair considers deterministic, single-spec relaxations. For this request it can suggest replacing python==99 with python. Every returned suggestion has already solved on every requested platform.

conda-presto does not apply the change. Copy an acceptable suggestion into a new request and resolve it normally:

curl -sS "$CONDA_PRESTO_URL/resolve" \
  --json '{
    "specs": ["python", "numpy"],
    "channels": ["conda-forge"],
    "platforms": ["linux-64"]
  }' | jq '.[0] | {platform, error}'

Compare two feasible revisions#

Compare a Python 3.12 baseline with the relaxed request:

curl -sS "$CONDA_PRESTO_URL/diff" \
  --json '{
    "from": {"specs": ["python=3.12", "numpy"], "channels": ["conda-forge"]},
    "to": {"specs": ["python", "numpy"], "channels": ["conda-forge"]},
    "platforms": ["linux-64"]
  }' | jq '.diff["linux-64"]'

The response separates added, removed, and changed packages. Diff reports what the two resolved environments contain, not whether the change is desirable.

Trace a transitive dependency#

Ask why libzlib is present in the selected Python environment:

curl -sS "$CONDA_PRESTO_URL/explain" \
  --json '{
    "package": "libzlib",
    "specs": ["python"],
    "channels": ["conda-forge"],
    "platforms": ["linux-64"]
  }' | jq

Each returned chain starts at a requested package and ends at libzlib. complete: false means the bounded local graph could not account for every edge.

Finish with an exported result#

After accepting the input, write a lockfile from the same request:

curl -sS "$CONDA_PRESTO_URL/resolve?format=pixi-lock-v6" \
  --json '{
    "specs": ["python", "numpy"],
    "channels": ["conda-forge"],
    "platforms": ["linux-64"]
  }' > pixi.lock

What you learned#

  • Preflight checks local input quality, not satisfiability.

  • Repair returns tested suggestions but never changes the request automatically.

  • Diff compares resolved package states.

  • Explain traces why one selected package is present.

For task recipes, see Inspect and compare environments. The design boundaries are explained in Environment review model.