Skip to main content

langchain-adeu

PyPI version License: MIT

LangChain integration for Adeu — Track Changes for Microsoft Word (.docx) in the LLM Era.

This package wraps the local, cross-platform, and offline-capable subset of Adeu's document-editing engine as native LangChain tools. It enables LangChain and LangGraph agents to read, edit, diff, sanitize, and finalize Microsoft Word documents while preserving the underlying formatting, layout, custom styles, and XML structures.


Installation

Install the package via pip or uv:

Using pip

pip install langchain-adeu

Using uv

uv add langchain-adeu

Quick Start

Instantiate the AdeuToolkit and register its tools with a tool-calling chat model. This short example initializes an agent capable of managing docx operations.

from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
from langchain_adeu import AdeuToolkit

# Load a tool-calling model
model = ChatOpenAI(model="anthropic:claude-sonnet-4-6")

# Initialize the toolkit
toolkit = AdeuToolkit()
tools = toolkit.get_tools()

# Create the agent
agent = create_agent(model=model, tools=tools)

Worked Example: Multi-Tool Review & Redline Flow

Below is a complete, runnable workflow illustrating how an agent can read an existing draft, apply tracked changes, generate a visual diff, and sanitize metadata before sending it to a counterparty.

from langchain_adeu import AdeuToolkit

# 1. Instantiate the toolkit
tools_map = {t.name: t for t in AdeuToolkit().get_tools()}

read_tool = tools_map["adeu_read_docx"]
apply_tool = tools_map["adeu_apply_changes"]
diff_tool = tools_map["adeu_diff_docx"]
sanitize_tool = tools_map["adeu_sanitize_docx"]

input_path = "MSA_draft.docx"
redline_path = "MSA_redlined.docx"
clean_path = "MSA_final.docx"

# 2. Read the document to extract text with active tracked changes & comments
# clean_view=False ensures the LLM sees inline CriticMarkup (e.g. {++inserted++})
read_result = read_tool.invoke({
    "reasoning": "Reading the draft to review tracked changes and comments.",
    "file_path": input_path,
    "clean_view": False,
    "mode": "full",
    "page": 1
})
print("--- Document Contents ---\n", read_result)

# 3. Apply a batch of edits (tracked modifications + a comment reply)
apply_result = apply_tool.invoke({
    "reasoning": "Applying jurisdiction edits and replying to a comment.",
    "file_path": input_path,
    "author_name": "AI Reviewer",
    "output_path": redline_path,
    "changes": [
        {
            "type": "modify",
            "target_text": "Governing Law shall be the State of New York.",
            "new_text": "Governing Law shall be the State of Delaware.",
            "comment": "Updating jurisdiction to corporate standard."
        },
        {
            "type": "reply",
            "target_id": "Com:1",
            "text": "Agreed. Applied jurisdiction change."
        }
    ]
})
print("\n--- Changes Applied ---\n", apply_result)

# 4. Generate a word-level diff to verify edits
diff_result = diff_tool.invoke({
    "reasoning": "Verifying the applied edits with a word-level diff.",
    "original_path": input_path,
    "modified_path": redline_path,
    "compare_clean": True
})
print("\n--- Word-Level Diff ---\n", diff_result)

# 5. Sanitize document properties and remove author history for final delivery
# keep_markup=True preserves unresolved track changes while stripping metadata
sanitize_result = sanitize_tool.invoke({
    "reasoning": "Stripping metadata before delivering the redline.",
    "file_path": redline_path,
    "output_path": clean_path,
    "keep_markup": True,
    "author": "Anonymous Advisor"
})
print("\n--- Sanitization Report ---\n", sanitize_result)

Reading Large Documents & Navigation Ladder

