Lile
lile is the fleet's LiveLearn local LLM daemon — a single-process FastAPI service that shares weights between inference and training, so feedback lands on the next inference request under a typed contract (not best-effort).
Lives in the agi repo. Extracted from the previous home in ht-unsloth.
Stack: Python + PyTorch + Unsloth. Private repo.
One mutable model. Always serving. Always trainable. Any objective, any time, via API.
Where to look
| Goal | File |
|---|---|
| Get the daemon running | OPERATING.md
|
| Understand what lile does + why | lile/PLAN.md (north-star) + lile/DESIGN.md (one-pager)
|
| See what's actually shipped | lile/STATUS.md — every claim cited by a test
|
| Learn the vocabulary | lile/GLOSSARY.md
|
| Migrate from a ht-unsloth checkout | MIGRATION.md
|
| Touch the daemon HTTP surface | lile/README.md
|
Cross-repo dependency
lile consumes unsloth (the heiervang fork) as a pinned git dependency. The single load-bearing coupling is a runtime monkeypatch of unsloth.kernels.utils.matmul_lora in lile/state.py; LileMatmulRebindError guards against upstream signature drift.
The HTTP-side companion (Studio frontend + studio/backend/routes/lile.py proxy) lives in ht-unsloth and talks to the lile daemon over LILE_DAEMON_URL.
Quickstart
pip install -e .
python -m lile.console.launch # default: Qwen3-8B on :8768
Chat + typed training + commit-token barrier:
# Train — returns commit_token N
curl -sS http://127.0.0.1:8768/v1/train \
-H 'content-type: application/json' \
-d '{"objective":"sft","samples":[{"prompt":"2+2?","response":"4."}]}' | jq
# Next chat that MUST see batch N
curl -sS http://127.0.0.1:8768/v1/chat/completions \
-H 'content-type: application/json' \
-d '{"messages":[{"role":"user","content":"2+2?"}],"after_commit_token":N}' | jq
Sources
- README
lile/PLAN.md,lile/DESIGN.md,lile/STATUS.md.