This guide walks you through installing Noēsis and running your first observable episode.
Prerequisites
- Python 3.12 or later
uv package manager (recommended) or pip
Before running commands, set any LLM adapter or model provider environment variables (keys, endpoints). Noēsis reads them at runtime.
Installation
If you’re trying Noēsis while it’s still pre-release, start with From source (preferred).
From source (preferred)
uv (when PyPI is live)
pip (when PyPI is live)
git clone https://github.com/saraeloop/noesis.git
cd noesis
uv tool install .
# or: pipx install .
Source-first is recommended while the PyPI release is pending.
Run your first episode
Run a baseline episode
Execute a simple episode using the CLI:This prints and stores the episode ID (for example, ep_abc123) and creates artifacts in the ./runs directory, relative to where you run the command. List recent episodes
View your episodes in a table:Add -j for JSON output when scripting. Inspect the results
View the episode summary and insight metrics:noesis show "$EP_ID"
noesis insight "$EP_ID"
Using Python
You can also run episodes programmatically:
import noesis as ns
# Run an episode
episode_id = ns.run("Draft a weekly engineering update", intuition=True)
# Read the summary
summary = ns.summary.read(episode_id)
print(f"Success: {summary['metrics']['success']}")
# Read the event timeline
events = list(ns.events.read(episode_id))
for event in events:
print(f"{event['phase']}: {event.get('payload', {})}")
Inspect artifacts
Every episode creates a structured artifact directory (written under ./runs by default, relative to where you run the command):
runs/
demo/ # label (configurable)
ep_abc123/ # episode id
summary.json # metrics, outcome, cross-links
state.json # current plan and episode state
events.jsonl # timeline with causal IDs
manifest.json # SHA-256 + size ledger
learn.jsonl # optional learning payloads
Use jq for pretty-printing JSON artifacts: cat runs/demo/ep_abc123/summary.json | jq .To change the artifact location, set NOESIS_RUNS_DIR or in Python call ns.set(runs_dir="./my-runs").
What’s next?