When working with long documents (e.g. 50+ pages), avoid loading the entire text into the LLM context at once. Follow this progressive navigation ladder:

  1. Plan structure (mode="outline"): Inspect document hierarchy (headings, sections, tables) with optional depth limits via outline_max_level and detailed metadata with outline_verbose=True.
  2. Read by slice (page=N or page="2-6"): Load targeted page ranges or specific sections rather than the full document (page="all"). When reading the entire document with page="all", pass force=True to override the response-budget refusal on large documents.
  3. Locate exact clauses (search_query): Find specific terms or phrases with pagination support (max_matches, match_offset), regex support (search_regex=True), case sensitivity (search_case_sensitive=True), and full-paragraph context (full_paragraph=True).
  4. Collect tracked-change IDs (mode="changes"): Retrieve the ledger of active revisions and comment threads with fresh IDs (filtered optionally by changes_author or paginated via changes_offset) before executing accept, reject, or reply operations.

Transactional vs. Partial Edits & Sanitization Safety

  • Salvage vs. Transactional Edits (partial): By default (partial=True), adeu_apply_changes operates in salvage mode: valid edits are committed and saved while failing ones are recorded in the artifact and PARTIAL: report header for correction. Setting partial=False enables strict all-or-nothing transactional semantics where any validation failure rejects the entire batch and writes no output file.
  • Sanitization Refusal Safety (status="blocked"): adeu_sanitize_docx returns status="blocked" with an explanatory report instead of raising a tool error when a SanitizeError is encountered (e.g., attempting a full sanitize of a document with unresolved tracked changes without accept_all=True or keep_markup=True, or comparing against a low-similarity baseline without allow_low_similarity_baseline=True), aborting without modifying or writing an output file.
  • Text-Revision Verification Gate (success=False): adeu_apply_text_revision re-reads the applied document's clean text and compares it against the text you supplied. On a mismatch (e.g. headings or table cells that cannot be deleted via text replacement) it returns success=False with status="verification_failed", writes nothing to output_path, and keeps a <stem>.unverified.docx diagnostic copy at unverified_output_path — that copy is not the requested document. The artifact also relays the engine's own post-gate stats, so edits_skipped, the per-edit edits reports (each marked status="failed") and verification_error describe exactly what was attempted. A revision that would delete the majority of the document is refused the same way (status="error") unless allow_major_deletions=True.

Per-Tool Reference

Tool Name Purpose / When to Use Key Input Parameters Response Format / Output Shape
adeu_read_docx Reads a .docx file into Markdown. Use clean_view=False to audit active track-changes, or inspect document structure with specialized modes and search. file_path (str), clean_view (bool), mode ("full", "outline", "appendix", "changes", "fields"), page (int, str e.g. '2-6', 'all'), force (bool), outline_max_level (int), outline_verbose (bool), search_query (str), search_regex (bool), search_case_sensitive (bool), max_matches (int), match_offset (int), full_paragraph (bool), changes_author (str), changes_offset (int), fields_offset (int) content_and_artifact (Returns projected Markdown text + structured metadata artifact)
adeu_apply_changes Commits a batch of edits as native track-changes and comment threads. Operates in salvage mode by default (partial=True); set partial=False for strict transactional semantics. file_path (str), author_name (str), changes (list[dict]), output_path (str), partial (bool) content_and_artifact (Returns completion text + structured change stats)
adeu_apply_text_revision Rewrites a whole document from revised clean text: Adeu diffs your text against the document's clean view and writes the delta as tracked changes. Use when handing back the entire edited text is easier than enumerating edits. revised_text must cover the ENTIRE document — anything omitted becomes a tracked deletion — and must contain no CriticMarkup. file_path (str), revised_text (str), output_path (str), author (str), allow_major_deletions (bool) content_and_artifact (Returns completion text + artifact with success, verified, edits_applied, status; on refusal success=False with status="verification_failed" — plus unverified_output_path — or status="error", and no output file)
adeu_diff_docx Generates a word-level patch, unified diff, or structured changes JSON showing insertions and deletions between two files. original_path (str), modified_path (str), compare_clean (bool), diff_format ("word_patch", "unified", "structured_changes") content (Returns free-form @@ Word Patch @@ visual text, a unified diff, or — for "structured_changes" — a JSON object {"changes": [...DocumentChange], "warnings": [...]} that can be passed straight to adeu_apply_changes)
adeu_accept_all_changes Resolves and bakes all tracked changes and format modifications into plain text. Optionally removes comments. file_path (str), output_path (str), remove_comments (bool) content_and_artifact (Returns completion text + artifact mapping paths)
adeu_sanitize_docx Cleans document properties (author names, RSIDs, Custom XML, DMS traces). Validates against an optional baseline document. file_path (str), output_path (str), keep_markup (bool), baseline_path (str), author (str), accept_all (bool), allow_low_similarity_baseline (bool) content_and_artifact (Returns human-readable report text + structured cleanup stats)

