Skip to content

Quickstart¤

This page gets you from a fresh checkout to a running skill.

Install¤

Quick install with curl:

curl -fsSL https://cantorindustries.com/jdsl-py/install.sh | bash

Requires Python ≥ 3.11. After install:

jdsl run examples/greeter.py

Development setup with uv:

uv sync
uv run pytest

The test suite is offline. Provider calls are faked in tests.

Run a Deterministic Skill¤

examples/greeter.py has no model leaves, so it needs no API key.

uv run jdsl show examples/greeter.py
uv run jdsl run examples/greeter.py

show renders the tree without executing it. run imports every module-level root(...) skill in the file and executes it.

Seed Inputs¤

Inputs become blackboard keys for that run.

uv run jdsl run examples/gate.py -i role=admin
uv run jdsl run examples/gate.py -i role=guest
uv run jdsl run examples/gate.py -i role=banned

Inside a tree, ref("role") resolves from the same blackboard. Missing refs raise with a message telling you to seed the key or produce it earlier.

Run an LLM-Backed Skill¤

Set a key for the provider implied by your model id:

echo 'DEEPSEEK_API_KEY=sk-...' >> .env
uv run jdsl run examples/triage.py

The skill uses predict("message -> category"). The model writes category, then normal tree guards decide which action runs.

Write the Smallest Skill¤

from jdsl import act, root, seq, store, tool

@tool
def greet(name: str) -> str:
    return f"hello {name}"

skill = root("Greeter").do(seq(store(act(greet, "Ada"), "message")))

ctx = skill.run()
print(ctx.blackboard["message"])

Use Concepts next if the blackboard and status rules are new. Use API Reference when you need exact combinator behavior.