Skip to content

Releases: databricks-solutions/agent-control-plane

v0.1.2

Choose a tag to compare

@bkaankuguoglu bkaankuguoglu released this 02 Jun 12:10
c71c0b9

This release builds the Unity AI Gateway v2 story and steps the app back from enforcement it shouldn't own. Two design decisions drove it (detail below): keep v2 on its own tab rather than replacing the existing gateway view, and remove in-app budgeting in favor of the platform's native control.

Added

  • Unity AI Gateway v2 (Beta) tab. A dedicated tab surfacing data that exists only in system.ai_gateway.usage (v2-routed traffic, ~20-min fresh): cached tokens, p50/p95 latency, p95 time-to-first-byte, and a per-endpoint table with a freshness ("as of") badge and a scope tooltip. The (Beta) marker is a label pill, not plain text. New discovery task workflows/11_discover_ai_gateway_usage.py → Delta → Lakebase (uag_usage_summary); backend get_uag_v2_usage() and GET /gateway/uag-v2-usage, both degrading gracefully to empty when the (account-scoped) system table is unreadable or unsynced.
  • v2 usage breakdowns on that tab — three additive cuts of system.ai_gateway.usage: Agent vs. Human (requester_type), Top Models (destination_model), and By API Type (api_type), each rendered as a proportion-bar card. New uag_usage_breakdown Delta table + Lakebase mirror; the backend response gains a breakdowns object keyed by dimension.
  • Actual per-user cost via Unity AI Gateway v2 attribution, from system.billing.usage joined to v2 usage (replaces estimated splits where v2 data exists).
  • Rate-limit (429) visibility per endpoint and per user, sourced from system.serving.endpoint_usage.

Changed

  • The AI Gateway top KPI row (Total Endpoints / Ready / Gateway Enabled / Requests 24h / Unique Users 24h / Error Rate 24h) now renders only on the Overview tab, so the Metrics, Permissions, Rate Limits, and v2 tabs aren't fronted by Overview-scoped numbers.

Removed

  • In-app per-user / per-group token budgeting (FEATURE_BUDGETS_ENABLED, the Budgets tab, /gateway/budgets* routes, budgets_service.py, and the related config). Unity AI Gateway v2 ships native budgets / spend controls; the app should not run a competing enforcement path. The Lakebase gateway_budgets table is left intact (orphaned, non-destructive). We will integrate the native budgets once a public v2 management API is available.

Security

  • Frontend dependency advisories cleared: axios, postcss, follow-redirects, picomatch bumps; Vite 5 → 6 (esbuild dev-server advisory); lodash override → 4.18.1.

Design decisions

  • Why v2 is a separate tab, not a replacement. system.ai_gateway.usage only covers traffic routed through v2-enabled endpoints — a subset of all serving requests — and carries no dollar cost and almost no 429s. The broad/authoritative sources remain system.serving.endpoint_usage (all serving + rate-limit hits) and system.billing.usage (billed cost). Folding v2 into — or replacing — the main view would contaminate broad metrics with a partial-coverage subset and drop cost/429 coverage. So v2 is additive: its own clearly-Beta tab for the things only it has (cached-token %, TTFB, requester/model/API breakdowns, ~20-min freshness). When v2 eventually supersedes the legacy gateway, we expand this tab rather than re-plumb the others.
  • Why in-app budgeting was removed. Enforcement belongs in the request path, which is the gateway — not in an app reading mirrored tables after the fact. Running our own budgets alongside v2's native budgets would create two sources of truth and a split-brain control. The v2 policy/budget management APIs are not yet public, so anything built now would target unstable internals and need rebuilding. The app stays in its lane — observability, not enforcement — and will surface native budgets once their API lands.

Full changelog: https://github.com/databricks-solutions/agent-control-plane/blob/main/CHANGELOG.md

v0.1.1

Choose a tag to compare

@bkaankuguoglu bkaankuguoglu released this 29 May 21:02