What's NOT Included

This package intentionally focuses on local, cross-platform, offline-capable workflows. For the following, use the Adeu MCP server directly:

  • Live MS Word Interop (Windows COM) — real-time edits on an active Microsoft Word canvas.
  • Adeu Cloud Features — email fetching, multi-document asynchronous semantic validation.
  • MCP Apps UI — interactive Markdown preview rendering inside custom client interfaces.

Development & Testing

We use uv for dependency management and workspace isolation.

Installation

Sync development and testing dependencies locally:

make install

Running Tests

To run unit tests (isolated, socket-disabled):

make test

To run integration tests (requires real fixture .docx documents):

make integration_test

Code Formatting & Linting

We enforce Ruff for formatting and linting:

make format
make lint

License

MIT. See LICENSE.

Metadata

Release files for langchain-adeu 3.0.7

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for langchain-adeu 3.0.7
File Size Uploaded
langchain_adeu-3.0.7.tar.gz 204.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for langchain-adeu 3.0.7
File Interpreter ABI Platform
langchain_adeu-3.0.7-py3-none-any.whl Python 3 none any Details

Total release size: 240.2 kB

Release files / langchain_adeu-3.0.7.tar.gz

Download URL langchain_adeu-3.0.7.tar.gz
Size 204.7 kB
Tags Source
SHA-256 checksum
How to use checksums
b67a05d43da06dfe3044308a92ab7e80c1373f10ea9d3f6af2f32e8890c792a7
BLAKE2b-256 checksum
How to use checksums
09b779b1c0894d933e340fd20a4e6e83214b75b4e3e6d6d835ad0f156ea23e75
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release files / langchain_adeu-3.0.7-py3-none-any.whl

Download URL langchain_adeu-3.0.7-py3-none-any.whl
Size 35.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
039d95559890ea8b454fe52e50d3765c82c306b63ba160e34d4b07f9fc25f796
BLAKE2b-256 checksum
How to use checksums
2013058296357e01b6387519fbe7f63388aa141ab8de0bff479fe0a6b9e395c0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

3.0.7 This release

2 release files

3.0.6

2 release files

3.0.5

2 release files

3.0.4

2 release files

3.0.3

2 release files

3.0.2

2 release files

3.0.1

2 release files

3.0.0

2 release files

2.4.1

2 release files

2.4.0

2 release files

2.3.1

2 release files

2.2.0

2 release files

2.1.0

2 release files

2.0.0

2 release files

1.30.0

2 release files

1.29.0

2 release files

1.28.0

2 release files

1.27.0

2 release files

1.26.0

2 release files

1.25.0

2 release files

1.23.0

2 release files

1.22.0

2 release files

1.21.0

2 release files

1.20.0

2 release files

1.19.1

2 release files

1.18.1

2 release files

1.18.0

2 release files

1.17.2

2 release files

1.17.1

2 release files

1.17.0

2 release files

1.16.0

2 release files

1.15.2

2 release files

1.15.1

2 release files

1.15.0

2 release files

1.14.0

2 release files

1.13.0

2 release files

1.12.1

2 release files

1.12.0

2 release files

1.11.2

2 release files

1.10.1

2 release files

1.9.0

2 release files

1.8.0

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page