You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 27a8d02
Browse filesBrowse the repository at this point in the historyBrowse files
feat(appkit): offer Codex in the omnigent plugin, sandboxed with bubblewrap (2/4)
Codex has its own shell, so it runs through a bubblewrap wrapper: own
PID namespace, the plugin's state directory masked, only the user's
home and work directory bound in, and /proc of the app's processes
hidden. The wrapper is named codex and put first on PATH, because
Omnigent resolves harness CLIs by name. Without bubblewrap, Codex is
not offered. Codex only trusts public TLS roots, so the model gateway
also listens on plain http for it.
Co-authored-by: Isaac <no-reply@databricks.com>
Signed-off-by: Noah Solomon <noah@databricks.com>
Copy file name to clipboardExpand all lines: docs/docs/plugins/omnigent.md
+14-7Lines changed: 14 additions & 7 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -6,7 +6,7 @@ This plugin is currently **beta**. APIs may change between minor releases. Impor
6
6
:::
7
7
<!-- AUTO-GENERATED: stability-banner-end -->
8
8
9
-
The `omnigent` plugin embeds [Omnigent](https://github.com/omnigent-ai/omnigent), the open-source agent meta-harness, in a Databricks AppKit app. Your users get Claude Agent SDK, Pi and OpenAI Agents SDK sessions inside the app, with model calls going through Unity AI Gateway as the app's service principal.
9
+
The `omnigent` plugin embeds [Omnigent](https://github.com/omnigent-ai/omnigent), the open-source agent meta-harness, in a Databricks AppKit app. Your users get Claude Agent SDK, Codex, Pi and OpenAI Agents SDK sessions inside the app, with model calls going through Unity AI Gateway as the app's service principal.
10
10
11
11
Omnigent owns the agent loop: sessions, history, approvals. The plugin runs it safely inside a Databricks App. Use the [`agents`](./agents.md) plugin when you want AppKit to own the loop against one serving endpoint. Use `omnigent` when you want the harnesses themselves.
12
12
@@ -27,21 +27,21 @@ await createApp({
27
27
The app also needs:
28
28
29
29
-**Python.** Add a `pyproject.toml` with `requires-python = ">=3.12,<3.13"` and `omnigent[databricks]`, plus a `uv.lock`. Databricks Apps then builds a Python 3.12 venv next to `npm install`. A plain `requirements.txt` gets Python 3.11, which Omnigent does not support. The lockfile must reference public PyPI.
30
-
-**Harness CLIs.** Add them to your `package.json`, so you pin their versions: `@anthropic-ai/claude-code` and `@earendil-works/pi-coding-agent`. The plugin only offers harnesses whose CLI is installed. The Claude Agent SDK's bundled CLI is too old for current Claude models, so add `@anthropic-ai/claude-code` even though the SDK ships one.
30
+
-**Harness CLIs.** Add them to your `package.json`, so you pin their versions: `@anthropic-ai/claude-code`, `@openai/codex` and `@earendil-works/pi-coding-agent`. The plugin only offers harnesses whose CLI is installed. The Claude Agent SDK's bundled CLI is too old for current Claude models, so add `@anthropic-ai/claude-code` even though the SDK ships one.
31
31
-**Start with `node`.** In `app.yaml`, use `command: ["node", "server.js"]`, not `npm run start`. npm does not pass SIGTERM on, so the plugin never gets to stop its child processes. As a backstop, each child also exits when Node does, so a redeploy still succeeds.
32
32
33
33
## Configuration
34
34
35
35
| Option | Default ||
36
36
|---|---|---|
37
37
|`instructions`| a generic assistant prompt | System instructions for every session |
38
-
|`harnesses`|`claude-sdk`, `pi`, `openai-agents`| Harnesses users may pick |
38
+
|`harnesses`|`claude-sdk`, `codex`, `pi`, `openai-agents`| Harnesses users may pick |
39
39
|`defaultHarness`, `defaultModel`| first available ||
40
40
|`runtime.python`|`./.venv/bin/python`||
41
41
|`runtime.home`|`$TMPDIR/appkit-omnigent`| The plugin's state directory |
42
42
|`runtime.hostIdleMs`| 30 min | Stop a user's Omnigent host after this long idle |
43
43
44
-
Each harness is offered the Unity AI Gateway `system.ai` models whose API it speaks: Claude Agent SDK the Anthropic Messages API, Pi the Codex Responses API, OpenAI Agents SDK the OpenAI Responses API.
44
+
Each harness is offered the Unity AI Gateway `system.ai` models whose API it speaks: Claude Agent SDK the Anthropic Messages API, Codex and Pi the Codex Responses API, OpenAI Agents SDK the OpenAI Responses API.
45
45
46
46
## Routes
47
47
@@ -55,15 +55,22 @@ All routes are under `/api/omnigent` and scoped to the signed-in user.
-**One Omnigent server, one host per user.** The server listens on loopback in Omnigent's header-auth mode, under a random header name only the plugin knows. Each active user gets their own host process, registered as that user; Omnigent only runs a session on its owner's host. An idle host stops after `runtime.hostIdleMs`.
63
-
-**No credential in any child process.** The harnesses' Databricks profile points at a model gateway inside the plugin, on loopback, with a placeholder token. The gateway forwards only model-serving paths to the workspace and adds the service principal's token. Every other path returns 403.
63
+
-**No credential in any child process.** The harnesses' Databricks profile points at a model gateway inside the plugin, on loopback, with a placeholder token. The gateway forwards only model-serving paths to the workspace and adds the service principal's token. Every other path returns 403. Codex only trusts public TLS roots, so it reaches the gateway over plain http on loopback; the others use https with a certificate the plugin generates.
64
+
-**Codex runs sandboxed.** Codex has its own shell. Its binary runs through a bubblewrap wrapper that gives it:
65
+
- its own PID namespace
66
+
- the plugin's state directory masked
67
+
- only the user's home and work directory bound in
68
+
- the `/proc` entries of the app's own processes hidden
69
+
70
+
Without bubblewrap on `PATH` (or bundled with Codex), Codex is not offered.
64
71
65
72
## Limits
66
73
67
74
-**Sessions live in the container.** Omnigent keeps them in SQLite under the plugin's state directory, so they survive a process restart but not a redeploy.
68
-
-**Only gateway harnesses.** Harnesses that sign in with their vendor (Cursor, Copilot, Gemini and others) bypass Unity AI Gateway, so they are not offered. Native terminal harnesses (`claude-native`, `pi-native`) are not offered yet: they need tmux and a terminal client.
75
+
-**Only gateway harnesses.** Harnesses that sign in with their vendor (Cursor, Copilot, Gemini and others) bypass Unity AI Gateway, so they are not offered. Native terminal harnesses (`claude-native`, `codex-native`, `pi-native`) are not offered yet: they need tmux and a terminal client.
69
76
-**Shared gateway limits.** All users' model traffic uses the service principal's gateway limits.
0 commit comments