Bring up MLflow, run CALIBER, tour the platform.
This is a copy-pasteable runbook for the current build. CALIBER runs as an MLflow application plugin with configurable local or object storage and optional real LLM providers — there is no canned demo seed to load. You bring the stack up, confirm it is healthy, and then either tour each surface of the SPA or let Aria, the embedded agentic copilot, build and test a governed artifact for you while you watch.
Prerequisites
You need a working Unix-like shell (macOS, Linux, or WSL) with the following on $PATH:
- Python 3.10–3.12 — 3.11 is recommended and is the canonical CI interpreter.
- Node ≥ 20 and npm — to build and serve the React SPA.
- Docker (optional) — needed for the suite's MinIO stack; local filesystem storage is also supported.
- git — to clone the repo.
CALIBER_LLM_PROVIDER defaults to the deterministic
fake provider. Aria's separate engine defaults to auto, preferring OpenAI when
OPENAI_API_KEY is set and otherwise Anthropic when ANTHROPIC_API_KEY is set. Export a
key and configure the relevant provider fields before treating evaluation or calibration output as real-model evidence.
1Clone & install
Clone the suite and install the plugin in editable mode with the dev and S3 extras, then install the SPA's npm dependencies:
git clone https://github.com/rrahimi-uci/caliber-suite.git
cd caliber-suite/caliber
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev,s3]"
cd caliber-ui
npm install
What that gives you:
- A
.venv/with CALIBER, MLflow (≥ 3.14), Alembic, the Starlette runtime, and the dev toolchain (pytest, ruff, mypy). - The
s3extra, which pulls in the object-storage client CALIBER uses for artifacts. - The SPA's build dependencies (Vite, React, TanStack Query) under
caliber-ui/.
make ui (from caliber/) so the server serves the SPA at /caliber/. For
live frontend development, run npm run dev in caliber-ui/ against the running backend.
This runbook assumes the built-in bundle.
2Storage & provider keys
make dev defaults MLflow artifacts to s3://mlflow/mlruns via MinIO at
http://127.0.0.1:9000, so bring that up first (the suite ships a Compose stack under
deploy/) or point the variables at your own endpoint. CALIBER workflow/file storage supports both
local filesystem and S3-compatible backends; this walkthrough uses MinIO so the object-storage surfaces are available.
Set the provider keys CALIBER should use before launching (a suite-root .env is the usual home for these):
# Real LLM provider for Aria + LLM-backed eval/calibration
export OPENAI_API_KEY=sk-... # or ANTHROPIC_API_KEY=...
# Object storage (defaults shown; override for your own endpoint)
export MLFLOW_S3_ENDPOINT_URL=http://127.0.0.1:9000
export MLFLOW_ARTIFACT_ROOT=s3://mlflow/mlruns
export AWS_ACCESS_KEY_ID=minioadmin
export AWS_SECRET_ACCESS_KEY=minioadmin
MLFLOW_ARTIFACT_ROOT to a file:// path if you only want to tour the read surfaces.
3Start MLflow with the CALIBER plugin
In this embedded walkthrough CALIBER doesn't run as a separate service. It's loaded as an MLflow application:
when the server launches with --app-name caliber, MLflow
mounts CALIBER's SPA at /caliber/ and its REST endpoints
at /ajax-api/2.0/mlflow/caliber/* on the same port,
alongside MLflow's native UI at /.
From caliber/ with the venv active, in terminal 1:
make dev
That wraps scripts/run-dev.sh, which:
- Sources
.envif present (without clobbering anything already exported). - Applies local-dev defaults: a metadata database (SQLite at
./caliber.dbunless you pointCALIBER_DATABASE_URLat Postgres), the MinIO artifact root, and a dev admin identity. - Runs
alembic upgrade headto bring the schema current. - Enables the workflow run queue, runtime approvals, and checkpointing.
- Execs
mlflow server --app-name caliberin the foreground.
The startup banner echoes the resolved configuration and the exact URLs to open:
run-dev.sh listens on 5000 by default; a suite-level
.env commonly sets MLFLOW_PORT=5001. Always use the caliber UI URL the banner
prints — the examples below use 5000 to match the script default.
4Verify the server is healthy
In a second terminal (leave make dev running in the first), hit the CALIBER health endpoint:
curl -s http://127.0.0.1:5000/ajax-api/2.0/mlflow/caliber/health | jq
The readiness endpoint reports which providers are real versus simulated — this is the same honesty signal the
SPA shows in its banner. With a provider key exported, llm should read openai or
anthropic and the simulated list should be empty (or list only the subsystems you left
on a stub):
curl -s http://127.0.0.1:5000/ajax-api/2.0/mlflow/caliber/readiness | jq .data
You can also confirm MLflow itself answered (its native UI is at /):
curl -sI http://127.0.0.1:5000/ | head -1
"status":"ok" and readiness shows your real
provider. If anything failed, jump to Troubleshooting.
5Open the SPA
In your browser, open the caliber UI URL from the startup banner:
open http://127.0.0.1:5000/caliber/ # macOS
xdg-open http://127.0.0.1:5000/caliber/ # Linux
On first load, sign in with admin / admin and immediately replace that local-only
first-boot password in Administration. The loopback launcher is the component that explicitly
enables this known credential; the product default leaves it disabled. The database starts empty — there is no demo seed in this build, so the lists are blank until you create
artifacts, either by hand on each page or by asking Aria to build them for you. The rest of this runbook walks
the SPA in sidebar order and then has Aria build a governed artifact end to end.
Dashboard · the platform at a glance
The landing page summarizes platform state — recent workflow runs, registered artifacts, and quick links into each surface. It is the jumping-off point; every count is a link into the page that owns those rows. On a fresh database it is mostly empty, which is the honest starting state for a new install.
Try this
- Open Aria from the top bar and say hello. It should greet you and explain what it can do — it does not start building anything until you express intent.
- Note the provider banner. It reflects the same
/readinesspayload you curled above.
Build · Workflows (Studio)
Workflows are the composition surface — the agentic graphs that wire prompts, tools, skills, and knowledge bases together. The Studio editor lets you build a workflow version, preview-run it, and publish it; the run views surface each run's MLflow trace, per-tool-call spans, runtime approvals, and checkpoints.
| Route | What it does |
|---|---|
/workflows | Lists workflows; create a new one or open an existing version. |
/workflows/:id/editor/:versionId | The Studio graph editor for a draft version. |
/workflows/:id | Workflow detail: versions, runs, deployment alias. |
/workflow-runs/:runId | A single run — status, trace spans, approvals, checkpoints. |
Try this
- Create a workflow, add a node or two in the editor, and use Preview run — it executes without persisting a published version.
- Enqueue a real run. With the run queue enabled, it lands in the queue and streams status; open the run to inspect its trace.
Libraries · Prompts, Tools, Skills, MCP Servers
The Library supplies what Build composes. Each library resource is its own versioned asset with a "pytest-for-an-asset" workspace — a status header, stage tabs, and durable test runs with baseline/diff — so you can develop and verify a prompt, tool, or skill in isolation before a workflow ever uses it.
Prompts
/prompts — immutable prompt drafts backed by MLflow's Prompt Registry, with a per-prompt test workspace. Saving never changes a live alias; promotion is a separate durable release operation with recovery for ambiguous provider outcomes.
Tools
/tools, /tools/:id — tool definitions runnable in a subprocess sandbox; test a draft against inputs before publishing.
Skills
/skills, /skills/:id — named capabilities with selection logic; preview which skills resolve for a given input.
MCP Servers
/mcp-servers — registered Model Context Protocol servers, including the first-party database server, exposed as tools.
Try this
- Create or edit a prompt and save a draft, then explicitly choose Save & promote when you intend to move the live alias.
- Open a tool's workspace and run its draft in the sandbox against a sample input — the run is recorded and diffable against a baseline.
- On a skill, use the selection preview to see which skills a given user message would pull in.
Knowledge · Knowledge Base & Object Store
These pages are the data plane — the grounding sources agents retrieve over. Knowledge bases provide hybrid retrieval; the object store is the file UI over the S3-compatible bucket.
Knowledge Base
/knowledge-bases — versioned KBs with hybrid search (BM25 + dense RRF, tri-hybrid with graph) and calibration metrics (Recall@k, nDCG@k, faithfulness, answer-correctness).
File Directory
/object-store — the file UI over configured local or S3-compatible directories.
Try this
- Upload a file in the Object Store and confirm it lands in the bucket (MinIO console or
aws s3 ls).
Evaluate · Test Sets, Judges & Evaluations
The evaluate group is the scoring plane: curate datasets, define how to judge, then run and inspect scores. Test sets are the datasets every scored run draws from; judges are custom LLM rubrics; evaluations run a test set through scorers and persist per-example results.
Test Sets
/eval-datasets — evaluation datasets of {input, expected} examples, versioned, that scorers run against; one-click Sync to MLflow pushes them to MLflow's native dataset registry.
Judges
/judges — reusable custom LLM judges built via mlflow.genai.make_judge (NL rubrics over inputs/outputs/expectations), used by calibration/optimization and by-hand review (not selectable on the Evaluations page, which exposes only deterministic scorers).
Evaluations
/evaluations, /evaluations/:runId — run a dataset through scorers, inspect per-example results, compare runs, and add a trace to a dataset.
Try this
- Create a small test set, then click Sync to MLflow and watch the row's badge flip to Synced.
- Author a Judge with a one-line rubric (it becomes available to calibration and optimization), then run a small Evaluations pass over your test set with the built-in graders and open the result for per-example scores.
Observe · Observability & Review Queues
The observe surfaces close the loop on what actually happened at runtime. Observability is the trace view over MLflow tracing; Review Queues add structured human review of those traces on top of MLflow 3.14's assessment primitives.
Observability
/observability — traces and per-tool-call spans for workflow runs, wired to MLflow tracing (document-extraction spans carry the source file as a multimodal attachment).
Review Queues
/review-queues — define review questions, enqueue traces, and review them; answers write back onto each trace as MLflow assessments and expectations.
Try this
- Open a workflow run's trace and inspect the per-tool-call spans (and any attached source documents).
- Create a Review Queue with a pass/fail question, enqueue a trace, and review it — the answer lands back on the trace.
Platform · LLM Gateway & Settings
The platform group is configuration and discovery. The Gateway page surfaces an external MLflow AI Gateway when one is configured (it is discovery and visibility, not a CALIBER-owned gateway). Settings is the grouped, safe-to-display inventory of runtime configuration.
LLM Gateway
/gateway — visibility into a configured external MLflow AI Gateway; routing is opt-in via CALIBER_LLM_BASE_URL.
Settings
/settings — grouped inventory: assistant, LLM, storage, security, worker, webhook, and sandbox configuration, plus the provider posture.
Try this
- Open Settings and find the assistant group — it shows the resolved engine (
auto→ your real provider) and model. - Confirm the storage group reflects the object-storage endpoint you configured.
Build with Aria · the agentic copilot
Aria is the embedded copilot, available from the top bar on every page. On OpenAI and Claude it runs a real
tool-calling loop: within one turn it reads live CALIBER state, executes and observes real capabilities, and
iterates before it answers. It supports interaction modes (chat, build,
plan), approval modes (manual, auto_safe, auto_all), context
attachments, a message queue, and steering — the same affordances a code assistant gives you.
Modes
chat talks, plan outlines, build materializes drafts. Aria only authors artifacts in build.
Approvals
The approval mode controls admitted synchronous work through validation and testing. Draft approval and publication remain explicit human actions in the lifecycle UI/API.
Permissioned tools
Read tools in every mode; reversible/sandboxed tools in build + auto_safe; admitted mutations and real runs in build + auto_all. Approval and publication are withheld from the synchronous toolset.
Transparency
Each turn records the tool calls it executed and a compact process-steps trail, so you can see exactly what Aria did.
Run, observe, fix · an end-to-end turn
Put Aria in build mode with auto_safe approvals and ask it to build a small tool. A
single turn typically reads the relevant registry, drafts the artifact, validates it, and runs it in the
sandbox — then reports what it observed, all before handing control back to you.
Switch the approval mode to auto_all when a turn needs admitted mutations or real runs. Aria still
cannot approve or publish a draft inside that synchronous turn; a human advances those lifecycle gates. Every
admitted action is recorded in the message's tool-call trail, so the autonomy remains bounded and auditable.
/aria/plans) walks a durable plan and does pause for an
approve/deny interaction — with separation of duties on gated steps — then resumes where it stopped.
What you just ran — the receipt
To pin it down in one place, by the end of this runbook you have:
- Brought up MLflow with the CALIBER plugin co-resident at
/caliber/, against the configured storage backend. - Confirmed via
/healthand/readinesswhich services are healthy and which providers are real or simulated. - Toured every SPA surface in sidebar order: Dashboard, Workflows, the Library, the data plane, the observe surfaces, and Platform.
- Used Aria's agentic loop to draft, validate, sandbox-test, and (optionally) publish a governed artifact — with every action recorded.
Everything Aria did this session is visible in the message's tool-call trail and persisted in the assistant tables. Artifact changes flow through the same validate → test → approve → publish gates as a manual edit, so there is no Aria-specific bypass to audit separately.
Reset the database
There is no demo seed to re-run — state is whatever you (or Aria) created. To start from a clean schema, stop the server and drop the metadata database, then let Alembic rebuild it:
# Stop terminal 1 (Ctrl-C), then, for the default SQLite metadata DB:
rm -f caliber.db caliber.db-wal caliber.db-shm
make dev # alembic re-creates the schema; the database is empty
If you're on Postgres, drop and recreate the CALIBER database (or its schema) instead, then run
make dev so Alembic migrates the fresh database to head. Object-storage artifacts live in the
bucket independently — clear the bucket separately if you want a truly clean slate.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
pip install fails on a build wheel |
Python outside 3.10–3.12, or missing build tools | python3 --version; install Python 3.11 via pyenv or your package manager |
/health returns 404 |
Server started without --app-name caliber |
Use make dev, not a raw mlflow server |
Readiness shows llm: fake / Aria won't build |
No provider key exported, so auto can't resolve a real engine |
Export OPENAI_API_KEY or ANTHROPIC_API_KEY before make dev and restart |
| MinIO / S3 shows not configured; artifact writes fail | Object storage endpoint or credentials not reachable | Start the suite MinIO stack, or set MLFLOW_S3_ENDPOINT_URL, MLFLOW_ARTIFACT_ROOT, and the AWS credential variables |
| UI deep link returns 404 | Hitting the Vite dev server with the wrong base, or the bundle isn't built | Open the caliber UI URL from the banner, or run make ui to build the bundle into the package |
| Aria starts building on "hello" | Stale build — the current engine is intent-aware and greets without authoring | Confirm you're on the current build; Aria only authors on explicit build intent or an active authoring flow |
If you hit something not on this table, capture the output of
curl -s http://127.0.0.1:5000/ajax-api/2.0/mlflow/caliber/readiness — that payload tells us which
providers are real versus simulated in one shot.