lumilake 0.1.0.dev1__tar.gz → 0.1.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. {lumilake-0.1.0.dev1 → lumilake-0.1.2}/PKG-INFO +62 -14
  2. lumilake-0.1.0.dev1/lumilake.egg-info/PKG-INFO → lumilake-0.1.2/README.md +52 -41
  3. {lumilake-0.1.0.dev1 → lumilake-0.1.2}/docs/API.md +10 -0
  4. lumilake-0.1.2/docs/CLI.md +125 -0
  5. {lumilake-0.1.0.dev1 → lumilake-0.1.2}/docs/CODE_STYLE.md +1 -2
  6. {lumilake-0.1.0.dev1 → lumilake-0.1.2}/docs/E2E_DEMO.md +4 -5
  7. lumilake-0.1.2/docs/ENV.md +154 -0
  8. {lumilake-0.1.0.dev1 → lumilake-0.1.2}/docs/OPS.md +50 -9
  9. lumilake-0.1.2/docs/PLUGINS.md +175 -0
  10. {lumilake-0.1.0.dev1 → lumilake-0.1.2}/docs/RELEASE.md +1 -1
  11. lumilake-0.1.2/docs/SDK.md +155 -0
  12. lumilake-0.1.0.dev1/README.md → lumilake-0.1.2/lumilake.egg-info/PKG-INFO +89 -4
  13. lumilake-0.1.2/lumilake.egg-info/requires.txt +19 -0
  14. {lumilake-0.1.0.dev1 → lumilake-0.1.2}/pyproject.toml +23 -24
  15. lumilake-0.1.0.dev1/docs/CLI.md +0 -82
  16. lumilake-0.1.0.dev1/docs/ENV.md +0 -61
  17. lumilake-0.1.0.dev1/docs/PLUGINS.md +0 -45
  18. lumilake-0.1.0.dev1/docs/SDK.md +0 -59
  19. lumilake-0.1.0.dev1/lumilake.egg-info/requires.txt +0 -19
  20. {lumilake-0.1.0.dev1 → lumilake-0.1.2}/LICENSE +0 -0
  21. {lumilake-0.1.0.dev1 → lumilake-0.1.2}/MANIFEST.in +0 -0
  22. {lumilake-0.1.0.dev1 → lumilake-0.1.2}/docs/ARCHITECTURE.md +0 -0
  23. {lumilake-0.1.0.dev1 → lumilake-0.1.2}/docs/FIRST_RELEASE_ROADMAP.md +0 -0
  24. {lumilake-0.1.0.dev1 → lumilake-0.1.2}/docs/WORKFLOWS.md +0 -0
  25. {lumilake-0.1.0.dev1 → lumilake-0.1.2}/lumilake.egg-info/SOURCES.txt +0 -0
  26. {lumilake-0.1.0.dev1 → lumilake-0.1.2}/lumilake.egg-info/dependency_links.txt +0 -0
  27. {lumilake-0.1.0.dev1 → lumilake-0.1.2}/lumilake.egg-info/top_level.txt +0 -0
  28. {lumilake-0.1.0.dev1 → lumilake-0.1.2}/setup.cfg +0 -0
  29. {lumilake-0.1.0.dev1 → lumilake-0.1.2}/tests/test_lambda_op_closure.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lumilake
3
- Version: 0.1.0.dev1
3
+ Version: 0.1.2
4
4
  Summary: Data analytics engine for agentic workflows
5
5
  Author: Lumilake contributors
6
6
  License-Expression: Apache-2.0
@@ -20,19 +20,19 @@ Requires-Python: <3.13,>=3.12
20
20
  Description-Content-Type: text/markdown
21
21
  License-File: LICENSE
22
22
  Provides-Extra: sdk
23
- Requires-Dist: lumilake-sdk==0.1.0.dev1; extra == "sdk"
23
+ Requires-Dist: lumilake-sdk==0.1.2; extra == "sdk"
24
24
  Provides-Extra: cli
25
- Requires-Dist: lumilake-cli==0.1.0.dev1; extra == "cli"
26
- Requires-Dist: lumilake-deploy==0.1.0.dev1; extra == "cli"
25
+ Requires-Dist: lumilake-cli==0.1.2; extra == "cli"
26
+ Requires-Dist: lumilake-deploy==0.1.2; extra == "cli"
27
27
  Provides-Extra: deploy
28
- Requires-Dist: lumilake-deploy==0.1.0.dev1; extra == "deploy"
28
+ Requires-Dist: lumilake-deploy==0.1.2; extra == "deploy"
29
29
  Provides-Extra: hook
30
- Requires-Dist: lumilake-hook==0.1.0.dev1; extra == "hook"
30
+ Requires-Dist: lumilake-hook==0.1.2; extra == "hook"
31
31
  Provides-Extra: all
32
- Requires-Dist: lumilake-sdk==0.1.0.dev1; extra == "all"
33
- Requires-Dist: lumilake-cli==0.1.0.dev1; extra == "all"
34
- Requires-Dist: lumilake-deploy==0.1.0.dev1; extra == "all"
35
- Requires-Dist: lumilake-hook==0.1.0.dev1; extra == "all"
32
+ Requires-Dist: lumilake-sdk==0.1.2; extra == "all"
33
+ Requires-Dist: lumilake-cli==0.1.2; extra == "all"
34
+ Requires-Dist: lumilake-deploy==0.1.2; extra == "all"
35
+ Requires-Dist: lumilake-hook==0.1.2; extra == "all"
36
36
  Dynamic: license-file
37
37
 
38
38
  # Lumilake
@@ -87,12 +87,50 @@ lumilake deploy -C ~/lumilake-deploy init --flowmesh # ~/lumilake-deploy/.env
87
87
  $EDITOR ~/lumilake-deploy/.env # fill in DATABASE_URL / S3 / model keys
