Local-first, multi-tenant AI agent platform built with ASP.NET Core, Vue and LM-Kit.NET. The runtime includes native ReAct agents, supervisor-based multi-agent delegation, user-scoped memory, RAG, HITL approvals, structured default tools, document processing, vision, speech and MCP server integration.
Prerequisites: Docker Desktop with at least 12 GB available memory.
Copy-Item .env.example .env
# Edit .env and replace POSTGRES_PASSWORD, REDIS_PASSWORD and JWT_SECRET_KEY.
docker compose up --build -d
docker compose psThe API applies pending EF migrations before accepting traffic. Open http://localhost. No default administrator is created. For an empty local database, temporarily configure BootstrapAdmin__Enabled=true, BootstrapAdmin__Email and BootstrapAdmin__Password, start the API once, then disable those settings.
The bundled Compose stack serves plain HTTP for local development, so AUTH_COOKIE_SECURE=false. Any internet-facing deployment must terminate TLS and set AUTH_COOKIE_SECURE=true.
Vue/Nginx ──cookie JWT──> ASP.NET Core API
│
┌─────────────────┼───────────────────┐
│ │ │
PostgreSQL Qdrant Redis
users/chat/audit RAG + memory cache/revocation
│
LM-Kit.NET models
ReAct / supervisor / vision / speech
AI safety boundaries:
- The server chooses model IDs; chat callers cannot supply model URLs.
- Remote configured models are HTTPS-only, host/DNS checked, size- and timeout-limited, and downloaded atomically.
- RAG vectors use a private
tenant + useraccess scope by default. - Tools pass permission, sandbox, timeout, output-budget, audit and HITL controls.
- Model output is escaped before frontend HTML rendering.
- AI endpoints use per-user token-bucket rate limiting.
Safe LM-Kit default tools enabled for ReAct are arithmetic, date/time, JSON, CSV, XML and statistics. File-changing tools are not exposed as defaults.
dotnet test .\LmKitOmniApi.Tests\LmKitOmniApi.Tests.csproj -c Release
dotnet build .\LmKitOmniApi\LmKitOmniApi.csproj -c Release
Set-Location .\LmKitOmniClient
npm ci
npm run test:unit
npx playwright install chromium
npm run test:e2eFull-stack browser verification (isolated Docker project, real API and data services):
docker compose --env-file .env.example -p lmkit-fullstack-e2e -f docker-compose.yml -f docker-compose.e2e.yml up -d --build --wait --wait-timeout 180
Set-Location .\LmKitOmniClient
npm run test:e2e:fullstack
Set-Location ..
docker compose --env-file .env.example -p lmkit-fullstack-e2e -f docker-compose.yml -f docker-compose.e2e.yml down -v --remove-orphansImportant configuration:
| Setting | Purpose |
|---|---|
JwtSettings__SecretKey |
JWT signing secret, at least 32 bytes |
REDIS_PASSWORD |
Redis requirepass shared by the server and the API connection string (no commas) |
AuthCookies__Secure |
Must be true behind production HTTPS |
Database__ApplyMigrations |
Apply pending migrations on API startup |
DataProtection__KeyPath |
Persistent key ring for encrypted approvals/MCP headers |
DataProtection__CertificatePath |
Optional PKCS#12 certificate used to encrypt the key ring at rest |
AiModels__DefaultChat |
Server-controlled LM-Kit model ID |
SemaphoreLimits__Chat |
Concurrent chat inference limit |
LMKit__LicenseKey |
Optional LM-Kit commercial license |
Operational rollout and rollback procedures are in the deployment runbook. The current functional assessment is in the audit report.
- The
/widget/chatroute requires an authenticated application session until a dedicated origin-bound widget credential flow is implemented. - MCP configuration is tenant-admin scoped and secrets are encrypted. Remote tools use the official Model Context Protocol C# SDK over Streamable HTTP, negotiate the stateless
2026-07-28protocol and fall back to initialize/session revisions for older servers. - Real model-quality gates require licensed/configured model artifacts and are separate from deterministic unit and API smoke tests.