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 and the all-in-one Docker image: installed in the image
(
libreoffice-*-nogui), so this works out of the box. - 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. - 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.
Metadata
Release files for classifyre-cli 0.6.14
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| classifyre_cli-0.6.14.tar.gz | 1.4 MB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| classifyre_cli-0.6.14-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 2.2 MB
Release files / classifyre_cli-0.6.14.tar.gz
| Download URL | classifyre_cli-0.6.14.tar.gz |
|---|---|
| Size | 1.4 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
49a9d3160195b07dba615e96a3d3ef4e29e973a5840249f538ee2d5fea3ae3c2
|
|
BLAKE2b-256 checksum How to use checksums |
c40ad030ad4f7e078612e4bd05c22b753e95175c4f49422bf8bae653d6793b18
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.4 {"installer":{"name":"uv","version":"0.13.4","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.6.14-py3-none-any.whl
| Download URL | classifyre_cli-0.6.14-py3-none-any.whl |
|---|---|
| Size | 769.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a03c6f38033c46599039055d7ef9fbd22c7f9fca710068e7019dec1d69175302
|
|
BLAKE2b-256 checksum How to use checksums |
abe0346af09167d487fd80fbe2c4495345119b615d39aa2a15c34598513fc684
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.4 {"installer":{"name":"uv","version":"0.13.4","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}
|
Security for classifyre-cli 0.6.14
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.