88
88
  lumilake deploy -C ~/lumilake-deploy pull # fetch ghcr.io/mlsys-io/lumilake_server:<tag>
89
89
  lumilake deploy -C ~/lumilake-deploy up # bring the stack up via docker compose
90
+ lumilake deploy -C ~/lumilake-deploy purge dev --dry-run # preview cleanup of one local image tag
90
91
  ```
91
92
 
92
93
  `LUMILAKE_DEPLOY_DIR=~/lumilake-deploy` is an equivalent override. The deployment directory only needs to hold your `.env` files (and any local state docker compose creates) — the compose file and server image are resolved from the installed `lumilake-deploy` package and GHCR. The server listens on `http://127.0.0.1:9000` by default — open `/docs` for the API browser.
93
94
 
94
95
  Note: a real workflow run also requires running PostgreSQL and S3-compatible storage; agent-style retrievals (`DataRetrievalOp` with `type: agent`) additionally require `LUMID_DATA_URL`. See `docs/ENV.md` for the env contract. If you don't have your own data plane, the repo ships a bundled Postgres + MinIO at `scripts/dev/compose.data-plane.yml` — see `docs/E2E_DEMO.md` for the full three-step demo flow (data plane → load demo data → run a workflow).
95
96
 
97
+ ### Hello world
98
+
99
+ The repo ships a `hello-world.yaml` template — `FormatOp` →
100
+ `LambdaOp` → `LLMChatOp` — that is the smallest copy-paste starting
101
+ point for a Lumilake YAML workflow. Submit it once the stack is up and
102
+ `S3_URL` points at reachable S3-compatible storage. From a source
103
+ checkout, start the bundled data plane first:
104
+
105
+ ```bash
106
+ docker compose -f scripts/dev/compose.data-plane.yml up -d
107
+ ```
108
+
109
+ PyPI installs do not include `scripts/dev/`; use your own reachable S3
110
+ endpoint, or download the repo's data-plane compose file alongside the
111
+ workflow template before running the local-only example.
112
+
113
+ ```bash
114
+ # From a source checkout:
115
+ uv run lumilake job submit examples/templates/yaml/hello-world.yaml \
116
+ --format yaml --input 'Name=world' --output-prefix demo/hello-world
117
+
118
+ # From a PyPI install (download the template alongside lumilake):
119
+ curl -O https://raw.githubusercontent.com/mlsys-io/lumilake_OSS/main/examples/templates/yaml/hello-world.yaml
120
+ lumilake job submit hello-world.yaml \
121
+ --format yaml --input 'Name=world' --output-prefix demo/hello-world
122
+ lumilake job watch <job_id>
123
+ lumilake job result <job_id>
124
+ ```
125
+
126
+ The template uses `Qwen/Qwen3-8B`, which is the bundled text-demo model.
127
+ You do not need to pre-populate or inspect `cached_models` before the
128
+ first run; it can be empty until after a worker serves a job. Only edit
129
+ `config.model` if your FlowMesh stack is configured for a different
130
+ model or the job fails with a missing-model / worker-placement error.
131
+
132
+ ### Real workflows
133
+
96
134
  Submit and inspect a workflow. From a source checkout the example
97
135
  workflow file is at `examples/templates/yaml/trading-agent.yaml`;
98
136
  PyPI installs do not ship the templates, so pass an absolute path to a
@@ -100,12 +138,10 @@ workflow file you have locally:
100
138
 
101
139
  ```bash
102
140
  # From a source checkout:
103
- uv run lumilake login http://127.0.0.1:9000
104
141
  uv run lumilake job submit examples/templates/yaml/trading-agent.yaml \
105
142
  --format yaml --input 'Stock=NVDA,AAPL,MSFT' --output-prefix demo/trading-agent
106
143
 
107
144
  # From a PyPI install (lumilake on PATH; supply your own workflow file):
108
- lumilake login http://127.0.0.1:9000
109
145
  lumilake job submit /path/to/your/workflow.yaml \
110
146
  --format yaml --input 'Stock=NVDA,AAPL,MSFT' --output-prefix demo/trading-agent
111
147
 
@@ -113,6 +149,10 @@ lumilake job list
113
149
  lumilake job watch <job_id>
114
150
  ```
115
151
 
152
+ `lumilake deploy up` writes `~/.lumilake/config.toml` so subsequent
153
+ calls find the local server automatically. For remote / hosted servers,
154
+ set `LUMILAKE_BASE_URL` instead.
155
+
116
156
  See `docs/E2E_DEMO.md` for a full reproduction using the bundled demo
117
157
  workflows and dataset.
118
158
 
@@ -140,6 +180,14 @@ Generate both Lumilake and bundled FlowMesh env files:
140
180
  lumilake deploy init --flowmesh
141
181
  ```
142
182
 
183
+ If another FlowMesh stack is already running on the same host, check
184
+ ports before `deploy up`. Common co-tenant FlowMesh defaults are HTTP
185
+ `8000`, gRPC `50051`, Redis control `6379`, and Redis telemetry `6380`.
186
+ The bundled stack reads `SERVER_HTTP_PORT`, `SERVER_GRPC_PORT`,
187
+ `REDIS_CONTROL_PORT`, and `REDIS_TELEMETRY_PORT` from `.env.flowmesh`;
188
+ change them to free ports and keep `LUMILAKE_RUNTIME_ORCHESTRATOR_URL`
189
+ in `.env` aligned with `SERVER_HTTP_PORT`.
190
+
143
191
  Common deployment commands:
144
192
 
145
193
  ```bash
@@ -153,7 +201,7 @@ lumilake deploy down
153
201
  lumilake deploy clean
