TreeMap
무료 오픈소스 디스크 사용량 시각화 도구로, 사각형 트리맵·중복 파일 탐색·디스크 가득 예측·정리 시 파일을 휴지통으로만 이동한다
LIA는 20여 개 AI 에이전트로 이메일·캘린더·연락처·Drive 등을 관리, 오픈소스·인간 검증·7개 LLM·6개 언어·프라이버시 설계
LIA orchestrates 20+ specialized AI agents to manage your emails, calendar, contacts, Drive and more. Open source, human validation (HITL), 7 LLM providers, 6 languages. Privacy by design.
생산성Python · TypeScriptGitHub @jgouviergmail온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
Smart multi-agent conversational assistant with LangGraph orchestration, Human-in-the-Loop, enterprise-grade observability, and full i18n support (6 languages)
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A self-hosted, multi-agent conversational assistant — LangGraph orchestration, Human-in-the-Loop before every mutation, transparency registers, enterprise observability, six languages.
If you find this project valuable, a star on GitHub is the best way to say so. Thank you!README 전문 보기 ↗I built LIA because I wanted to pick up a conversation without piecing its context together again. This self-hosted AI assistant brings your emails, meeting notes and open commitments into view, then helps you prepare the next step.
Start the guided installer:
git clone --depth 1 https://github.com/jgouviergmail/LIA-Assistant.git && cd LIA-Assistant && ./install.sh
For a Linux host with Git, Python and Docker Compose. Prerequisites and setup choices.
Explore LIA · Try the interactive walkthrough · Installation guide · Documentation
The moment I wanted to improve is simple: “I'm speaking with Claire. What did we agree, what changed, and what do I still owe her?”
Try: “Prepare my catch-up with Claire using the project brief, our recent emails and the last meeting notes. Highlight anything that conflicts.”
That continuity is LIA's focus: the relationship, its sources and the next action in one place. Start there; voice, personal Radio, routines and the rest are available when you need them. The functional map shows how those pieces connect.
The command above starts the installer in install.sh. It asks how to expose the instance, creates the administrator account and walks you through provider keys. The first source build takes longer than starting an already installed instance.
Have these ready: a supported Linux host, Git, Python and Docker Compose; see the installer prerequisites for versions and disk space. The current installer asks for OpenAI and DeepSeek keys. Add the optional Gemini key for memory recall, document search and image analysis.
Already have the checkout? Run ./install.sh from its root. An interrupted installation can continue with ./install.sh --resume.
The self-hosting guide covers every installer choice and troubleshooting. The getting-started guide covers the wider setup.
A guided installer lives at the repository root (ADR-215). It asks a short questionnaire (LAN exposure, your own reverse proxy, or managed HTTPS with Caddy), generates a private .env and Compose overlay, applies the reference seeds atomically, creates the admin and provider keys over stdin, verifies the installation beyond /ready and prints a non-secret report.
The experimental speaking avatar is an optional choice, disabled by default; each person then connects their own Simli account.
A complete source checkout builds the images locally; an official release directory uses prebuilt digests only when its adjacent manifest is qualified.
The Google Gemini key is an optional question — memory recall, searches by meaning and image analysis wait for it — and the final report names every capability left waiting for a key.
Two optional key pairs follow, each given whole or left empty: a Google Maps browser key with its Cloud map ID for interactive place maps, and, on an instance reached on a public domain, a Cloudflare Turnstile widget's keys for the anti-robot check on the password doors (ADR-364).
Every line of the shipped env templates states the code's default or says why it differs, and .env.prod.example carries the values production runs.
Resume an interrupted run with ./install.sh --resume; change a running installation with ./install.sh --reconfigure, which shows the answers in force (Enter keeps them) and every setting they would rewrite before anything changes, replaces each file atomically after a private backup, recreates the containers without rebuilding and puts the previous files and stack back if the new one does not come back ready.
The shipped .env profiles size the connection pools against the database's memory floor as well as its ceiling, and a guard reads both profiles with the Compose file so the sizing cannot drift (ADR-283).
Full guide: docs/guides/GUIDE_SELF_HOSTING.md — what it installs, every setting, and what to do when a step fails. Production targets include the Raspberry Pi (ARM64) through multi-arch Docker images (linux/amd64,linux/arm64).
| Software | Version | Required |
|---|---|---|
| Python | 3.14 | Yes |
| Node.js | 24 LTS | Yes |
| Docker | 24+ | Yes |
| pnpm | 10+ | Yes |
| Task | 3+ | Yes (build tool) |
Every command lives in Taskfile.yml.
# 1. Clone the repository
git clone https://github.com/jgouviergmail/LIA-Assistant.git
cd LIA-Assistant
# 2. Configure environment
cp .env.example .env # Edit with your API keys
# 3. Full setup (backend + frontend + git hooks)
task setup
# 4. Start all services (API + Web + PostgreSQL + Redis + observability)
task dev
# 1. Start the infrastructure
docker compose -f docker-compose.dev.yml up -d postgres redis prometheus grafana
# 2. Backend setup
cd apps/api
python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install --require-hashes -r requirements.lock.txt # compiled lockfile (reproducible)
cp ../../.env.example .env # Configure your API keys
# 3. Database migrations
alembic upgrade head
# 4. Frontend setup
cd ../web
pnpm install
# 5. Start the services
# Terminal 1 - Backend:
cd apps/api && uvicorn src.main:app --reload --port 8000
# Terminal 2 - Frontend:
cd apps/web && pnpm dev
| Service | URL | Credentials |
|---|---|---|
| Frontend | http://localhost:3000 | — |
| API Docs | http://localhost:8000/docs | — |
| Grafana | http://localhost:3001 | admin/admin |
| Prometheus | http://localhost:9090 | — |
# Database
DATABASE_URL=postgresql+asyncpg://user:pass@localhost:5432/lia
REDIS_URL=redis://localhost:6379/0
# Security (REQUIRED - change in production)
SECRET_KEY=change-me-in-production-use-openssl-rand-base64-32
FERNET_KEY=your-fernet-key-here
# LLM provider API keys are configured in the Admin UI after first login
# (Settings > Administration > LLM Configuration). At least one provider is required.
# Google OAuth (optional)
GOOGLE_CLIENT_ID=...
GOOGLE_CLIENT_SECRET=...
# Feature flags (optional, disabled by default unless stated)
MCP_ENABLED=false # Admin MCP servers
MCP_USER_ENABLED=false # Per-user MCP (requires MCP_ENABLED)
CHANNELS_ENABLED=false # Multi-channel messaging (Telegram)
HEARTBEAT_ENABLED=false # Autonomous proactive notifications
SUB_AGENTS_ENABLED=false # Persistent specialized sub-agents
SKILLS_ENABLED=false # Skills system (agentskills.io standard)
RAG_SPACES_ENABLED=true # Knowledge spaces (document upload & retrieval)
FCM_NOTIFICATIONS_ENABLED=false # Firebase push notifications
Every optional subsystem is governed by a {FEATURE}_ENABLED flag, checked at startup, at route wiring and at node entry; the full list with defaults is in .env.example.
Explore LIA and its real interface or try the public demonstration.
The public walkthrough is available without an account and uses example data. It shows how context, results and approval controls fit together. A live demonstrator is also offered when the instance publishes one.
Hosted beta access — account access and activation are granted at the administrator's discretion. To request an invitation, write to [email protected].
To run your own LIA, start with Quick Start or the production installation guide.
The walkthrough runs without a real model, connected account or external action. Its source links let you inspect the mechanisms it illustrates.
Start with one use case. Open a chapter when you want the details.
Every capability below is documented in an architecture decision record (ADR) or a technical document — the links lead there.
| Explore | What you'll find |
|---|---|
| LIA World | A shared campus, your private home and familiar LIA functions |
| Talk to it | Chat, voice, live sessions, radio and a companion that feels present |
| Connect your world | Your accounts, documents, home, health, tools and skills |
| Act, under your control | Orchestration, approvals, calls, creation, browser work and tickets |
| Anticipate | Timely suggestions, routines, reminders and a daily briefing |
| Remember | Memory, journals, knowledge, meetings, people and saved work |
| Trust it | Records, spending limits, authentication, data protection and controls |
Search complete minutes from the meeting list, with server-side filtering and pagination.
Record from the phone or the computer while the chat stays usable, with a capture that survives reloads and lost microphones.
Import a recording you already hold — WAV, MP3 or M4A — and it becomes a meeting with its minutes: sent in chunks under published bounds, read only as the format it claims, its length measured before any engine is paid.
A chain of transcription engines walked at processing time.
Minutes filled from one of thirty built-in templates or your own, reformatted in place or derived into a second set from the same transcript (ADR-258, ADR-259, MEETINGS).
Share a skill, MCP server or plugin with an accepted connection as an independently owned, disabled copy. The recipient sees who shared it and when, the sharer whom it went to — under the card's line, a copy already given never sent twice —, and the recipient supplies their own credentials and manages it with the existing controls (ADR-350).
A 360° relationship lens over open loops, calls, messages and memories, with a written debrief per person built lazily when the card opens (ADR-176, ADR-193, ADR-269).
A timeline on each relationship card lines up its dated records — commitments, calls, memories, relayed messages, text messages — on one thread, page after page, never repeating or dropping one.
Connections between users of the same instance, assistant to assistant — relayed messages delivered by the recipient's own assistant, field-level read-only shares, silent blocking; a first name reaches the person it designates, and a name that fits several people is asked about, never guessed (ADR-180, ADR-182).
A generated image shared with a connection as a copy, in one click and one transaction, its comment quoted literally in their chat (ADR-316).
Ask LIA to inspect or change supported preferences and application objects: reminders, routines, memories, skills and other declared capabilities. Reads and minor reversible settings follow their own authorization policy; creations, deletions and sensitive operations present a reviewable confirmation. File, private-input and connector authorization steps continue through their native browser flows. Commands remain account-scoped, expiring and checked against current authority; administrator capabilities stay reserved to administrators. The application commands guide describes the supported surfaces and secure continuation contract.
FOR_EACH confirmation. Plan approval is currently auto-approved because tool-level approval supersedes it (HITL, ADR-106).lia-card in the chat, Markdown on a ticket or an external channel — the report naming to whom and what (ADR-289).A ticket has a lifecycle, a holder and a result (ADR-276, WORKBOARD):
The home page opens on the date and LIA's living face, then aggregates your sources in parallel with a per-section cache and an LLM synthesis — an agenda on a timeline, an illustrated weather, a Workboard card with exact counts of what waits on you, what LIA holds, what your connections hold and what is overdue — served by a read-only domain outside the agent graph (BRIEFING_DOMAIN). The page fills in as it can: what is ready appears at once, each slower card arrives on its own request under one act, and the greeting and synthesis come once every card is there (ADR-271). A new account starts small: where the instance provides the weather, the dashboard opens on that card alone and a starter checklist asks for the home address first, the other cards one switch away (ADR-307). Meetings and calls read as timelines by day and part of day, and a list that cannot load says so instead of looking empty.
The complete native catalogue uses original designs and contextual expressions. Reviewed offline artwork supplies bounded body relief, while the shared rig owns head pose, eyes, brows and mouth. Reduced motion and unavailable graphics retain their native fallback. See the volume guide for projection and performance limits.
Optional JEV badges qualify displayed emails (professional, personal, spam or phishing/scam; normal, urgent or critical priority) and appointments (professional or personal). Accepted labels also inform the answer. Uncertainty produces no badge; these advisory labels grant no permission and provide no guarantee of safety (ADR-351).
One row per action (claimed before it happens, closed from an explicit result), one per consultation (which capability read what, when, with what outcome), one per turn.
Proactive acts and direct reads are recorded too.
Extractions are complete, never capped.
An opt-in per-account hash chain makes the registers tamper-evident while preserving the right to erasure, and LIA answers « what did you do? » from them with exact totals (ADR-263, ADR-270, ADR-273, ADR-318, AI_ACT_TRACEABILITY).
Retry-After.Arithmetic, dates and currencies use tools in both execution modes, never a model's estimate:
An isometric campus makes LIA's capabilities places you can visit. Explore its rooms and garden with keyboard or touch, use the minimap and camera controls, and let LIA accompany you. Daylight, optional cached weather and separately controlled sounds give the place atmosphere without calling a model for decoration.
World is optional and starts disabled in the minimal installer. An operator enables it for the instance, with the native capability policy still applying. Live voice with LIA remains its existing feature; direct voice between people is a separate proposal. See the World guide, architecture decision and the qualification ledgers (World, interactions and play) for implementation, evidence and remaining physical-device/provider checks.
LIA is an open-source personal AI assistant in a web application you can host yourself. It connects the information you make available — emails, calendar, documents, preferences and commitments — to help you prepare conversations, organize your day and follow through.
Its strength is the continuity between those activities. Memory, knowledge spaces, meeting records and Relations, its personal relationship view, make relevant context available for the next supported request. A preference you correct, a document you keep or a commitment you record can become useful again. Each feature contributes through its own sources, permissions and settings.
LIA also helps between conversations: a daily briefing, a personal Radio, reminders, routines, proactive suggestions and, when you allow it, a personal discussion it opens itself. You choose the sources and enabled features, and the time windows and channels for proactive help. Chat, rich cards, voice and Live sessions keep this assistance accessible in the same application.
LIA World gives that assistance a place. Walk through a shared campus with LIA, open your private workspaces from its rooms, return to your own home or exchange text with other people. The world is shared; your assistant's conversations, documents and home preferences stay private. The operator chooses whether to enable this optional experience.
You can inspect sources, correct remembered information and review prepared drafts. Actions covered by approval flows ask for your decision before execution. Registers expose recorded consultations, action attempts and outcomes; usage and budgets are visible to users and operators.
| Your situation | Ask LIA, or use its dedicated view |
|---|---|
| A discussion to prepare | “Prepare my catch-up with Claire using the project brief, our recent emails and the last meeting notes. Highlight anything that conflicts.” |
| A promise to follow up | Open Relations to review recent exchanges, the debrief and open commitments before contacting someone. |
| A message to get right | “Draft an email to the supplier asking which delivery date they can commit to. Show me the draft before sending it.” |
| A meeting to keep useful | Record it, review and correct the minutes, search their full content, then export a PDF. Successfully indexed minutes can be retrieved in a later conversation. |
| A day to listen to | Choose personal and news sources in Radio, then listen with the programme, transcript and articles beside you. |
| People to coordinate with | “Find a time for dinner with Sam tomorrow evening using the availability shared with me. Show the invitation before sending it.” This uses an accepted connection and its permissions on the same instance. |
| A place to work and meet | Enter LIA World, find LIA in the campus, open your private calendar or meeting records, then exchange a message with another person without sharing your assistant's context. |
These examples use the services and permissions enabled on your instance. Generated conclusions and documents remain yours to review.
| What matters in daily use | What LIA provides |
|---|---|
| Relevant context, ready to reuse | Memory, knowledge, meeting records, saved answers and Relations support relevant requests from their authorized sources. You can inspect and correct what is kept. |
| Help when you ask and between requests | Conversation, daily briefing and personal Radio, alongside reminders, scheduled work, conditional routines, proactive suggestions and opt-in discussions with their own source and timing controls. |
| A clear next step | Rich results, reviewable drafts, downloadable documents and compatible skills or MCP apps present information and controls in the appropriate form. |
| A choice of how to work | Pipeline builds and validates a plan before execution; ReAct explores iteratively from tool results. Chat and Live voice use documented provider and mode capabilities. |
| One installation for several people | Separate accounts have their own connectors, memory and preferences. Accepted connections choose what to share and can exchange messages through their assistants. |
| A system you can inspect and operate | Open code, a documented architecture, registers, model configuration, account and instance budgets, administration, Grafana dashboards and alert rules. |
Cloud models and compatible local models served through native Ollama can be configured for supported processing roles. Model capabilities, host resources and enabled external services determine the available features and where information is processed. Hosting and provider services may incur costs.
Preparing meetings, retrieving business knowledge and following commitments can also help colleagues. LIA's multi-user web application, connectors, MCP, APIs and observability provide a foundation to customize and integrate into your organization.
Define the deployment's identity, permissions, business sources, usage rules, integrations and hosting. The architecture, documentation and self-hosting guide help scope that work.
Browse the views that interest you; open any image at full resolution.
The Administration & Monitoring section below includes the three Grafana views supplied by the project.
The World illustration above is the owner's supplied French application capture, published with this release. It is an unmodified illustration of the current interface; its visible account name is part of that supplied image. Its provenance manifest distinguishes it from the automated fictional-data captures below.
Explore the real application interface in English and light mode, filled with fictional demonstration data. The geographic maps and walking route use real Google Maps imagery and geographic data, prepared separately and served locally with attribution. The browser captures exercise the actual pages, controls and widgets without model inference, provider calls, connected accounts or external actions. Radio uses a local silent audio fixture. The interactive budget is a custom skill example produced by an executed Python fixture generator; its estimates are illustrative and no booking is made.
Open any image at full resolution. The home capture manifest, workflow manifest and extended application manifest record the images and their provenance. Reproduce the campaigns with the public capture workflow, workflow runner and extended capture runner.
Watch or download the complete film. The French presentation follows concrete uses, contextual native avatars, display modes, reminders, Relations, planned actions, administration and the installable mobile web application. Interfaces follow the product's UI with fictional demonstration data. The landing's blue Presentation button opens the full film with sound and controls in an exclusive fullscreen player.
The editable construction, production and update procedure and decision record preserve the scenario, native-view sources, feature focuses and soundtrack provenance for future product updates. Release assets include a checked editable source archive. The video is a product demonstration, not a recorded provider session.
The admin interface brings deployed capabilities, accounts, model configuration, budgets and diagnostics into one place. The observability stack adds metrics, logs, traces and alerts. Deployment settings still define which services and capabilities are available.
| Area | What you control |
|---|---|
| LLM configuration | The model behind every node and slot, provider parameters, prompt versions, the context window per slot |
| Bounded JEV decisions | An independent opt-in switch for each native decision, a general switch, dedicated model and price settings, and diagnostic traces of duration, fallback and spend; uncertain results return to the established path (ADR-325, guide) |
| Model catalogue & pricing | Providers, capability flags, accepted reasoning depths, a provenance badge and prices per model — the source of truth for the LLM factory, with its status against the public registries; image-generation and Google API pricing alongside; live cross-worker invalidation |
| Platform capabilities | One switch per capability, grouped in families, each row showing the deployment bound, the operator choice and the state actually enforced |
| Budgets & limits | Per-user token, message and cost quotas with live gauges; the instance daily ceiling in euros, today's spend and what remains |
| Knowledge & skills | Knowledge spaces and reindexation, the system FAQ space, skills (enable, translate, delete), admin MCP servers and plugins |
| People & voice | Users with every per-account switch as a sortable column, roles, connector health, assistant personalities, the TTS catalogue and voice picker |
| Platform health | Incidents and their diagnoses, each shown with the evidence it was written from |
| Registers | Readable, technical and Article-12 extractions over one, several or all accounts — masked unless audited |
| Broadcast, debug, demo | Announcements to everyone or to chosen accounts, each stored with its recipients and listed with its audience; per-user debug verbosity, the public showroom link, CSV consumption exports |
A panel embedded in the chat, organised into six groups; an empty section shows "N/A" rather than disappearing.
| Group | Sections |
|---|---|
| Request Analysis | Intent classification, Domain detection, Routing decision, Query transformations |
| Planning & Execution | Planner output, Tool selection, Context resolution, Token budget, Execution timeline, ForEach analysis, Execution waves |
| Intelligent Mechanisms | Cache hits, pattern learning, semantic expansion, Skills activation |
| Context Injection | Memory injection (scores), RAG injection (scores), Knowledge enrichment (Brave), Journal injection (per-entry scores, budget) |
| Background Extraction | Memory detection (create/update/delete), Journal extraction, Interest profile |
| LLM & API Pipeline | Request lifecycle (timing breakdown per node), LLM Pipeline (chronological reconciliation), LLM call details (model, tokens, latency, cost), Google API calls |
Built for developers and operators: diagnose, optimise prompts and understand the agent's decisions in real time — no external tool, no log access needed (DEBUG_PANEL).
LogsNotDelivered fires when lines go missing; every dashboard opens on seven days (logs and traces on four hours) behind one shared menu — ADR-333.GET /health) split from readiness (GET /ready, 503 unless PostgreSQL and Redis answer) — ADR-115.promtool, every alert linking its runbook. The latency alert observes only turns a person waits for, and only over enough of them for a p95 to mean something; the operator's daily report opens on the alerts that fired, the incidents still open and the container restarts, each source named when it cannot be read. One Alertmanager template drops what is not configured, every severity reaches the team receivers it announces, deduplicated, and the routing matrix runs against the production image's real entrypoint — ADR-119.These three Grafana screenshots were supplied by the project owner and reproduced unchanged. Their figures show the supplied dashboard state; the Grafana manifest records their origin and dimensions.
Three layers: a Next.js front end (chat, settings, six languages, SSE streaming, voice) talking over HTTP-only cookies to a FastAPI backend, whose LangGraph graph orchestrates the agents and tools; PostgreSQL (data, checkpoints, pgvector) and Redis (cache, sessions, rate limiting, locks) underneath, with Prometheus, Langfuse, Loki and Tempo watching. The backend follows Domain-Driven Design: one bounded context per domain, each with its router, service, repository and schemas.
Switchable per user from the chat header:
FOR_EACH iteration), a Semantic Validator checks its coherence, tool-level approval flows review the actions that require confirmation, and a Task Orchestrator runs the tools in parallel waves; Bayesian pattern learning shortens the next similar request. Planning and validation precede execution; token use depends on the task and selected models.graph TD
A[User Message] --> CP[Compaction]
CP --> B[Router Node]
B -->|conversation| C[Response Node]
B -->|pipeline mode| D[Planner Node]
B -->|react mode| R1[ReAct Setup]
D -->|empty plan| C
D --> E[Semantic Validator]
E -->|ambiguous| CL[Clarification]
CL --> E
E -->|replan| D
E --> F{Approval Gate}
F --> G[Task Orchestrator]
G --> H[Domain Agents + Tools]
G -->|drafts| HD[HITL Dispatch]
G -->|bulk action| FE[FOR_EACH Confirm]
FE -->|approved| G
H --> I[Initiative]
HD --> I
I --> C
R1 --> R2[ReAct Call Model]
R2 -->|tool_calls| R3[ReAct Execute Tools]
R3 --> R2
R3 -->|draft| HD
R2 -->|declared gap| R5[ReAct Recovery]
R5 --> R2
R2 -->|done| R4[ReAct Finalize]
R4 --> I
C --> J[SSE Stream]
apps/api/src/
├── core/ # Settings composed per domain, constants, i18n tables, recurrence engine
├── domains/ # Bounded contexts (DDD); shared helpers stay separate
│ ├── agents/ # The LangGraph graph: nodes (router, planner, react ×4, response…), tools, prompts, orchestration
│ ├── connectors/ # Google, Apple and Microsoft clients behind one provider resolver
│ ├── heartbeat/ proactive_discussions/ moments/ scheduled_actions/ reminders/ habits/ interests/ briefing/ # initiative
│ ├── memories/ journals/ rag_spaces/ meetings/ relations/ peers/ sms/ workboard/ attachments/ # what LIA keeps
│ ├── auth/ users/ usage_limits/ capabilities/ feature_switches/ diagnostics/ # control
│ └── voice/ skills/ plugins/ user_mcp/ telephony/ document_generation/ image_generation/ …
└── infrastructure/ # Cross-cutting: cache and Redis key families, LLM factory and providers,
# MCP client pool, browser pool, rate limiting, scheduler, startup steps, observability
apps/web/src/ # Next.js App Router under app/[lng]/, components, hooks, stores, six locales
apps/mobile/ # Capacitor shells for Android and iOS, loading a self-hosted server
infrastructure/ # Compose stacks, database seeds, observability config, backups, Caddy
scripts/ # Release, audit, deployment and measurement tooling
docs/ # Architecture, technical documents, guides, runbooks, ADRs, the public audit
| Pattern | What it buys |
|---|---|
| Five-layer tool system | A generic connector base with OAuth auto-refresh, a meta-decorator composing metrics + rate limiting + context save, domain formatters, a declarative ToolManifest, and a catalogue loader — a tool is a few lines, not a file |
| Domain taxonomy | One declarative DOMAIN_REGISTRY (agents, result key, related domains, priority, routability) feeds catalogue filtering, semantic expansion and the initiative phase — never a second hand-maintained table |
| Data registry | Tool results live in an in-memory store decoupled from the message history, so aggressive message windowing never loses a $steps.X.field reference |
| Semantic validator | A dedicated LLM, distinct from the planner, inspects every plan for hallucinated capabilities, ghost dependencies, cardinality and scope errors before anything runs |
| Re-plan before running | Validator issues go back to the planner a bounded number of times, and panic mode retries planning once over a wider catalogue; once a plan has run, a failed step is stated in the answer, never replayed |
| Connector abstraction | Python protocols and normalisers make Google, Apple and Microsoft interchangeable behind unified domain models; a resolver guarantees one provider per category |
| Published bounds | Whatever a validator can reject, its producer can read: every enforced limit is published to the planner, and what is mechanically repairable is repaired before validation (ADR-184) |
| Exact counts | A number shown to a person is exact or it does not exist — aggregates over the whole set, pages of rows, never a count derived from a capped page (ADR-185) |
| Boot-time completeness | Every registry keyed by an enum or a domain is asserted complete at startup; the app refuses to boot on a missing entry rather than failing silently later |
The long version: How does LIA work? (public architecture guide), ARCHITECTURE.md, ARCHITECTURE_LANGRAPH.md, and the living maps — the functional map, the technical map and the history of every decision, also published in six languages on the public site.
| Layer | Technology | Role |
|---|---|---|
| Backend | Python 3.14 · FastAPI 0.141.1 · Pydantic 2.13.4 · SQLAlchemy 2.0.54 · Alembic | REST API, SSE streaming, validation, async ORM, migrations |
| Orchestration | LangGraph 1.2.14 · LangChain 1.3.15 · mcp SDK (Streamable HTTP) | Multi-agent graph, LLM abstraction, Model Context Protocol |
| Data | PostgreSQL 16 + pgvector · Redis 7.4 | Data, checkpoints, vector search · cache, sessions, locks |
| Frontend | Node.js 24 LTS · Next.js 16.4.2 · React 19.3.1 · TypeScript · TailwindCSS · Radix UI · TanStack Query · react-i18next | App Router UI, accessible primitives, server state, six languages |
| Voice | ONNX Runtime Web (wake word) · sherpa-onnx (offline Whisper) · Edge TTS · OpenAI · ElevenLabs · Gemini · Fish Audio | In-browser detection, server transcription, speech synthesis |
| Observability | Prometheus · Grafana · Loki · Tempo · Langfuse · structlog | Metrics, dashboards, logs, traces, LLM tracing |
| Delivery | Docker (multi-arch amd64/arm64) · GitHub Actions · Task | Images, CI/CD, one build tool for every command |
The UI is responsive by design — desktop, tablet and phone — with touch-friendly, mobile-first components.
The model catalogue lives in the database, curated from vendored public registries and editable from the admin panel; every row states where its capabilities came from, and a slot's output budget is held to the cap a vouched row declares, flagged on the configuration screen when it exceeds it (ADR-244). Reasoning depth has one stored shape for every provider (ADR-245); a model family is declared once, and a caller that needs two sentences asks for no reasoning rather than a small budget — a reasoning model bills its thinking inside max_tokens (ADR-285). What a prompt says is what the code enforces, and nothing else: every placeholder has a producer, every published bound is the applied bound, prose never lives in a .py (ADR-284). Every prompt follows one layout — stable before volatile, one boundary each provider adapter translates into its own cache mechanism, no cache write nobody reads — and what each model generation accepts is measured on its API and declared once (ADR-309, ADR-306).
| Provider | Notes |
|---|---|
| OpenAI | Prompt caching, reasoning models, structured output |
| Anthropic | Extended and adaptive thinking; request surface declared per generation, prompt cache read back across turns and its writes billed |
Gemini, multimodal; gemini-embedding-001 for retrieval | |
| DeepSeek | Cost-effective reasoning with a thinking-mode toggle (deepseek-flash, deepseek-v4-pro); tariff by UTC window |
| Qwen | Thinking, tools and vision through Alibaba Cloud DashScope; explicit prompt cache where the family needs it; Qwen Image 3.0; regional endpoint via QWEN_BASE_URL |
| Perplexity | Web-augmented answers; endpoint via PERPLEXITY_BASE_URL |
| Ollama | Compatible local models, capabilities discovered from the server, native client; OLLAMA_BASE_URL |
Compatible chat models hosted on your own machine can serve processing slots whose required capabilities they meet. Image generation, embeddings, Live and native decision providers have their own supported paths. Local inference depends on the chosen model and host resources. LIA drives Ollama through its native API rather than an OpenAI compatibility layer (ADR-267):
think, including switching it off, and the thinking trace comes back separated from the answer.task test:backend:unit:fast # fast unit suite, parallel (what the pre-commit hook runs)
task test:backend:unit:coverage # the CI unit suite verbatim, measuring coverage
task test:backend:coverage # the coverage floor, on unit + integration together
task test:backend:integration # requires PostgreSQL + Redis
task test:backend:agents # LangGraph agent suite
task test:frontend # vitest
task test:e2e # Playwright + axe journeys (hermetic, mocked API)
| Metric | Value |
|---|---|
| Backend tests | 54,033 collected over tests/, across 3,636 files (pytest --collect-only -q --no-cov, Windows/Python 3.14, 2026-10-28) |
| Frontend tests (vitest) | 15,161 across 1,317 files (vitest list, 2026-10-28), plus hermetic Playwright journeys with axe, dark-mode and zoom checks |
| Coverage floor | 78% enforced in CI on the backend — a shrink-only ratchet, never lowered; frontend thresholds per glob |
| Technical audit | Method, evidence and open findings — full public report & protocol |
Tests are risk-driven and behavioural: a module never disables itself on a missing provider key, a test double that receives a coroutine owns it, and an unawaited coroutine or a post-summary warning is a failure (GUIDE_TESTING).
Two layers: a local pre-commit hook (fast, on staged files) and a GitHub Actions pipeline on every push and PR to main. The workflow orchestrates and the Taskfile implements: every CI step is a task <name> call, so the pipeline runs literally the command a developer runs, and a guard fails on any inline step.
Pre-commit (local) GitHub Actions CI
=================== ==================
.bak files check Lint Backend (Ruff + Black + MyPy strict)
Secrets grep Lint Frontend (ESLint + TypeScript)
Ruff + Black + MyPy Fast unit tests + coverage floor
Fast unit tests Integration tests (PostgreSQL + Redis)
Critical pattern detection Agents suite
i18n keys sync Code hygiene (i18n, Alembic, lockfiles, patterns, docs)
Alembic migration conflicts Docker build smoke test
.env.example completeness Secret scan (Gitleaks)
ESLint + TypeScript check ──────────────────────
Pre-push: secret scan Security workflow (weekly)
CodeQL (Python, JS/TS, Actions)
Dependency audit (pip-audit + pnpm audit)
Trivy filesystem scan
SBOM generation
Dependency watch (weekly, ADR-331)
E2E + a11y matrix: Chromium · Firefox · WebKit (weekly)
| Practice | Implementation |
|---|---|
| Reproducible builds | Universal Python lockfiles (linux/amd64, arm64, Windows), hash-verified installs everywhere, a guard failing manifest edits without lock regeneration (ADR-112) |
| Supply chain | Every GitHub Action pinned by commit SHA and every production build input by version and digest, permissions: contents: read; a weekly watch of the advisories each dependency publishes, a refresh under a cooling-off period that never moves backwards, Dependabot on the same cooldowns (ADR-331); the CI's secret scan before every push; SBOM per release |
| Shrink-only ratchets | Coverage, file size, cyclomatic complexity, MyPy debt, React hooks, accessibility and metric visibility can only improve — a baseline is lowered after the work, never raised to absorb a regression |
| Coverage where code runs | The backend floor holds over the unit and integration suites together, combined strictly, and the lines a change adds are held at the floor in CI (ADR-113) |
| Findings register | Every audit finding lives in a machine-readable public register checked on every documentation build: a closure or a remediation carries its proof, and a release is refused while a priority finding is overdue (AUDIT_PROTOCOL) |
| Documentation gate | Every version, count and threshold a document states is recomputed from the code that owns it and a mismatch fails the build; broken links, stale code paths and unreachable documents too |
| Release pipeline | A tag builds candidates; a release is promoted only from a qualified, disposable-machine installer run (ADR-215); multi-arch images on ghcr.io |
Full details: CI/CD documentation.
| Reference | Concrete measure |
|---|---|
| GDPR / RGPD | PII filtering, data minimisation, full-account export and account deletion that also removes linked OAuth grants and transparency records (privacy guide) |
| EU AI Act | The interface identifies LIA as AI; approval before mutation and separate records of actions, reads and decisions support transparency and traceability. Applicable duties still depend on the deployment and use case (traceability boundaries) |
| OWASP Top 10 | XSS, SQL injection and CSRF safeguards; a global Redis-backed rate limit before routes; request bodies bounded before they are read, webhooks included; reset links bound to their account and capped per account, an optional anti-robot check on the password doors (ADR-363, ADR-364) |
| Prompt injection | External content wrapped in safety markers, trust classified by data type rather than by producing tool, and a provenance that survives history compaction — a summary built from third-party text inherits its banner instead of promoting the claim to system authority |
| SSRF & hostile text | Every fetched URL is validated, then fetched on the very address the check resolved, one redirect hop at a time; text flatteners run in linear time on hostile input, held by growth and equivalence tests (ADR-326) |
| OAuth / PKCE | PKCE S256, single-use state and issuer/identity checks; grouped Google/Microsoft consent shares grants only within the verified provider account, and every token renews through one door (); linking a federated identity never changes an account's status () |
These references describe implemented controls, not a GDPR/AI Act legal opinion, OWASP or ISO certification, or a security-audit score. The public technical audit measures 24 technical-quality areas against an ISO/IEC 25010:2023-inspired grid and explicitly excludes security.
Reporting a vulnerability — do not open a GitHub issue. Write to [email protected] with a description, the steps to reproduce and the potential impact; we answer within 48 hours. Policy and supported versions: SECURITY.md.
Instrumentation and caching are in place — per-node message windowing, LLM context compaction with a threshold derived from the response model's window, prompt caching shaped for every provider mechanism (breakpoints, explicit markers, implicit prefixes) with a cross-turn cache for ReAct that the exchange rhythm switches on, asymmetric Gemini embeddings, parallel execution of independent domains, persistent HTTP pools — all instrumented in production. The perceived response time is dominated by the LLM call cascade (seconds to tens of seconds depending on the request and the hardware); that is the optimisation programme in progress. The technical audit describes the current performance limits: no sustained load campaign has been executed yet, and the figures will be published when one has.
| Entry point | What it covers |
|---|---|
| GETTING_STARTED.md | Detailed installation guide |
| ARCHITECTURE.md | Complete system architecture |
| INDEX.md | The full documentation map |
| Living maps | A functional map, a technical map and the illustrated history of every decision — interactive pages on the public site (/maps, six languages) and offline French documents, from one set of data checked on every commit |
| CLAUDE.md | The engineering rulebook the AI works under — its systemic rules, each paid for by a measured defect |
| Domain | Documents |
|---|---|
| Agents & LLM | ARCHITECTURE_LANGRAPH • PLANNER • SEMANTIC_ROUTER • LLM_PROVIDERS |
| HITL & registers | HITL • AI_ACT_TRACEABILITY • PROVENANCE_AND_CAPABILITIES |
| Voice & meetings | VOICE • VOICE_MODE • MEETINGS |
| Memory & knowledge | LONG_TERM_MEMORY • MEMORY_RESOLUTION • JOURNALS • |
| Guide | Description |
|---|---|
| GUIDE_DEVELOPPEMENT | Complete development workflow |
| GUIDE_AGENT_CREATION | How to create a new agent |
| GUIDE_TOOL_CREATION | How to create a new tool |
| GUIDE_TESTING | Testing strategy |
| GUIDE_DEBUGGING | LangGraph and log debugging |
| GUIDE_SELF_HOSTING | Production self-hosting |
364 ADR files (ADR-001 through ADR-366 — ADR-008 has no separate file) record every major architectural decision with its context, the alternatives and, increasingly, the production measurement that motivated it. Three to start with, and the full index:
I choose the product's direction, its architecture and the details of its everyday use. I use AI tools to help write the code, with a written engineering rulebook, automated checks, reviews and adversarial audits. I remain responsible for what ships.
The full story covers the method, trade-offs and work still to do.
| 60 backend domain packages | 1,059,000+ source lines (excl. tests) | 69,000+ inventoried automated tests | 364 ADRs |
| 292 versions shipped | 6 languages, parity enforced in CI | 652 Prometheus metrics | Technical audit and protocol |
Source-line figure: 1,059,000+ physical lines in Python, TypeScript, JavaScript and CSS under apps/api/src and apps/web/src, excluding test directories and *.test.*/*.spec.* files (measured 2026-10-30). The domain figure counts backend domain packages. Test inventory combines backend collection and the frontend suite; release qualification executes the repository's required gates. The published technical audit does not score security.
Your day. LIA keeps up. You decide. Designed in France, open source, self-hostable, with a six-language interface.
Contributions are welcome — bug fixes, features, documentation, tests, translations in the six supported languages, performance work. Start with the Contributing Guide.
git clone https://github.com/YOUR-USERNAME/LIA-Assistant.git && cd LIA-Assistant
git checkout -b feature/my-feature
task setup # backend + frontend + git hooks
task test:backend:unit:fast # develop and test
git commit -m "feat(agents): add weather forecast agent" # Conventional Commits
git push origin feature/my-feature # then open a PR
task ci:fast runs every CI gate that needs no service; task pre-commit is what the git hook runs| Channel | Usage |
|---|---|
| GitHub Issues | Bugs, feature requests |
| GitHub Discussions | Questions, ideas |
| [email protected] | General inquiries |
Also: the documentation index, the practical guides and the operational runbooks.
Copyright (c) 2024-2026 LIA Contributors.
This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0) — see LICENSE.
A commercial license is available for organizations that cannot comply with AGPL-3.0 terms: contact [email protected].
LIA stands on excellent open source work: Python, FastAPI, LangGraph and LangChain, SQLAlchemy, Pydantic, Alembic, PostgreSQL with pgvector, Redis, structlog, Edge TTS, sherpa-onnx, Docker; Node.js, Next.js, React, TypeScript, TailwindCSS, Radix UI, TanStack Query, react-i18next; , , , and ; and the , and open standards.
lia_worker_memory_bytes, one series per live worker), drawn on the infrastructure dashboard and watched by an alert that names the process; what a process loads is declared, measured on the target host and bounded where it multiplies — the supervisor never imports the application, heavy libraries load where they are used, and the speech engine keeps one resident model per worker (ADR-283).| Error architecture | Tools return ToolResponse / ToolErrorModel with a closed ToolErrorCode taxonomy and a recoverability flag; the API raises through centralised exception helpers, never a raw HTTPException |
| MCP / plugins | Model Context Protocol servers and apps, agentskills.io skills and Agent Plugins v1 packages use documented open interfaces, with separately reviewed trust and sandbox boundaries (MCP, plugins) |
| Supply chain | Hash-verified universal lockfiles and every build input pinned by digest, pip-audit on the full transitive tree, a weekly watch of each dependency's own advisories and end-of-life dates, a refresh that never moves a version backwards (ADR-331), a CycloneDX SBOM per release |
| Untrusted code | Skill scripts execute in a throwaway container — no Docker socket, no network, read-only filesystem, unprivileged uid, all capabilities dropped — and no sandbox means no execution, never a weaker fallback; a script the assistant writes, or a skill's command that names its hosts, reaches the web only through one egress proxy holding the keys and the allowlist (ADR-298) |
| Reach | MCP_INTEGRATION • SKILLS_INTEGRATION • PLUGINS_INTEGRATION • BROWSER_CONTROL • SUB_AGENTS |
| Initiative | HEARTBEAT_AUTONOME • SCHEDULED_ACTIONS • WORKBOARD • BRIEFING_DOMAIN |
| Channels & mobile | CHANNELS_INTEGRATION • GUIDE_TELEGRAM • GUIDE_MOBILE_ANDROID • GUIDE_MOBILE_IOS |
| Security | SECURITY • AUTHENTICATION • OAUTH • RATE_LIMITING |
| Operations | CI_CD • OBSERVABILITY_AGENTS • METRICS_REFERENCE • ALERTING • runbooks |
| Costs | LLM_PRICING_MANAGEMENT • GOOGLE_API_TRACKING • USAGE_LIMITS |