Observed since 21 Oct, 09:49 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Interactive teaching demos for AI search, logic, planning, CSP, uncertainty, and tokenisation.
ai9414 is a Python teaching toolkit for interactive artificial intelligence demos. It opens small browser-based visualisations for search, logic, uncertainty, constraint satisfaction, planning, and foundation models, with simple installed commands that are easy to use in class.

It currently includes seventeen ready-to-run demos:
labyrinth DFS search
Start with ai9414 demo labyrinthoffice delivery DFS search
Start with ai9414 demo delivery. This demo has fixed office layouts and an action-order control for DFS.spatial graph DFS search
Start with ai9414 demo graph-dfsspatial graph BFS search
Start with ai9414 demo graph-bfsspatial graph greedy best-first search
Start with ai9414 demo graph-gbfsspatial graph A* search
Start with ai9414 demo graph-astarspatial graph uniform-cost search
Start with ai9414 demo graph-ucsspatial graph branch-and-bound search
Start with ai9414 demo graph-bnbpropositional logic DPLL
Start with ai9414 demo logic-dpllpropositional resolution/refutation
Start with ai9414 demo logic-resolutionreasoning with uncertainty belief-state explorer
Start with ai9414 demo uncertaintyfoundation models tokenisation explorer
Start with ai9414 demo foundation-models-tokenisationfoundation models next-token decoding explorer
Start with ai9414 demo foundation-models-decodingCSP map colouring
Start with ai9414 demo csp-mapCSP delivery time-slot assignment
Start with ai9414 demo csp-deliverySTRIPS planning
Start with ai9414 demo stripsBlocks World planning
Start with ai9414 demo blocksworldai9414 ...S and G labels for start and goal nodesInstall from PyPI:
uvx ai9414 demo graph-bnb
Install directly from this repository:
uv sync
uv run ai9414 list
uv run ai9414 demo graph-bnb
If your environment does not put console scripts on PATH, the module entry point works too:
uv run python -m ai9414 demo graph-bnb
To see the curated example names for a demo:
uv run ai9414 list --examples graph-dfs
uv sync --extra dev
uv run pytest
uv build
uv run ai9414 demo graph-bnb
The scripts under examples/ are still useful when working directly in the repository, but they are no longer the main installed interface.
To start the labyrinth example directly from the repository:
uv run python examples/labyrinth_demo.py
To start the delivery DFS example directly from the repository:
uv run python examples/delivery_demo.py
To start the spatial graph DFS example directly from the repository:
uv run python examples/graph_dfs_demo.py
To start the spatial graph BFS example directly from the repository:
uv run python examples/graph_bfs_demo.py
To start the spatial graph greedy best-first example directly from the repository:
uv run python examples/graph_gbfs_demo.py
To start the spatial graph A* example directly from the repository:
uv run python examples/graph_astar_demo.py
To start the spatial graph uniform-cost example directly from the repository:
uv run python examples/graph_ucs_demo.py
To start the spatial graph branch-and-bound example directly from the repository:
uv run python examples/graph_branch_and_bound_demo.py
To start the DPLL logic example directly from the repository:
uv run python examples/logic_dpll_demo.py
To start the resolution/refutation example directly from the repository:
uv run python examples/resolution_demo.py
To start the reasoning-with-uncertainty example directly from the repository:
uv run python examples/uncertainty_demo.py
To start the foundation models tokenisation example directly from the repository:
uv run python examples/foundation_models_demo.py
To start the foundation models decoding example:
uv run ai9414 demo foundation-models-decoding
To start the CSP map-colouring example directly from the repository:
uv run python examples/csp_demo.py
To start the CSP delivery scheduling example directly from the repository:
uv run python examples/delivery_csp_demo.py
To start the STRIPS planning example directly from the repository:
uv run python examples/strips_demo.py
To start the Blocks World planning example directly from the repository:
uv run python examples/blocksworld_demo.py
The same install is enough for the labyrinth live-Python stub as well. The
student download now uses the built-in ai9414.search.run_labyrinth_solver(...)
wrapper, so no separate Flask setup is required.
To export a backend-free replay bundle:
PYTHONPATH=src uv run python - <<'PY'
from pathlib import Path
from ai9414.search import SearchDemo
app = SearchDemo()
output_dir = app.export_solution_bundle(Path("build/search-solution"))
print(output_dir)
PY
Labyrinth example:
from ai9414.labyrinth import LabyrinthDemo
app = LabyrinthDemo()
app.load_example("small")
app.show()
Spatial graph DFS example:
from ai9414.graph_dfs import GraphDfsDemo
app = GraphDfsDemo()
app.load_example("small")
app.show()
Spatial graph BFS example:
from ai9414.graph_bfs import GraphBfsDemo
app = GraphBfsDemo()
app.load_example("small")
app.show()
Spatial graph greedy best-first example:
from ai9414.graph_gbfs import GraphGbfsDemo
app = GraphGbfsDemo()
app.load_example("small")
app.show()
Spatial graph A* example:
from ai9414.graph_astar import GraphAStarDemo
app = GraphAStarDemo()
app.load_example("small")
app.show()
Spatial graph branch-and-bound example:
from ai9414.search import SearchDemo
app = SearchDemo()
app.load_example("small")
app.set_options(playback_speed=1.0)
app.show()
Spatial graph uniform-cost example:
from ai9414.graph_ucs import GraphUcsDemo
app = GraphUcsDemo()
app.load_example("small")
app.show()
Visual DPLL example:
from ai9414.logic import DpllDemo
app = DpllDemo()
app.load_example("unit_chain")
app.show()
Reasoning with uncertainty example:
from ai9414.uncertainty import BayesFilterDemo
app = BayesFilterDemo.example("two_doors")
app.show()
Set up a custom corridor:
from ai9414.uncertainty import BayesFilterDemo
app = BayesFilterDemo(
cells=10,
landmarks={"door": [2, 6]},
initial_belief="uniform",
)
app.show()
Foundation models tokenisation example:
from ai9414.foundation_models import TokenisationExplorer
app = TokenisationExplorer()
app.load_example("simple_sentence")
app.show()
Custom tokenisation text:
from ai9414.foundation_models import TokenisationExplorer
app = TokenisationExplorer()
app.load_corpus("office_messages")
app.learn_merges(12)
app.set_text("Deliver parcel to Office A before 10:30.")
app.show()
Foundation models decoding example:
from ai9414.foundation_models import DecodingExplorer
app = DecodingExplorer()
app.load_example("lecture_activity")
app.show()
Visual CSP example:
from ai9414.csp import CSPDemo
app = CSPDemo(example="australia")
app.set_algorithm("backtracking_forward_checking")
app.show()
Custom CSP map:
from ai9414.csp import CSPDemo
app = CSPDemo()
app.load_map_problem(
regions=["a", "b", "c", "d"],
adjacency={
"a": ["b", "c"],
"b": ["a", "c", "d"],
"c": ["a", "b", "d"],
"d": ["b", "c"],
},
colours=["red", "green", "blue"],
)
app.set_variable_ordering("mrv")
app.show()
Delivery scheduling CSP example:
from ai9414.delivery_csp import DeliveryCSPDemo
app = DeliveryCSPDemo(example="weekday_schedule")
app.set_algorithm("backtracking_forward_checking")
app.show()
Custom delivery scheduling CSP:
from ai9414.delivery_csp import DeliveryCSPDemo
app = DeliveryCSPDemo()
app.load_delivery_problem(
deliveries=[
{"id": "a", "label": "Delivery A", "short_label": "A", "colour": "#c75b4a"},
{"id": "b", "label": "Delivery B", "short_label": "B", "colour": "#4d79ab"},
],
slots=[
{"id": "slot_1", "label": "09:00", "order": 0},
{"id": "slot_2", "label": "11:00", "order": 1},
],
rooms=[
{"id": "dock", "label": "Dock"},
],
values=[
{"id": "slot_1_dock", "slot": "slot_1", "room": "dock", "label": "09:00 @ Dock"},
{"id": "slot_2_dock", "slot": "slot_2", "room": "dock", "label": "11:00 @ Dock"},
],
domains={
"a": ["slot_1_dock", "slot_2_dock"],
"b": ["slot_2_dock"],
},
constraints=[
{
"kind": "precedence",
"left": "a",
"right": "b",
"label": "A before B",
"description": "Delivery A must happen before delivery B.",
}
],
)
app.set_variable_ordering("mrv")
app.show()
Visual STRIPS planning example:
from ai9414.strips import StripsDemo
app = StripsDemo()
app.load_example("canonical_delivery")
app.show()
Visual Blocks World planning example:
from ai9414.strips import BlocksworldDemo
app = BlocksworldDemo()
app.load_example("sussman_anomaly")
app.show()
Custom STRIPS problem:
from ai9414.strips import StripsDemo, StripsProblem
problem = StripsProblem(
rooms=["corridor", "mail_room", "office_a", "office_b", "lab"],
robot_start="corridor",
parcel_start="mail_room",
keycard_start="office_a",
locked_edge=("corridor", "lab"),
door_locked=True,
goal=[("at", "parcel", "lab")],
)
app = StripsDemo(problem=problem)
app.solve()
app.show()
Suggested STRIPS exercises:
Suggested Blocks World exercises:
Custom CNF with DPLL:
from ai9414.logic import DpllDemo
app = DpllDemo()
app.load_cnf([
["A", "B"],
["~A", "C"],
["~B", "C"],
])
app.show()
Entailment with DPLL:
from ai9414.logic import DpllDemo
app = DpllDemo(mode="entailment")
app.load_kb(
formulas=["A -> B", "B -> C", "A"],
query="C",
)
app.show()
Curated Wumpus entailment examples:
from ai9414.logic import DpllDemo
app = DpllDemo(mode="entailment", example="wumpus_no_breeze")
app.show()
app = DpllDemo(mode="entailment", example="wumpus_forced_pit")
app.show()
Resolution/refutation proof attempts:
from ai9414.resolution import ResolutionDemo
app = ResolutionDemo(example="chain_refutation")
app.load_proof_attempt(
clauses=[["~A", "B"], ["A"], ["~B"]],
steps=[
{"left": 1, "right": 2, "pivot": "A"},
{"left": 4, "right": 3, "pivot": "B"},
],
)
app.show()
Live labyrinth solver wrapper:
from typing import Any
from ai9414.search import run_labyrinth_solver
def solve_dfs(labyrinth: dict[str, Any]) -> dict[str, Any]:
...
if __name__ == "__main__":
run_labyrinth_solver(solve_dfs)
Live graph solver wrapper:
from typing import Any
from ai9414.search import run_graph_solver
def solve_dfs(graph: dict[str, Any]) -> dict[str, Any]:
...
if __name__ == "__main__":
run_graph_solver(solve_dfs)
Live graph BFS solver wrapper:
from typing import Any
from ai9414.search import run_graph_bfs_solver
def solve_bfs(graph: dict[str, Any]) -> dict[str, Any]:
...
if __name__ == "__main__":
run_graph_bfs_solver(solve_bfs)
Live graph A* solver wrapper:
from typing import Any
from ai9414.search import run_graph_astar_solver
def solve_astar(graph: dict[str, Any]) -> dict[str, Any]:
...
if __name__ == "__main__":
run_graph_astar_solver(solve_astar)
Live graph UCS solver wrapper:
from typing import Any
from ai9414.search import run_graph_ucs_solver
def solve_ucs(graph: dict[str, Any]) -> dict[str, Any]:
...
if __name__ == "__main__":
run_graph_ucs_solver(solve_ucs)
Live graph greedy best-first solver wrapper:
from typing import Any
from ai9414.search import run_graph_gbfs_solver
def solve_gbfs(graph: dict[str, Any]) -> dict[str, Any]:
...
if __name__ == "__main__":
run_graph_gbfs_solver(solve_gbfs)
Live spatial graph branch-and-bound solver wrapper:
from typing import Any
from ai9414.search import run_weighted_graph_solver
def solve_dfbb(graph: dict[str, Any]) -> dict[str, Any]:
...
if __name__ == "__main__":
run_weighted_graph_solver(solve_dfbb)
Live DPLL solver wrapper:
from typing import Any
from ai9414.logic import run_dpll_solver
def solve_dpll(problem: dict[str, Any], options: dict[str, Any]) -> dict[str, Any]:
...
if __name__ == "__main__":
run_dpll_solver(solve_dpll)
src/ai9414/
core/
demo/
graph_bfs/
graph_dfs/
graph_astar/
graph_gbfs/
graph_ucs/
labyrinth/
logic/
search/
frontend/
examples/
tests/
docs/
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.2.0 | 29 Jul 2026 | 7 |
This describes our collected data; it is not a security assessment.
Shared repository data · GitHub
Observed since 21 Oct, 09:49 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:268bf636492d4ddcb496793360148915cf634d119331f5be9f258c2fca0778a8