154
202
  ```
155
203
 
156
- Use `deploy down` to stop services while keeping data volumes. Use `deploy clean` or `deploy reset` only when you want to remove local stack state.
204
+ Use `deploy down` to stop services while keeping data volumes (non-destructive). Use `deploy clean` or `deploy reset` only when you want to remove local stack state; both delete every Lumilake-managed volume, and `reset` prompts for confirmation by default (`--yes` skips the prompt).
157
205
 
158
206
  ## Python SDK
159
207
 
@@ -221,7 +269,7 @@ A minimal in-memory plugin is available under `examples/plugins/simple_plugin/`.
221
269
  uv sync --group lint --group test --extra cli
222
270
  uv run pre-commit install --install-hooks -t pre-commit -t prepare-commit-msg -t commit-msg
223
271
  uv run pre-commit run --all-files
224
- uv run pytest tests/ --ignore=tests/server
272
+ uv run pytest tests/
225
273
  ```
226
274
 
227
275
  After changing dependencies, run:
@@ -1,40 +1,3 @@
1
- Metadata-Version: 2.4
2
- Name: lumilake
3
- Version: 0.1.0.dev1
4
- Summary: Data analytics engine for agentic workflows
5
- Author: Lumilake contributors
6
- License-Expression: Apache-2.0
7
- Project-URL: Homepage, https://github.com/mlsys-io/lumilake_OSS
8
- Project-URL: Repository, https://github.com/mlsys-io/lumilake_OSS
9
- Project-URL: Issues, https://github.com/mlsys-io/lumilake_OSS/issues
10
- Keywords: agentic-workflows,data-analytics,lakehouse,workflow-orchestration
11
- Classifier: Development Status :: 3 - Alpha
12
- Classifier: Environment :: Console
13
- Classifier: Framework :: FastAPI
14
- Classifier: Intended Audience :: Developers
15
- Classifier: Intended Audience :: Science/Research
16
- Classifier: Programming Language :: Python :: 3
17
- Classifier: Programming Language :: Python :: 3.12
18
- Classifier: Typing :: Typed
19
- Requires-Python: <3.13,>=3.12
20
- Description-Content-Type: text/markdown
21
- License-File: LICENSE
22
- Provides-Extra: sdk
23
- Requires-Dist: lumilake-sdk==0.1.0.dev1; extra == "sdk"
24
- Provides-Extra: cli
25
- Requires-Dist: lumilake-cli==0.1.0.dev1; extra == "cli"
26
- Requires-Dist: lumilake-deploy==0.1.0.dev1; extra == "cli"
27
- Provides-Extra: deploy
28
- Requires-Dist: lumilake-deploy==0.1.0.dev1; extra == "deploy"
29
- Provides-Extra: hook
30
- Requires-Dist: lumilake-hook==0.1.0.dev1; extra == "hook"
31
- Provides-Extra: all
32
- Requires-Dist: lumilake-sdk==0.1.0.dev1; extra == "all"
33
- Requires-Dist: lumilake-cli==0.1.0.dev1; extra == "all"
34
- Requires-Dist: lumilake-deploy==0.1.0.dev1; extra == "all"
35
- Requires-Dist: lumilake-hook==0.1.0.dev1; extra == "all"
36
- Dynamic: license-file
37
-
38
1
  # Lumilake
39
2
 
40
3
  [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0)
@@ -87,12 +50,50 @@ lumilake deploy -C ~/lumilake-deploy init --flowmesh # ~/lumilake-deploy/.env
87
50
  $EDITOR ~/lumilake-deploy/.env # fill in DATABASE_URL / S3 / model keys
88
51
  lumilake deploy -C ~/lumilake-deploy pull # fetch ghcr.io/mlsys-io/lumilake_server:<tag>
89
52
  lumilake deploy -C ~/lumilake-deploy up # bring the stack up via docker compose
53
+ lumilake deploy -C ~/lumilake-deploy purge dev --dry-run # preview cleanup of one local image tag
90
54
  ```
91
55
 
92
56
  `LUMILAKE_DEPLOY_DIR=~/lumilake-deploy` is an equivalent override. The deployment directory only needs to hold your `.env` files (and any local state docker compose creates) — the compose file and server image are resolved from the installed `lumilake-deploy` package and GHCR. The server listens on `http://127.0.0.1:9000` by default — open `/docs` for the API browser.
93
57
 
94
58
  Note: a real workflow run also requires running PostgreSQL and S3-compatible storage; agent-style retrievals (`DataRetrievalOp` with `type: agent`) additionally require `LUMID_DATA_URL`. See `docs/ENV.md` for the env contract. If you don't have your own data plane, the repo ships a bundled Postgres + MinIO at `scripts/dev/compose.data-plane.yml` — see `docs/E2E_DEMO.md` for the full three-step demo flow (data plane → load demo data → run a workflow).
95
59
 
60
+ ### Hello world
61
+
62
+ The repo ships a `hello-world.yaml` template — `FormatOp` →
63
+ `LambdaOp` → `LLMChatOp` — that is the smallest copy-paste starting
64
+ point for a Lumilake YAML workflow. Submit it once the stack is up and
65
+ `S3_URL` points at reachable S3-compatible storage. From a source
66
+ checkout, start the bundled data plane first:
67
+
68
+ ```bash
69
+ docker compose -f scripts/dev/compose.data-plane.yml up -d
70
+ ```
71
+
72
+ PyPI installs do not include `scripts/dev/`; use your own reachable S3
73
+ endpoint, or download the repo's data-plane compose file alongside the
74
+ workflow template before running the local-only example.
75
+
76
+ ```bash
77
+ # From a source checkout:
78
+ uv run lumilake job submit examples/templates/yaml/hello-world.yaml \
79
+ --format yaml --input 'Name=world' --output-prefix demo/hello-world
80
+
81
+ # From a PyPI install (download the template alongside lumilake):
82
+ curl -O https://raw.githubusercontent.com/mlsys-io/lumilake_OSS/main/examples/templates/yaml/hello-world.yaml
83
+ lumilake job submit hello-world.yaml \
84
+ --format yaml --input 'Name=world' --output-prefix demo/hello-world
85
+ lumilake job watch <job_id>
86
+ lumilake job result <job_id>
87
+ ```
88
+
89
+ The template uses `Qwen/Qwen3-8B`, which is the bundled text-demo model.
90
+ You do not need to pre-populate or inspect `cached_models` before the
91
+ first run; it can be empty until after a worker serves a job. Only edit
92
+ `config.model` if your FlowMesh stack is configured for a different
93
+ model or the job fails with a missing-model / worker-placement error.
94
+
95
+ ### Real workflows
96
+
96
97
  Submit and inspect a workflow. From a source checkout the example
