Skip to main content

Framework-neutral Python SDK for building LAREX Action processors.

Project description

LAREX Action SDK

This SDK is work in progress. The public API can still change before LAREX Actions and the SDK are considered stable.

Framework-neutral Python SDK for building LAREX Action processors.

The core package verifies LAREX dispatch requests, parses typed run/input payloads, sends heartbeats, downloads selected files, and uploads result manifests. FastAPI support is available as an optional convenience extra.

Installation

uv add "larex-action-sdk[fastapi]"

For framework-neutral usage only:

uv add larex-action-sdk

FastAPI Processor

import os

from larex_actions import ActionContext, crop_image_bytes
from larex_actions.fastapi import create_larex_action_app


async def process(ctx: ActionContext) -> None:
    action_input = await ctx.pull_input()
    results = ctx.result_builder()

    for page in action_input.pages:
        async with ctx.step(f"Processing {page.name}", progress_percent=25):
            if page.images and action_input.target_selection:
                image_bytes = await ctx.download_bytes(page.images[0])
                for target_page in action_input.target_selection.pages:
                    if target_page.page_id != page.id:
                        continue
                    for region in target_page.regions:
                        crop = crop_image_bytes(image_bytes, region.coords, padding=16)
                        # Run a model on the crop, then merge results into PAGE XML.

            if page.xml:
                xml_bytes = await ctx.download_bytes(page.xml[0])
                results.add_xml_bytes(
                    page_id=page.id,
                    content=xml_bytes,
                    file_name=f"{page.name}-processed.xml",
                )

    await ctx.complete(results, "Done")


app = create_larex_action_app(
    processor_id="my-processor",
    dispatch_secret=os.environ["LAREX_DISPATCH_HMAC_SECRET"],
    handler=process,
)

Target-Aware Runs

LAREX can dispatch page, region, and textline targeted runs. The SDK exposes the requested target on both dispatch and pulled input payloads:

payload_target = ctx.payload.target
action_input = await ctx.pull_input()
input_target = action_input.target

Processors still receive full page files according to the Action YAML inputs. Target metadata contains selected region/textline ids, geometry, and current text. LAREX sends full page images/XML and lets processors decide how to use the target. The SDK includes crop_image_bytes(...) and bounding_box(...) helpers for building region/textline crops from target geometry.

Processors return normal PAGE XML via ResultBuilder.add_xml_bytes(...) or add_xml_path(...). For region or textline targeted runs, LAREX imports only the selected target scope from the returned PAGE XML.

Framework-Neutral Dispatch Verification

from larex_actions import DispatchVerifier

payload = DispatchVerifier(
    processor_id="my-processor",
    dispatch_secret=secret,
).verify(
    method=request_method,
    path_and_query=request_path_and_query,
    headers=request_headers,
    body=request_body,
)

You can then pass payload.model_dump(mode="json", by_alias=True) to your own queue/worker system and use ActionClient.from_dispatch(payload) in async workers.

Security

  • Dispatch requests are verified with the X-LAREX-Action-* HMAC headers.
  • Timestamps and nonces are checked to reduce replay risk.
  • The FastAPI adapter rejects dispatch bodies larger than max_dispatch_body_bytes.
  • Per-run bearer secrets and dispatch HMAC secrets are never included in model reprs.
  • Processor YAML must still declare the inputs and outputs LAREX should expose or accept.

Development

uv sync --all-extras
uv run ruff format .
uv run ruff check .
uv run pyright
uv run pytest
uv build

Releases are published with PyPI Trusted Publishing from GitHub Actions. Release candidate tags containing rc publish to TestPyPI; published GitHub releases publish to PyPI.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

larex_action_sdk-0.3.0.tar.gz (42.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

larex_action_sdk-0.3.0-py3-none-any.whl (16.1 kB view details)

Uploaded Python 3

File details

Details for the file larex_action_sdk-0.3.0.tar.gz.

File metadata

  • Download URL: larex_action_sdk-0.3.0.tar.gz
  • Upload date:
  • Size: 42.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for larex_action_sdk-0.3.0.tar.gz
Algorithm Hash digest
SHA256 85299e7f3779af52c3cdc4c0771f3675a9f2a9e449a942422c38058099fb9ad7
MD5 9b5610bdd6a3b2019c60cd2b3adabc13
BLAKE2b-256 6a635d1a231e8c6eff0eef4a758f31a97e69f6b8837fd7b7030bbc613603f210

See more details on using hashes here.

Provenance

The following attestation bundles were made for larex_action_sdk-0.3.0.tar.gz:

Publisher: publish.yml on OCR4all/larex-action-sdk

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file larex_action_sdk-0.3.0-py3-none-any.whl.

File metadata

File hashes

Hashes for larex_action_sdk-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 27a12d952be0cdea777e8c1e7ea04fdb60dd734ac8788e6394ae17f5a83728d4
MD5 241e8522ce677f5a1af0c6aa2344150c
BLAKE2b-256 115099d7a0f47c264bbadd4e85f94414349e7edb1f80af7a1bd2a2375c108b64

See more details on using hashes here.

Provenance

The following attestation bundles were made for larex_action_sdk-0.3.0-py3-none-any.whl:

Publisher: publish.yml on OCR4all/larex-action-sdk

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page