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:
- Application creation & management — create/name a generated-SDK app, manage its lifecycle, view the SDK overview panel.
- 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.
- Object-type code-gen — typed interfaces/classes per object type with typed properties (names + descriptions surfaced inline in the editor), primary key, and metadata.
- Link-type code-gen — navigation methods between linked object types (one-to-one / one-to-many traversal).
- Action-type code-gen — typed
applyAction(...)functions per ontology action (create/modify/delete object edits), with typed parameters. - Language targets — TypeScript (npm), Python (pip / conda), Java (Maven), and OpenAPI export → any other language via open-source generators.
- Generated client preview — example code + autogenerated documentation shown in console; bootstrap templates per language; "host on Foundry" option.
- Query / "try it" experience — generated TS bindings drive React apps; object set queries, search/filter, aggregations, ordering, pagination.
- Subscriptions — TypeScript OSDK live subscriptions over WebSocket (object change feed).
- 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.
- SDK versioning & release — semver SDK versions, release notes, developer toolchain release notes; centrally maintained from the Ontology.
- Package download / install — obtain packages via npm / pip / conda / Maven; install commands per language; OpenAPI file for others.
- API reference docs — per-language reference pages (object/property/method reference) + migration guides.
- 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+/publishfilter the surface by it; links / actions to excluded object types are skipped. - Action-type code-gen (cap 5). ✅ DONE.
_palantir-codegen.tsemits typedapply<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>Inputshapes and an Actions reference tab.generateDabConfignow grants create/update/delete permissions exactly where an action declares them (config ↔ client in lock-step). - Typed object properties (cap 3). ✅ DONE (named members).
deriveObjectPropertiesbuilds each type's property list from the ontologyentityBindings(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 liveINFORMATION_SCHEMA.COLUMNSintrospection — all bound columns are surfaced asstringfor 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]/queryproxy to the DAB REST runtime on ACA (serviceUrl) with Entra auth; honestMessageBargate 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/publishroute 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
stringtyping with real scalar types by introspecting the bound source columns via SynapseINFORMATION_SCHEMA.COLUMNS(or DAB$openapi) keyed byentityBindings, and show a per-type property panel with the resolved types. - SDK versioning & release history (cap 11).
semverfield + Release button → append{version, generatedAt, notes, objectCount, artifactHash}tostate.versions[]in Cosmos; render a version-historyTablewith 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-clientproducts/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 lacksApplication.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-appitem wired to this SDK's Data API (reusegenerateSlateBundle), proving an end-to-end consumer.