Skip to main content

Architecture Overview

Genie Workbench is a full-stack application deployed as a Databricks App. This document describes the major components, their interactions, and the data flows between them.

High-Level Architecture

Backend Structure

The backend is a FastAPI application (backend/main.py) that provides REST API endpoints and serves the built React frontend as static files.

Entry Point (backend/main.py)

  • Registers OBOAuthMiddleware for user identity on all /api/* routes
  • Mounts routers with their prefixes
  • Serves frontend/dist/ as static files (SPA with fallback to index.html)
  • On startup, ensures the GSO job's run_as matches the app's SP via _ensure_gso_job_run_as()

Routers

RouterPrefixPurpose
analysis.py/apiSpace fetch/parse, app settings, debug auth
spaces.py/apiSpace listing, scanning, history, starring
admin.py/api/adminOrg-wide dashboard, leaderboard, alerts
auth.py/api/authCurrent user info, health check
create.py/api/createCreate agent chat, UC discovery, wizard, session management
auto_optimize.py/api/auto-optimizeGSO trigger, run management, results, patches, suggestions

See Appendix A: API Reference for the complete endpoint list.

Services

ServiceFilePurpose
Authservices/auth.pyOBO ContextVar management, SP singleton, WorkspaceClient factory
Genie Clientservices/genie_client.pyGenie API: fetch space, list spaces, SP fallback on scope error
Scannerservices/scanner.pyRule-based IQ scoring (12 checks, 3 maturity tiers)
Create Agentservices/create_agent.pyMulti-turn tool-calling LLM agent for agent creation
Create Agent Toolsservices/create_agent_tools.pyTool definitions: UC discovery, SQL, config generation
Create Agent Sessionservices/create_agent_session.pySession persistence (L1 in-memory + L2 Lakebase)
Plan Builderservices/plan_builder.pyParallel LLM plan generation across 5 sections
LLM Utilsservices/llm_utils.pyOpenAI-compatible LLM client via Databricks model serving
UC Clientservices/uc_client.pyUnity Catalog browsing (catalogs, schemas, tables)
Lakebaseservices/lakebase.pyPostgreSQL persistence with in-memory fallback
GSO Lakebaseservices/gso_lakebase.pyGSO synced table reads from Lakebase

Prompt Templates

  • backend/prompts/ — templates for analysis
  • backend/prompts_create/ — modular templates for the create agent (step detection, system prompts, tool instructions)
  • backend/references/schema.md — Genie Space JSON schema reference (needed at runtime)

Frontend Structure

The frontend is a React 19 + TypeScript + Tailwind CSS v4 application built with Vite.

App.tsx uses React state (not a router library) to switch between four views:

ViewComponentDescription
listSpaceListBrowse and search Genie Agents with IQ scores
detailSpaceDetailSpace detail with tabs: Score, Optimize, History
adminAdminDashboardOrg-wide stats, leaderboard, alerts
createCreateAgentChatConversational agent for building new Genie Agents

Component Organization

  • components/ui/ — design system primitives (button, card, badge, etc.) using class-variance-authority
  • components/auto-optimize/ — 24 components for the GSO optimization UI
  • pages/SpaceList, SpaceDetail, AdminDashboard, HistoryTab, IQScoreTab
  • hooks/useAnalysis, useTheme
  • lib/api.ts — all API calls and SSE streaming helpers
  • types/index.ts — TypeScript mirrors of backend Pydantic models

Design System

  • Primary accent: Electric Indigo (#4F46E5)
  • Secondary accent: Cyan (#06B6D4)
  • Themes: Light and dark mode via CSS variables on :root / .dark, toggled by useTheme() hook
  • Fonts: Cabinet Grotesk (display), General Sans (body), JetBrains Mono (code)

GSO Package

The packages/genie-space-optimizer/ directory contains a separate Python package with its own frontend:

  • Python backend — optimization pipeline, job notebooks, FastAPI service
  • React frontend — built with Bun (not npm), includes a "How It Works" walkthrough UI
  • Deployed as — a wheel installed into the app's Python environment + a Databricks Job for the optimization DAG
  • Has its ownpyproject.toml, uv.lock, package.json, bun.lock

The main Workbench app proxies GSO functionality through backend/routers/auto_optimize.py.

Data Flows

SSE Streaming

One endpoint uses Server-Sent Events via FastAPI's StreamingResponse:

EndpointUse
/api/create/agent/chatCreate agent events (15s keepalive)

The frontend consumes SSE via manual fetch + ReadableStream in lib/api.ts (not the EventSource API). Buffers are split on \n\n delimiters.

For SSE endpoints, the OBO ContextVar is not cleared after call_next in the middleware, because the response body streams lazily after the middleware returns. Streaming handlers stash the user token on request.state and re-set it inside the generator.

Persistence

StoreTechnologyContents
LakebasePostgreSQL (asyncpg)scan_results, starred_spaces, seen_spaces, optimization_runs, agent_sessions
Delta TablesUnity CatalogGSO optimization state: 12 tables under GSO_CATALOG.GSO_SCHEMA
MLflowExperiment TrackingLLM call traces, benchmark evaluations, prompt registry

Lakebase degrades gracefully to in-memory dictionaries when LAKEBASE_HOST is not configured, making the app functional (but non-persistent) without a database.

Key Design Decisions

  1. No local dev server — the app depends on Databricks OBO auth, Lakebase, and model serving endpoints that are only available inside a Databricks App environment. All testing is done by deploying to a real workspace.

  2. Two deployment mechanismsdeploy.sh manages the app (create, sync, databricks apps deploy); the GSO optimization job is managed by DABs (databricks bundle deploy -t app). They coexist but are independent.

  3. Pydantic/TypeScript model syncbackend/models.py and frontend/src/types/index.ts must be kept in sync manually. There is no code generation step.

  4. Root package.json is a no-op — exists solely to satisfy the Databricks Apps platform build hook. The real frontend build happens in frontend/.

Next Steps