Observed since 21 Oct, 09:16 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
The FIRST LLM-as-a-backend framework
The FIRST LLM-as-a-backend framework.
Who needs fast, deterministic and cheap backend when you can have agents?
Why write boring, predictable code when you can replace your entire API with vibes? 🚀
Tired of your endpoints responding in microseconds? 😴 Sick of knowing exactly what your backend will do? 🥱 Fed up with paying pennies for compute? 😤
Agnette liberates you from the tyranny of determinism.
✅ Your /users endpoint can now hallucinate creative new users
✅ Your auth middleware can philosophize about whether someone deserves access
✅ Your database queries become polite requests to an AI that may or may not feel like helping today
Each request is a surprise(🎁), each response is an adventure (🌈), your API now costs more than your CEO's salary (💸)
This is the future. 🔥
(The package is powered by [glyph-agents] https://github.com/dubloom/glyph-agents, another lib I'm building).
This project is intended to run with uvicorn only for now.
python -m venv .venv
source .venv/bin/activate
pip install agnette
from glyph import AgentOptions
from agnette import Agnette
app = Agnette(
default_agent_options=AgentOptions(
model="claude-sonnet-4-5",
allowed_tools=["Read", "Write", "Edit", "Glob", "Grep", "WebFetch"],
)
)
@app.post("/hello", prompt="Reply with a short greeting.")
def hello() -> None:
pass
Run:
uvicorn examples.notes_app:app --reload
You can run Agnette in full "LLM-as-a-backend" mode with a single app-level prompt and no route decorators.
Why define routes when you can just describe your entire app in one sentence and let the model figure out the rest? 🧘
No paths. No methods. No schemas. The LLM is the router, the controller, the business logic, and the database layer. Your API is now a philosophy. ✨
from agnette import Agnette, AgentOptions
app = Agnette(
default_agent_options=AgentOptions(
model="claude-sonnet-4-5",
allowed_tools=["Bash", "Read", "Write", "Edit", "Glob", "Grep", "WebFetch"],
),
prompt="You are the backend for a playful habit tracker app...",
)
Run:
uvicorn examples.pure_vibe_app:app --reload
Try:
curl -sS -X POST http://127.0.0.1:8000/habits \
-H 'Content-Type: application/json' \
-d '{"name":"drink water","target_per_day":8,"unit":"glasses"}'
curl -sS http://127.0.0.1:8000/habits
curl -sS http://127.0.0.1:8000/habits/habit-1
For each route request, Agnette:
path, method, path_params, query_params, headers, and body as json_body or raw_body).glyph.query(...).text/plain.If execution fails, the route returns 500 with Agent execution failed: ....
Use decorators on an Agnette app instance:
@app.route(path, prompt=..., methods=[...])@app.get(...)@app.post(...)@app.put(...)@app.patch(...)@app.delete(...)@app.options(...)@app.head(...)Each route can override agent_options; otherwise it uses default_agent_options.
Agnette supports HTTP middleware through:
@app.middleware("http", prompt="...")
def my_middleware() -> None:
pass
Middleware prompt output must be JSON with:
allow (required boolean)status_code (optional integer, default 403)response_text (optional string)If allow is false, the request is blocked with a plain-text response.
examples/notes_app.py demonstrates prompt-driven CRUD using data/notes.json.
Run:
uvicorn examples.notes_app:app --reload
examples/auth_app.py demonstrates:
/health/auth/sign-in that mints/stores bearer tokens in data/issued_tokens.json/private/echo enforced by prompt-driven HTTP middlewareRun:
uvicorn examples.auth_app:app --reload
examples/pure_vibe_app.py demonstrates full vibe mode:
Run:
uvicorn examples.pure_vibe_app:app --reload
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.2.0 | 20 Apr 2026 | 3 |
This describes our collected data; it is not a security assessment.
Observed since 21 Oct, 09:16 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:5de82ae840f77b7b5b93273a709076728334c121a632c8953081829796c8f8ae