Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
1c858c0
docs: fix Model Serving plugin naming for consistency (#309)
pkosiec Apr 23, 2026
a9e98a6
chore: release v0.25.0 [skip ci]
databricks-appkit[bot] Apr 23, 2026
2bc3e70
chore: sync template to v0.25.0 [skip ci]
databricks-appkit[bot] Apr 23, 2026
1c994a6
fix(appkit): check isRetryable before retrying in interceptor (#276)
MarioCadenas Apr 27, 2026
a6ad84d
chore: release v0.25.1 [skip ci]
databricks-appkit[bot] Apr 27, 2026
5334308
chore: sync template to v0.25.1 [skip ci]
databricks-appkit[bot] Apr 27, 2026
a06b6e3
feat: add onPluginsReady callback to createApp, remove autoStart (#280)
MarioCadenas Apr 27, 2026
f2f0504
feat: add appkit codemod on-plugins-ready CLI (#291)
MarioCadenas Apr 27, 2026
323c8cc
feat(appkit): shared agent types and LLM adapter implementations
MarioCadenas Apr 21, 2026
b45e338
feat(appkit): tool primitives and ToolProvider surfaces on core plugins
MarioCadenas Apr 21, 2026
73a696a
docs(appkit): explain hand-rolled AppKitMcpClient vs official MCP SDK
MarioCadenas Apr 23, 2026
1055f0f
refactor(appkit): merge FilesPlugin ctor volume loops
MarioCadenas Apr 23, 2026
9183ce6
feat(appkit): plugin infrastructure — attachContext lifecycle + Plugi…
MarioCadenas Apr 21, 2026
aafb511
feat(appkit): agents() plugin, createAgent(def), and markdown-driven …
MarioCadenas Apr 21, 2026
ddde87b
refactor(appkit): generalize default base system prompt
MarioCadenas Apr 23, 2026
de8b72c
feat(appkit): optional serving_endpoint on agents plugin manifest
MarioCadenas Apr 23, 2026
b2a7e95
fix(appkit): agents manifest uses DATABRICKS_AGENT_ENDPOINT
MarioCadenas Apr 23, 2026
c4b7134
feat(agents): folder-based markdown discovery (<id>/agent.md)
MarioCadenas Apr 23, 2026
2ca8074
refactor(appkit): promote MCP client + host policy to connectors/mcp
MarioCadenas Apr 23, 2026
0f4893d
refactor(appkit): static context import + SDK credential chain in agents
MarioCadenas Apr 23, 2026
54684f6
refactor(appkit): extract normalizeToolResult, consumeAdapterStream, …
MarioCadenas Apr 23, 2026
70804c3
fix(agents): propagate tool annotations through tool() → FunctionTool…
MarioCadenas Apr 24, 2026
6c7291b
feat(agents): semantic ToolEffect — write/update/destructive tiers
MarioCadenas Apr 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,24 @@ All notable changes to this project will be documented in this file.

# Changelog

# Changelog

# Changelog

## [0.25.1](https://github.com/databricks/appkit/compare/v0.25.0...v0.25.1) (2026-04-27)

### appkit

* **appkit:** check isRetryable before retrying in interceptor ([#276](https://github.com/databricks/appkit/issues/276)) ([1c994a6](https://github.com/databricks/appkit/commit/1c994a6d99f397b56e90f1b53df06a61f02b9e82))


## [0.25.0](https://github.com/databricks/appkit/compare/v0.24.0...v0.25.0) (2026-04-23)

### files

* **files:** per-volume in-app policy enforcement ([#197](https://github.com/databricks/appkit/issues/197)) ([f54dca5](https://github.com/databricks/appkit/commit/f54dca5da5af5368c7bcb18745715b54a99d47e9))


## [0.24.0](https://github.com/databricks/appkit/compare/v0.23.0...v0.24.0) (2026-04-20)

* add AST extraction to serving type generator and move types to shared/ ([#279](https://github.com/databricks/appkit/issues/279)) ([422afb3](https://github.com/databricks/appkit/commit/422afb38aa73f8adb94e091225dc3381bd92cfcd))
Expand Down
13 changes: 6 additions & 7 deletions apps/dev-playground/server/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ const adminOnly: FilePolicy = (action, _resource, user) => {

createApp({
plugins: [
server({ autoStart: false }),
server(),
reconnect(),
telemetryExamples(),
analytics({}),
Expand Down Expand Up @@ -95,9 +95,8 @@ createApp({
// }),
],
...(process.env.APPKIT_E2E_TEST && { client: createMockClient() }),
}).then((appkit) => {
appkit.server
.extend((app) => {
onPluginsReady(appkit) {
appkit.server.extend((app) => {
app.get("/sp", (_req, res) => {
appkit.analytics
.query("SELECT * FROM samples.nyctaxi.trips;")
Expand Down Expand Up @@ -195,9 +194,9 @@ createApp({
results,
});
});
})
.start();
});
});
},
}).catch(console.error);

type ProbeResult = {
volume: string;
Expand Down
8 changes: 4 additions & 4 deletions apps/dev-playground/shared/appkit-types/analytics.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -119,10 +119,10 @@ declare module "@databricks/appkit-ui/react" {
result: Array<{
/** @sqlType STRING */
string_value: string;
/** @sqlType STRING */
number_value: string;
/** @sqlType STRING */
boolean_value: string;
/** @sqlType INT */
number_value: number;
/** @sqlType BOOLEAN */
boolean_value: boolean;
/** @sqlType STRING */
date_value: string;
/** @sqlType STRING */
Expand Down
21 changes: 0 additions & 21 deletions docs/docs/api/appkit/Class.ServerError.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ Use for server start/stop issues, configuration conflicts, etc.
## Example

```typescript
throw new ServerError("Cannot get server when autoStart is true");
throw new ServerError("Server not started");
```

Expand Down Expand Up @@ -151,26 +150,6 @@ Create a human-readable string representation

***

### autoStartConflict()

```ts
static autoStartConflict(operation: string): ServerError;
```

Create a server error for autoStart conflict

#### Parameters

| Parameter | Type |
| ------ | ------ |
| `operation` | `string` |

#### Returns

`ServerError`

***

### clientDirectoryNotFound()

```ts
Expand Down
21 changes: 13 additions & 8 deletions docs/docs/api/appkit/Function.createApp.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
function createApp<T>(config: {
cache?: CacheConfig;
client?: WorkspaceClient;
onPluginsReady?: (appkit: PluginMap<T>) => void | Promise<void>;
plugins?: T;
telemetry?: TelemetryConfig;
}): Promise<PluginMap<T>>;
Expand All @@ -13,6 +14,9 @@ Bootstraps AppKit with the provided configuration.

Initializes telemetry, cache, and service context, then registers plugins
in phase order (core, normal, deferred) and awaits their setup.
If a `onPluginsReady` callback is provided it runs after plugin setup but
before the server starts, giving you access to the full appkit handle
for registering custom routes or performing async setup.
The returned object maps each plugin name to its `exports()` API,
with an `asUser(req)` method for user-scoped execution.

Expand All @@ -26,9 +30,10 @@ with an `asUser(req)` method for user-scoped execution.

| Parameter | Type |
| ------ | ------ |
| `config` | \{ `cache?`: [`CacheConfig`](Interface.CacheConfig.md); `client?`: `WorkspaceClient`; `plugins?`: `T`; `telemetry?`: [`TelemetryConfig`](Interface.TelemetryConfig.md); \} |
| `config` | \{ `cache?`: [`CacheConfig`](Interface.CacheConfig.md); `client?`: `WorkspaceClient`; `onPluginsReady?`: (`appkit`: `PluginMap`\<`T`\>) => `void` \| `Promise`\<`void`\>; `plugins?`: `T`; `telemetry?`: [`TelemetryConfig`](Interface.TelemetryConfig.md); \} |
| `config.cache?` | [`CacheConfig`](Interface.CacheConfig.md) |
| `config.client?` | `WorkspaceClient` |
| `config.onPluginsReady?` | (`appkit`: `PluginMap`\<`T`\>) => `void` \| `Promise`\<`void`\> |
| `config.plugins?` | `T` |
| `config.telemetry?` | [`TelemetryConfig`](Interface.TelemetryConfig.md) |

Expand All @@ -51,12 +56,12 @@ await createApp({
```ts
import { createApp, server, analytics } from "@databricks/appkit";

const appkit = await createApp({
plugins: [server({ autoStart: false }), analytics({})],
});

appkit.server.extend((app) => {
app.get("/custom", (_req, res) => res.json({ ok: true }));
await createApp({
plugins: [server(), analytics({})],
onPluginsReady(appkit) {
appkit.server.extend((app) => {
app.get("/custom", (_req, res) => res.json({ ok: true }));
});
},
});
await appkit.server.start();
```
2 changes: 1 addition & 1 deletion docs/docs/faq.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ AppKit provides built-in integrations with the following Databricks services via
| [Lakebase](./plugins/lakebase) | Lakebase Autoscaling (PostgreSQL) | Relational database access via standard pg.Pool with automatic OAuth token refresh |
| [Genie](./plugins/genie) | AI/BI Genie Spaces | Natural language data queries with conversation management and streaming |
| [Files](./plugins/files) | Unity Catalog Volumes | Multi-volume file operations (list, read, upload, download, delete, preview) |
| [Serving](./plugins/serving) | Model Serving | Authenticated proxy to Model Serving endpoints with invoke and streaming support |
| [Model Serving](./plugins/model-serving) | Model Serving | Authenticated proxy to Model Serving endpoints with invoke and streaming support |
| [Server](./plugins/server) | N/A | Express HTTP server with static file serving, Vite dev mode, and plugin route injection |

Stay tuned for new plugins as we constantly expand integrations!
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
sidebar_position: 7
---

# Serving plugin
# Model Serving plugin

Provides an authenticated proxy to [Databricks Model Serving](https://docs.databricks.com/aws/en/machine-learning/model-serving) endpoints, with invoke and streaming support.

Expand Down
33 changes: 24 additions & 9 deletions docs/docs/plugins/server.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,22 +36,38 @@ await createApp({
});
```

## Manual server start example
## Custom routes example

When you need to extend Express with custom routes:
Use the `onPluginsReady` callback to extend Express with custom routes before the server starts:

```ts
import { createApp, server } from "@databricks/appkit";

const appkit = await createApp({
plugins: [server({ autoStart: false })],
await createApp({
plugins: [server()],
onPluginsReady(appkit) {
appkit.server.extend((app) => {
app.get("/custom", (_req, res) => res.json({ ok: true }));
});
},
});
```

appkit.server.extend((app) => {
app.get("/custom", (_req, res) => res.json({ ok: true }));
});
The `onPluginsReady` callback also supports async operations:

await appkit.server.start();
```ts
await createApp({
plugins: [server()],
async onPluginsReady(appkit) {
const pool = await initializeDatabase();
appkit.server.extend((app) => {
app.get("/data", async (_req, res) => {
const result = await pool.query("SELECT 1");
res.json(result);
});
});
},
});
```

## Configuration options
Expand All @@ -64,7 +80,6 @@ await createApp({
server({
port: 8000, // default: Number(process.env.DATABRICKS_APP_PORT) || 8000
host: "0.0.0.0", // default: process.env.FLASK_RUN_HOST || "0.0.0.0"
autoStart: true, // default: true
staticPath: "dist", // optional: force a specific static directory
}),
],
Expand Down
10 changes: 9 additions & 1 deletion knip.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
"docs"
],
"workspaces": {
"packages/appkit": {},
"packages/appkit": {
"ignoreDependencies": ["@langchain/core", "ai"]
},
"packages/appkit-ui": {
"ignoreDependencies": ["tailwindcss", "tw-animate-css"]
}
Expand All @@ -17,6 +19,12 @@
"**/*.example.tsx",
"**/*.css",
"packages/appkit/src/plugins/vector-search/**",
"packages/appkit/src/plugin/index.ts",
"packages/appkit/src/plugin/to-plugin.ts",
"packages/appkit/src/plugins/agents/index.ts",
"packages/appkit/src/plugins/agents/tools/index.ts",
"packages/appkit/src/plugins/agents/from-plugin.ts",
"packages/appkit/src/plugins/agents/load-agents.ts",
"template/**",
"tools/**",
"docs/**"
Expand Down
2 changes: 1 addition & 1 deletion packages/appkit-ui/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@databricks/appkit-ui",
"type": "module",
"version": "0.24.0",
"version": "0.25.1",
"license": "Apache-2.0",
"repository": {
"type": "git",
Expand Down
39 changes: 36 additions & 3 deletions packages/appkit/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@databricks/appkit",
"type": "module",
"version": "0.24.0",
"version": "0.25.1",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
"packageManager": "pnpm@10.21.0",
Expand Down Expand Up @@ -29,6 +29,18 @@
"development": "./src/index.ts",
"default": "./dist/index.js"
},
"./agents/vercel-ai": {
"development": "./src/agents/vercel-ai.ts",
"default": "./dist/agents/vercel-ai.js"
},
"./agents/langchain": {
"development": "./src/agents/langchain.ts",
"default": "./dist/agents/langchain.js"
},
"./agents/databricks": {
"development": "./src/agents/databricks.ts",
"default": "./dist/agents/databricks.js"
},
"./type-generator": {
"types": "./dist/type-generator/index.d.ts",
"development": "./src/type-generator/index.ts",
Expand Down Expand Up @@ -71,20 +83,38 @@
"@types/semver": "7.7.1",
"dotenv": "16.6.1",
"express": "4.22.0",
"js-yaml": "^4.1.1",
"obug": "2.1.1",
"pg": "8.18.0",
"picocolors": "1.1.1",
"semver": "7.7.3",
"shared": "workspace:*",
"vite": "npm:rolldown-vite@7.1.14",
"ws": "8.18.3"
"ws": "8.18.3",
"zod": "^4.0.0"
},
"peerDependencies": {
"@langchain/core": ">=0.3.0",
"ai": ">=4.0.0"
},
"peerDependenciesMeta": {
"ai": {
"optional": true
},
"@langchain/core": {
"optional": true
}
},
"devDependencies": {
"@ai-sdk/openai": "4.0.0-beta.27",
"@langchain/core": "^1.1.39",
"@types/express": "4.17.25",
"@types/js-yaml": "^4.0.9",
"@types/json-schema": "7.0.15",
"@types/pg": "8.16.0",
"@types/ws": "8.18.1",
"@vitejs/plugin-react": "5.1.1"
"@vitejs/plugin-react": "5.1.1",
"ai": "7.0.0-beta.76"
},
"overrides": {
"vite": "npm:rolldown-vite@7.1.14"
Expand All @@ -93,6 +123,9 @@
"publishConfig": {
"exports": {
".": "./dist/index.js",
"./agents/vercel-ai": "./dist/agents/vercel-ai.js",
"./agents/langchain": "./dist/agents/langchain.js",
"./agents/databricks": "./dist/agents/databricks.js",
"./dist/shared/src/plugin": "./dist/shared/src/plugin.d.ts",
"./type-generator": "./dist/type-generator/index.js",
"./package.json": "./package.json"
Expand Down
Loading