Skip to main content

langextract-usage

How to use LangExtract to extract structured information from text. Use when writing code that calls lx.extract(), building extraction pipelines, defining examples, or troubleshooting alignment issues.

Source facts

Repository
google/langextract
Last source activity
October 14, 2026 at 08:34
Detected SKILL.md language
English
Stars
39,041
Forks
2,728

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

File Explorer
8 files

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
langextract-usage
description
How to use LangExtract to extract structured information from text. Use when writing code that calls lx.extract(), building extraction pipelines, defining examples, or troubleshooting alignment issues.
# LangExtract Usage LangExtract extracts structured information from unstructured text using LLMs. The main entry point is `lx.extract()`. Every extraction needs at least one example and input text. `prompt_description` is optional but recommended. ## Install ```bash pip install langextract # For OpenAI model support: pip install langextract[openai] ``` ## API keys ```bash # Gemini (checks GEMINI_API_KEY then LANGEXTRACT_API_KEY) export GEMINI_API_KEY="your_key" # OpenAI (checks OPENAI_API_KEY then LANGEXTRACT_API_KEY) export OPENAI_API_KEY="your_key" # Ollama: no API key needed, just a running Ollama server ``` Auto-routing + env-default resolution is tuned for GPT-style model IDs (`gpt-4*`, `gpt-5*`). For OpenAI-compatible endpoints or non-GPT IDs, pass an explicit `ModelConfig` — see `references/providers.md`. ## Basic extraction ```python import langextract as lx examples = [ lx.data.ExampleData( text="Patient takes lisinopril 10mg daily for hypertension.", extractions=[ lx.data.Extraction( extraction_class="medication", extraction_text="lisinopril", attributes={"dose": "10mg", "frequency": "daily"}, ), lx.data.Extraction( extraction_class="condition", extraction_text="hypertension", attributes={"status": "active"}, ), ], ) ] result = lx.extract( text_or_documents="Patient is prescribed metformin 500mg twice daily.", prompt_description="Extract medications and conditions with attributes.", examples=examples, model_id="gemini-2.5-flash", ) for e in result.extractions: print(e.extraction_class, e.extraction_text) print(f" char_interval: {e.char_interval}") print(f" attributes: {e.attributes}") ``` See `examples/basic_extraction.py` for a runnable version and `examples/relationship_extraction.py` for using `extraction_class` + `attributes` to encode relationships between entities. ## Writing good examples Examples drive model behavior. Follow these rules: 1. `extraction_text` must be verbatim from the example text, not paraphrased 2. List extractions in order of appearance in the text 3. Each `extraction_class` should be consistent across examples 4. Include attributes that match what you want extracted at runtime LangExtract can raise prompt-alignment warnings when an example's `extraction_text` values don't align cleanly to the example's `text` (failed alignment, or fuzzy/lesser rather than exact). The validator does not enforce rules 2–4 above — those are guidance to steer the model's output, not checked invariants. To fail fast on alignment issues during development, pass these kwargs directly to `lx.extract()` (both default to permissive): ```python from langextract.prompt_validation import PromptValidationLevel result = lx.extract( ..., prompt_validation_level=PromptValidationLevel.ERROR, # default: WARNING prompt_validation_strict=True, # default: False ) ``` See `references/prompt-validation.md` for level semantics and strict-mode behavior. ## Key parameters ```python result = lx.extract( text_or_documents=text, # str, URL, or list of Documents fetch_urls=False, # True to fetch a URL input prompt_description=prompt, # what to extract (optional) examples=examples, # few-shot examples (required) model_id="gemini-2.5-flash", # model to use extraction_passes=1, # >1 for higher recall (costs more) max_char_buffer=1000, # chunk size batch_length=10, # chunks per batch max_workers=10, # parallel workers (provider-dependent) context_window_chars=None, # cross-chunk context for coreference ) ``` - `text_or_documents` accepts a URL string, which is fetched only when `fetch_urls=True`; otherwise it is treated as text. Only enable fetching for URLs from a trusted source, in a sandboxed process. - For full parallelism, keep `batch_length >= max_workers`. Parallel processing via `max_workers` is provider-dependent; some providers parallelize batched prompts, while others (such as the current Ollama provider) process them sequentially. - `context_window_chars` includes characters from the previous chunk as context for the current one, which helps with coreference and entity continuity across chunk boundaries. - For multiple documents, pass a list of `lx.data.Document` — see `examples/multiple_documents.py`. ## Working with results ```python # Filter to grounded extractions only (have source positions) grounded = [e for e in result.extractions if e.char_interval] # Access source position for e in grounded: start = e.char_interval.start_pos end = e.char_interval.end_pos matched_text = result.text[start:end] # Save to JSONL lx.io.save_annotated_documents( [result], output_name="results.jsonl", output_dir="." ) # Visualize from JSONL (shows first document) html = lx.visualize("results.jsonl") with open("visualization.html", "w", encoding="utf-8") as f: if hasattr(html, "data"): f.write(html.data) # Jupyter/Colab else: f.write(html) # Or visualize an AnnotatedDocument directly html = lx.visualize(result) ``` ## Provider selection The default is Gemini. For other providers, see `references/providers.md`, which covers: - OpenAI (JSON mode; fence behavior auto-configured) - Ollama (local models, `model_url`) - `ModelConfig` for advanced provider_kwargs (custom `base_url`, etc.) - Custom provider plugins via `router.register()` ## Common issues **Extractions with `char_interval=None`**: the extraction could not be located in the source text. Common causes include paraphrased output, alignment misses, or hallucinated entities. Filter with `[e for e in result.extractions if e.char_interval]`. To tune alignment, see `references/resolver-params.md`. **Prompt alignment warnings**: your examples have `extraction_text` that doesn't match the example text verbatim. Fix the examples, or see `references/prompt-validation.md` to fail fast during development. **Slow on long documents**: `extraction_passes > 1` multiplies processing time. Start with 1 and increase only if recall is insufficient. **Model selection**: `gemini-2.5-flash` is recommended for most tasks; `gemini-2.5-pro` for complex reasoning. ## Further reading - `references/providers.md` — OpenAI, Ollama, ModelConfig, custom plugins - `references/resolver-params.md` — fuzzy alignment tuning - `references/prompt-validation.md` — catching example issues early - `examples/` — runnable scripts for each scenario above
View on GitHub