97
98
  workflow file is at `examples/templates/yaml/trading-agent.yaml`;
98
99
  PyPI installs do not ship the templates, so pass an absolute path to a
@@ -100,12 +101,10 @@ workflow file you have locally:
100
101
 
101
102
  ```bash
102
103
  # From a source checkout:
103
- uv run lumilake login http://127.0.0.1:9000
104
104
  uv run lumilake job submit examples/templates/yaml/trading-agent.yaml \
105
105
  --format yaml --input 'Stock=NVDA,AAPL,MSFT' --output-prefix demo/trading-agent
106
106
 
107
107
  # From a PyPI install (lumilake on PATH; supply your own workflow file):
108
- lumilake login http://127.0.0.1:9000
109
108
  lumilake job submit /path/to/your/workflow.yaml \
110
109
  --format yaml --input 'Stock=NVDA,AAPL,MSFT' --output-prefix demo/trading-agent
111
110
 
@@ -113,6 +112,10 @@ lumilake job list
113
112
  lumilake job watch <job_id>
114
113
  ```
115
114
 
115
+ `lumilake deploy up` writes `~/.lumilake/config.toml` so subsequent
116
+ calls find the local server automatically. For remote / hosted servers,
117
+ set `LUMILAKE_BASE_URL` instead.
118
+
116
119
  See `docs/E2E_DEMO.md` for a full reproduction using the bundled demo
117
120
  workflows and dataset.
118
121
 
@@ -140,6 +143,14 @@ Generate both Lumilake and bundled FlowMesh env files:
140
143
  lumilake deploy init --flowmesh
141
144
  ```
142
145
 
146
+ If another FlowMesh stack is already running on the same host, check
147
+ ports before `deploy up`. Common co-tenant FlowMesh defaults are HTTP
148
+ `8000`, gRPC `50051`, Redis control `6379`, and Redis telemetry `6380`.
149
+ The bundled stack reads `SERVER_HTTP_PORT`, `SERVER_GRPC_PORT`,
150
+ `REDIS_CONTROL_PORT`, and `REDIS_TELEMETRY_PORT` from `.env.flowmesh`;
151
+ change them to free ports and keep `LUMILAKE_RUNTIME_ORCHESTRATOR_URL`
152
+ in `.env` aligned with `SERVER_HTTP_PORT`.
153
+
143
154
  Common deployment commands:
144
155
 
145
156
  ```bash
@@ -153,7 +164,7 @@ lumilake deploy down
153
164
  lumilake deploy clean
154
165
  ```
155
166
 
156
- Use `deploy down` to stop services while keeping data volumes. Use `deploy clean` or `deploy reset` only when you want to remove local stack state.
167
+ Use `deploy down` to stop services while keeping data volumes (non-destructive). Use `deploy clean` or `deploy reset` only when you want to remove local stack state; both delete every Lumilake-managed volume, and `reset` prompts for confirmation by default (`--yes` skips the prompt).
157
168
 
158
169
  ## Python SDK
159
170
 
@@ -221,7 +232,7 @@ A minimal in-memory plugin is available under `examples/plugins/simple_plugin/`.
221
232
  uv sync --group lint --group test --extra cli
222
233
  uv run pre-commit install --install-hooks -t pre-commit -t prepare-commit-msg -t commit-msg
223
234
  uv run pre-commit run --all-files
224
- uv run pytest tests/ --ignore=tests/server
235
+ uv run pytest tests/
225
236
  ```
226
237
 
227
238
  After changing dependencies, run:
