Skip to content

feat(shared): migrate genie to modular @databricks/sdk-genie - #646

Open
MarioCadenas wants to merge 4 commits into
feat/modular-currentuserfrom
feat/modular-genie
Open

MarioCadenas wants to merge 4 commits into
feat/modular-currentuserfrom
feat/modular-genie

Conversation

@MarioCadenas

Copy link
Copy Markdown
Collaborator

Part of the migration off @databricks/sdk-experimental onto the modular @databricks/sdk-* SDK (see #562). Base: analytics-migration-sdk.

Changes

feat(shared): migrate genie to modular @databricks/sdk-genie

Route the facade's genie accessor through a lazily built modular
GenieClient (sdk-genie 0.54.0, compatible with sdk-core/auth/options
0.51.0) and port the genie connector to its camelCase model.

  • Poll getConversationMessage ourselves instead of using the SDK waiter:
    the modular wait() has no onProgress, which the SSE status events need.
    Cadence, timeout and the "failed to reach COMPLETED state" errors match
    the legacy waiter.
  • Convert the query statement response back to the snake_case wire shape
    with bigint counts as numbers, so the SSE contract and JSON.stringify
    keep working.
  • Patch sdk-genie: its model types data_array as protobuf ListValue[], so
    the unmarshal rejected every real JSON_ARRAY query result.
  • Match RESOURCE_DOES_NOT_EXIST on ApiError .code / .errorCode too.

The CLI's listSpaces/getSpace calls stay on the legacy client.

Draft: implemented by an agent; needs review and a deployed SP + OBO check before it's marked ready.

This pull request and its description were written by Isaac.

@MarioCadenas
MarioCadenas changed the base branch from analytics-migration-sdk to feat/modular-currentuser October 8, 2026 14:37
@MarioCadenas
MarioCadenas added this pull request to stack #636 October 8, 2026 14:38
@github-actions

github-actions Bot commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

📦 Bundle size report

Compared against bundle-size-baseline.json (main).

@databricks/appkit

npm tarball (packed): 1.2 MB (+22 KB) — gzipped download (dist + bin; excludes release-only docs/NOTICE).

dist raw gzip
JS (runtime) 1.3 MB (+22 KB) 455 KB (+8.3 KB)
Type declarations 460 KB (+4.2 KB) 167 KB (+1.7 KB)
Source maps 2.5 MB (+42 KB) 852 KB (+15 KB)
Other 11 KB 3.7 KB
Total 4.2 MB (+68 KB) 1.4 MB (+25 KB)
Per-entry composition (own code — deps external (as shipped))
Entry Initial (gz) Lazy (gz) Total (gz) node_modules (min) Own code (min)
. 105 KB (+2.6 KB) 2.5 KB (+1 B) 107 KB (+2.6 KB) external 339 KB (+7.0 KB)
./beta 101 KB (+2.5 KB) 486 B (+1 B) 101 KB (+2.5 KB) external 304 KB (+6.3 KB)
./testing 44 KB (+2.4 KB) 32 KB (-43 B) 76 KB (+2.4 KB) external 221 KB (+6.4 KB)
./tsdown 520 B 0 B 520 B external 813 B
./type-generator 25 KB (+2.3 KB) 0 B 25 KB (+2.3 KB) external 73 KB (+6.0 KB)

Chunks:

Entry Chunk Load Size (gz)
. index.js initial 100 KB
. utils.js initial 4.6 KB
. remote-tunnel-manager.js lazy 2.5 KB
./beta beta.js initial 81 KB
./beta stream-manager.js initial 5.9 KB
./beta modular.js initial 5.6 KB
./beta service-context.js initial 4.2 KB
./beta databricks.js initial 3.3 KB
./beta client.js initial 594 B
./beta index.js initial 20 B
./beta supervisor-api.js lazy 193 B
./beta databricks.js lazy 178 B
./beta index.js lazy 115 B
./testing manifest.js initial 31 KB
./testing index.js initial 10 KB
./testing wide-event-emitter.js initial 2.9 KB
./testing index.js lazy 28 KB
./testing remote-tunnel-manager.js lazy 2.5 KB
./testing utils.js lazy 1.8 KB
./tsdown index.js initial 520 B
./type-generator index.js initial 25 KB

@databricks/appkit-ui

npm tarball (packed): 397 KB (+540 B) — gzipped download (dist + bin; excludes release-only docs/NOTICE).

dist raw gzip
JS (runtime) 429 KB (+235 B) 147 KB (+108 B)
Type declarations 267 KB (+699 B) 98 KB (+339 B)
Source maps 853 KB (+314 B) 286 KB (+143 B)
CSS 16 KB 3.2 KB
Total 1.5 MB (+1.2 KB) 534 KB (+590 B)
Per-entry composition (consumer bundle — deps bundled, peerDeps external)
Entry Initial (gz) Lazy (gz) Total (gz) node_modules (min) Own code (min)
./js 5.3 KB 49 KB 55 KB 208 KB 14 KB
./js/beta 2.1 KB 0 B 2.1 KB 0 B 5.0 KB
./react 433 KB (+12 B) 49 KB 481 KB (+12 B) 1.3 MB 177 KB (+41 B)
./react/beta 4.9 KB 0 B 4.9 KB 0 B 12 KB

Chunks:

Entry Chunk Load Size (gz)
./js index.js initial 5.2 KB
./js chunk initial 120 B
./js apache-arrow lazy 49 KB
./js/beta beta.js initial 2.1 KB
./react index.js initial 431 KB
./react tslib initial 2.1 KB
./react apache-arrow lazy 49 KB
./react/beta beta.js initial 4.9 KB

@github-actions

github-actions Bot commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

🤖 AppKit PR bot

🔬 Run evals

Start an eval for this PR from the evals-monitor app: Go to Evals Monitor →

📦 Try this PR's app template

Scaffolds a new app from this PR's SDK build. Run it in any folder (requires the GitHub CLI — gh auth login — and the Databricks CLI):

gh run download 38918773118 -R databricks/appkit -n appkit-template-0.88.1-pr.057ddb5-feat-modular-genie-646 -D appkit-pr-646 \
  && unzip -o "appkit-pr-646/appkit-template-0.88.1-pr.057ddb5-feat-modular-genie-646.zip" -d "appkit-pr-646" \
  && databricks apps init --template "appkit-pr-646"

The template pins @databricks/appkit and @databricks/appkit-ui to tarballs built from this branch, so the scaffolded app runs against this PR's code.

@MarioCadenas
MarioCadenas marked this pull request as ready for review October 9, 2026 10:50
@MarioCadenas
MarioCadenas requested a review from a team as a code owner October 9, 2026 10:50
@MarioCadenas
MarioCadenas requested a review from ditadi October 9, 2026 10:50
@MarioCadenas
MarioCadenas removed this pull request from stack #636 October 13, 2026 08:32
@MarioCadenas
MarioCadenas added this pull request to stack #664 October 13, 2026 08:33
@MarioCadenas
MarioCadenas force-pushed the feat/modular-genie branch 2 times, most recently from 34088a9 to 28a8725 Compare October 13, 2026 14:32
@MarioCadenas
MarioCadenas removed this pull request from stack #664 October 13, 2026 15:47
@MarioCadenas
MarioCadenas added this pull request to stack #669 October 13, 2026 15:48
@MarioCadenas
MarioCadenas force-pushed the feat/modular-genie branch 2 times, most recently from e7f269e to 255b479 Compare October 14, 2026 14:35
MarioCadenas and others added 4 commits October 16, 2026 16:43
Route the facade's genie accessor through a lazily built modular
GenieClient (sdk-genie 0.54.0, compatible with sdk-core/auth/options
0.51.0) and port the genie connector to its camelCase model.

- Poll getConversationMessage ourselves instead of using the SDK waiter:
  the modular wait() has no onProgress, which the SSE status events need.
  Cadence, timeout and the "failed to reach COMPLETED state" errors match
  the legacy waiter.
- Convert the query statement response back to the snake_case wire shape
  with bigint counts as numbers, so the SSE contract and JSON.stringify
  keep working.
- Patch sdk-genie: its model types data_array as protobuf ListValue[], so
  the unmarshal rejected every real JSON_ARRAY query result.
- Match RESOURCE_DOES_NOT_EXIST on ApiError .code / .errorCode too.

The CLI's listSpaces/getSpace calls stay on the legacy client.

Co-authored-by: Isaac <no-reply@databricks.com>
Signed-off-by: MarioCadenas <MarioCadenas@users.noreply.github.com>
The modular SDK returns int64 fields as bigint, which JSON.stringify
throws on. Add a shared sseJsonReplacer used by both SSE serialization
sites (stream-manager size check and SSEWriter.writeEvent) that emits
them as numbers, matching the legacy SDK's raw JSON.

The genie connector's toWireShape now only renames keys back to the
snake_case contract, with a TODO to move appkit-ui to the camelCase
shape and drop the conversion.

Co-authored-by: Isaac <no-reply@databricks.com>
Signed-off-by: MarioCadenas <MarioCadenas@users.noreply.github.com>
Genie query results come from the modular SDK in camelCase. Teach
transformGenieData to read result.dataArray and column typeName, and keep
accepting the legacy snake_case shape so it still works against servers
that predate the migration.

GenieStatementResponse gains the camelCase fields; the snake_case ones are
kept as @deprecated optional fields. The playground's chart-inference
fixtures move to the new shape.

Co-authored-by: Isaac <no-reply@databricks.com>
Signed-off-by: MarioCadenas <MarioCadenas@users.noreply.github.com>
Drop the connector's toWireShape conversion and send the modular SDK's
statement response as-is (dataArray, typeName, ...). bigint counts are
already handled by the SSE serializer, and appkit-ui reads both shapes.

Custom clients reading the genie query_result SSE payload directly need
to switch to the camelCase fields.

Co-authored-by: Isaac <no-reply@databricks.com>
Signed-off-by: MarioCadenas <MarioCadenas@users.noreply.github.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants