A minimal library to make Chainlit easier to use.
Project description
Easierlit
Easierlit is a Python-first wrapper around Chainlit. It keeps the power of Chainlit while reducing the boilerplate for worker loops, message flow, auth, and persistence.
Quick Links
- Installation: Install
- Start in 60 seconds: Quick Start
- Method contracts:
docs/api-reference.en.md - Full usage guide:
docs/usage.en.md - Korean docs:
README.ko.md,docs/api-reference.ko.md,docs/usage.ko.md
Why Easierlit
- Clear runtime split:
EasierlitServer: runs Chainlit in the main process.EasierlitClient: runs yourrun_func(app)in one global thread worker.EasierlitApp: queue bridge for inbound/outbound communication.- Production-oriented defaults:
- headless server mode
- sidebar default state
open - JWT secret auto-management (
.chainlit/jwt.secret) - dedicated auth cookie (
easierlit_access_token) - fail-fast worker policy
- Practical persistence behavior:
- default SQLite bootstrap (
.chainlit/easierlit.db) - schema compatibility recovery
- SQLite
tagsnormalization for thread CRUD
Architecture at a Glance
User UI
-> Chainlit callbacks (on_message / on_chat_start / ...)
-> Easierlit runtime bridge
-> EasierlitApp incoming queue
-> run_func(app) in worker (thread)
-> app.* APIs (message + thread CRUD)
-> runtime dispatcher
-> realtime session OR data-layer fallback
Install
pip install easierlit
For local development:
pip install -e ".[dev]"
Quick Start (60 Seconds)
from easierlit import AppClosedError, EasierlitClient, EasierlitServer
def run_func(app):
while True:
try:
incoming = app.recv(timeout=1.0)
except TimeoutError:
continue
except AppClosedError:
break
app.send(
thread_id=incoming.thread_id,
content=f"Echo: {incoming.content}",
author="EchoBot",
)
client = EasierlitClient(run_func=run_func)
server = EasierlitServer(client=client)
server.serve() # blocking
Async worker pattern:
from easierlit import AppClosedError, EasierlitClient, EasierlitServer
async def run_func(app):
while True:
try:
incoming = await app.arecv()
except AppClosedError:
break
app.send(
thread_id=incoming.thread_id,
content=f"Echo: {incoming.content}",
author="EchoBot",
)
client = EasierlitClient(
run_func=run_func,
run_func_mode="auto", # auto/sync/async
)
server = EasierlitServer(client=client)
server.serve()
Public API (v0.3.0)
EasierlitServer(
client,
host="127.0.0.1",
port=8000,
root_path="",
auth=None,
persistence=None,
)
EasierlitClient(run_func, worker_mode="thread", run_func_mode="auto")
EasierlitApp.recv(timeout=None)
EasierlitApp.arecv(timeout=None)
EasierlitApp.send(thread_id, content, author="Assistant", metadata=None)
EasierlitApp.add_message(thread_id, content, author="Assistant", metadata=None)
EasierlitApp.update_message(thread_id, message_id, content, metadata=None)
EasierlitApp.delete_message(thread_id, message_id)
EasierlitApp.list_threads(first=20, cursor=None, search=None, user_identifier=None)
EasierlitApp.get_thread(thread_id)
EasierlitApp.new_thread(thread_id, name=None, metadata=None, tags=None)
EasierlitApp.update_thread(thread_id, name=None, metadata=None, tags=None)
EasierlitApp.delete_thread(thread_id)
EasierlitApp.close()
EasierlitAuthConfig(username, password, identifier=None, metadata=None)
EasierlitPersistenceConfig(enabled=True, sqlite_path=".chainlit/easierlit.db")
For exact method contracts, use:
docs/api-reference.en.md
This includes parameter constraints, return semantics, exceptions, side effects, concurrency notes, and failure-mode fixes for each public method.
Auth and Persistence Defaults
- JWT secret: auto-managed at
.chainlit/jwt.secret - Auth cookie:
easierlit_access_token - Default persistence: SQLite at
.chainlit/easierlit.db - If SQLite schema is incompatible, Easierlit recreates DB with backup
- Sidebar default state is forced to
open
Thread History sidebar visibility follows Chainlit policy:
requireLogin=TruedataPersistence=True
Typical Easierlit setup:
- set
auth=EasierlitAuthConfig(...) - keep persistence enabled (default)
Message and Thread Operations
Message APIs:
app.send(...)app.add_message(...)app.update_message(...)app.delete_message(...)
Thread APIs:
app.list_threads(...)app.get_thread(thread_id)app.new_thread(...)app.update_thread(...)app.delete_thread(thread_id)
Behavior highlights:
app.new_thread(...)creates only when thread does not exist.app.update_thread(...)updates only when thread already exists.- With auth enabled, both
app.new_thread(...)andapp.update_thread(...)auto-assign thread ownership. - SQLite SQLAlchemyDataLayer path auto normalizes thread
tags. - If no active websocket session exists, Easierlit applies internal HTTP-context fallback for data-layer message CRUD.
Worker Failure Policy
Easierlit uses fail-fast behavior for worker crashes.
- If
run_funcraises, server shutdown is triggered. - UI gets a short summary when possible.
- Full traceback is kept in server logs.
Chainlit Message vs Tool-call
Chainlit distinguishes message and tool/run categories at step type level.
Message steps:
user_messageassistant_messagesystem_message
Tool/run family includes:
tool,run,llm,embedding,retrieval,rerank,undefined
Easierlit v0.3.0 currently provides message-centric public APIs. A dedicated tool-call step creation public API is not provided yet.
Example Map
examples/minimal.py: basic echo botexamples/custom_auth.py: single-account authexamples/thread_crud.py: thread list/get/update/deleteexamples/thread_create_in_run_func.py: create thread fromrun_func
Documentation Map
- Method-level API contracts (EN):
docs/api-reference.en.md - Method-level API contracts (KO):
docs/api-reference.ko.md - Full usage guide (EN):
docs/usage.en.md - Full usage guide (KO):
docs/usage.ko.md
Migration Note
Removed APIs from earlier drafts are not part of v0.3.0 public usage. Use the APIs documented in this README and API Reference.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file easierlit-0.3.0.tar.gz.
File metadata
- Download URL: easierlit-0.3.0.tar.gz
- Upload date:
- Size: 23.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
afde39733d2b2981b8064f65698f475da79257341d09fe1d2e34198993d3083f
|
|
| MD5 |
4226987f88b08e1b7f9df40687892cb5
|
|
| BLAKE2b-256 |
bb890a74d9f99351e5801e9c8647b800360f8e8ccac23c530bdd27ad055dc42a
|
Provenance
The following attestation bundles were made for easierlit-0.3.0.tar.gz:
Publisher:
publish.yml on smturtle2/easierlit
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
easierlit-0.3.0.tar.gz -
Subject digest:
afde39733d2b2981b8064f65698f475da79257341d09fe1d2e34198993d3083f - Sigstore transparency entry: 953453010
- Sigstore integration time:
-
Permalink:
smturtle2/easierlit@c7a79ef43408949afad13eb8859e95acfc3a1cba -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/smturtle2
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c7a79ef43408949afad13eb8859e95acfc3a1cba -
Trigger Event:
push
-
Statement type:
File details
Details for the file easierlit-0.3.0-py3-none-any.whl.
File metadata
- Download URL: easierlit-0.3.0-py3-none-any.whl
- Upload date:
- Size: 17.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2e81f5375570cec1ea7d827e50653ebeba48b0a7097ee4a907f58b0522399f11
|
|
| MD5 |
8350fd6338e6575da340787df9bb18be
|
|
| BLAKE2b-256 |
6997ef793891e794c6c663f08ef3cbcf65c1f578ad7b14001a34f7873ce8ba0d
|
Provenance
The following attestation bundles were made for easierlit-0.3.0-py3-none-any.whl:
Publisher:
publish.yml on smturtle2/easierlit
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
easierlit-0.3.0-py3-none-any.whl -
Subject digest:
2e81f5375570cec1ea7d827e50653ebeba48b0a7097ee4a907f58b0522399f11 - Sigstore transparency entry: 953453012
- Sigstore integration time:
-
Permalink:
smturtle2/easierlit@c7a79ef43408949afad13eb8859e95acfc3a1cba -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/smturtle2
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c7a79ef43408949afad13eb8859e95acfc3a1cba -
Trigger Event:
push
-
Statement type: