How to Use Vertex AI Batch Processing in LangExtract: A Complete Implementation Guide
LangExtract automatically routes large workloads to the Vertex AI Batch Prediction API when you provide a Vertex AI-enabled client and a batch configuration, handling GCS upload, job polling, and result caching automatically.
Vertex AI batch processing in LangExtract enables cost-effective extraction from large document collections by asynchronously processing prompts through Google's managed batch service. This guide explains the architecture, configuration options, and implementation patterns using the google/langextract repository's official batch processing pipeline.
Prerequisites for Vertex AI Batch Processing
Before enabling batch mode, you must instantiate a genai.Client with explicit Vertex AI support. The library validates this through _is_vertexai_client() in langextract/providers/gemini_batch.py (lines 71-80), which checks that vertexai=True is set on the client instance.
import google.genai as genai
client = genai.Client(
vertexai=True,
project="your-gcp-project",
location="us-central1"
)
You also need appropriate IAM permissions for Cloud Storage (to create buckets and objects) and Vertex AI (to submit and poll batch jobs).
Understanding the Batch Processing Architecture
The integration is built around three core components defined in langextract/providers/gemini_batch.py:
| Component | Purpose | Location |
|---|---|---|
| Vertex AI Client Detection | Guarantees batch mode only runs with vertexai=True clients |
_is_vertexai_client() (lines 71-80) |
| Batch Configuration | Holds all knobs (enabled, threshold, poll_interval, etc.) and validates them |
BatchConfig dataclass (lines 57-80) |
| Batch Inference Pipeline | Orchestrates request building, GCS upload, job creation, polling, and result extraction | infer_batch() (lines 688-785) and helper methods |
The Batch Inference Pipeline Steps
When infer_batch() executes, it performs the following operations:
- Request Building:
_build_request()creates REST-compatible dictionaries for each prompt, including JSON schemas and generation configs. - File Upload:
_submit_file()serializes prompts to a JSONL file and uploads it to a dedicated GCS bucket. - Job Creation: Calls
client.batches.create()with the uploaded file as the source. - Polling:
_poll_completion()monitors the job state until it reaches a terminal state (SUCCEEDED,PAUSED, or failure), respectingpoll_intervalandtimeoutsettings. - Result Extraction:
_extract_from_file()downloads output JSONL files and parses them with_parse_batch_line(), preserving original prompt order. - Caching:
GCSBatchCachewrites results back to GCS using SHA-256 hashes as keys, enabling instant reuse on subsequent runs.
Configuring Batch Processing in LangExtract
You can configure batch behavior using either a dictionary or the BatchConfig dataclass. Both methods validate that enable_caching and retention_days are explicitly set when enabled=True.
Using Dictionary Configuration
Pass a dictionary via language_model_params:
batch_config = {
"enabled": True,
"threshold": 10, # trigger batch mode after 10 chunks
"poll_interval": 30, # seconds between status checks
"timeout": 3600, # maximum seconds to wait
"enable_caching": True, # store results in GCS
"retention_days": 30, # auto-delete cache after 30 days
"max_prompts_per_job": 10000, # split large workloads
"ignore_item_errors": False, # fail entire batch on single error
}
results = lx.extract(
text_or_documents=large_text,
prompt_description="Extract entities and relationships",
model_id="gemini-2.5-flash",
language_model_params={
"vertexai": True,
"project": "your-gcp-project",
"location": "us-central1",
"batch": batch_config,
},
)
Using the BatchConfig Dataclass
For programmatic control, import the dataclass directly from langextract/providers/gemini_batch.py:
from langextract.providers.gemini_batch import BatchConfig
cfg = BatchConfig(
enabled=True,
threshold=20,
poll_interval=15,
timeout=1800,
max_prompts_per_job=5000,
ignore_item_errors=False,
enable_caching=True,
retention_days=None, # keep cache indefinitely
)
results = lx.extract(
...,
language_model_params={
"vertexai": True,
"project": "my-project",
"location": "europe-west1",
"batch": cfg, # dataclass accepted directly
},
)
The BatchConfig class is defined starting at line 57 in langextract/providers/gemini_batch.py.
Complete Working Examples
End-to-End Batch Extraction Script
This runnable example from docs/examples/batch_api_example.md demonstrates logging, text chunking, and batch configuration:
import logging
import requests
import textwrap
import langextract as lx
# Configure logging to track batch progress
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s",
handlers=[
logging.FileHandler("batch_process.log"),
logging.StreamHandler(),
],
)
# Download sample text (Romeo & Juliet, ~60k characters)
url = "https://www.gutenberg.org/files/1513/1513-0.txt"
text = requests.get(url).text
text_subset = text[:60_000]
# Define extraction prompt and examples
prompt = textwrap.dedent("""\
Extract characters and emotions from the text.
Use exact text from the input for extraction_text.""")
examples = [
lx.data.ExampleData(
text="ROMEO. But soft! What light through yonder window breaks?",
extractions=[
lx.data.Extraction(extraction_class="character", extraction_text="ROMEO"),
lx.data.Extraction(extraction_class="emotion", extraction_text="But soft!"),
],
)
]
# Batch configuration
batch_config = {
"enabled": True,
"threshold": 10,
"poll_interval": 30,
"timeout": 3600,
"enable_caching": True,
"retention_days": 30,
}
# Execute extraction with automatic batch routing
results = lx.extract(
text_or_documents=text_subset,
prompt_description=prompt,
examples=examples,
model_id="gemini-2.5-flash",
max_char_buffer=500,
batch_length=1000,
language_model_params={
"vertexai": True,
"project": "your-gcp-project",
"location": "us-central1",
"batch": batch_config,
},
)
print(f"Extracted {len(results.extractions)} entities.")
Direct infer_batch Usage
For advanced scenarios requiring direct pipeline control, call infer_batch() from langextract/providers/gemini_batch.py (lines 688-785):
from google import genai
from langextract.providers.gemini_batch import infer_batch, BatchConfig
client = genai.Client(vertexai=True, project="my-project", location="us-central1")
prompts = ["Who is the protagonist?", "List all locations mentioned."]
cfg = BatchConfig.from_dict({
"enabled": True,
"threshold": 1,
"enable_caching": False,
"retention_days": 0,
})
results = infer_batch(
client=client,
model_id="gemini-1.5-pro",
prompts=prompts,
schema_dict=None,
gen_config={"temperature": 0.0},
cfg=cfg,
system_instruction=None,
safety_settings=None,
)
How Batch Mode Triggering Works
LangExtract's public extract() function automatically evaluates whether to use batch processing based on the threshold parameter in your BatchConfig. The default threshold is 50 prompts—if the number of chunks after text segmentation meets or exceeds this value, the library switches from real-time Gemini/Vertex AI endpoints to the asynchronous batch pipeline.
You can force batch mode regardless of prompt count by setting enabled=True with a custom threshold:
batch_config = {
"enabled": True,
"threshold": 5, # Trigger batch even for small workloads
}
Caching and Cost Optimization
The batch implementation includes sophisticated caching via GCSBatchCache to minimize redundant API calls. When enable_caching=True, the system:
- Generates SHA-256 hashes of each prompt to create unique cache keys
- Stores results in a dedicated GCS bucket named
langextract-{project}-{location}-batch - Checks for existing results before submitting new batch jobs, returning cached data instantly when available
- Automatically applies lifecycle rules when
retention_daysis set, deleting cached objects after the specified period to prevent unbounded storage growth
For workloads exceeding max_prompts_per_job (default varies by configuration), the library automatically splits prompts into multiple batch jobs, each with unique display names like langextract-batch-{timestamp}, allowing you to process millions of documents without hitting Vertex AI request size limits.
Summary
- Vertex AI batch processing in LangExtract requires a
genai.Clientinstantiated withvertexai=Trueand a validBatchConfigobject. - The system automatically triggers batch mode when prompt counts exceed the configurable threshold (default 50), or when explicitly enabled.
- The pipeline handles the entire lifecycle: GCS upload, job submission via
client.batches.create(), polling via_poll_completion(), and ordered result extraction. - GCS caching using SHA-256 hashed keys eliminates redundant API calls, with optional lifecycle management via
retention_days. - For large datasets, the library supports chunked job submission through
max_prompts_per_jobto avoid Vertex AI limits.
Frequently Asked Questions
What is the default batch threshold in LangExtract?
The default threshold is 50 prompts. When the number of text chunks generated from your input meets or exceeds this value, LangExtract automatically routes the workload to the Vertex AI Batch Prediction API instead of the real-time endpoint. You can override this by setting threshold in your BatchConfig.
How does the GCS caching mechanism work?
When enable_caching=True, LangExtract creates a bucket named langextract-{project}-{location}-batch and stores each prompt-result pair using a SHA-256 hash of the prompt as the object key. Before submitting new batch jobs, the system queries this cache via GCSBatchCache and returns any existing matches instantly. Setting retention_days automatically configures lifecycle rules to delete cached objects after the specified period.
Can I use batch processing without Vertex AI?
No. The batch processing pipeline specifically requires a Vertex AI-enabled client. The _is_vertexai_client() function in langextract/providers/gemini_batch.py explicitly validates that vertexai=True is set on the genai.Client instance. Attempting to use batch configuration with a standard Gemini client will result in validation errors.
How do I handle failed items in a batch job?
By default, the batch pipeline stops on errors. However, you can set ignore_item_errors=True in your BatchConfig to continue processing when individual prompts fail. When enabled, the system returns None or partial results for failed items while preserving the order of successful extractions. The _poll_completion() function monitors job status, and _extract_from_file() handles parsing of successful outputs even when some lines contain errors.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →