---
title: "Platform Update — August 28, 2026"
slug: "platform-update-2026-08-28"
date: "2026-08-28"
tag: "Application"
summary: "Fifty-two production releases in a week — a platform-scoped LLM usage analytics API with p50–p99 latency and cost drill-down, an ibl.ai Pro / Fast model split, a voice transcription overhaul configurable per tenant without a deploy, on-device LLM providers in the agent settings UI, and a sixteen-setting control plane for per-chat-run VM sandboxes."
author: "ibl.ai Engineering"
linkedin: |
  Fifty-two production releases in seven days. This week's theme: seeing and controlling exactly what your agents cost.

  The headline is a platform-scoped LLM usage analytics API. Cost, tokens, latency percentiles from p50 to p99, and counts — aggregated with group-by across type, model, tags and environment, with day/week/month time series, then drilled down to row-level observations and per-user, per-session traces.

  Alongside it, an ibl.ai Pro / Fast split. The single ibl.ai model name becomes ibl.ai Pro and ibl.ai Fast, a cheaper small-model variant. Fast's candidate set is exactly its own model plus fallbacks, so a Fast turn can never be quietly escalated onto a Pro-tier model — the cost ceiling you set is the cost ceiling you get.

  Also shipped this week across the ibl.ai platform:

  → Voice transcription overhaul — every provider's model resolves through config, so a tenant can adopt a newer transcription model from the Data Manager with no deploy. Agents can pin the language their learners speak and supply vocabulary hints.
  → ibl.ai speech-to-text on the gateway as a first-class provider, with per-request cost recorded to Langfuse
  → On-device LLM providers surfaced in the agent settings LLM tab, with model rows and availability guidance
  → A sixteen-setting control plane for the per-chat-run VM sandbox behind the graph agent's execute tool — CPU, memory, disk, idle timeout, lifetime and exec ceilings, all operator-set
  → Agent-based completion — a unit can be marked complete by the agent's own evaluation instead of a five-second timer
  → Admin chat-history exports now carry document_sources: the retrieved source, title, snippet, score and confidence the AI actually used to answer
  → Admin memory settings management, chat history in the user profile, multi-agent onboarding, an analytics agent picker, and role-based course content tabs

  That cadence is the point. When you run the platform yourself, upstream shipping velocity is something you receive rather than something you wait on — you pull the release on your own maintenance window.

  It is also why the ownership model matters. With ibl.ai you own all the code and the data — self-hosted inside your own perimeter, model-agnostic across any LLM, usage-based with no per-seat pricing, deployable anywhere from your own cloud to a fully air-gapped network.

  #iblai #AgenticAI #EnterpriseAI #ShipIt #LLMOps #Observability #OpenSource
---

Covers releases published **2026-08-21 → 2026-08-28** across `iblai/iblai-prod-images` (19 releases) and `iblai/iblai-web-frontend` (33 releases).

| Service / Package | Image / Pin | Version Span |
|---|---|---|
| dm | `iblai-dm-pro` | `4.343.0-ai` → `4.356.0-ai` |
| cli | `ibl-cli` (pyproject) | `6.0.0` → `6.2.0` |
| lms | `iblai-lms-spa` | `0.69.2` → `0.73.0` |
| edx | `iblai-edx-pro` | `sumac.2.52.0` → `sumac.2.55.0` |
| mfe | `iblai-edx-mfe-pro` | `sumac.0.3.4` → `sumac.0.3.6` |
| auth (deploy) | `iblai-auth-spa` | `2.2.2` → `2.2.5` |
| web-containers | `@iblai/web-containers` | `1.18.5` → `1.19.1` |
| data-layer | `@iblai/data-layer` | `1.12.106` → `1.13.0` |
| web-utils | `@iblai/web-utils` | `2.1.14` → `2.2.1` |
| mcp | `@iblai/mcp` | `1.10.4` → `1.12.1` |
| agent-ai | `@iblai/agent-ai` | `2.8.1` → `2.8.2` |
| auth (pkg) | `@iblai/auth` | `2.2.4` → `2.2.5` |
| iblai-js | `@iblai/iblai-js` | `2.5.5` → `2.7.2` |

