multixtract 0.1.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,419 @@
1
+ Metadata-Version: 2.4
2
+ Name: multixtract
3
+ Version: 0.1.1
4
+ Summary: Vendor-neutral PDF/document extraction: text, tables, and vision-described images, chunked and embedded for search & RAG.
5
+ Project-URL: Homepage, https://github.com/srivnamrata/multixtract
6
+ Project-URL: Documentation, https://github.com/srivnamrata/multixtract#readme
7
+ Project-URL: Issues, https://github.com/srivnamrata/multixtract/issues
8
+ Project-URL: Changelog, https://github.com/srivnamrata/multixtract/blob/main/CHANGELOG.md
9
+ Author-email: Namrata Srivastava <srivnamrata@yahoo.co.in>
10
+ License: MIT License
11
+
12
+ Copyright (c) 2026 Namrata Srivastava
13
+
14
+ Permission is hereby granted, free of charge, to any person obtaining a copy
15
+ of this software and associated documentation files (the "Software"), to deal
16
+ in the Software without restriction, including without limitation the rights
17
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
18
+ copies of the Software, and to permit persons to whom the Software is
19
+ furnished to do so, subject to the following conditions:
20
+
21
+ The above copyright notice and this permission notice shall be included in all
22
+ copies or substantial portions of the Software.
23
+
24
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
27
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
29
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30
+ SOFTWARE.
31
+ License-File: LICENSE
32
+ Keywords: chunking,embeddings,extraction,ocr,pdf,rag,vision
33
+ Classifier: Development Status :: 3 - Alpha
34
+ Classifier: Environment :: Console
35
+ Classifier: Intended Audience :: Developers
36
+ Classifier: License :: OSI Approved :: MIT License
37
+ Classifier: Operating System :: OS Independent
38
+ Classifier: Programming Language :: Python :: 3
39
+ Classifier: Programming Language :: Python :: 3 :: Only
40
+ Classifier: Programming Language :: Python :: 3.9
41
+ Classifier: Programming Language :: Python :: 3.10
42
+ Classifier: Programming Language :: Python :: 3.11
43
+ Classifier: Programming Language :: Python :: 3.12
44
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
45
+ Classifier: Topic :: Scientific/Engineering :: Image Recognition
46
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
47
+ Classifier: Topic :: Text Processing
48
+ Classifier: Topic :: Text Processing :: Indexing
49
+ Requires-Python: >=3.9
50
+ Requires-Dist: imagehash>=4.3
51
+ Requires-Dist: pillow>=10.0
52
+ Provides-Extra: all
53
+ Requires-Dist: accelerate<2.0,>=0.27; extra == 'all'
54
+ Requires-Dist: azure-identity<2.0,>=1.15; extra == 'all'
55
+ Requires-Dist: azure-storage-blob<13.0,>=12.19; extra == 'all'
56
+ Requires-Dist: beautifulsoup4>=4.12; extra == 'all'
57
+ Requires-Dist: ebooklib>=0.18; extra == 'all'
58
+ Requires-Dist: imagecodecs>=2023.1.23; extra == 'all'
59
+ Requires-Dist: openai<2.0,>=1.57.0; extra == 'all'
60
+ Requires-Dist: openpyxl>=3.1; extra == 'all'
61
+ Requires-Dist: pdfplumber>=0.10; extra == 'all'
62
+ Requires-Dist: pymupdf>=1.23; extra == 'all'
63
+ Requires-Dist: python-docx>=1.1; extra == 'all'
64
+ Requires-Dist: python-pptx>=0.6.21; extra == 'all'
65
+ Requires-Dist: striprtf>=0.0.26; extra == 'all'
66
+ Requires-Dist: torch<3.0,>=2.1; extra == 'all'
67
+ Requires-Dist: transformers<5.0,>=4.45; extra == 'all'
68
+ Requires-Dist: transformers<5.0,>=4.49; extra == 'all'
69
+ Provides-Extra: azure
70
+ Requires-Dist: azure-identity<2.0,>=1.15; extra == 'azure'
71
+ Requires-Dist: azure-storage-blob<13.0,>=12.19; extra == 'azure'
72
+ Requires-Dist: openai<2.0,>=1.57.0; extra == 'azure'
73
+ Provides-Extra: dev
74
+ Requires-Dist: build>=1.2; extra == 'dev'
75
+ Requires-Dist: mkdocs-include-markdown-plugin>=6.0; extra == 'dev'
76
+ Requires-Dist: mkdocs-material>=9.5; extra == 'dev'
77
+ Requires-Dist: pytest-cov>=5.0; extra == 'dev'
78
+ Requires-Dist: pytest>=7.4; extra == 'dev'
79
+ Requires-Dist: ruff>=0.4; extra == 'dev'
80
+ Requires-Dist: twine>=5.0; extra == 'dev'
81
+ Provides-Extra: docx
82
+ Requires-Dist: python-docx>=1.1; extra == 'docx'
83
+ Provides-Extra: epub
84
+ Requires-Dist: beautifulsoup4>=4.12; extra == 'epub'
85
+ Requires-Dist: ebooklib>=0.18; extra == 'epub'
86
+ Provides-Extra: html
87
+ Requires-Dist: beautifulsoup4>=4.12; extra == 'html'
88
+ Provides-Extra: imaging
89
+ Requires-Dist: imagecodecs>=2023.1.23; extra == 'imaging'
90
+ Provides-Extra: llama
91
+ Requires-Dist: accelerate<2.0,>=0.27; extra == 'llama'
92
+ Requires-Dist: torch<3.0,>=2.1; extra == 'llama'
93
+ Requires-Dist: transformers<5.0,>=4.45; extra == 'llama'
94
+ Provides-Extra: openai
95
+ Requires-Dist: openai<2.0,>=1.57.0; extra == 'openai'
96
+ Provides-Extra: pdf
97
+ Requires-Dist: pdfplumber>=0.10; extra == 'pdf'
98
+ Requires-Dist: pymupdf>=1.23; extra == 'pdf'
99
+ Provides-Extra: pptx
100
+ Requires-Dist: python-pptx>=0.6.21; extra == 'pptx'
101
+ Provides-Extra: qwen2vl
102
+ Requires-Dist: accelerate<2.0,>=0.27; extra == 'qwen2vl'
103
+ Requires-Dist: torch<3.0,>=2.1; extra == 'qwen2vl'
104
+ Requires-Dist: transformers<5.0,>=4.49; extra == 'qwen2vl'
105
+ Provides-Extra: rtf
106
+ Requires-Dist: striprtf>=0.0.26; extra == 'rtf'
107
+ Provides-Extra: smolvlm
108
+ Requires-Dist: torch<3.0,>=2.1; extra == 'smolvlm'
109
+ Requires-Dist: transformers<5.0,>=4.49; extra == 'smolvlm'
110
+ Provides-Extra: xlsx
111
+ Requires-Dist: openpyxl>=3.1; extra == 'xlsx'
112
+ Description-Content-Type: text/markdown
113
+
114
+ # multixtract
115
+
116
+ Vendor-neutral document extraction for search & RAG. Pull **text, tables, and images** out of PDFs, Word, PowerPoint, and Excel/CSV files, let any **vision model** describe the images, **chunk** everything into bite-size pieces, **embed** them, and store the result anywhere.
117
+
118
+ The core is tiny (just `Pillow` + `ImageHash`). Every **format parser** and every **cloud SDK** is an **optional extra** — install only what you need and plug in OpenAI, Azure OpenAI, a local model, Azure Blob, S3, or local disk.
119
+
120
+ ## Install
121
+
122
+ ```bash
123
+ pip install multixtract # core only — framework + image filters
124
+ ```
125
+
126
+ ### Format extractors
127
+
128
+ Install the formats you need (each lazy-loads its parser; calling an extractor without its extra raises a clear `pip install` hint):
129
+
130
+ | Extra | Formats | Pulls in |
131
+ |---|---|---|
132
+ | `[pdf]` | `.pdf` | PyMuPDF, pdfplumber |
133
+ | `[docx]` | `.docx` (+ legacy `.doc`\*) | python-docx |
134
+ | `[pptx]` | `.pptx` (+ legacy `.ppt`\*) | python-pptx |
135
+ | `[xlsx]` | `.xlsx`, `.xlsm`, `.csv` | openpyxl |
136
+ | `[imaging]` | decode `.wdp` / JPEG-XR images embedded in pptx/xlsx | imagecodecs |
137
+
138
+ ```bash
139
+ pip install "multixtract[pdf]" # just PDFs
140
+ pip install "multixtract[pdf,docx,pptx,xlsx]" # all document formats
141
+ ```
142
+
143
+ \* Legacy `.doc` / `.ppt` are converted via a system **LibreOffice** install (headless) then parsed natively (`.doc`→docx, `.ppt`→pptx). EMF/WMF/SVG vector images also require LibreOffice.
144
+
145
+ ### Providers
146
+
147
+ | Extra | Adds |
148
+ |---|---|
149
+ | `[openai]` | OpenAI vision & embeddings |
150
+ | `[azure]` | Azure OpenAI + Azure Blob Storage |
151
+ | `[qwen2vl]` | **Qwen2.5-VL** — recommended local vision model (leads 7B class on DocVQA/ChartQA; GPU 16–24 GB recommended) |
152
+ | `[smolvlm]` | **SmolVLM 2.2B** — CPU-friendly local vision model, better accuracy than Moondream |
153
+ | `[llama]` | **Llama 3.2 Vision** — strong free alternative (11B; GPU 16 GB recommended) |
154
+ | `[all]` | all formats + imaging + all providers |
155
+
156
+ ```bash
157
+ pip install "multixtract[openai]" # + OpenAI vision & embeddings
158
+ pip install "multixtract[azure]" # + Azure OpenAI & Azure Blob Storage
159
+ pip install "multixtract[qwen2vl]" # + Qwen2.5-VL local vision (GPU recommended)
160
+ pip install "multixtract[smolvlm]" # + SmolVLM 2.2B local vision (CPU-friendly)
161
+ pip install "multixtract[all]" # everything
162
+ ```
163
+
164
+ ## Quick start
165
+
166
+ ```python
167
+ from multixtract import Pipeline
168
+ from multixtract.providers import OpenAIVisionModel, OpenAIEmbedder
169
+ from multixtract.providers.storage import LocalDiskStore
170
+
171
+ pipeline = Pipeline(
172
+ vision=OpenAIVisionModel(api_key="sk-...", model="gpt-4o"),
173
+ embedder=OpenAIEmbedder(api_key="sk-...", model="text-embedding-3-large", dim=1024),
174
+ store=LocalDiskStore("./output_folder"),
175
+ )
176
+
177
+ result = pipeline.process("report.pdf") # also .docx / .pptx / .xlsx / .csv
178
+ print(result.document) # {metadata, pgs:[{txt, tables, imgs:[...]}]}
179
+ print(result.chunks) # [{chunk_id, chunk_type, content, embedding, ...}]
180
+ ```
181
+
182
+ ## Recipes — use only the parts you need
183
+
184
+ Extraction, vision (OCR/description), chunking, and embedding are fully **decoupled**. Call only the steps you want — no `Pipeline` required.
185
+
186
+ ### Extract only — no chunking, no embedding
187
+
188
+ ```python
189
+ from multixtract import extract_document # needs multixtract[pdf]
190
+
191
+ document, images = extract_document("report.pdf") # .docx / .pptx / .xlsx / .csv too
192
+
193
+ for page in document["pgs"]:
194
+ print(f"--- page {page['pg_num']} ---")
195
+ print(page["txt"]) # plain text
196
+ for table in page["tables"]: # each table is a list of row-lists
197
+ print(table)
198
+
199
+ # `images` = filtered, de-duplicated images ready for analysis.
200
+ # NOTE: no vision model was called — these are raw image bytes + metadata.
201
+ for img in images:
202
+ print(img["image_id"], img["page_number"], img["width"], "x", img["height"])
203
+ ```
204
+
205
+ No API keys, no cloud SDKs, no `chunk_document` — just text, tables, and the filtered image bytes.
206
+
207
+ ### Extract + chunk, but don't embed
208
+
209
+ ```python
210
+ from multixtract import extract_document, chunk_document
211
+
212
+ document, _ = extract_document("timetable.pdf")
213
+ chunks = chunk_document(document, base_name="timetable") # each chunk has embedding=None
214
+ ```
215
+
216
+ ### OCR images with a vision model — no embedding
217
+
218
+ OCR text comes from a `VisionModel` (e.g. GPT-4o vision), which also returns a caption and a longer description. Run it directly on the filtered images and skip the embedder/chunker entirely.
219
+
220
+ ```python
221
+ from multixtract import extract_document
222
+ from multixtract.providers import OpenAIVisionModel # needs multixtract[openai]
223
+
224
+ vision = OpenAIVisionModel(api_key="sk-...", model="gpt-4o")
225
+
226
+ document, images = extract_document("scanned.pdf") # needs multixtract[pdf]
227
+ for img in images:
228
+ result = vision.analyze(
229
+ image_bytes=img["image_bytes"],
230
+ ext=img["ext"],
231
+ width=img["width"],
232
+ height=img["height"],
233
+ )
234
+ print(img["image_id"], "| OCR:", result.ocr_text)
235
+ print(" caption:", result.caption)
236
+ print(" description:", result.description)
237
+ ```
238
+
239
+ On **Azure OpenAI**, swap in the Azure provider (`multixtract[azure]`) and pass your endpoint + deployment. Keep secrets out of code — inject them via environment variables or a secrets manager:
240
+
241
+ ```python
242
+ from multixtract.providers import AzureOpenAIVisionModel
243
+
244
+ vision = AzureOpenAIVisionModel(
245
+ endpoint="https://<resource>.openai.azure.com",
246
+ api_key=AZURE_OPENAI_KEY, # injected, never hard-coded
247
+ deployment="gpt-4o",
248
+ )
249
+ # vision.analyze(...) exactly as above
250
+ ```
251
+
252
+ ### Bring your own OCR — fully offline (no cloud)
253
+
254
+ A `VisionModel` is just any object with an `analyze()` method (structural typing — no subclassing or cloud SDK needed). Here's a zero-cloud one backed by [Tesseract](https://github.com/tesseract-ocr/tesseract) (`pip install pytesseract`, plus a system `tesseract` binary):
255
+
256
+ ```python
257
+ import io
258
+ import pytesseract
259
+ from PIL import Image
260
+ from multixtract import extract_document
261
+ from multixtract.interfaces import VisionResult
262
+
263
+ class TesseractVisionModel:
264
+ """Offline OCR-only VisionModel — no network, no API key."""
265
+ def analyze(self, image_bytes, ext="png", width=0, height=0) -> VisionResult:
266
+ try:
267
+ text = pytesseract.image_to_string(Image.open(io.BytesIO(image_bytes)))
268
+ except Exception:
269
+ return VisionResult() # never break the caller
270
+ return VisionResult(ocr_text=text.strip())
271
+
272
+ vision = TesseractVisionModel()
273
+ document, images = extract_document("scanned.pdf") # needs multixtract[pdf]
274
+ for img in images:
275
+ print(img["image_id"], "| OCR:", vision.analyze(img["image_bytes"], img["ext"]).ocr_text)
276
+ ```
277
+
278
+ Because it satisfies the same `VisionModel` interface as the cloud providers, you can also drop it straight into the full pipeline — `Pipeline(vision=TesseractVisionModel(), embedder=..., store=...)` — for offline OCR end-to-end.
279
+
280
+ ### Local vision models — offline, no API key
281
+
282
+ Three local model options are available. All return the same `VisionResult` structure and work as drop-in replacements for the cloud providers.
283
+
284
+ #### Qwen2.5-VL (recommended)
285
+
286
+ Best accuracy for document images — leads the 7B class on DocVQA, ChartQA, TextVQA, and OCR benchmarks as of 2025. Requires a GPU with 16–24 GB VRAM for BF16; use the 3B variant or `load_in_4bit=True` for smaller cards.
287
+
288
+ ```bash
289
+ pip install "multixtract[qwen2vl]"
290
+ ```
291
+
292
+ ```python
293
+ from multixtract import extract_document
294
+ from multixtract.providers import Qwen2VLVisionModel
295
+
296
+ # Default: 7B. Use "Qwen/Qwen2.5-VL-3B-Instruct" for lower VRAM.
297
+ vision = Qwen2VLVisionModel()
298
+ document, images = extract_document("report.pdf")
299
+ for img in images:
300
+ r = vision.analyze(img["image_bytes"], ext=img["ext"])
301
+ print(r.caption, "|", r.description)
302
+
303
+ # Drop into the full pipeline:
304
+ Pipeline(vision=Qwen2VLVisionModel(), embedder=my_embedder, store=my_store).process("report.pdf")
305
+ ```
306
+
307
+ #### SmolVLM 2.2B (CPU-friendly)
308
+
309
+ At 2.2B parameters, SmolVLM runs on CPU without impractical wait times and delivers meaningfully better DocVQA and ChartQA accuracy than Moondream2. No `trust_remote_code` required. Use it when a GPU is unavailable.
310
+
311
+ ```bash
312
+ pip install "multixtract[smolvlm]"
313
+ ```
314
+
315
+ ```python
316
+ from multixtract.providers import SmolVLMVisionModel
317
+
318
+ vision = SmolVLMVisionModel() # ~4 GB download on first use
319
+ vision = SmolVLMVisionModel("HuggingFaceTB/SmolVLM-500M-Instruct") # 500M for extreme constraints
320
+ document, images = extract_document("report.pdf")
321
+ for img in images:
322
+ r = vision.analyze(img["image_bytes"], ext=img["ext"])
323
+ print(r.caption, "|", r.ocr_text)
324
+ ```
325
+
326
+ #### Llama 3.2 Vision
327
+
328
+ Strong free alternative, especially for users already in the Meta/Llama ecosystem. Requires ≥16 GB VRAM for the 11B model.
329
+
330
+ ```python
331
+ from multixtract.providers import Llama32VisionModel # pip install "multixtract[llama]"
332
+
333
+ vision = Llama32VisionModel() # 11B default
334
+ vision = Llama32VisionModel("meta-llama/Llama-3.2-90B-Vision-Instruct") # 90B, highest accuracy
335
+ vision = Llama32VisionModel(load_in_4bit=True) # 4-bit, needs bitsandbytes
336
+ ```
337
+
338
+ ## Architecture
339
+
340
+ ```
341
+ file → extract (text/tables/images) → filter images → vision describe
342
+ → chunk (text/table/image) → embed → store (JSON)
343
+ ```
344
+
345
+ The right extractor is chosen by file extension via a registry; the pipeline talks only to three **interfaces** — it never imports a vendor directly:
346
+
347
+ | Interface | Job | Built-in implementations |
348
+ |---|---|---|
349
+ | `VisionModel` | image → caption + OCR + description | `OpenAIVisionModel`, `AzureOpenAIVisionModel`, `Llama32VisionModel` |
350
+ | `Embedder` | text → vector | `OpenAIEmbedder`, `AzureOpenAIEmbedder` |
351
+ | `BlobStore` | save bytes/JSON | `LocalDiskStore`, `AzureBlobStore` |
352
+
353
+ Write your own by implementing the same methods (e.g. a local vision model, a sentence-transformers embedder, or an S3 store). Add a new format by implementing `DocumentExtractor` and calling `register_extractor`.
354
+
355
+ ## Features
356
+
357
+ * **Multi-format**: PDF, Word, PowerPoint, Excel/CSV (+ legacy `.doc`/`.ppt` via LibreOffice)
358
+ * Cross-page image **deduplication** via xref tracking
359
+ * **Image filters**: solid-color / tiny-icon / dimension / reference-logo (perceptual hash)
360
+ * **Sliding-window** text chunking (~500 tokens, ~50 overlap) at sentence boundaries
361
+ * Tables serialized to **Markdown**; images embedded once and reused
362
+ * **Parallel** vision calls, **batched** embeddings
363
+
364
+ ## Development
365
+
366
+ ```bash
367
+ pip install -e ".[dev,pdf,docx,pptx,xlsx]"
368
+ pytest
369
+ ruff check src tests
370
+ ```
371
+
372
+ ## Troubleshooting
373
+
374
+ **LibreOffice not found / vector images skipped**
375
+ EMF, WMF, and SVG images embedded in PPTX/XLSX are converted via LibreOffice.
376
+ Install it system-wide (`apt install libreoffice` / `brew install libreoffice` /
377
+ [libreoffice.org](https://www.libreoffice.org/download/download/)) and ensure
378
+ `soffice` is on `PATH`. Without it, vector images are silently skipped; other
379
+ image types are unaffected.
380
+
381
+ **`.doc` / `.ppt` legacy files not extracted**
382
+ Legacy binary formats require LibreOffice for conversion to DOCX/PPTX before
383
+ extraction. The same `soffice` dependency applies.
384
+
385
+ **`transformers` / `torch` import errors or CUDA failures**
386
+ Local vision models (Qwen2.5-VL, Llama 3.2 Vision, SmolVLM) require a compatible
387
+ `torch` + CUDA environment. Confirm with:
388
+ ```python
389
+ import torch; print(torch.cuda.is_available(), torch.version.cuda)
390
+ ```
391
+ If CUDA is unavailable, SmolVLM (`[smolvlm]`) is the recommended model that runs
392
+ on CPU at practical speeds. Qwen2.5-VL and Llama 3.2 Vision require a GPU with ≥16 GB
393
+ VRAM in BF16; use `load_in_4bit=True` for smaller cards.
394
+
395
+ **`pip install multixtract[qwen2vl]` takes a long time**
396
+ `torch` is a large package (~2 GB). Pull a GPU-specific wheel with:
397
+ ```bash
398
+ pip install "multixtract[qwen2vl]" --extra-index-url https://download.pytorch.org/whl/cu121
399
+ ```
400
+ Replace `cu121` with your CUDA version (`cu118`, `cu124`, etc.).
401
+
402
+ **Azure `DefaultAzureCredential` fails locally**
403
+ `DefaultAzureCredential` tries several auth paths in order. For local dev the
404
+ easiest is `az login` (Azure CLI). For managed identity in production, ensure
405
+ the compute resource has an assigned identity and the necessary role on the
406
+ target resource.
407
+
408
+
409
+ **PyMuPDF / pdfplumber version conflicts**
410
+ If you see `ImportError` from `fitz`, ensure `PyMuPDF>=1.23` is installed.
411
+ `pdfplumber` and `PyMuPDF` can coexist; both are required for the `[pdf]` extra.
412
+
413
+ ## Acknowledgements
414
+
415
+ Built with assistance from [Claude](https://claude.ai) (Anthropic) for code review, bug analysis, and quality improvements.
416
+
417
+ ## License
418
+
419
+ MIT — see `LICENSE`.
@@ -0,0 +1,37 @@
1
+ multixtract/__init__.py,sha256=A1Eh7-tcRbnHB4-U_M7IlcY0gExiXAfCb5QmGROjekI,1471
2
+ multixtract/chunking.py,sha256=kv0b_tMgj_MTGi2Bi4TNE39SkUMqFpzlA-FTDGPbWXE,11964
3
+ multixtract/cli.py,sha256=1IFtbbrE4G6K1Ry7rxNmPswgQlOqn5CRWHtn0hMyogU,2808
4
+ multixtract/extraction.py,sha256=rFbGTUCVb2cW1aoSKBhbMKcbzgDVAKuh4_ToLavlbdM,1941
5
+ multixtract/filters.py,sha256=kjlt0UCTWvgRe4AZbnzd8hOd_XQUnpV-7WxIEUY4I0Q,6474
6
+ multixtract/interfaces.py,sha256=44g-SYB9q8YoeKJ-Pveem9TrR32PvKEqoA12AZ90MFk,4814
7
+ multixtract/pipeline.py,sha256=a7lmaljjutnOuggT_J8E57eFv_qAoVCZtYW82qklEr0,10070
8
+ multixtract/py.typed,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
9
+ multixtract/vision.py,sha256=C7lTJ7C3AJFPtah4T83MYcJCkq4mf0m-5d8fsWX3Zww,5088
10
+ multixtract/extractors/__init__.py,sha256=8t2qgZCsfKAN1MXJ91i7aUuQZlDrpQNNomSdBi_E5j4,2842
11
+ multixtract/extractors/_image_utils.py,sha256=AzHiuLR2FVtR5yE58UENJVE80l-FnETZtYwvxuaOtME,5816
12
+ multixtract/extractors/docx.py,sha256=L4DwnxMqYR2ZMP3RJCLT9uBI2XYQa2YKwjiu002bKjo,15434
13
+ multixtract/extractors/eml.py,sha256=cTNsPXqBxsZrrLgtNknob4vKbmhDLYxaICnvJsVSdlg,6285
14
+ multixtract/extractors/epub.py,sha256=O7zBD4r2WP9VR2u90ILwgfbQDezFHZXsDKzjg3bRjEM,5485
15
+ multixtract/extractors/excel.py,sha256=0jxlDPPmTdLwBg_AmVDxvfm7buMVyni-xtrPs0Z4sv8,13115
16
+ multixtract/extractors/html.py,sha256=GKjAD4cUIi2DPobXRC7v-3m46d7neaON_9aym01WRxo,4068
17
+ multixtract/extractors/image.py,sha256=ma9UNAe1ivKK82-8RlqPxetMDPi4LLSx_jlYThqS020,4843
18
+ multixtract/extractors/legacy.py,sha256=oSjn9lBKMMKlKOQFM2_Rhrwia0FL70_RalJfwAkxCy4,6386
19
+ multixtract/extractors/markdown.py,sha256=W1H-IGV2REKCio0DVxTX6K7G5zpc66sNtfcIJpKqLmM,3504
20
+ multixtract/extractors/pdf.py,sha256=vTMY4fJMOATNn_dExEA8jlrvBPEGoU_Cj2XsPhlZEd8,14781
21
+ multixtract/extractors/pptx.py,sha256=M4YmFEqYDCCxTa3Q2H63ufLdZ3sCaCEtZhfvrBOWcDg,12603
22
+ multixtract/extractors/registry.py,sha256=Rk0aYTxvxfFeTVgqKCVggblHwh_vhDmhsAh5cCPpVHg,2594
23
+ multixtract/extractors/rtf.py,sha256=QXBF-Yi71wTjKxuDJySkKnvcK4XVT8qPmgjFmFI_AgE,1585
24
+ multixtract/extractors/text.py,sha256=rmPdZcTQSsZ8EjlKEzWhr1ffz4P36gZ2mYbarSP5JV0,1662
25
+ multixtract/providers/__init__.py,sha256=eDSWrhpxVtMPS1GUjliuYuSq8xUzMR9xxYCzG1cO4d4,1464
26
+ multixtract/providers/_utils.py,sha256=6RYyBQRSTlp0luujYfRlIkGJ0ZylT4QPcTvv_2fzCkQ,773
27
+ multixtract/providers/azure.py,sha256=rCEexnS_KGmPUuF7RhUfLg__i70DQS4rBzF_ZI5aBMc,3090
28
+ multixtract/providers/llama.py,sha256=1hqd552UkUAZP42NQjEGgZ5qs0V6ptxM4msc8bDe2EY,6167
29
+ multixtract/providers/openai.py,sha256=nXch8vCtWBSTM__y0Larpds1spfy3J_DWay242ifmzw,4737
30
+ multixtract/providers/qwen2vl.py,sha256=M3sE14mKnOM62_7l_c5Z0n--cm7mbFJE50r94jWYVGo,6316
31
+ multixtract/providers/smolvlm.py,sha256=x0Dzd8KIHPzD0Ha9Ljh2qG3mJ-znikvktoO81Wqxgb0,5999
32
+ multixtract/providers/storage.py,sha256=wBC7-hS_AZfD3MoL4TSBfHdEY7_rnW_8s-OX17weQ5c,3391
33
+ multixtract-0.1.1.dist-info/METADATA,sha256=cuuA1YQ31ktqY29jccuX63fHwZdXUX7MYTfdJIUZM64,18133
34
+ multixtract-0.1.1.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
35
+ multixtract-0.1.1.dist-info/entry_points.txt,sha256=daxPU7Z90YIdpugnnQlb3VsjLKqZpB4T6QeuuWVePdA,53
36
+ multixtract-0.1.1.dist-info/licenses/LICENSE,sha256=dHP9u9d5c8cq_yqgOE2bHicroMaCvXPhgUcJfq1pjcc,1075
37
+ multixtract-0.1.1.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.31.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ multixtract = multixtract.cli:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Namrata Srivastava
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.