v2.1.0
Important note
Before upgrading to Eneo 2.1, review the database migration guidance below.
Manual action is required only for deployments previously upgraded from
v2.0.1 to v2.1.0-rc.1. All other supported upgrade paths require no
additional steps.
Database migration fix
Eneo 2.1 fixes an Alembic migration ordering issue introduced in
v2.1.0-rc.1. On deployments that upgraded from v2.0.1 to v2.1.0-rc.1, nine
database migrations (SCIM, model cost, model lifecycle, and transcription
changes) were silently skipped while the database was still marked as fully
migrated.
Direct upgrades from v2.0.0 or v2.0.1 to the final v2.1 release are safe.
Fresh installations require no manual action.
If you previously upgraded from v2.0.1 to v2.1.0-rc.1, repair the migration
state after deploying v2.1, with the application stopped.
First, point Alembic back at the last correctly applied revision:
UPDATE alembic_version
SET version_num = '202605061100';Then apply the skipped migrations and mark the database as current:
uv run alembic upgrade 20260603_transcription_migrate
uv run alembic stamp headDo not run alembic upgrade head instead of the two commands above. Several
migrations after the repaired revision were already applied during the
rc.1 upgrade and are not safe to re-run: a plain upgrade to head fails with
duplicate object errors and leaves the migration state partially advanced.
The commands above apply exactly the nine skipped migrations and then record
the correct final state without re-running anything else.
What's Changed
- Feature/90 icons support by @MaxEriksson2000 in #110
- feat(files): add Excel support with LLM-optimized extraction and improved error handling by @CCimen in #118
- Fix/crawler session recovery and slot cleanup by @CCimen in #119
- fix(crawler): prevent worker resurrection and Redis slot leaks by @CCimen in #120
- fix(crawler): zombie counter prevention and filename truncation by @CCimen in #121
- refactor(crawler): modularize architecture and fix session management by @CCimen in #122
- fix(worker): use same session for job status updates to prevent deadlock by @axelander in #124
- Feature/docs site by @axelander in #54
- add version info to sidebar by @axelander in #117
- enable eu and swe models by default by @axelander in #116
- feat: add mobile-adapted app view for dashboard by @MaxEriksson2000 in #111
- Fix exception during Azure openai stream iteration by @gdm-allo in #126
- Feature/sharepoint integration improvements by @MaxEriksson2000 in #78
- Fix/documentation deployment by @CCimen in #127
- fix: update React version for docs page to mitigate CVE-2025-55182 by @axelander in #131
- build and push docs to github page by @axelander in #133
- Docs/architecture diagrams update by @CCimen in #135
- use markdown for images to resolve basePath correctly by @axelander in #136
- chore(docs): upgrade nextra to 4.6.1 and add official style import by @CCimen in #128
- fix(worker): improve cron job session management and reliability by @CCimen in #129
- Merge pull request #7 from eneo-ai/develop by @CCimen in #137
- Refactor/sync main to develop by @axelander in #138
- fix: restore websites tab visibility in personal space by @CCimen in #139
- remove PAGE_BASE_PATH from docs build to work with custom domain docs… by @axelander in #141
- perf(tests): optimize integration test cleanup with batched truncation by @axelander in #142
- feat: Add comprehensive audit logging system with GDPR compliance by @CCimen in #100
- Fix/improve audit logging and update documentation for audit logging by @CCimen in #144
- Fix/63 en locallzation not working by @axelander in #125
- Fix/remove false docs security by @CCimen in #146
- docs: add healthchecks and troubleshooting to deployment config by @CCimen in #148
- add gpt 5.1 via azure and update litellm to support reasoning = none by @axelander in #147
- feat: integration improvments by @MaxEriksson2000 in #149
- fix: wso2 validation issues by @MaxEriksson2000 in #151
- fix: removed disable state on button by @MaxEriksson2000 in #155
- Fix/1.6.0 by @MaxEriksson2000 in #156
- fix: remove expired Yarn repository in devcontainer setup by @CCimen in #158
- fix: bug regarding respons session id by @MaxEriksson2000 in #163
- Fix/redis worker resilience by @CCimen in #160
- fix: reduce lost recordings and transcription failures by @CCimen in #161
- fix: router issues solved by @MaxEriksson2000 in #167
- Feature/sharepoint route issues by @MaxEriksson2000 in #168
- fix: improve SharePoint logging and fix file deletion error by @MaxEriksson2000 in #169
- Feature/sharepoint darkmode support by @MaxEriksson2000 in #170
- docs: information about webhooks with proxy by @MaxEriksson2000 in #172
- fix: improve job manager display with overflow scroll and better job … by @MaxEriksson2000 in #174
- fix: improve audio recorder error UI and add missing translations by @CCimen in #175
- Feature/per tenant models by @axelander in #145
- feat: added JIT support for oidc by @MaxEriksson2000 in #152
- feat(tests): added assistant router tests by @MaxEriksson2000 in #165
- feat: add error_id tracing for 500 responses by @MaxEriksson2000 in #166
- feat: mobile and app imrovements by @MaxEriksson2000 in #154
- remap vllm to hosted_vllm for litellm compliance by @axelander in #178
- readd none option for > gpt-5 models + fix tenant selector by @axelander in #181
- fix: resolve OpenAPI schema issues for Java code generation by @CCimen in #182
- Feat/user groups handling by @MaxEriksson2000 in #179
- feat: improve file text storage and downloads by @MaxEriksson2000 in #99
- fix(devcontainer, migrations): resolve Yarn GPG key failure and Alembic multiple heads by @CCimen in #185
- add icons for vLLM and mistral, add vllm option to edit provider dial… by @axelander in #187
- feat: add pyright audit checks and fix audit slop (testing) by @CCimen in #171
- fix: assistant created without a model now can change to a model when… by @axelander in #191
- feat: add voice-to-text input button using Web Speech API by @MaxEriksson2000 in #186
- chore: remove legacy hardcoded templates seeded via migrations by @MaxEriksson2000 in #189
- Feature/improve thinking clarity UI by @CCimen in #177
- Fix pyright CI baseline stability by @CCimen in #192
- feat: show crawl failure warnings in knowledge source picker by @MaxEriksson2000 in #184
- add debug logs to show what family is used for embeddings by @axelander in #194
- fix(sharepoint): remove admin requirement for service account and rename Azure AD to Microsoft Entra ID by @MaxEriksson2000 in #193
- fix: embedding model provider not resolved correctly in worker by @axelander in #196
- allow build images on open PRs but needs manual approval by @axelander in #200
- chore: update docs with contribution guidelines by @axelander in #199
- Feature/crawl improvements by @MaxEriksson2000 in #197
- resolve migration order for app_templates and model migration by @axelander in #201
- fix: use deployment_name as model name for Azure models in migration by @MaxEriksson2000 in #204
- fix: return descriptive error when model provider is inactive by @MaxEriksson2000 in #202
- Feature/grouped model selector by @MaxEriksson2000 in #203
- fix: decrypt federation client_secret before masking by @MaxEriksson2000 in #205
- fix: sharepoint personal auth by @MaxEriksson2000 in #208
- feat: sharepoint imrovements by @MaxEriksson2000 in #209
- 1.7.0 add migration guide to docs by @axelander in #210
- make tmp dir location configurable by @axelander in #213
- if groupchat, check for included assistants by @axelander in #216
- docs: sharepoint membership update by @MaxEriksson2000 in #215
- fix: invalidate model providers on cancel addwizard flow to show empt… by @axelander in #207
- fix: update transcription model references on migration by @axelander in #218
- fix: pass include_applications to service and load group_chats in spa… by @CCimen in #219
- fix: authorization bypass in info blob delete and JSON injection in c… by @MaxEriksson2000 in #190
- Feature/voice input speech to text by @MaxEriksson2000 in #220
- fix: set resource permissions before building sparse space model with… by @CCimen in #222
- fix: strengthen RAG citation prompt to reduce missing references by @MaxEriksson2000 in #225
- feat: restrict integration permissions to AI Configurator and Owner by @MaxEriksson2000 in #221
- add support for extended logging on tenant model adapter by @axelander in #226
- feat(sharepoint): wrapper improvements by @MaxEriksson2000 in #227
- feat: categorize SharePoint sites by Teams membership in import dialog by @MaxEriksson2000 in #224
- feat: add model validation step before creation in AddWizard by @MaxEriksson2000 in #183
- feat: grouphandling sharepoint improvements by @MaxEriksson2000 in #229
- remove voicerecord feature by @axelander in #230
- Feature/mcp poc by @axelander in #173
- show warning on assistant settings if mcp tools not supported by @axelander in #232
- fix migration chain for mcp feature by @axelander in #236
- Fix/pdfplumber sharepoint extraction by @MaxEriksson2000 in #237
- stop autoloading venv twice by @axelander in #228
- fix: handle group-only members in space assembler by @MaxEriksson2000 in #238
- model provider tables collapse as intended by @axelander in #244
- rename intric-prefixed envs to eneo_ by @axelander in #247
- increase max completion tokens by @axelander in #245
- feat(insights): improve performance with aggregated queries and optimized data flow by @CCimen in #188
- add audit logs to mcp integration by @axelander in #249
- fix: prevent deletion of in use embedding models by @axelander in #248
- add bearer token auth on mcp servers by @axelander in #251
- remove reintroduced file by @axelander in #252
- remove assistant insights from admin by @axelander in #254
- disable mcp when knowledge attached to assistant by @axelander in #259
- show warning on both knowledge and mcp servers, require mutual exclus… by @axelander in #263
- fix(cors): return explicit origin instead of wildcard when credential… by @axelander in #275
- Feature/shared space integrations by @MaxEriksson2000 in #243
- fix: prevent tmp file leaks on upload and transcription errors by @MaxEriksson2000 in #265
- Replace browser alert() calls with toast notifications by @MaxEriksson2000 in #274
- feat: add LiteLLM provider management system by @MaxEriksson2000 in #256
- Add security classification to MCP servers, improve tool sync UX, fix cross-tenant vulnerability by @MaxEriksson2000 in #261
- Fix/token counter and upload errors by @MaxEriksson2000 in #253
- Fix: filter non-standard models and sort by release date by @MaxEriksson2000 in #278
- fix: isolate backend .venv in named Docker volume by @MaxEriksson2000 in #279
- Consolidate admin usage page and improve usage levels by @MaxEriksson2000 in #282
- regenerate intric-js by @axelander in #287
- Add icon support to group chats by @MaxEriksson2000 in #285
- Optimize admin/models capabilities loading and fix model sorting by @MaxEriksson2000 in #288
- feat: use actual LLM provider token counts instead of tiktoken estimates by @MaxEriksson2000 in #280
- loosen validation of provider name by @axelander in #293
- add nickname to embedding models by @axelander in #289
- fix: correctly identify transcription model type when editing via nam… by @axelander in #294
- fix(templates): remove knowledge from app templates and persist model selection by @CCimen in #297
- fix(security): pin litellm to safe version, harden CI dependency controls by @CCimen in #301
- fix: use conventional KB/MB/GB labels instead of KiB/MiB/GiB by @MaxEriksson2000 in #299
- Add GitHub issue templates by @MaxEriksson2000 in #306
- fix: improve token handling and context window UX by @MaxEriksson2000 in #298
- feat: add server-side pagination to admin users view by @MaxEriksson2000 in #307
- Feature/allow multiorigins by @jerkerosatiesk in #262
- docs: sharepoint-sharedspace-improvements by @MaxEriksson2000 in #311
- feat: centralized error handling with localized messages by @MaxEriksson2000 in #308
- fix: require admin permission to modify tenant_app integrations by @MaxEriksson2000 in #312
- fix: update dependency versions for security patches by @MaxEriksson2000 in #313
- fix: ensure clean dependencies on devcontainer rebuild by @MaxEriksson2000 in #314
- feat: patch federations by @jerkerosatiesk in #310
- fix schema.d.ts generation by @axelander in #318
- fix: restore browser import breaking chat streaming by @MaxEriksson2000 in #319
- fix: handle stale core.hooksPath in devcontainer post-create by @MaxEriksson2000 in #322
- chore(deps): update litellm 1.80.0 → 1.83.0 by @MaxEriksson2000 in #321
- feat(web): introduce shadcn-svelte with Card on space overview by @MaxEriksson2000 in #324
- feature/api-key-v2-security-hardening-and-admin-user-management by @CCimen in #206
- fix: resolve all backend pyright errors and enforce code quality checks by @MaxEriksson2000 in #292
- fix: resolve all frontend type errors and enforce strict type checking by @MaxEriksson2000 in #291
- chore: enable global pyright strict mode by @MaxEriksson2000 in #325
- chore: remove plan file by @axelander in #326
- fix: public keys can only have read permission by @axelander in #328
- fix: remove dead code + fix add models create transform by @axelander in #329
- Migrate api-keys feature to shadcn-svelte + colour token cleanup by @MaxEriksson2000 in #327
- fix: group chat publish endpoint, ModelId fields, worker cleanup by @MaxEriksson2000 in #331
- bugfix: allow listing mcp servers as a regular user by @axelander in #335
- Remove API key scope enforcement and strict mode toggles by @MaxEriksson2000 in #334
- fix: reasoning_content AttributeError on non-reasoning models by @MaxEriksson2000 in #338
- feat: improve API key management flows by @MaxEriksson2000 in #337
- feat(space-admin-keys): only allow rotation of your own keys and serv… by @axelander in #341
- fix: defer tenant SSO redirect_uri to backend config by @CCimen in #342
- fix: load assistant/app attachments with text content by @axelander in #343
- chore(deps): bump langchain-core to 0.3.84 by @axelander in #344
- feat(api-keys): scope-aware resource_permissions handling by @axelander in #345
- fix(deployment): bump Traefik to floating v3 tag for Docker API compatibility by @CCimen in #350
- chore: make sure schema.d.ts is up to date by @axelander in #352
- fix(mcp): replay persisted tool calls to the LLM on follow-up turns by @axelander in #351
- chore: ignore Codex configuration by @MangeAtOrebroKommun in #355
- feat: unify predefined roles into standard roles system by @MaxEriksson2000 in #348
- feat(api-keys): default to active and share state filter component by @MaxEriksson2000 in #356
- feat(api-keys): gate v2 key creation on session + Permission.API_KEYS by @axelander in #358
- feat(api-keys): change-expiration action and rotate-with-extend option by @MaxEriksson2000 in #357
- chore(deps): bump litellm 1.83.0 -> 1.83.10 by @MaxEriksson2000 in #359
- Add backend-owned model kwarg capabilities by @CCimen in #362
- fix(mcp): prevent anyio cancel-scope leak that creeps gunicorn CPU to… by @axelander in #361
- Fix reasoning model kwarg capability toggle by @CCimen in #363
- feat(model-providers): live-list models, generalized across providers by @MaxEriksson2000 in #366
- refactor(model-org): drop hardcoded ModelOrg enum by @MaxEriksson2000 in #365
- ci: simplify to develop + release branches, remove main branch by @axelander in #276
- fix(api-keys): scope /account/api-keys list to caller-owned keys + au… by @axelander in #368
- update admin sidebar icon by @axelander in #370
- feat(audit): capture HTTP request context (ip, user-agent, request-id… by @axelander in #373
- ci: add security dependency gates by @CCimen in #375
- fix(backend): narrow supported python runtime by @CCimen in #392
- chore(deps): pause dependabot version updates by @CCimen in #395
- fix(api-keys): unblock /ask for service keys + show service keys in s… by @axelander in #396
- refactor(api-keys): drop central allowed-origins allowlist; trust per… by @axelander in #398
- option to disable grace period on rotating api-key by @axelander in #399
- Feature/fine grained pk permissions by @axelander in #400
- fix(api-keys): make service keys usable on admin endpoints + gate use… by @axelander in #401
- feat(chat/attachments): compact 2-column grid with collapse for many files by @MaxEriksson2000 in #405
- fix(group-chat): prevent crash when selector returns out-of-range index by @axelander in #402
- fix(api-keys): allow users to edit their own keys from personal listing by @axelander in #406
- refactor(users): stop auto-provisioning personal API keys at user creation by @MaxEriksson2000 in #409
- fix(audit): sweep actor resolution through audit_actor_for to unblock service keys by @MaxEriksson2000 in #408
- feat(auth): block service-key creation of new resources by @axelander in #410
- fix(sessions): include service-key sessions in tenant-scoped queries by @axelander in #407
- chore(ci): pytest filterwarnings = error + bortstädning av läckor by @MaxEriksson2000 in #413
- fix(chat): persist user message and partial reply when stream is aborted (#349) by @Banald in #412
- feat: flag deprecated models and redesign admin models table by @MaxEriksson2000 in #315
- Normalize SharePoint scope paths before comparison by @MaxEriksson2000 in #430
- fix migration chain after pr merge by @axelander in #433
- chore(releases): publish release SBOM assets by @CCimen in #432
- chore(releases): label SBOM release assets by @CCimen in #434
- fix(alembic): place model-lifecycle migrations after session migration by @axelander in #435
- Add deterministic local commit and push guardrails by @CCimen in #346
- fix(api-keys): allow scoped user file cleanup by @CCimen in #438
- chore(releases): add backend Python runtime SBOM by @CCimen in #442
- docs(releases): document SBOM release flow by @CCimen in #444
- chore(security): pause CodeQL workflow by @CCimen in #446
- feat(open telemetry): Implement v1 of OTEL in Eneo by @AronAtOrebroKommun in #439
- Handle Microsoft Graph 429 throttling in SharePoint sync (Retry-After + backoff) and harden the sync lock by @MaxEriksson2000 in #428
- chore(security): attest release SBOM artifacts by @CCimen in #448
- docs(api-keys): add v2 migration faq by @axelander in #449
- chore(devcontainer): install ripgrep by @axelander in #447
- chore(devx): add per-branch database snapshot scripts by @axelander in #445
- feat: allow renaming conversations from history by @TimSkoglund in #211
- fix(mcp): disconnect clients in reverse-connect order to honour anyio LIFO by @axelander in #423
- fix(models): show tenant-configured Azure completion models by @MaxEriksson2000 in #453
- feat(scim): add SCIM 2.0 provisioning server (RFC 7644) by @MangeAtOrebroKommun in #443
- docs(sharepoint): clarify Group.Read.All requires admin consent by @MaxEriksson2000 in #456
- fix(audit): complete ACTION_METADATA coverage and guard it by @MaxEriksson2000 in #457
- Unique model display names + transcription model migration by @MaxEriksson2000 in #452
- feat(models): force-override migration blockers and split warnings by severity by @MaxEriksson2000 in #455
- feat(audit): translate action/category labels by key in the frontend by @MaxEriksson2000 in #458
- chore(tooling): dead-code analysis (knip, vulture, deptry) + aggregated task commands by @MaxEriksson2000 in #460
- test: frontend test infrastructure (Vitest + Playwright E2E) by @MaxEriksson2000 in #459
- docs(scim): group identity matching + fact-check the SCIM guide by @MangeAtOrebroKommun in #461
- deps: security sweep (backend + frontend) with JWT key-length and test-shutdown fixes by @MaxEriksson2000 in #462
- test(actors): guard website tenant-permission gate in shared spaces by @MaxEriksson2000 in #465
- fix(knowledge): make source pagination reactive in assistant edit by @MaxEriksson2000 in #467
- fix(completion-models): surface provider outages to API consumers by @CCimen in #454
- chore(backend): integration test configuration less wobbly when run in gh codespaces by @jonatan-hagglund-fk in #422
- fix(embeddings): set encoding_format to "float" for strict OpenAI APIs (#339) by @axelander in #468
- refactor(knowledge): rebuild SelectKnowledge with runes + shadcn (modern design) by @MaxEriksson2000 in #469
- fix(cors): seed PUBLIC_ORIGIN into allowed_origins so CORS works on fresh installs by @axelander in #466
- feat(roles): add personal_chat permission decoupled from assistants by @MaxEriksson2000 in #470
- ci: retry uv python install to survive transient GitHub CDN 504s by @MaxEriksson2000 in #471
- fix: harden pyright strict-mode follow-up regressions by @CCimen in #336
- fix(spaces): handle legacy NULL completion_model_kwargs without crashing personal space by @CCimen in #354
- ci(e2e): build web app outside the Playwright webServer timeout by @MaxEriksson2000 in #472
- fix(web): make failed job/upload error messages expandable by @MaxEriksson2000 in #332
- chore(api): backfill OpenAPI route metadata for spaces & users routers by @MaxEriksson2000 in #473
- chore(api): backfill OpenAPI route metadata for tenant/auth/misc routers by @MaxEriksson2000 in #479
- chore(api): backfill OpenAPI route metadata for knowledge/IO routers by @MaxEriksson2000 in #477
- chore(api): backfill OpenAPI route metadata for model/provider routers by @MaxEriksson2000 in #474
- chore(api): backfill OpenAPI route metadata for admin/config routers by @MaxEriksson2000 in #478
- chore(api): backfill OpenAPI route metadata for chat/assistant routers by @MaxEriksson2000 in #476
- chore(api): backfill OpenAPI route metadata for sysadmin router by @MaxEriksson2000 in #475
- ci(api): enforce route metadata across all endpoints by @MaxEriksson2000 in #481
- ci: advisory dead-code report on PRs (vulture + deptry + knip) by @MaxEriksson2000 in #482
- Move theme switcher to header & fix failed-pages dark mode by @MaxEriksson2000 in #483
- fix(admin/users): refresh list after editing a user by @axelander in #485
- fix(files): handle WebP/AVIF uploads instead of crashing by @axelander in #486
- Migrate app header to shadcn (ProfileMenu, JobManager, nav redesign) by @MaxEriksson2000 in #484
- feat(help-assistants): Prompt Guide v1 by @Banald in #437
New Contributors
- @gdm-allo made their first contribution in #126
- @MangeAtOrebroKommun made their first contribution in #355
- @AronAtOrebroKommun made their first contribution in #439
- @TimSkoglund made their first contribution in #211
- @jonatan-hagglund-fk made their first contribution in #422
Full Changelog: v1.5.2...v2.1.0