Added

  • Ask Genie chat overlay (behind FEATURE_GENIE_ENABLED, defaults off; requires GENIE_SPACE_ID). Floating bottom-right FAB on every page; ⌘/Ctrl+K to toggle. Sends questions to the Databricks Genie REST API on behalf of the signed-in user, polls until completion, and renders Genie's prose answer alongside a chart or table derived from the SQL it ran. The bootstrap script setup_genie_space.py provisions an ACP Analytics space with 11 Delta tables and 30 sample questions.
  • Auto-detected result charts in the overlay: line (date × numeric), bar with top-15 + "Other" bucket (string × numeric), multi-series line (date × category × numeric), stacked bar with top-8 series + "Other" bucket (string × category × numeric), and donut for ≤6 categories. Y-axis uses compact formatting (1.38B, $12K); hover shows full precision; column-name hints route currency/percent formatting automatically. Date cells render as "May 16" with full ISO on hover.
  • Per-route starter chips in the empty state. Routes covered: governance, agents, agent detail, ai-gateway, observability, workspaces, tools, knowledge bases, admin.
  • In-chat retry on errors (re-asks the previous question), cancel button while Genie is thinking (AbortController-aware poll loop), and conversation persistence across hard refresh via sessionStorage.
  • Per-user / per-group token budgets (behind FEATURE_BUDGETS_ENABLED, defaults off). Admins set a token cap per principal scoped optionally to an endpoint and a period (day / month / quarter / year). The new "Budgets" sub-tab on AI Gateway shows real-time spent vs cap with ok / warning / breached status pills, a breached-count header banner, and a token-amount input that accepts K / M / B suffixes. Spend is computed on read from gateway_usage_daily (input + output tokens) — no separate cache, no dollar conversion. For authoritative billed dollars, the Governance tab remains the source of truth.
  • New Lakebase table gateway_budgets (created by setup_lakebase_tables.py); new REST surface GET/POST/PATCH/DELETE /api/v1/gateway/budgets plus GET /api/v1/gateway/budgets/alerts; admin gating via the existing require_admin dependency.

Changed

  • Billing data refresh moved from app startup to the discovery workflow. New task workflows/09_discover_billing.py pulls system.billing.usage, system.billing.list_prices, and system.serving.endpoint_usage every 30 min into four Delta tables (billing_serving_daily, billing_token_daily, billing_product_daily, billing_user_endpoint_daily). 02_sync_to_lakebase.py (Phase 7) mirrors them to Lakebase and stamps billing_cache_meta.last_refreshed. The app's billing_service.py is now a read-only layer over the Lakebase cache — maybe_refresh_async()/force_refresh_async() are kept as no-op stubs for backward compatibility. Brings the billing pipeline in line with the project's discovery → Delta → Lakebase pattern and exposes per-endpoint cost data to Genie/analytics consumers via Delta.

v0.1.0

Choose a tag to compare

@bkaankuguoglu bkaankuguoglu released this 27 May 10:36

Added

  • Knowledge Bases page: unified Vector Search + Lakebase monitoring with cost attribution
  • Vector Search: endpoint/index discovery, sync status, health history, workload cost breakdown
  • Lakebase: instance inventory, compute vs storage cost, per-workspace breakdown
  • Gateway usage caching: all system.serving queries cached via workflow (zero live queries)
  • User analytics caching: activity data cached via workflow
  • 6 parallel discovery workflow tasks (agents, observability, knowledge bases, user analytics, gateway usage)
  • All billing data cached in kb_billing_daily Lakebase table
  • Recharts line charts for cost trends on Knowledge Bases page
  • Trace discovery: Tier 2a (AI Gateway / Model Serving inference logs from *_payload UC tables) and Tier 2b (UC-stored MLflow traces from both *_otel_spans and trace_logs_* table formats), both account-wide via Unity Catalog SQL
  • Gateway Requests panel in Observability with payload deep-dive
  • Trace deep-dive view now serves UC-stored traces from the Lakebase cache (no MLflow REST round-trip)
  • Trace and gateway-log time-window selectors extended to 180d / 365d

Changed

  • Knowledge Bases billing reads from Lakebase cache (was live system table queries)
  • Gateway usage reads from Lakebase cache (was live system table queries)
  • User analytics reads from Lakebase cache (was live system table queries)
  • Sidebar nav reordered: Agents → AI Gateway → Knowledge Bases → Tools → ...
  • Trace discovery's visibility model and run-as principal recommendation documented in README and installation guide
  • observability_trace_details lookup falls back to request_id-only when workspace_id is empty (UC traces have no owning workspace)

Fixed

  • grant_sp_lakebase.py now registers the app SP correctly on Provisioned Lakebase via POST /api/2.0/database/instances/{name}/roles with identity_type=SERVICE_PRINCIPAL. The previous Provisioned-mode branch only printed a TODO message and skipped role registration, leaving operators to do it by hand — and raw psql CREATE ROLE produced a PG_ONLY role that couldn't validate Databricks-OAuth-minted passwords (every app Lakebase read failed with password authentication failed)
  • 02_sync_to_lakebase.py wraps all DDL (ALTER, CREATE INDEX) in PostgreSQL savepoints so the workflow tolerates non-owner-runs without poisoning the surrounding transaction (caught failures roll back to the savepoint and the run continues)
  • Installation guide documents the workflow-before-app deploy order to avoid the SP-ownership trap on fresh Lakebase instances

Notes

  • Tier 3 (cross-workspace MLflow REST fan-out for default-backend traces) is on the roadmap. Until then, default-backend traces are visible only from within their owning workspace; UC-stored traces and AI Gateway logs are covered account-wide.