@@ -49,3 +49,13 @@ Most API responses use an envelope:
49
49
  ```
50
50
 
51
51
  Errors use normal HTTP status codes with a JSON error body. The Python SDK unwraps successful envelopes and raises typed exceptions for HTTP failures.
52
+
53
+ ### Error Status Codes
54
+
55
+ - `400 Bad Request` — malformed request syntax (the JSON or YAML body could not be parsed).
56
+ - `404 Not Found` — the resource is missing.
57
+ - `409 Conflict` — the resource is in a state that cannot satisfy the request; the cancel endpoint includes the job's terminal `status` (`completed` / `failed` / `cancelled`) in `detail`.
58
+ - `422 Unprocessable Entity` — the payload was syntactically valid but failed validation (schema, header value, batch-size, input shape, unresolved location, duplicate graph name, graph compilation, ...).
59
+ - `5xx` — server-side faults (DB unavailable, runtime backend error).
60
+
61
+ The `X-Request-ID` response header echoes the request trace id (either the inbound `X-Request-ID` header or a freshly minted `req-<uid>` token); the same id is attached to every server log record produced under that request.
@@ -0,0 +1,125 @@
1
+ # CLI Reference
2
+
3
+ Install the CLI extra or use `uv run` from a source checkout:
4
+
5
+ ```bash
6
+ pip install "lumilake[cli]" # full CLI + deploy lifecycle
7
+ lumilake --help
8
+ ```
9
+
10
+ ```bash
11
+ uv run lumilake --help
12
+ ```
13
+
14
+ `pip install lumilake-cli` (no extra) installs a thin CLI that omits the
15
+ deploy lifecycle — useful for users that only need
16
+ `job` / `worker` / `trace` against a remote server. Running
17
+ `lumilake deploy` from a thin install prints an install hint pointing
18
+ back at `lumilake[cli]` or `lumilake-cli[deploy]`.
19
+
20
+ ## Configuration
21
+
22
+ The CLI resolves the target server URL in this order:
23
+
24
+ 1. `LUMILAKE_BASE_URL` environment variable.
25
+ 2. `~/.lumilake/config.toml` (written by `lumilake deploy up`).
26
+ 3. `http://127.0.0.1:9000` (the local deploy default).
27
+
28
+ | Command | Purpose |
29
+ |---------|---------|
30
+ | `lumilake config` | Show the resolved base URL and where it came from. |
31
+ | `lumilake info` | Query server health metadata. |
32
+ | `lumilake health` | Query server health. |
33
+
34
+ `lumilake deploy up` writes the resolved local server URL to `~/.lumilake/config.toml` after the stack is healthy (preserving any saved `api_key`), so subsequent CLI and SDK calls find it automatically. Remote / hosted users should set `LUMILAKE_BASE_URL` instead.
35
+
36
+ ### Authentication
37
+
38
+ When the server runs an `IdentityProvider` plugin (e.g. `lumid_lumilake_plugin`), the CLI presents a bearer token via `Authorization: Bearer <api_key>`. Three commands manage it:
39
+
40
+ | Command | Purpose |
41
+ |---------|---------|
42
+ | `lumilake init <url> --api-key <key> [--config <path>] [--force]` | Save `base_url` + `api_key` to `~/.lumilake/config.toml`. Confirms overwrite unless `--force`. |
43
+ | `lumilake deinit [--config <path>]` | Delete the config file. |
44
+ | `lumilake config [--source auto\|file\|env] [--show-api-key]` | Show the resolved config. `api_key` is redacted (first 4 + last 4) unless `--show-api-key`. |
45
+
46
+ Resolution order matches the SDK: explicit args > `LUMILAKE_BASE_URL` / `LUMILAKE_API_KEY` env > `~/.lumilake/config.toml` > local defaults. The CLI sends no `Authorization` header when `api_key` resolves to nothing — fine for local-mode deploys, rejected by deploys running with `LUMILAKE_REQUIRE_IDENTITY_PROVIDER=1`.
47
+
48
+ ## Deploy
49
+
50
+ Every `lumilake deploy` command reads `.env` (and optionally `.env.flowmesh`) from `--project-dir` (`-C <path>`) or, when not given, the current working directory. `LUMILAKE_DEPLOY_DIR` is an equivalent override.
51
+
52
+ ```bash
53
+ mkdir -p ~/lumilake-deploy
54
+ lumilake deploy -C ~/lumilake-deploy init # writes ~/lumilake-deploy/.env
55
+ # or:
56
+ LUMILAKE_DEPLOY_DIR=~/lumilake-deploy lumilake deploy init
57
+ ```
58
+
59
+ `init` previews the file (or a unified diff against an existing one) before asking for confirmation; pass `--force` to skip the preview and prompt.
60
+
61
+ The compose file and image are resolved from the installed `lumilake-deploy` package and GHCR; the deployment directory only needs to hold your `.env` files (and any local state docker compose creates).
62
+
63
+ If another FlowMesh stack is already running on the host, resolve port
64
+ collisions before `deploy up`. Common co-tenant defaults are FlowMesh
65
+ HTTP `8000`, gRPC `50051`, Redis control `6379`, and Redis telemetry
66
+ `6380`; the bundled stack reads the override keys documented in
67
+ `docs/ENV.md` from `.env.flowmesh`.
68
+
69
+ | Command | Purpose |
70
+ |---------|---------|
71
+ | `lumilake deploy init [--flowmesh] [--force]` | Create `.env` (preview + confirm); optionally also `.env.flowmesh`. |
72
+ | `lumilake deploy doctor [--flowmesh]` | Validate deployment env files. |
73
+ | `lumilake deploy build` | Build the Lumilake server Docker image from source. |
74
+ | `lumilake deploy pull` | Pull the published server image from the registry (`$LUMILAKE_REGISTRY`). |
75
+ | `lumilake deploy up` | Start the local stack and persist `base_url` to `~/.lumilake/config.toml` (image must already be present — run `pull` or `build` first). |
76
+ | `lumilake deploy down [--wipe-archive]` | Stop the stack but keep data volumes. Non-destructive. |
77
+ | `lumilake deploy clean` | Stop the stack and delete volumes. Destructive. |
78
+ | `lumilake deploy purge <image_tag> [--dry-run] [--force]` | Remove one local Lumilake server image tag for the configured registry. |
79
+ | `lumilake deploy reset [--yes]` | Wipe every volume, then start the stack again. Destructive. |
80
+ | `lumilake deploy status` | Show known stack container state. |
81
+ | `lumilake deploy restart [service]` | Restart one service or the full stack. |
82
+ | `lumilake deploy logs [service]` | Stream or tail service logs. |
83
+ | `lumilake deploy update-flowmesh` | Re-lock and install the latest FlowMesh packages. |
84
+
85
+ ### `deploy down` vs `deploy reset`
86
+
87
+ | Command | Stops services | Removes data volumes |
88
+ |---------|----------------|----------------------|
89
+ | `lumilake deploy down` | yes | no — archive (job records, run artifacts), compute Postgres, and MinIO corpus data survive, so `deploy up` resumes against the same state. `--wipe-archive` additionally wipes compute Postgres and FlowMesh runtime-state volumes while preserving MinIO corpus data. |
90
+ | `lumilake deploy clean` | yes | yes (every Lumilake-managed volume) |
91
+ | `lumilake deploy reset` | yes | yes (every Lumilake-managed volume), then re-runs `deploy up`. Prompts for confirmation; pass `--yes` to skip the prompt in scripts. |
92
+
93
+ Use `deploy down` between sessions. Reach for `clean` / `reset` only when you intentionally want to drop the local stack state.
94
+ Use `deploy purge <image_tag> --dry-run` to preview image cleanup; it removes
95
+ local server image tags only, not containers or volumes.
96
+
97
+ ## Jobs
98
+
99
+ | Command | Purpose |
100
+ |---------|---------|
101
+ | `lumilake job submit <workflow>` | Submit a workflow spec. |
102
+ | `lumilake job preview <workflow>` | Compile and schedule a workflow without dispatching runtime work. |
103
+ | `lumilake job list` | List jobs. |
104
+ | `lumilake job info <job_id>` | Show one job. |
105
+ | `lumilake job progress <job_id>` | Show detailed progress. |
106
+ | `lumilake job result <job_id>` | Show the final result. |
107
+ | `lumilake job inputs <job_id>` | Show resolved job inputs. |
108
+ | `lumilake job watch <job_id>` | Watch status until completion or failure. |
109
+ | `lumilake job cancel <job_id>` | Cancel a job. |
110
+ | `lumilake job artifact <job_id> --path <path> --output <file>` | Download a stored job artifact. |
111
+
112
+ Run `uv run lumilake job submit --help` for format, input, and output flags.
113
+
114
+ ## Workers and Traces
115
+
116
+ | Command | Purpose |
117
+ |---------|---------|
118
+ | `lumilake worker list` | List runtime workers. |
119
+ | `lumilake worker get <worker_id>` | Show one worker. |
120
+ | `lumilake trace list` | List execution traces. |
121
+ | `lumilake trace get <exec_id>` | Show a trace summary, JSON payload, or Mermaid graph. |
122
+
123
+ ## `--json` flag
124
+
125
+ Most query commands (`lumilake job list/info/progress/result/inputs`, `lumilake worker list/get`, `lumilake trace list`) emit the server's JSON envelope by default, so scripts can parse them directly. `lumilake trace get` defaults to a human-readable summary table; pass `--json` (a shortcut for `--format json`) for parse-friendly output.
@@ -53,8 +53,7 @@ This guide collects rules agents and contributors should apply before editing so
53
53
 
54
54
  ## Tests
55
55
 
56
- - Default unit validation is `uv run pytest tests/ --ignore=tests/server`.
57
- - `tests/server` exercises live-server behavior and is reserved for pre-release validation.
56
+ - Default unit validation is `uv run pytest tests/`. CI also collects coverage via `pytest-cov` against the SDK, CLI, deploy, hook, and server packages.
58
57
  - When changing runtime behavior, add or update a focused test in the same PR.
59
58
  - Do not ignore failing checks. A red test on `main` is a CI gap to close, not a reason to skip validation.
60
59
 
@@ -98,9 +98,9 @@ docker compose -f scripts/dev/compose.data-plane.yml down -v
98
98
  ```
99
99
 
100
100
  **Skip this step entirely** if you have your own Postgres and S3 — just
101
- set `DATABASE_URL`, `S3_URL`, and `S3_USER_DATA_PREFIX` in your `.env`
102
- to your own endpoints. Nothing in step 2 or 3 reads the bundled
103
- defaults if you've overridden them.
101
+ set `DATABASE_URL` and `S3_URL` in your `.env` to your own endpoints.
102
+ Nothing in step 2 or 3 reads the bundled defaults if you've overridden
103
+ them.
104
104
 
105
105
  ---
106
106
 
@@ -205,8 +205,7 @@ The shipped `.env.example` is **pre-pointed at step 1's data plane**
205
205
  - Set a model provider key (`OPENAI_API_KEY`, etc.) — only if you
206
206
  author workflows that call hosted providers; the bundled demos run
207
207
  on local open-weight models.
208
- - Point at your own Postgres / S3 (override `DATABASE_URL`, `S3_URL`,
209
- `S3_USER_DATA_PREFIX`).
208
+ - Point at your own Postgres / S3 (override `DATABASE_URL`, `S3_URL`).
210
209
  - Enable agent retrievals (`LUMID_DATA_URL=http://127.0.0.1:9102`).
211
210
  - Set `LUMILAKE_GPU_DEVICES` to one or more free GPU indices on your
212
211
  host (default is empty — no GPU workers). On a shared host, pick an
