The daemon rejects an invalid semantic-query request (unknown source, ambiguous measure, no join path) with a plain ValueError; the Node compute port now maps the daemon's exit code 3 / HTTP 400 to KtxExpectedError so these routine, caller-driven rejections stay out of Error Tracking. A dedicated SemanticLayerRequestError(ValueError) is raised only for engine rejections and routed through both daemon transports and the HTTP handler. Because pydantic v2 ValidationError subclasses ValueError, malformed sources or responses (contract faults) are kept as faults: they are reported and mapped to exit 1 / HTTP 500 / plain Error on every path. Non-object stdin is likewise a fault (exit 1), not exit 3. |
||
|---|---|---|
| .. | ||
| src/ktx_daemon | ||
| tests | ||
| pyproject.toml | ||
| README.md | ||
ktx-daemon
ktx-daemon is the portable Python compute package for ktx.
It supports portable compute in two modes:
- One-shot commands, used by default by the
@kaelio/ktxCLI. - An explicit HTTP server for long-running local MCP sessions.
One-shot semantic query
printf '%s\n' '{"sources":[],"query":{"measures":[],"dimensions":[]},"dialect":"postgres"}' \
| ktx-daemon semantic-query
One-shot source generation
Generate semantic-layer sources from schema scan data:
printf '%s\n' '{"tables":[{"name":"orders","db":"public","columns":[{"name":"id","type":"integer","primary_key":true}]}],"links":[],"dialect":"postgres"}' \
| ktx-daemon semantic-generate-sources
One-shot database introspection
Introspect a Postgres database schema:
printf '%s\n' '{"connection_id":"warehouse","driver":"postgres","url":"postgresql://readonly@example.test/warehouse","schemas":["public"]}' \
| ktx-daemon database-introspect
One-shot LookML parsing
Parse LookML projects into resolved, KSL-ready structures:
printf '%s\n' '{"files":[{"path":"views/orders.view.lkml","content":"view: orders { sql_table_name: public.orders ;; measure: order_count { type: count } }"}],"dialect":"postgres"}' \
| ktx-daemon lookml-parse
One-shot embeddings
Compute text embeddings locally:
printf '%s\n' '{"text":"hello"}' \
| ktx-daemon embedding-compute
Compute text embeddings locally in bulk:
printf '%s\n' '{"texts":["hello","world"]}' \
| ktx-daemon embedding-compute-bulk
One-shot code execution
Execute Python code with the current in-process boundary:
printf '%s\n' '{"code":"result = 1 + 2"}' \
| ktx-daemon code-execute
HTTP compute server
Start the HTTP compute server with code execution disabled:
ktx-daemon serve-http --host 127.0.0.1 --port 8765
Enable HTTP code execution explicitly:
ktx-daemon serve-http --host 127.0.0.1 --port 8765 --enable-code-execution
Available HTTP endpoints:
GET /healthPOST /database/introspectPOST /embeddings/computePOST /embeddings/compute-bulkPOST /lookml/parsePOST /semantic-layer/generate-sourcesPOST /semantic-layer/queryPOST /semantic-layer/validatePOST /code/executewhen--enable-code-executionis passed
The HTTP server exposes Postgres database introspection, LookML parsing, local
embedding compute, and semantic-layer compute for source generation, query
compilation, and validation.
Code execution is off by default. When enabled, it runs Python exec in the
daemon process with the same in-process boundary as the one-shot
code-execute command and does not provide OS-level sandboxing.
HTTP code execution uses the standalone ktx boundary. It does not forward caller authorization headers to a host app and does not connect scratchpad or visualization helpers to host application APIs.