---

## iblai-dm-pro (`4.343.0-ai` → `4.356.0-ai`)

**Admin memory settings management** (4.346.0) — tenant admins can view and update another user's memsearch settings via `GET`/`PUT /api/ai-mentor/orgs/<org>/users/<user_id>/memsearch-settings/`. Access is resolved through `UserPlatformLink.is_admin`; non-admin callers remain pinned to their own settings.

**Analytics email-host exclusion toggle** (4.348.0) — new `ENABLE_ANALYTICS_EMAIL_HOST_EXCLUSION` dynamic setting (global default `True`, platform-overridable) controls whether internal/test email hosts (`@ibleducation.com`, `@ibl.ai`) are excluded from chat-history and analytics views. Turning it off surfaces those sessions without a code change.

**Analytics proxy** (4.351.0) — new platform-scoped LLM usage analytics endpoint (`GET /api/v2/analytics/llm-usage/`) exposing cost, tokens, latency percentiles (p50–p99), and counts from the tracing backend. Three resources: `metrics` (aggregate with `group_by` type/model/tags/environment + day/week/month time series), `observations` (row-level drill-down, page-paginated), and `traces` (per-user/per-session drill-down with single-record get). All measures, aggregations, dimensions, and ordering are validated against a whitelist. RBAC usergroup row-scope is enforced on single-record fetches.

**Admin chat-history export** (4.355.0) — the `document_sources` column is available in admin chat-history exports, showing the retrieved-document context (`source`, `title`, `snippet`, `score`, `confidence_level`) the AI used to answer. A fail-safe normalizer reads every entry through `.get()` so malformed data cannot break report generation.

**Voice transcription overhaul** (4.356.0) — `TranscriptionOptions` (language + prompt) is threaded from `convert_audio_to_text_by_provider` to every provider, and each provider's model is resolved through `Config` (`VOICE_TRANSCRIPTION_OPENAI_MODEL`, `..._GROQ_MODEL`, `..._GOOGLE_MODEL`, `VOICE_TRANSCRIPTION_LANGUAGE`), so a tenant can adopt a newer transcription model from the Data Manager without a deploy. Default models move to `gpt-transcribe` (OpenAI) and `whisper-large-v3-turbo` (Groq). Mentors can pin the language their learners speak (`transcription_language`) and supply vocabulary hints (`transcription_instructions`), both editable through the mentor-settings endpoint. `AudioToTextView` accepts `mentor`, `language`, and `prompt` with precedence: request → mentor pin → tenant config → auto-detect. Provider selection stays with the platform via `VOICE_TRANSCRIPTION_PROVIDER`.

**ibl.ai speech-to-text on the gateway** (4.356.0) — speech-to-text runs on the ibl.ai gateway as a provider (`stt_model_slug` on the routing profile), with per-request cost recorded to Langfuse. The lookup can be shed per platform with `IBLAI_STT_COST_LOOKUP_ENABLED`.

