Choose it for reviewable source spans
A structured field is easier to check when a reviewer can find the phrase behind it. LangExtract's README describes an LLM extraction workflow that maps extracted text to source locations and produces an interactive HTML view. That is the main reason to consider it for document extraction.
You supply instructions and examples. The README recommends verbatim example extractions in source order and warns that a model can copy material from those examples into its answer. Extractions that cannot be located in the input receive char_interval = None.
Rejecting ungrounded items is a useful validation step. A matching phrase can still have the wrong label, and an attribute can contain an incorrect inference. Source grounding supports inspection; it does not certify correctness.
What our recorded run establishes
Our stored run is dated September 25, 2026, at 12:10:49.505 UTC and uses commit 62b933a2c757fd2bbb100498571b8d1692db4344. The recorded configuration has 3 CPUs, 8 GB of memory and image ghcr.io/astral-sh/uv:python3.12-bookworm. The install tail identifies Python 3.12.12 in the virtual environment.
The install step succeeded in 24.842 seconds, rounded to 25 seconds in the summary. The build step succeeded in 0.833 seconds, rounded to 1 second. The record lists 128 dependencies occupying 290 MB. The checkout contained 150 files, approximately 41,621 lines of source and 13.1 MB before dependencies, with 11 CI workflows, a Dockerfile and a tests directory.
These are recorded setup and repository observations. The supplied record does not expose the exact install or build command, establish an installed CLI, or demonstrate a provider-backed extraction workload. No new execution was performed for this correction.
The test step exited with code 1 after 82.404 seconds. Pytest's own summary reports 79.33 seconds, with 877 passed, 3 failed, 20 skipped, 94 warnings and 52 passing subtests. These are reported outcomes, not a reconciled count of exhaustive unique coverage. In particular, the parser's total of 880 must not be used as a denominator that accounts for all skipped tests and subtests.
All three named failures are in create_provider_plugin_test.py. They concern an offline-safe editable install, generated wheel and source-distribution packaging, and PEP 660 editable installation. The log tail includes BackendUnavailable: Cannot import 'setuptools.build_meta'. This identifies a build-backend import failure in the captured output, but the excerpt does not establish a common root cause for every failed test. It also does not show that LangExtract's extraction functionality is broken.
Pip-audit recorded 3 advisories across 1 package in that environment. The supplied record does not identify the package or advisories, and it does not give the number of scanned packages. Coverage, severity and applicability cannot be determined from these totals. The dependency count is not an audit-coverage count.
Provider setup remains a separate decision
The README documents Gemini, OpenAI, Vertex AI and local Ollama use, plus separately packaged custom providers. OpenAI requires its optional dependency. Vertex AI has project, location and service-account configuration. Ollama requires a local service and downloaded model.
The README says Gemini and supported OpenAI models can use output_schema, with or without few-shot examples. It explicitly says Ollama does not currently support output_schema. Check the exact provider path you intend to use rather than assuming configuration carries across providers.
For longer documents, the README demonstrates extraction_passes=3, max_workers=20 and a 1,000-character buffer. These are example settings, not our measured accuracy or speed results. Chunking and repeated passes should be evaluated against your documents and request budget.
Results can be saved as JSONL and visualized in HTML. The supplied current README also explicitly sets fetch_urls=True in its URL-input example; the README at our measured commit does not. Match documentation to the version you deploy instead of mixing examples from different revisions.
Historical reports are now closed
The supplied v1.7.0 release notes list repeated-mention alignment changes, provider-plugin generation and packaging fixes, Gemini settings forwarding, inference errors for unusable responses, and OpenAI routing changes. Those release notes describe upstream changes, not results measured in our sandbox. Our run used the later main-branch commit 62b933a rather than a clean v1.7.0 release checkout.
The current source extracts change how the older issue reports should inform adoption:
- Issue 542 reported a crash when
format_typepassed throughresolver_paramsreached formatting as a string. It was closed as completed through pull request 544 on October 4, 2026. - Issue 532 reported misplaced
toolsin Vertex batch requests. It was closed as completed through pull request 553 on October 5, 2026. - Issue 529 reported ignored top-level
temperature=0.0withconfig=ormodel=. It was closed as completed through pull request 571 on October 14, 2026.
These are historical reports with recorded closure status, not three currently open blockers. The supplied extracts do not establish which published packages contain each fix, and we have not rerun the affected paths. Check your pinned version when these configurations matter.
The README also states that LangExtract is not an officially supported Google product. Its medical demonstration is not a finished or approved product and is not intended for diagnosis, treatment or medical advice.
How the ratings work
These editorial ratings use a five-point evidence rubric: 1 means a demonstrated major limitation, 2 means limited supporting evidence, 3 means a useful baseline with material limits, 4 means strong documented support with stated gaps, and 5 requires broad corroboration for the rated area. They are judgments about the supplied evidence, not benchmark scores. Unknown adoption, support responsiveness and compatibility do not earn high ratings.
Setup receives 3/5 because the recorded install and build steps succeeded, while provider setup and extraction remain unverified. Documentation receives 4/5 because the README covers installation, examples, grounding, providers, visualization and testing, although we have not validated every recipe. Community receives 2/5 because contribution instructions, community-provider documentation and issue follow-through provide limited evidence; they do not establish adoption or support quality. Maturity receives 3/5 because releases and reported test results provide a baseline, with unresolved limits in our historical run and no workload validation.
Decide by the output you need
Instructor documents Pydantic validation and automatic retries. Consider it when typed model responses are the main requirement. Presidio documents configurable identification and anonymization of PII. Consider it for that narrower task, while retaining its warning that automated detection can miss sensitive information. Neither comparison is a measured head-to-head result.
For LangExtract, start with a representative document set and one provider configuration. Record the package and model versions, prompt and examples. Check missing spans, incorrect labels and inferred attributes, then inspect the HTML output. Those checks address the decision this run leaves open: whether source-linked extraction is accurate enough for your documents.

