CLI Application
Python CLI for source extraction, detector execution, and batched output delivery.
Setup
cd /unstructured/apps/cli
uv sync
# Optional if you want an activated shell instead of `uv run ...`:
source .venv/bin/activate
Optional detector groups:
uv sync --group detectors
# or specific groups: --group secrets --group pii --group threat ...
System dependency: LibreOffice
Legacy Office formats (.doc, .xls, .ppt) have no usable pure-Python parser,
so src/utils/legacy_office.py shells out to soffice --headless --convert-to docx|xlsx|pptx and feeds the result through the normal OOXML extractors. Without
it those files scan as "no content available" — a silent coverage gap, not an
error.
- Kubernetes: installed in the CLI image (
libreoffice-*-nogui), so this works out of the box. - Desktop and local dev: install it yourself —
brew install --cask libreoffice(macOS),apt install libreoffice-writer libreoffice-calc libreoffice-impress(Debian/Ubuntu), or libreoffice.org on Windows. The desktop app deliberately does not bundle LibreOffice: it is ~550 MB even stripped, and slimming the upstream bundle breaks its code signature, which Apple Silicon punishes by killing the process on launch. - Non-standard install: set
CLASSIFYRE_SOFFICE_PATHto the binary. The CLI checks that first, thenPATH, then the standard macOS, Windows, and Linux-tarball install locations.
When no binary is found the file is not silently reported as empty. The scan
raises an ENGINE_UNAVAILABLE text-extraction coverage error that fails that
asset's text scan, lands in scan_stats.errors and the run's text-coverage
counters, and carries a platform-specific message telling the user how to install
LibreOffice.
tests/utils/test_legacy_office.py skips its round-trip tests when no LibreOffice
is found, so a green local run does not by itself prove this path works.
Command Syntax
Use the thin wrapper:
uv run main.py <command> <recipe.json> [options]
Or direct module entrypoint:
uv run python -m src.main <command> <recipe.json> [options]
Commands:
test- test source connection.discover- discover source resources.extract- run extraction and emit batched output.evaluate-file- internally evaluate detectors against one local file.
Extract Output Model
Extraction always emits in batches.
Recipes do not contain output configuration; output is controlled by CLI flags and environment variables.
Output types:
console- emits NDJSON envelopes to stdout.file- appends NDJSON envelopes to a file.rest- pushes batches to API endpoints and finalizes run.
Default behavior:
- If
source_idis present (--source-idorSOURCE_IDenv), default output isrest. - Otherwise default output is
console. - Default batch size is
20.
CLI Options
Global/common:
--debug- enable debug logging.--detectors-file <path>- file evaluation only.
Extract output options:
--output-type rest|file|console--output-batch-size <int>--output-rest-url <url>(complete API base, including the namespace path)--output-file-path <path>--source-id <uuid>--runner-id <uuid>--managed-runner(REST only; runner lifecycle managed by API orchestrator)
Environment fallbacks:
SOURCE_ID,RUNNER_IDCLASSIFYRE_OUTPUT_TYPE,CLASSIFYRE_OUTPUT_BATCH_SIZECLASSIFYRE_OUTPUT_REST_URL,CLASSIFYRE_OUTPUT_REST_TIMEOUT_SECCLASSIFYRE_OUTPUT_FILE_PATHAPI_URL(fallback base URL for REST output)
Practical Examples
1) Console output (quick local test)
uv run main.py extract ./wordpress-recipe.json --output-type console --output-batch-size 1
You will see NDJSON lines like:
{"event":"batch", ...}{"event":"finish", ...}
2) File output
uv run main.py extract ./wordpress-recipe.json \
--output-type file \
--output-file-path /tmp/classifyre-assets.ndjson \
--output-batch-size 20
3) REST output (manual CLI to backend)
uv run main.py extract ./wordpress-recipe.json \
--output-type rest \
--source-id <source_uuid>
Notes:
--runner-idoptional for manual runs. If omitted, CLI creates external runner automatically.--output-rest-urlis optional. If omitted, CLI usesCLASSIFYRE_OUTPUT_REST_URL, thenAPI_URL, thenhttp://localhost:8000. In a namespaced deployment, pass the complete base (for examplehttps://api.example/ns-id); the CLI appends all asset, finding, runner, and source endpoints beneath it.--managed-runnershould be used only for API-orchestrated runs where runner already exists.
4) REST output with explicit runner (managed/orchestrated style)
uv run main.py extract ./wordpress-recipe.json \
--output-type rest \
--source-id <source_uuid> \
--runner-id <runner_uuid> \
--managed-runner
5) Full extract command with all output flags
uv run main.py extract ./wordpress-recipe.json \
--output-type rest \
--output-batch-size 20 \
--output-rest-url http://localhost:8000 \
--output-file-path /tmp/classifyre-assets.ndjson \
--source-id <source_uuid> \
--runner-id <runner_uuid> \
--managed-runner
Use --output-file-path only when --output-type file.
Dev Scripts
bun run dev- run CLI quickly.bun run lint- ruff format/check.bun run check-types- mypy.bun run test- pytest suite.
Release files for classifyre-cli 0.4.127
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| classifyre_cli-0.4.127.tar.gz | 1.2 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| classifyre_cli-0.4.127-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.7 MB
Release files / classifyre_cli-0.4.127.tar.gz
| Download URL | classifyre_cli-0.4.127.tar.gz |
|---|---|
| Size | 1.2 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
75276dec4c5b277870c8ae341e696256477b3ffab8fc901186220cdd7e7d4ff4
|
|
BLAKE2b-256 checksum How to use checksums |
10cb9b05ff86e1369711ac82742981d5643860f2eaed4bb52a1a5504eecf15a0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / classifyre_cli-0.4.127-py3-none-any.whl
| Download URL | classifyre_cli-0.4.127-py3-none-any.whl |
|---|---|
| Size | 570.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a6191b75e93854420dfbfd217bd470ce72b2004ff27d395fdc04283a15bacbc0
|
|
BLAKE2b-256 checksum How to use checksums |
b596f2f8e32bfdba624f73a940ce7c2d83c47380638ceb8005161e5ad113301d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|