Accelerate financial and billing data extraction
Extract structured financial and billing data from unstructured documents, such as PDFs or images, using GroundX®.
This content is authored by Red Hat experts, but has not yet been tested on every supported configuration.
Accelerate financial and billing data extraction Copy linkLink copied!
Extract structured financial and billing data from unstructured documents, such as PDFs or images, using GroundX®.
Table of contents Copy linkLink copied!
Detailed description Copy linkLink copied!
For many organizations, critical financial and billing information remains locked inside unstructured formats like scans, PDFs, and images. Extracting this data traditionally requires slow, error-prone manual entry or brittle, template-based OCR systems that break whenever a vendor shifts a column or alters a layout. Processing complex document structures—such as nested tables, multi-page invoices, and diverse document formats—at scale remains a highly complex technical challenge.
This AI quickstart is designed to bypass those hurdles, helping you get up and running quickly with a robust, production-ready extraction pipeline. You will deploy GroundX from EyeLevel to automate billing data extraction within a secure, on-premises AI environment powered by OpenShift AI.
See it in action Copy linkLink copied!
See a detailed walkthrough of the UI-based quickstart application: Walkthrough
Architecture diagrams Copy linkLink copied!

Requirements Copy linkLink copied!
This quickstart was developed and tested on a Red Hat OpenShift® cluster with the following components and resources. These can be considered the minimum requirements.
Minimum hardware requirements Copy linkLink copied!
| Node Type | Qty | vCPU | Memory (GB) |
|---|---|---|---|
| Control Plane | 3 | 4 | 16 |
| Worker | 3 | 4 | 16 |
Minimum software requirements Copy linkLink copied!
This quickstart was tested with the following software versions:
| Software | Version |
|---|---|
| Red Hat OpenShift | 4.20.5 |
| Red Hat OpenShift Service Mesh | 2.5.11-0 |
| Red Hat OpenShift Serverless | 1.37.0 |
| Red Hat OpenShift AI | 3.4 |
| helm | 3.17.1 |
| GroundX | 2.9.92 |
Required user permissions Copy linkLink copied!
The user performing this quickstart should be able to create a project and install both Helm charts. Roles differ by chart:
| Chart | Required role | Purpose |
|---|---|---|
billing-operators |
cluster-admin (or equivalent) | Installs operators, storage class, node labels, and SCCs |
billing-workloads |
admin (namespace-level) | Deploys GroundX, MinIO tenant, database, UI, and notebook into eyelevel |
[!NOTE] A single
make -C helm installruns both charts. Use an account that can installbilling-operators(typicallycluster-admin). If operators are already installed cluster-wide, an admin can install only the workloads chart.
Deploy Copy linkLink copied!
Deployment uses two Helm umbrella charts, installed in sequence through a Makefile:
| Chart | Path | Purpose |
|---|---|---|
| billing-operators | helm/billing-operators/ |
Operators and cluster prep (storage class, node labels, Percona operator, MinIO operator, optional Strimzi operator) |
| billing-workloads | helm/billing-workloads/ |
Application workloads (database cluster, MinIO tenant, Kafka cluster, GroundX, Streamlit UI, Jupyter notebook) |
By default, GroundX layout and ranker inference run on CPU. Optional GPU settings are documented under Technical details.
Prerequisites Copy linkLink copied!
The steps assume the following products and tools are already available on the cluster:
- Red Hat OpenShift Container Platform
- Red Hat OpenShift Service Mesh
- Red Hat OpenShift Serverless
- Red Hat OpenShift AI
- Authorino (typically installed with OpenShift AI / Service Mesh)
- Helm 3.x installed locally
ocCLI installed and authenticated- The
eyelevelproject/namespace does not already exist
[!NOTE] GPU is optional. Default GroundX inference uses CPU. Install the Node Feature Discovery and NVIDIA GPU operators only if you enable GPU inference (see Technical details).
Installation Copy linkLink copied!
- Clone this repo and log in to your cluster:
git clone https://github.com/rh-ai-quickstart/Billing-extraction-with-GroundX.git
cd Billing-extraction-with-GroundX
oc login --token=<user_token> --server=https://api.<openshift_cluster_fqdn>:6443
- Create the workloads secret file (required — credentials are not stored in git):
cp helm/billing-workloads/secret.example.yaml helm/billing-workloads/secret.yaml
Edit helm/billing-workloads/secret.yaml and set at least these keys under groundx-secret.data:
Key in secret.yaml |
What it is | Used by |
|---|---|---|
GROUNDX_ADMIN_API_KEY |
GroundX platform / admin API key | Streamlit UI (GROUNDX_API_KEY in the pods) |
GROUNDX_AGENT_API_KEY |
OpenAI-compatible API key (not a placeholder like sk-CHANGE_ME) |
GroundX layout and extract agents |
[!IMPORTANT]
GROUNDX_ADMIN_API_KEYcan be any UUID you choose — it does not come from GroundX or another provider. Pick any value in UUID format (for example00000000-0000-0000-0000-000000000001) and use the same value consistently. Do not confuse it withGROUNDX_AGENT_API_KEY, which must be a real OpenAI-compatible API key.
No shell environment variables are required for install. Helm merges secret.yaml into the chart and creates the eyelevel-secret-credentials Kubernetes Secret.
[!NOTE]
helm/billing-operators/secret.yamlis NOT OPTIONAL.
make -C helm install only checks that helm/billing-workloads/secret.yaml exists.
Review and edit the values files to match your environment:
helm/billing-operators/values.yaml— operator toggles, node labelshelm/billing-workloads/values.yaml— GroundX config, notebook settings, resource limits
Install using the Makefile (recommended):
# From the repo root — installs operators first, then workloads
make -C helm install
Monitor deployment Copy linkLink copied!
oc get pods -n eyelevel
All pods should reach Running (or Completed for one-shot Jobs).
Demo billing extraction Copy linkLink copied!
Access the UI Copy linkLink copied!
- Open the frontend UI route in the OpenShift console (Networking → Routes), or:
oc get route -n eyelevel -l app.kubernetes.io/component=frontend \
-o jsonpath='https://{.items[0].spec.host}{"\n"}'
The URL looks like https://billing-workloads-frontend-eyelevel.<cluster_domain>/.
- Follow the Data Extraction UI walkthrough below to run extraction in the app.

| Page | Description |
|---|---|
| Documentation | What the app is, what GroundX does, and what success looks like |
| Infrastructure Check | Validate SDK, credentials, schemas, and GroundX API connectivity |
| Upload & Process | Select a sample bill (or upload PDF/JPG/PNG) and run extraction with simple.yaml |
| View Extracted Data | Inspect the latest JSON and field table; download results |
| Job History | Browse past submissions and reopen extracted data |
Typical flow: Infrastructure Check → Upload & Process (try AT&T Wireless) → View Extracted Data → Job History.
Delete Copy linkLink copied!
Remove the deployment using the Makefile:
# From the repo root — uninstalls both charts and deletes the eyelevel project
make -C helm uninstall
This uninstalls the workloads chart first (clearing CRs and finalizers), then the operators chart, then deletes the eyelevel project.
If the project remains, remove it manually:
oc delete project eyelevel
References Copy linkLink copied!
- GroundX documentation v2.9
- Red Hat OpenShift AI documentation v3.4
- Red Hat OpenShift documentation
Technical details Copy linkLink copied!
GPU configuration for GroundX inference Copy linkLink copied!
By default, the billing-workloads chart runs GroundX layout and ranker inference on CPU. There is no separate “suppress GPU” flag — the chart overrides the upstream GroundX defaults (which request a GPU) in helm/billing-workloads/values.yaml:
| Setting | Effect |
|---|---|
deviceType: cpu |
Runs the container on CPU instead of CUDA |
nvidia.com/gpu: '0' |
Prevents the scheduler from allocating a GPU |
Layout inference (groundx.layout.inference):
layout:
inference:
deviceType: cpu
resources:
limits:
memory: 12Gi
nvidia.com/gpu: '0'
requests:
cpu: 500m
memory: 2Gi
nvidia.com/gpu: '0'
Ranker inference (groundx.ranker.inference) — also CPU by default, with fewer workers and more memory than the GPU defaults:
ranker:
inference:
deviceType: cpu
workers: 2
resources:
limits:
memory: 8Gi
nvidia.com/gpu: '0'
requests:
cpu: 1500m
memory: 4Gi
nvidia.com/gpu: '0'
To enable GPU inference, set nvidia.com/gpu to '1' and deviceType to cuda (for ranker; layout follows the same pattern). Use a GPU with roughly 24 GB of memory (for example NVIDIA A10, L40S, or A100). See the comments in helm/billing-workloads/values.yaml for the full GPU resource blocks. Nodes labeled for GroundX (gpuLayout / gpuRanker) must have an NVIDIA GPU available, and the NVIDIA GPU operator must be installed.