Skip to content
CSA Loom — the Microsoft Fabric experience for Azure tenants where Fabric isn't yet available: lakehouses, warehouses, notebooks, semantic models, Activator rules, Data Agents, across Commercial, GCC, GCC-High, and DoD IL5

ontology-sdk — parity with Palantir OSDK (typed Ontology SDK generator)

Source UI: Palantir Foundry Developer Console → Application API → SDK generation (https://www.palantir.com/docs/foundry/ontology-sdk/overview, /generate-osdk-for-other-languages, /typescript-osdk, /python-osdk). Loom editor: apps/fiab-console/lib/editors/palantir-editors.tsx → OntologySdkEditor Backend: app/api/items/ontology-sdk/[id]/{generate,publish,bind-ontology,route}.ts, codegen lib/editors/_palantir-codegen.ts.

No-Fabric rule. Every capability below is delivered Azure-native by default: Microsoft Data API Builder (DAB) on Azure Container Apps (REST + GraphQL), APIM (publish / products / subscription keys / dev portal), Entra ID app registrations via Microsoft Graph (OAuth clients), Azure OpenAI (example code), Cosmos (versions / config), Azure Artifacts/ACR (package hosting), Synapse INFORMATION_SCHEMA (typed properties). Fabric/OneLake is never on the default path.


Real feature inventory (every capability)

Developer Console exposes these for an OSDK application:

  1. Application creation & management — create/name a generated-SDK app, manage its lifecycle, view the SDK overview panel.
  2. Ontology scope selection — pick the subset of the ontology the SDK covers: which object types, link types, and action types are included. The token is scoped to exactly those entities.
  3. Object-type code-gen — typed interfaces/classes per object type with typed properties (names + descriptions surfaced inline in the editor), primary key, and metadata.
  4. Link-type code-gen — navigation methods between linked object types (one-to-one / one-to-many traversal).
  5. Action-type code-gen — typed applyAction(...) functions per ontology action (create/modify/delete object edits), with typed parameters.
  6. Language targetsTypeScript (npm), Python (pip / conda), Java (Maven), and OpenAPI export → any other language via open-source generators.
  7. Generated client preview — example code + autogenerated documentation shown in console; bootstrap templates per language; "host on Foundry" option.
  8. Query / "try it" experience — generated TS bindings drive React apps; object set queries, search/filter, aggregations, ordering, pagination.
  9. Subscriptions — TypeScript OSDK live subscriptions over WebSocket (object change feed).
  10. OAuth / auth setup — create an OAuth client (public or confidential), set redirect URLs, client id/secret, scopes; the SDK token combines with the user's own data permissions. Legacy "standalone OAuth clients" page.
  11. SDK versioning & release — semver SDK versions, release notes, developer toolchain release notes; centrally maintained from the Ontology.
  12. Package download / install — obtain packages via npm / pip / conda / Maven; install commands per language; OpenAPI file for others.
  13. API reference docs — per-language reference pages (object/property/method reference) + migration guides.
  14. MCP integration — Ontology MCP / Palantir MCP expose the ontology to agents (adjacent, OSDK-related).

Loom coverage

# Real capability Loom today Grade
1 App creation / management new-gate + Cosmos item; bind dropdown ✅ built
2 Ontology scope selection (objects/links/actions subset) Objects / Links / Actions tabs with checkbox + search + select-all; persisted to Cosmos; /generate + /publish filter by it ✅ built
3 Object-type code-gen TS interface + Python dataclass per class with real named members (key + writable columns + action params) from entityBindings; untyped bag only for unbound types ✅ built (scalar typing pending)
4 Link-type code-gen TS emits kind_to?: T fields (scope-filtered to included types); no navigation methods; Python omits links ⚠️ partial
5 Action-type code-gen typed apply<Action> create→POST / update→PATCH / delete→DELETE methods (TS + Python) over the DAB REST mutation surface + typed *Input shapes + Actions reference tab; dab-config permissions emit create/update/delete to match ✅ built
6 Language targets TS + Python only; no Java, no OpenAPI export download ⚠️ partial
7 Generated client preview dynamic tabs TypeScript / Python / Actions / dab-config.json (read-only) ⚠️ read-only
8 Query / "try it" playground none — code is text only, never executed ❌ MISSING
9 Subscriptions (change feed) none ❌ MISSING
10 OAuth client setup none ❌ MISSING
11 SDK versioning & release lastGeneratedAt + object/link/action counts only; no versions/release history ❌ MISSING
12 Package download / install Copy-to-clipboard per tab; no zip, no install commands ❌ MISSING
13 API reference docs Actions reference tab (deterministic, from surface); no per-object reference page yet ⚠️ partial
14 APIM publish /publish imports OpenAPI to APIM (real ARM), now scope-filtered ✅ built
14b APIM product / subscription keys none (publish only — no consumer onboarding) ❌ MISSING

The editor now leads with an Ontology scope selector (Objects / Links / Actions), generates typed clients with named properties + applyCreate/Update/Delete write-back methods, and shows a dynamic 3–4 tab preview. Real backends (deterministic DAB codegen + real APIM import) drive it; the scope selection + typed/action codegen close the three P0 gaps. Remaining gaps (Try-it playground, GraphQL tab, Java/OpenAPI targets, versioning, OAuth, packaging) are P1/P2.


Build plan (prioritized)

P0 — visible parity, biggest lift

  • Ontology scope selector (cap 2). ✅ DONE. Objects / Links / Actions tabs with per-type checkboxes, a search box, and select-all / clear. Selection is persisted to state.selectedObjectTypes[] / selectedLinkTypes[] / selectedActionTypes[] (Cosmos) and /generate + /publish filter the surface by it; links / actions to excluded object types are skipped.
  • Action-type code-gen (cap 5). ✅ DONE. _palantir-codegen.ts emits typed apply<Action> methods — create→POST /entity, update→PATCH /entity/<key>/<id>, delete→DELETE /entity/<key>/<id> — over the DAB REST mutation surface on Container Apps, in TS + Python, with typed <Type>Input shapes and an Actions reference tab. generateDabConfig now grants create/update/delete permissions exactly where an action declares them (config ↔ client in lock-step).
  • Typed object properties (cap 3). ✅ DONE (named members). deriveObjectProperties builds each type's property list from the ontology entityBindings (keyColumns + writableColumns) and action params; the generated interfaces / dataclasses emit real named members (key first) instead of [property: string]: unknown. Honest note: precise scalar typing (int/decimal/datetime/bool) still awaits a live INFORMATION_SCHEMA.COLUMNS introspection — all bound columns are surfaced as string for now (DAB returns JSON scalars; the Atelier write path binds NVARCHAR). Unbound types keep the untyped bag with an in-UI MessageBar explaining the remediation.
  • Live API Explorer / "Try it" (cap 8). ⏳ TODO. New panel: pick an included object type → Run → render rows in a Table; show the request URL. Backend: a /api/items/ontology-sdk/[id]/query proxy to the DAB REST runtime on ACA (serviceUrl) with Entra auth; honest MessageBar gate when DAB serviceUrl/ACA isn't set.
  • GraphQL Data API tab + playground (cap 8). ⏳ TODO. DAB already enables /graphql. Add a GraphQL tab with a Monaco query editor + Run; backend proxies to the DAB GraphQL endpoint. Reuse the same ACA serviceUrl gate.

P1 — completeness

  • Java + OpenAPI targets (cap 6). Add generateJavaSdk (Maven coordinates + typed POJOs + client) and an Export OpenAPI action that downloads the same OpenAPI 3.0 doc the /publish route already builds. Language tab strip: TypeScript / Python / Java / GraphQL / OpenAPI / dab-config.
  • Typed properties (cap 3). ✅ Named members DONE (see P0). Remaining: replace the conservative string typing with real scalar types by introspecting the bound source columns via Synapse INFORMATION_SCHEMA.COLUMNS (or DAB $openapi) keyed by entityBindings, and show a per-type property panel with the resolved types.
  • SDK versioning & release history (cap 11). semver field + Release button → append {version, generatedAt, notes, objectCount, artifactHash} to state.versions[] in Cosmos; render a version-history Table with re-download per version.
  • Package download (cap 12). Download button assembling a zip per language (package.json / pyproject.toml / pom.xml + sources) plus an install snippet (npm i, pip install, Maven dep). Optional push to Azure Artifacts/ACR behind an honest gate.
  • APIM product + subscription keys (cap 14b). After publish, manage the APIM product, mint subscription keys, and link the developer portal — via the existing apim-client products/subscriptions REST. Consumer-onboarding parity with the data-product marketplace.

P2 — depth

  • OAuth client setup (cap 10). Panel to register a confidential/public Entra app (redirect URIs, scopes) via Microsoft Graph /applications; show client id + auth snippet. Honest gate when the Console SP lacks Application.ReadWrite.OwnedBy.
  • API reference docs (cap 13). A Docs tab rendering object/property/link/action reference from the surface (deterministic, no new backend) — Fluent cards per type.
  • Subscriptions / change feed (cap 9). Subscriptions panel backed by Azure Web PubSub / SignalR over a Cosmos change feed (or ADX). Honest gate until wired.
  • Bootstrap demo app (cap 7). "Bootstrap React app" → scaffold a sibling slate-app item wired to this SDK's Data API (reuse generateSlateBundle), proving an end-to-end consumer.