LangBot Core Development
This skill covers developing the LangBot core (the main repo), distinct from
plugin development (see langbot-plugin-dev) and deployment (langbot-deploy).
Stack
- Backend: Python
>=3.11,<4.0, deps viauv. Framework: Quart (async Flask). Serves the HTTP API + pre-built web UI onhttp://127.0.0.1:5300. - Frontend (
web/): Vite + React Router 7 + shadcn/ui + Tailwind, managed bypnpm. Dev server on:3000. (NOT Next.js —devscript isvite.)
Dev environment
# Backend
pip install uv
uv sync --dev
uv run main.py # API + UI on http://127.0.0.1:5300
# Frontend (separate terminal)
cd web
cp .env.example .env
pnpm install
pnpm dev # http://127.0.0.1:3000 (reads VITE_API_BASE_URL)
# Lint/format hooks (CI runs the same checks)
uv run pre-commit install
First run generates data/config.yaml; DB defaults to SQLite (PostgreSQL
supported). Migrations run automatically on startup.
Repo layout (key paths)
src/langbot/
├── __main__.py # entrypoint, CLI flags (--standalone-runtime/-box/--debug)
├── pkg/
│ ├── api/
│ │ ├── http/ # Quart controllers + services
│ │ │ ├── controller/groups/ # route groups (@group.group_class)
│ │ │ └── service/ # business logic (called by controllers AND MCP)
│ │ └── mcp/ # MCP server (server.py = tools, mount.py = ASGI dispatch)
│ ├── core/ # app bootstrap, stages, task manager
│ ├── platform/ provider/ pipeline/ plugin/ box/ skill/ rag/ vector/
│ ├── command/ persistence/ storage/ config/ entity/ telemetry/
│ └── templates/config.yaml # config template (top-level: api, system, plugin, box, space...)
├── web/ # Vite SPA
└── docker/ # compose deployment
HTTP API auth model
Route auth is declared per-route via AuthType in
pkg/api/http/controller/group.py:
NONE— public.USER_TOKEN— web UI JWT (Authorization: Bearer <jwt>).API_KEY—X-API-KeyorAuthorization: Bearer <key>.USER_TOKEN_OR_API_KEY— either.
Authenticated routes receive an immutable RequestContext containing the
principal, authorized Workspace membership, fixed-role permissions, instance,
request id, and placement generation. A browser's X-Workspace-Id is only a
selector and is always checked against the Account membership. Tenant services
must accept this context (or an explicit trusted execution context) and fail
closed when it is absent.
API-key authentication accepts:
- the global key from
config.yamlapi.global_api_keyonly for a community instance with exactly one local Workspace, then - web-UI keys whose one-time
lbk_secret is stored only as a hash and is bound to one Workspace, explicit scopes, status, and optional expiry.
An API key derives its Workspace from the key record and ignores a caller's Workspace selector. Public Bot/Webhook routes similarly derive Workspace from the opaque owning resource rather than a header.
Route groups self-register via @group.group_class(name, path) and are
discovered by importutil.import_modules_in_pkg.
Adding an API endpoint
- Add/extend a controller in
pkg/api/http/controller/groups/and the matching service method inpkg/api/http/service/. - Pick the right
AuthType. - If the endpoint should be agent-accessible, add/adjust the matching MCP tool
in
pkg/api/mcp/server.pyand update thelangbot-mcp-opsskill. API and MCP surface must stay aligned (seeAGENTS.md). - Update
docs/service-api-openapi.jsonif you maintain the OpenAPI overview.
Database migrations (Alembic)
Single migration set supports SQLite + PostgreSQL. Files in
src/langbot/pkg/persistence/alembic/versions/.
# From project root (needs data/config.yaml)
uv run python -m langbot.pkg.persistence.alembic_runner autogenerate "description"
Standards
- All code comments/docstrings in English; user-facing strings need i18n
(
en_US+zh_Hansminimum,ja_JPwhere present). - Consider toC and toB compatibility + security.
- Commit format:
<type>(<scope>): <subject>(feat/fix/docs/refactor/...).
Tests
uv run pytest tests/unit_tests -q # unit tests
uv run pytest tests/unit_tests/api -q # API service tests
uv run python tests/manual/mcp_smoke.py # MCP server e2e smoke
See also
langbot-plugin-dev— plugin SDK / runtime development.langbot-testing— WebUI/e2e QA harness (bin/lbs).langbot-deploy— Docker/compose deployment + config.langbot-mcp-ops— operating the LangBot MCP server.