@@ -0,0 +1,154 @@
1
+ # Environment Reference
2
+
3
+ Lumilake reads configuration from `.env` for local deployment and from process environment variables for direct server runs. Generate the template with:
4
+
5
+ ```bash
6
+ lumilake deploy -C <deploy-dir> init
7
+ ```
8
+
9
+ `-C / --project-dir` (or `LUMILAKE_DEPLOY_DIR`) selects the directory the env files are written to and later read from. Workspace-checkout users may prefix every command with `uv run`; from a PyPI install (`pip install 'lumilake[cli]'`) invoke `lumilake` directly.
10
+
11
+ To also generate a bundled FlowMesh stack env file:
12
+
13
+ ```bash
14
+ lumilake deploy -C <deploy-dir> init --flowmesh
15
+ ```
16
+
17
+ Run `lumilake deploy -C <deploy-dir> doctor` after editing `.env`.
18
+
19
+ ## Required Keys
20
+
21
+ | Key | Purpose |
22
+ |-----|---------|
23
+ | `LUMILAKE_SERVER_HOST` | Host the FastAPI server binds to. |
24
+ | `LUMILAKE_SERVER_PORT` | Port the FastAPI server binds to. |
25
+ | `LUMILAKE_RUNTIME_ORCHESTRATOR_URL` | FlowMesh server URL used for workflow dispatch. |
26
+ | `S3_ARCHIVE_PREFIX` | `bucket/prefix` where job records and runtime artifacts are archived. |
27
+ | `LUMILAKE_IMAGE_TAG` | Docker image tag used by local deployment. Defaults to `dev` (the rolling main-built image). Pin to a `vX.Y.Z` semver tag for production. |
28
+ | `LUMILAKE_REGISTRY` | Container registry the deploy CLI pulls the server image from. Defaults to `ghcr.io/mlsys-io`. **Trust-bearing**: setting this points `lumilake deploy pull` at a different host, so only override it to a registry you control. |
29
+
30
+ Compute data plane (required for every direct SQL/S3 op):
31
+
32
+ | Key | Purpose |
33
+ |-----|---------|
34
+ | `DATABASE_URL` | PostgreSQL connection string used by every SQL `DataRetrievalOp`. |
35
+ | `S3_URL` | S3-compatible endpoint and credentials used by every S3 `DataRetrievalOp` and the archive (`S3_ARCHIVE_PREFIX`). Its path (`bucket/prefix`) is also the scan root for data-profile listing. |
36
+ | `S3_CERT_FILE` | Path to an S3 TLS cert bundle. Optional; the bundled compose mounts the file when set. |
37
+
38
+ ## Lumid.data routing
39
+
40
+ Only `DataRetrievalOp` with `type: agent` routes through lumid.data — SQL and S3 retrievals always go direct against `DATABASE_URL` / `S3_URL` regardless of `LUMID_DATA_URL`.
41
+
42
+ Agent-retrieval keys:
43
+
44
+ | Key | Purpose |
45
+ |-----|---------|
46
+ | `LUMID_DATA_URL` | Base URL for lumid.data's `/agent/v1` endpoint. Required when a workflow contains agent retrievals. |
47
+ | `LUMID_DATA_TOKEN` | Bearer token sent to lumid.data. |
48
+ | `LUMID_DATA_TIMEOUT_SECONDS` | HTTP timeout for lumid.data calls. Defaults to `30`. |
49
+
50
+ ## Server and Logging
51
+
52
+ | Key | Purpose |
53
+ |-----|---------|
54
+ | `LUMILAKE_LOG_LEVEL` | Server log level. Defaults to `INFO`. |
55
+ | `LUMILAKE_SKIP_DOTENV_CHECK` | Set to `1` when the server's env is injected directly (Docker) so startup does not require a `.env` file. |
56
+ | `LUMILAKE_REQUIRE_IDENTITY_PROVIDER` | When truthy, rejects requests with 503 unless at least one `IdentityProvider` plugin is registered. Recommended for cloud deploys; leave unset locally. |
57
+ | `LUMILAKE_RUNTIME_TOKEN` | Scheduler-internal credential for FlowMesh control-plane reads (worker enumeration, profile fetches). Never used to authorize HTTP request handlers. Leave empty for local; in cloud, set to a token whose FlowMesh principal can read worker metadata. Required when `LUMILAKE_REQUIRE_IDENTITY_PROVIDER` is set. |
58
+ | `LUMILAKE_RECOVER_IN_FLIGHT_JOBS` | Whether server startup marks pending/running jobs as failed. Default `1` (recommended for single-instance deploys). Set to `0` in HA / multi-instance deploys so a starting standby doesn't clobber jobs the active instance is still running. |
59
+ | `LUMILAKE_RUNTIME_MANAGER_TYPE` | Runtime dispatch backend. `default` or `flowmesh`. |
60
+ | `LUMILAKE_JOB_MANAGER_TYPE` | Job manager implementation. Currently only `priority`. |
61
+ | `LUMILAKE_HTTP_TIMEOUT_SECONDS` | Outbound HTTP timeout for server-side calls. Defaults to `300`. |
62
+
63
+ ## Scheduler and Runtime Tuning
64
+
65
+ | Key | Purpose |
66
+ |-----|---------|
67
+ | `LUMILAKE_OPTIMIZER_TYPE` | Optimizer implementation. Defaults to `halo`. |
68
+ | `LUMILAKE_OPTIMIZER_BATCH_SIZE` | Maximum batch size used by the optimizer loop. |
69
+ | `LUMILAKE_BATCH_ACCUMULATION_SECONDS` | Wait window before forming the first optimization batch. |
70
+ | `LUMILAKE_STARVATION_LIMIT` | Starvation threshold; `0` means immediate override. |
71
+ | `LUMILAKE_OPTIMIZER_SUBPROCESS_TIMEOUT_SECONDS` | Timeout for optimizer subprocess execution. |
72
+ | `LUMILAKE_QUEUE_QUANTUM_HIGH` | High-priority queue quantum. Defaults to `20`. |
73
+ | `LUMILAKE_QUEUE_QUANTUM_MEDIUM` | Medium-priority queue quantum. Defaults to `10`. |
74
+ | `LUMILAKE_QUEUE_QUANTUM_LOW` | Low-priority queue quantum. Defaults to `5`. |
75
+ | `LUMILAKE_POLL_TIMEOUT_SECONDS` | Overall timeout for runtime polling. Defaults to `inf`. |
76
+ | `LUMILAKE_POLL_INTERVAL_SECONDS` | Interval between runtime status polls. Defaults to `5`. |
77
+ | `LUMILAKE_FLOWMESH_OUTPUT_DESTINATION` | FlowMesh result delivery mode. `local` (default) or `http`. |
78
+
79
+ ## Worker Groups
80
+
81
+ | Key | Purpose |
82
+ |-----|---------|
83
+ | `LUMILAKE_CPU_WORKER_GROUP_SIZE` | Number of CPU workers FlowMesh provisions. |
84
+ | `LUMILAKE_GPU_WORKER_GROUP_SIZE` | Number of GPU workers FlowMesh provisions. At least one of CPU / GPU size must be `> 0`. |
85
+ | `LUMILAKE_GPU_DEVICES` | GPU device ids Lumilake assigns to FlowMesh workers (one per device). Specific index (`0`), comma-separated subset (`0,2`), or `all` to cover every `nvidia-smi` device. Leave blank to skip GPU worker creation. |
86
+
87
+ ## Plugins
88
+
89
+ | Key | Purpose |
90
+ |-----|---------|
91
+ | `LUMILAKE_PLUGINS` | Comma-separated list of plugin module names the server imports at startup. See `docs/PLUGINS.md`. |
92
+ | `LUMILAKE_PLUGIN_DIR` | Host directory bind-mounted to `/app/plugins` (read-only) and added to `PYTHONPATH`. Each `*.py` placed here is importable by the names listed in `LUMILAKE_PLUGINS`. Defaults to `./plugins` relative to the deploy directory. |
93
+
94
+ ## Data Profiling
95
+
96
+ | Key | Purpose |
97
+ |-----|---------|
98
+ | `LUMILAKE_DATA_PROFILE_NUM_TEST_QUERIES` | Number of test queries per data profile. Defaults to `1`. |
99
+ | `LUMILAKE_S3_PROFILE_COST_PER_FILE` | Cost-model coefficient (per file) for S3 profile estimates. |
100
+ | `LUMILAKE_S3_PROFILE_COST_PER_MIB` | Cost-model coefficient (per MiB) for S3 profile estimates. |
101
+ | `LUMILAKE_LOCAL_DATA_PROFILE_PLAN_VARIANTS` | Comma-separated planner variants used for local data profiles. Defaults to `default,prefer_index,prefer_seq,prefer_nestloop`. |
102
+ | `LUMILAKE_DISABLE_DATA_PROFILE` | When truthy (`1`/`true`/`yes`/`on`), the server skips inline data-profile task build/run, skips `collect_data_profile` at batch dispatch, and the HALO optimizer falls back to its static cost model (any supplied profile results are dropped). Defaults to off. |
103
+
104
+ ## vLLM Backend
105
+
106
+ | Key | Purpose |
107
+ |-----|---------|
108
+ | `LUMILAKE_VLLM_MAX_NUM_BATCHED_TOKENS` | vLLM `max_num_batched_tokens`. Defaults to `2048`. |
109
+ | `LUMILAKE_VLLM_MAX_CUDAGRAPH_CAPTURE_SIZE` | vLLM CUDA-graph capture size. Defaults to `64`. |
110
+ | `LUMILAKE_VLLM_GPU_MEMORY_UTILIZATION` | vLLM GPU memory utilization fraction. Defaults to `0.9`. |
111
+
112
+ ## Hardware Requirements
113
+
114
+ Used by FlowMesh worker placement.
115
+
116
+ | Key | Purpose |
117
+ |-----|---------|
118
+ | `HARDWARE_CPU_REQUIREMENT` | CPU cores per worker. Defaults to `8`. |
119
+ | `HARDWARE_MEMORY_REQUIREMENT` | Memory per worker. Defaults to `16Gi`. |
120
+ | `HARDWARE_GPU_REQUIREMENT` | GPUs per worker. Defaults to `1`. |
121
+ | `HARDWARE_GPU_MEMORY_REQUIREMENT` | GPU memory per worker. Defaults to `8Gi`. |
122
+
123
+ ## FlowMesh TLS and Worker Config
124
+
125
+ Picked up by the bundled FlowMesh deploy helpers.
126
+
127
+ | Key | Purpose |
128
+ |-----|---------|
129
+ | `SERVER_HTTP_PORT` | FlowMesh HTTP API port in `.env.flowmesh`. Keep `LUMILAKE_RUNTIME_ORCHESTRATOR_URL` in `.env` and `FLOWMESH_BASE_URL` in `.env.flowmesh` aligned with this port. |
130
+ | `SERVER_GRPC_PORT` | FlowMesh gRPC port in `.env.flowmesh`. Change it when a co-tenant FlowMesh stack already owns `50051`. |
131
+ | `REDIS_CONTROL_PORT` | FlowMesh control Redis port in `.env.flowmesh`. Change it when another stack already owns `6379`. |
132
+ | `REDIS_TELEMETRY_PORT` | FlowMesh telemetry Redis port in `.env.flowmesh`. Change it when another stack already owns `6380`. |
133
+ | `FLOWMESH_BASE_URL` | FlowMesh HTTP base URL consumed by FlowMesh workers; should point at `SERVER_HTTP_PORT`. |
134
+ | `REDIS_TLS_DIR` | Directory holding Redis TLS certs. Empty disables TLS bind-mounts. |
135
+ | `SERVER_TLS_DIR` | Directory holding FlowMesh server gRPC TLS certs. Empty disables TLS. |
136
+ | `SERVER_WORKER_CONFIG` | Path to a FlowMesh worker config override. |
137
+
138
+ `lumilake deploy init --flowmesh` writes `.env.flowmesh`. On hosts that
139
+ also run another FlowMesh stack, check the common defaults before
140
+ `deploy up`: HTTP `8000`, gRPC `50051`, Redis control `6379`, and Redis
141
+ telemetry `6380`.
142
+
143
+ ## SDK / CLI Client
144
+
145
+ Consumed by the SDK and deploy CLI helpers.
146
+
147
+ | Key | Purpose |
148
+ |-----|---------|
149
+ | `LUMILAKE_BASE_URL` | SDK / CLI override for the saved server URL (see `docs/SDK.md` and `docs/CLI.md` for resolution order). |
150
+ | `LUMILAKE_API_KEY` | Bearer token sent as `Authorization: Bearer <key>` by the SDK / CLI. Required when the server runs an `IdentityProvider` plugin with `LUMILAKE_REQUIRE_IDENTITY_PROVIDER=1`. |
151
+ | `LUMILAKE_TIMEOUT` | SDK / CLI HTTP timeout override in seconds. Values `<= 0` are ignored. |
152
+ | `LUMILAKE_DEPLOY_DIR` | Default `--project-dir` for `lumilake deploy`. |
153
+
154
+ See `.env.example` for the deploy-time template and defaults.