**ibl.ai Pro / Fast split** (4.356.0) — the `iblai` LLM name splits into `ibl.ai Pro` (`iblai-pro`, today's configuration) and `ibl.ai Fast` (`iblai-fast`, a cheaper small-model variant). The provider key is unchanged; only `llm_name` moves and migration `0356` rewrites existing rows. Both variants share one routing-profile row. Fast's candidate set is exactly its own model plus fallbacks, so a Fast turn can never be escalated onto a Pro-tier model. The gateway is now asked to honour the configured model set via `provider.{order,allow_fallbacks,require_parameters}` and an explicit `models` fallback list. `require_parameters` keeps a tool-bound turn off any provider that would silently drop `tools`.

**Deployment:**
- Run `python manage.py migrate` (migrations `0356` — eleven additive columns + `iblai` → `iblai-pro` rename; rolling-deploy safe).
- Run `python manage.py seed_tools && python manage.py seed_llm_registry`.
- Recreate ClickHouse materialized views for the new provider bucketing:
  ```bash
  python manage.py create_clickhouse_views --action recreate --view mv_cost_per_provider_daily
  python manage.py create_clickhouse_views --action recreate --view mv_sessions_by_provider_daily
  ```
- **Breaking:** clients sending `llm_name="iblai"` must switch to `"iblai-pro"` or `"iblai-fast"`.
- **Behaviour change:** because `gpt-transcribe` replaced the singular `language` field with a `languages` list, request parameters are now built per model.

## ibl-cli (`6.0.0` → `6.2.0`)

**Sandbox control-plane settings** (6.1.0) — sixteen `IBL_SANDBOX_*` settings registered under `IBL_DM` for the per-chat-run VM sandbox backing the graph agent's `execute` tool: `IBL_SANDBOX_API_URL`, `IBL_SANDBOX_IMAGE`, `IBL_SANDBOX_CPUS` (1.0), `IBL_SANDBOX_MEMORY_MB` (512), `IBL_SANDBOX_DISK_MB` (1024), `IBL_SANDBOX_IDLE_TIMEOUT_S` (300), `IBL_SANDBOX_MAX_LIFETIME_S` (3600), `IBL_SANDBOX_EXEC_TIMEOUT_S` (60), `IBL_SANDBOX_MAX_EXEC_TIMEOUT_S` (600), `IBL_SANDBOX_SYNC_MAX_FILES` (20), `IBL_SANDBOX_STATE_FILE_MAX_BYTES` (512000), `IBL_SANDBOX_STATE_SNAPSHOT_MAX_BYTES` (8388608), `IBL_SANDBOX_SHARE_MAX_FILE_BYTES` (26214400), and `IBL_SANDBOX_CREATE_ATTEMPTS_PER_RUN` (3). `IBL_SANDBOX_API_TOKEN` is a `SecretSetting` (in `secrets.yml`, no generator). All sixteen are emitted from the common DM env template. Additive and inert by default until an operator sets API URL, token, and image; the per-mentor gate remains `MentorSettings.enable_virtual_machine`. The sandbox image must provide `python3` and GNU `grep`.

**Agent-based completion metadata key** (6.2.0) — `enable_agent_based_completion` added to `IBL_DM.COURSE_METADATA_KEYS` and `COURSE_METADATA_PUBLIC_KEYS` defaults, allowing the new Studio "Agent Based Completion" toggle to persist and propagate through course metadata.

## iblai-lms-spa (`0.69.2` → `0.73.0`)

**SDK onboarding** (0.70.0, 0.72.0) — the LMS integrates the SDK onboarding flow, including multi-agent onboarding for platforms with several agents.

**Analytics agent picker** (0.71.0) — a new agent picker on the LMS analytics view scopes analytics to a specific agent.

**Role-based course content tabs** (0.73.0) — course content tabs now gate visibility based on edX course roles.

## iblai-edx-pro (`sumac.2.52.0` → `sumac.2.55.0`)

**Agent-based completion toggle** (2.54.0) — new "Agent Based Completion" checkbox in the Studio "Mentor & Content Mode" section (`formKey: enable_agent_based_completion`). When enabled, the Skills/Mentor SPA disables the 5-second unit auto-completion timer and instead marks a unit complete based on the agent's own evaluation. Not yet wired end-to-end: the matching CLI metadata key landed in 6.2.0 (above); the SPA-side timer-disable logic is a separate change.

**SSO full-name sync** (2.55.0) — `ibl-edx-signal-relay-app` 0.6.1 → 0.6.2: `listen_for_user_save` now corrects `UserProfile.name` from `first_name`/`last_name` directly when both are present and differ from the current value, keeping the "Full Name" shown in the Skills SPA in sync with SSO-provided identity. No frontend change required.

**Unified API gateway routing** (2.55.0) — a new `unified_api_wsgi.py` entrypoint applies `X-Forwarded-Prefix` as `SCRIPT_NAME` and strips it from `PATH_INFO`, so the LMS/CMS resolves correctly when served behind the unified API gateway under a subpath.

**Deployment:** shared `apps/` changes — picked up on image rebuild + LMS/CMS restart, no migrations.

## iblai-edx-mfe-pro (`sumac.0.3.4` → `sumac.0.3.6`)

**Gradebook on Sumac** (0.3.5) — the Gradebook MFE moved from the Olive branch to `open-release/sumac.1`.

**JWT cookie fix for Discussions and Learning MFEs** (0.3.6) — Discussions and Learning MFEs are pinned to `iblai-develop`, which carries the `USE-JWT-COOKIE` CORS fix. A `frontend-platform` build stage clones and compiles `ibl-edx-mfe-frontend-platform#ibl-develop` and copies the result into both MFE images so the webpack alias resolves.

## iblai-auth-spa (`2.2.2` → `2.2.5`)

**Login-complete redirect** (2.2.5) — 401 responses during login-complete now redirect to the login page instead of the 409 conflict page. Deployment pin updated to `@iblai/auth` v2.2.5.

## @iblai/web-containers (`1.18.5` → `1.19.1`)

**ibl.ai voice provider in agent settings** (1.18.7) — the agent voice tab now includes the ibl.ai on-device provider. Voices are shown by name instead of voice id, and the voice picker rows are aligned.

**User role change guard** (1.18.8) — the user role `<select>` is disabled while a role change is in flight, preventing double-submissions. Aria labels added across all locales.

**Chat history in user profile** (1.18.9) — a chat history view is available on the user profile page.

**Multi-agent onboarding** (1.18.10) — the onboarding flow now supports selecting from multiple agents.

**Documentation & Help Center settings** (1.18.11) — new `documentation_url` and `support_url` tenant settings. The Help Center link resolves from `support_url` with a legacy fallback. A Documentation field is added to organization settings. Duplicate organization settings removed from the Advanced tab.

**Sandbox kind selection** (1.19.0) — the sandbox UI now surfaces the kind of sandbox (e.g. VM type) as a selectable option.

**On-device LLM providers** (1.19.1) — the LLM tab surfaces on-device providers and models. A provider modal renders on-device model rows with a selection hook, and an info box explains on-device availability.

## @iblai/data-layer (`1.12.106` → `1.13.0`)

**Skills chat-history reducers** (1.12.107) — Redux reducers for chat history in the skills subsystem.

**edX + Studio user roles** (1.13.0) — new API bindings for fetching user roles from edX and Studio, enabling role-based UI gating in consuming apps.

## @iblai/web-utils (`2.1.14` → `2.2.1`)

**Agent course voice autoplay** (2.1.17) — new tenant setting to enable voice autoplay for agent course interactions.

**Tauri mobile safety** (2.1.18) — desktop-only chat commands are no longer invoked on Tauri mobile builds.

**Agent-based completion flag** (2.2.0) — client-side support for the `enable_agent_based_completion` course metadata flag, gating the completion timer in consuming SPAs.

**Tenant settings: documentation & support URLs** (2.2.1) — `documentation_url` and `support_url` registered as tenant settings with a default help-center fallback to the support portal.

## @iblai/mcp (`1.10.4` → `1.12.1`)

Tracks `@iblai/web-containers`. The MCP server package picks up the voice provider, chat history, multi-agent onboarding, documentation/help-center settings, sandbox kind, and on-device LLM provider changes surfaced through web-containers.

## @iblai/agent-ai (`2.8.1` → `2.8.2`)

**Close button for embeds** (2.8.2) — new `showclosebutton` attribute on the `<agent-ai>` web component. When set, the embed renders a close button that dispatches a `closeEmbed` custom event, allowing the host page to tear down the embed frame.

## @iblai/auth (`2.2.4` → `2.2.5`)

**Login-complete redirect** — 401 responses during login-complete now redirect to the login page. Transitive dependency updates from web-containers and iblai-js.

## @iblai/iblai-js (`2.5.5` → `2.7.2`)

SDK umbrella package — re-exports updated types, hooks, and API bindings from `web-containers`, `data-layer`, `mcp`, `auth`, `web-utils`, and `agent-ai`. No standalone feature additions; version bumps track downstream packages.
