<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Dibi8</title>
    <description>The latest articles on DEV Community by Dibi8 (@dibi8).</description>
    <link>https://dev.to/dibi8</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3838863%2Fccb31c3b-ae24-43fc-ade1-53b569db8640.jpg</url>
      <title>DEV Community: Dibi8</title>
      <link>https://dev.to/dibi8</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dibi8"/>
    <language>en</language>
    <item>
      <title>Best AI Voice Tools 2025</title>
      <dc:creator>Dibi8</dc:creator>
      <pubDate>Mon, 06 Jul 2026 17:30:25 +0000</pubDate>
      <link>https://dev.to/dibi8/best-ai-voice-tools-2025-4a9h</link>
      <guid>https://dev.to/dibi8/best-ai-voice-tools-2025-4a9h</guid>
      <description>&lt;p&gt;Open-source AI ecosystem keeps shipping interesting things. Today's pick:&lt;/p&gt;

&lt;h2&gt;
  
  
  Best AI Voice Tools 2025
&lt;/h2&gt;

&lt;p&gt;Compare the best AI voice tools of 2025 for text-to-speech and transcription. ElevenLabs, Murf.ai, Whisper, Otter.ai, and more with pricing, accuracy, and use cases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read the full breakdown on dibi8:&lt;/strong&gt; &lt;a href="https://dibi8.com/resources/ai-tools/ai-voice-tools-text-to-speech-transcription/" rel="noopener noreferrer"&gt;https://dibi8.com/resources/ai-tools/ai-voice-tools-text-to-speech-transcription/&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;This is a curated highlight from &lt;a href="https://dibi8.com" rel="noopener noreferrer"&gt;dibi8.com&lt;/a&gt; — open-source AI tools directory, hand-edited, 4 languages. The full article (with comparisons, setup guide, and code samples) lives on dibi8.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Knowledge Work Plugins</title>
      <dc:creator>Dibi8</dc:creator>
      <pubDate>Mon, 06 Jul 2026 11:18:36 +0000</pubDate>
      <link>https://dev.to/dibi8/knowledge-work-plugins-mik</link>
      <guid>https://dev.to/dibi8/knowledge-work-plugins-mik</guid>
      <description>&lt;p&gt;Found this in the open-source AI tooling space — worth a look:&lt;/p&gt;

&lt;h2&gt;
  
  
  Knowledge Work Plugins
&lt;/h2&gt;

&lt;p&gt;Knowledge Work Plugins (20,728 stars) by Anthropic extends Claude with powerful tools for document editing, code analysis, web browsing, and file operations. Build custom plugins for your workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read the full breakdown on dibi8:&lt;/strong&gt; &lt;a href="https://dibi8.com/resources/ai-tools/knowledge-work-plugins/" rel="noopener noreferrer"&gt;https://dibi8.com/resources/ai-tools/knowledge-work-plugins/&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;This is a curated highlight from &lt;a href="https://dibi8.com" rel="noopener noreferrer"&gt;dibi8.com&lt;/a&gt; — open-source AI tools directory, hand-edited, 4 languages. The full article (with comparisons, setup guide, and code samples) lives on dibi8.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Codebase-Memory-MCP: High-Performance Code Intelligence for AI</title>
      <dc:creator>Dibi8</dc:creator>
      <pubDate>Mon, 06 Jul 2026 05:52:06 +0000</pubDate>
      <link>https://dev.to/dibi8/codebase-memory-mcp-high-performance-code-intelligence-for-ai-1n3h</link>
      <guid>https://dev.to/dibi8/codebase-memory-mcp-high-performance-code-intelligence-for-ai-1n3h</guid>
      <description>&lt;p&gt;Found this in the open-source AI tooling space — worth a look:&lt;/p&gt;

&lt;h2&gt;
  
  
  Codebase-Memory-MCP: High-Performance Code Intelligence for AI
&lt;/h2&gt;

&lt;p&gt;Deep dive into codebase-memory-mcp â€” the fastest code intelligence MCP server that indexes entire repositories in milliseconds. Full installation guide, comparison with alternatives, and real-world&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read the full breakdown on dibi8:&lt;/strong&gt; &lt;a href="https://dibi8.com/resources/dev-utils/codebase-memory-mcp-high-performance-code-intelligence/" rel="noopener noreferrer"&gt;https://dibi8.com/resources/dev-utils/codebase-memory-mcp-high-performance-code-intelligence/&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;This is a curated highlight from &lt;a href="https://dibi8.com" rel="noopener noreferrer"&gt;dibi8.com&lt;/a&gt; — open-source AI tools directory, hand-edited, 4 languages. The full article (with comparisons, setup guide, and code samples) lives on dibi8.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
    </item>
    <item>
      <title>LlamaIndex: 49K+ Stars â Production RAG Deployment Guide 2026</title>
      <dc:creator>Dibi8</dc:creator>
      <pubDate>Sun, 05 Jul 2026 15:57:37 +0000</pubDate>
      <link>https://dev.to/dibi8/llamaindex-49k-stars-a-production-rag-deployment-guide-2026-15o2</link>
      <guid>https://dev.to/dibi8/llamaindex-49k-stars-a-production-rag-deployment-guide-2026-15o2</guid>
      <description>&lt;p&gt;Curated find from dibi8.com — open-source, production-relevant:&lt;/p&gt;

&lt;h2&gt;
  
  
  LlamaIndex: 49K+ Stars â€” Production RAG Deployment Guide 2026
&lt;/h2&gt;

&lt;p&gt;LlamaIndex is a data framework for building production RAG systems with LLMs. Supports OpenAI, Anthropic, Ollama, Qdrant, Weaviate, Chroma. Covers Docker deployment, query engines, agents, and&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read the full breakdown on dibi8:&lt;/strong&gt; &lt;a href="https://dibi8.com/resources/llm-frameworks/llamaindex/" rel="noopener noreferrer"&gt;https://dibi8.com/resources/llm-frameworks/llamaindex/&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;This is a curated highlight from &lt;a href="https://dibi8.com" rel="noopener noreferrer"&gt;dibi8.com&lt;/a&gt; — open-source AI tools directory, hand-edited, 4 languages. The full article (with comparisons, setup guide, and code samples) lives on dibi8.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
    </item>
    <item>
      <title>This Week in Open-Source AI Agents â Top Trending GitHub Repos (Week of May 25, 2026)</title>
      <dc:creator>Dibi8</dc:creator>
      <pubDate>Sun, 05 Jul 2026 11:19:01 +0000</pubDate>
      <link>https://dev.to/dibi8/this-week-in-open-source-ai-agents-a-top-trending-github-repos-week-of-may-25-2026-3p6j</link>
      <guid>https://dev.to/dibi8/this-week-in-open-source-ai-agents-a-top-trending-github-repos-week-of-may-25-2026-3p6j</guid>
      <description>&lt;p&gt;Sharing an open-source tool I came across in the dibi8 directory:&lt;/p&gt;

&lt;h2&gt;
  
  
  This Week in Open-Source AI Agents â€” Top Trending GitHub Repos (Week of May 25, 2026)
&lt;/h2&gt;

&lt;p&gt;Hand-edited weekly roundup of top trending open-source AI agent, LLM, and MCP projects on GitHub â€” data auto-collected by Dibi8 Tribe Intel, analysis by Dibi8 editorial team.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read the full breakdown on dibi8:&lt;/strong&gt; &lt;a href="https://dibi8.com/resources/llm-frameworks/this-week-ai-agents-2026-w21/" rel="noopener noreferrer"&gt;https://dibi8.com/resources/llm-frameworks/this-week-ai-agents-2026-w21/&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;This is a curated highlight from &lt;a href="https://dibi8.com" rel="noopener noreferrer"&gt;dibi8.com&lt;/a&gt; — open-source AI tools directory, hand-edited, 4 languages. The full article (with comparisons, setup guide, and code samples) lives on dibi8.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
    </item>
    <item>
      <title>AI Agent Memory Persistence 2026</title>
      <dc:creator>Dibi8</dc:creator>
      <pubDate>Sun, 05 Jul 2026 05:23:27 +0000</pubDate>
      <link>https://dev.to/dibi8/ai-agent-memory-persistence-2026-12h0</link>
      <guid>https://dev.to/dibi8/ai-agent-memory-persistence-2026-12h0</guid>
      <description>&lt;p&gt;Open-source AI ecosystem keeps shipping interesting things. Today's pick:&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Agent Memory Persistence 2026
&lt;/h2&gt;

&lt;p&gt;Agents without persistent memory restart from zero every session. Tested Letta, Mem0, A-MEM on the same multi-session workload: which actually retains context, which costs less, when to roll your own.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read the full breakdown on dibi8:&lt;/strong&gt; &lt;a href="https://dibi8.com/resources/llm-frameworks/ai-agent-memory-persistence-letta-mem0-a-mem-2026/" rel="noopener noreferrer"&gt;https://dibi8.com/resources/llm-frameworks/ai-agent-memory-persistence-letta-mem0-a-mem-2026/&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;This is a curated highlight from &lt;a href="https://dibi8.com" rel="noopener noreferrer"&gt;dibi8.com&lt;/a&gt; — open-source AI tools directory, hand-edited, 4 languages. The full article (with comparisons, setup guide, and code samples) lives on dibi8.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Unsloth 2026: 64.9k-Star Fast LLM Fine-Tuning</title>
      <dc:creator>Dibi8</dc:creator>
      <pubDate>Sun, 05 Jul 2026 01:00:05 +0000</pubDate>
      <link>https://dev.to/dibi8/unsloth-2026-649k-star-fast-llm-fine-tuning-302d</link>
      <guid>https://dev.to/dibi8/unsloth-2026-649k-star-fast-llm-fine-tuning-302d</guid>
      <description>&lt;p&gt;If &lt;a href="https://dibi8.com/resources/llm-frameworks/axolotl-llm-fine-tuning-framework-2026/" rel="noopener noreferrer"&gt;Axolotl&lt;/a&gt; is the production multi-GPU fine-tuning framework, &lt;strong&gt;Unsloth&lt;/strong&gt; is the single-GPU speed king. By rewriting the LLM training kernels in custom Triton + Python instead of relying on PyTorch's generic autograd, Unsloth fine-tunes models &lt;strong&gt;2× faster&lt;/strong&gt; with &lt;strong&gt;70% less VRAM&lt;/strong&gt; than HuggingFace TRL baselines.&lt;/p&gt;

&lt;p&gt;64.9k GitHub stars, dual Apache 2.0 / AGPL-3.0 license. Supports 500+ models (Llama 3-3.2, Mistral, Qwen 3-3.6, Gemma, DeepSeek, Phi-4, gpt-oss). The default fine-tuning tool when you have a single 24 GB consumer GPU and need to iterate fast.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdibi8.com%2Fimages%2Farticles%2Funsloth-fast-llm-fine-tuning-2026%2Fcover.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdibi8.com%2Fimages%2Farticles%2Funsloth-fast-llm-fine-tuning-2026%2Fcover.jpg" alt="Unsloth 2026: 64.9k-Star Fast LLM Fine-Tuning — 2× Speed, 70% Less VRAM, Single-GPU Friendly — dibi8.com" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What&lt;/strong&gt;: Fast single-GPU LLM fine-tuning library&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: 64.9k stars&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License&lt;/strong&gt;: Dual Apache 2.0 + AGPL-3.0 (Apache for SaaS-friendly use; AGPL kicks in for derivative redistribution)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed&lt;/strong&gt;: 2× faster training, 70% less VRAM vs HF TRL baseline (some methods up to 80% VRAM reduction)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Models&lt;/strong&gt;: Llama 3-3.2, Mistral, Qwen 3-3.6, Gemma 1-4, DeepSeek, gpt-oss, Phi-4&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Methods&lt;/strong&gt;: Full / LoRA / QLoRA / DPO / GRPO / FP8 training / pretraining&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardware&lt;/strong&gt;: NVIDIA (RTX 30/40/50 series), AMD limited, Apple Silicon inference, CPU inference only&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Why Unsloth's 2× Speed Is Real (and not marketing fluff)
&lt;/h2&gt;

&lt;p&gt;Most "speedup" claims in ML are gimmicks (benchmark cherry-picked, etc.). Unsloth's is real and shows up in your training logs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Custom Triton kernels&lt;/strong&gt; for the matmul + softmax fused operations that dominate training time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manual gradient computation&lt;/strong&gt; (no PyTorch autograd overhead per step)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory-efficient attention&lt;/strong&gt; with smarter activation checkpointing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;4-bit / 8-bit fast paths&lt;/strong&gt; that maintain accuracy but skip dequantization&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The combined effect: Llama 3 8B QLoRA fine-tuning on RTX 3090 — HF TRL ~3.5 hr / 16 GB VRAM. Unsloth ~1.5 hr / 5 GB VRAM. Same dataset, same hyperparams, same final eval scores.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Hardware Reality
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;GPU&lt;/th&gt;
&lt;th&gt;Model size you can QLoRA-finetune (with Unsloth's 70% VRAM reduction)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;8 GB (RTX 3060 8GB)&lt;/td&gt;
&lt;td&gt;Llama 3.2 3B QLoRA, Phi-4 mini&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12 GB (RTX 3060 12GB / 4070)&lt;/td&gt;
&lt;td&gt;Llama 3.2 8B QLoRA, Mistral 7B QLoRA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24 GB (RTX 3090 / 4090)&lt;/td&gt;
&lt;td&gt;Llama 3.3 70B QLoRA (yes, on a single 4090!)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;48 GB (A6000)&lt;/td&gt;
&lt;td&gt;Llama 3.3 70B LoRA, Mixtral QLoRA&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is the "fine-tune on consumer hardware" story. Llama 70B QLoRA on a $1500 RTX 4090 was impossible with HF TRL — Unsloth makes it routine.&lt;/p&gt;

&lt;p&gt;For cloud rentals: H100 on Vast.ai (~$1.50/hr) handles anything; for cheaper experiments, RTX 4090 instances at $0.40-0.60/hr work fine on a &lt;a href="https://m.do.co/c/eca87ac14ee0" rel="noopener noreferrer"&gt;DigitalOcean GPU droplet&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Quick Install (5 min)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;unsloth
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hello world — QLoRA fine-tune Llama 3.2 8B in ~20 lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;unsloth&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastLanguageModel&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;trl&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SFTTrainer&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datasets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_dataset&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tokenizer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FastLanguageModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_pretrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;unsloth/llama-3.2-8b-bnb-4bit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_seq_length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2048&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;load_in_4bit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FastLanguageModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_peft_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lora_alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target_modules&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;all-linear&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;dataset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;load_dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tatsu-lab/alpaca&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;train&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;trainer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SFTTrainer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tokenizer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tokenizer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;train_dataset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;dataset_text_field&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_seq_length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2048&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;num_train_epochs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;per_device_train_batch_size&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;trainer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;train&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save_pretrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./outputs/llama-alpaca-lora&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Same model, same data — running with Unsloth-optimized kernels.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The Pre-Quantized Model Catalog
&lt;/h2&gt;

&lt;p&gt;Unsloth maintains pre-quantized 4-bit / 8-bit versions of popular models at &lt;code&gt;huggingface.co/unsloth&lt;/code&gt;. Using these saves 5-15 minutes of initial download + quantization on every fresh run:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;unsloth/llama-3.2-8b-bnb-4bit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;unsloth/mistral-7b-v0.3-bnb-4bit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;unsloth/qwen3-coder-14b-bnb-4bit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;unsloth/gemma-3-9b-bnb-4bit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;unsloth/DeepSeek-V3-bnb-4bit&lt;/code&gt; (for the brave on 48 GB+)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Always check the Unsloth HF profile for pre-quantized versions of your target model before downloading from the original publisher.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. GRPO — Fast Reinforcement Learning Fine-Tuning
&lt;/h2&gt;

&lt;p&gt;GRPO (Group Relative Policy Optimization) is the 2026 default for RL fine-tuning (the technique behind DeepSeek-R1). Unsloth's GRPO implementation uses 80% less VRAM than HF TRL's, making GRPO feasible on a single 24 GB GPU instead of requiring a multi-GPU node.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;trl&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;GRPOConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;GRPOTrainer&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;unsloth&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastLanguageModel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PatchFastRL&lt;/span&gt;

&lt;span class="nc"&gt;PatchFastRL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GRPO&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FastLanguageModel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# ... load model with FastLanguageModel as in section 3 ...
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;reward_fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;correct&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# your reward logic
&lt;/span&gt;
&lt;span class="n"&gt;trainer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GRPOTrainer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;GRPOConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output_dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./outputs/grpo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num_train_epochs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;train_dataset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;reward_funcs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;reward_fn&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;trainer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;train&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For domain-specific reasoning (math, code, structured output), GRPO + Unsloth on a single GPU is now the most cost-efficient way to bake reasoning improvements into a base model.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Unsloth vs Axolotl vs HuggingFace TRL
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pick&lt;/th&gt;
&lt;th&gt;When&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Unsloth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Single GPU, fast iteration, RL fine-tuning, consumer hardware, prototyping&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Axolotl&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multi-GPU production, multi-node, broad method support (DPO/IPO/KTO/ORPO/GRPO/GDPO), YAML config-as-code. See &lt;a href="https://dibi8.com/resources/llm-frameworks/axolotl-llm-fine-tuning-framework-2026/" rel="noopener noreferrer"&gt;Axolotl 2026 guide&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HuggingFace TRL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Direct API access, custom RL algorithm research, you need to modify trainer internals&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Cloud platforms&lt;/strong&gt; (Together, Fireworks, OpenAI fine-tuning)&lt;/td&gt;
&lt;td&gt;Don't want to own infra, don't care about weight portability&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The honest 2026 default: &lt;strong&gt;Unsloth for the experiment phase, Axolotl for the production deploy phase&lt;/strong&gt;. Both wrap PyTorch + TRL underneath, so methods learned in Unsloth port to Axolotl.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. License Caveat (the AGPL bit)
&lt;/h2&gt;

&lt;p&gt;Unsloth is dual-licensed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Apache 2.0&lt;/strong&gt;: covers the core library usage. Safe to use in any application&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AGPL-3.0&lt;/strong&gt;: kicks in if you distribute a modified Unsloth or run it as a service that exposes Unsloth's API externally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Practical implications:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Use Unsloth to fine-tune your model, deploy that model in any product. Fine.&lt;/li&gt;
&lt;li&gt;✅ Fine-tune on a SaaS GPU you rent, take the weights to your own deployment. Fine.&lt;/li&gt;
&lt;li&gt;⚠️ Build a "fine-tuning-as-a-service" that exposes Unsloth directly. AGPL triggered — your service must be AGPL.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For 99% of users (you're fine-tuning models for your own product), Apache is what applies.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Production Patterns
&lt;/h2&gt;

&lt;p&gt;The two patterns most teams settle on:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern A — Pure Unsloth (single-GPU shop)&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rent RTX 4090 on Vast.ai → Unsloth QLoRA experiments → 
Merge LoRA + base → Push to HF Hub → Serve via vLLM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pattern B — Unsloth + Axolotl hybrid (production team)&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Unsloth on dev laptop for 50 quick experiments
↓ winner found
Axolotl on 8× H100 cluster for final long-context, multi-epoch full fine-tune
↓ production model
Push to HF Hub → Serve via vLLM behind LiteLLM gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The hybrid pattern pays for the cluster only when you have a candidate worth scaling.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. When NOT to Use Unsloth
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-node distributed training&lt;/strong&gt; — Unsloth focuses on single-GPU optimization. Axolotl handles multi-node better&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You need cutting-edge fine-tuning research methods&lt;/strong&gt; — TRL gets new methods first; Unsloth adopts after stabilization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AMD GPUs primary&lt;/strong&gt; — Unsloth's AMD support is limited (works but not optimized); use Axolotl or TRL there&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You don't actually need the speed&lt;/strong&gt; — If your job runs overnight anyway, the 2× speed doesn't matter, and HF TRL is more standardized&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Unsloth = &lt;strong&gt;single-GPU LLM fine-tuning speed king&lt;/strong&gt;. 64.9k stars, 2× faster + 70% less VRAM vs HuggingFace TRL, dual Apache/AGPL license. Llama 70B QLoRA on a single RTX 4090 is now routine.&lt;/p&gt;

&lt;p&gt;Pair with &lt;a href="https://dibi8.com/resources/llm-frameworks/axolotl-llm-fine-tuning-framework-2026/" rel="noopener noreferrer"&gt;Axolotl&lt;/a&gt; for the production multi-GPU phase. Rent a &lt;a href="https://m.do.co/c/eca87ac14ee0" rel="noopener noreferrer"&gt;GPU instance&lt;/a&gt; or use Vast.ai when you need to train.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Part of dibi8's Fine-Tuning Stack — see the upcoming Fine-Tuning Stack collection for the full pipeline from dataset prep to production deployment.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Recommended Tools
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Fine-tuning needs serious GPU. Cloud rental is often cheaper than buying.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;{{&amp;lt; aff "huwangyun" "llm-footer" "HuwangYun GPU Server" &amp;gt;}}&lt;/strong&gt; — 虎网云 offers RTX 4090 / A100 nodes in mainland China with low-latency access — cheaper than US cloud GPU for Chinese users running Unsloth fine-tuning workloads.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Affiliate link — supports dibi8.com at no extra cost to you.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  References &amp;amp; Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/unslothai/unsloth" rel="noopener noreferrer"&gt;Unsloth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/huggingface/trl" rel="noopener noreferrer"&gt;HuggingFace TRL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/axolotl-ai-cloud/axolotl" rel="noopener noreferrer"&gt;Axolotl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pytorch/pytorch" rel="noopener noreferrer"&gt;PyTorch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/triton-lang/triton" rel="noopener noreferrer"&gt;Triton&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/vllm-project/vllm" rel="noopener noreferrer"&gt;vLLM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/BerriAI/litellm" rel="noopener noreferrer"&gt;LiteLLM&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>claudecode</category>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Semgrep: The 15K-Star SAST Tool That Finds 500+ Vulnerabilities</title>
      <dc:creator>Dibi8</dc:creator>
      <pubDate>Sat, 04 Jul 2026 20:07:04 +0000</pubDate>
      <link>https://dev.to/dibi8/semgrep-the-15k-star-sast-tool-that-finds-500-vulnerabilities-5c62</link>
      <guid>https://dev.to/dibi8/semgrep-the-15k-star-sast-tool-that-finds-500-vulnerabilities-5c62</guid>
      <description>&lt;p&gt;Sharing an open-source tool I came across in the dibi8 directory:&lt;/p&gt;

&lt;h2&gt;
  
  
  Semgrep: The 15K-Star SAST Tool That Finds 500+ Vulnerabilities
&lt;/h2&gt;

&lt;p&gt;Semgrep is an open-source static analysis tool with 15K+ GitHub stars that finds 500+ vulnerability patterns in Python, JavaScript, TypeScript, Go, Java, and more. Fast, lightweight, CI/CD&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read the full breakdown on dibi8:&lt;/strong&gt; &lt;a href="https://dibi8.com/resources/dev-utils/semgrep-15k-star-sast-security-scanner/" rel="noopener noreferrer"&gt;https://dibi8.com/resources/dev-utils/semgrep-15k-star-sast-security-scanner/&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;This is a curated highlight from &lt;a href="https://dibi8.com" rel="noopener noreferrer"&gt;dibi8.com&lt;/a&gt; — open-source AI tools directory, hand-edited, 4 languages. The full article (with comparisons, setup guide, and code samples) lives on dibi8.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
    </item>
    <item>
      <title>CC Switch: The Ultimate AI Coding Agent Manager for</title>
      <dc:creator>Dibi8</dc:creator>
      <pubDate>Sat, 04 Jul 2026 10:31:35 +0000</pubDate>
      <link>https://dev.to/dibi8/cc-switch-the-ultimate-ai-coding-agent-manager-for-4ab</link>
      <guid>https://dev.to/dibi8/cc-switch-the-ultimate-ai-coding-agent-manager-for-4ab</guid>
      <description>&lt;p&gt;Sharing an open-source tool I came across in the dibi8 directory:&lt;/p&gt;

&lt;h2&gt;
  
  
  CC Switch: The Ultimate AI Coding Agent Manager for
&lt;/h2&gt;

&lt;p&gt;Complete guide to CC Switch â€” the cross-platform desktop app that manages Claude Code, Codex, Gemini CLI, OpenCode, OpenClaw, and Hermes Agent in one unified interface. Installation, configuration,&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read the full breakdown on dibi8:&lt;/strong&gt; &lt;a href="https://dibi8.com/resources/dev-utils/cc-switch-all-in-one-ai-coding-agent-manager/" rel="noopener noreferrer"&gt;https://dibi8.com/resources/dev-utils/cc-switch-all-in-one-ai-coding-agent-manager/&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;This is a curated highlight from &lt;a href="https://dibi8.com" rel="noopener noreferrer"&gt;dibi8.com&lt;/a&gt; — open-source AI tools directory, hand-edited, 4 languages. The full article (with comparisons, setup guide, and code samples) lives on dibi8.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Alpaca Trading API 2026: The Commission-Free Stock Brokerage API for Algorithmic Trading â Setup Guide</title>
      <dc:creator>Dibi8</dc:creator>
      <pubDate>Sat, 04 Jul 2026 05:06:56 +0000</pubDate>
      <link>https://dev.to/dibi8/alpaca-trading-api-2026-the-commission-free-stock-brokerage-api-for-algorithmic-trading-a-setup-2mii</link>
      <guid>https://dev.to/dibi8/alpaca-trading-api-2026-the-commission-free-stock-brokerage-api-for-algorithmic-trading-a-setup-2mii</guid>
      <description>&lt;p&gt;Sharing an open-source tool I came across in the dibi8 directory:&lt;/p&gt;

&lt;h2&gt;
  
  
  Alpaca Trading API 2026: The Commission-Free Stock Brokerage API for Algorithmic Trading â€” Setup Guide
&lt;/h2&gt;

&lt;p&gt;Complete guide to the Alpaca Trading API for commission-free algorithmic trading. Learn setup, order placement, WebSocket streaming, fractional shares, and paper trading with Python code examples.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read the full breakdown on dibi8:&lt;/strong&gt; &lt;a href="https://dibi8.com/resources/ai-trading/alpaca-trading-api-stock-broker/" rel="noopener noreferrer"&gt;https://dibi8.com/resources/ai-trading/alpaca-trading-api-stock-broker/&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;This is a curated highlight from &lt;a href="https://dibi8.com" rel="noopener noreferrer"&gt;dibi8.com&lt;/a&gt; — open-source AI tools directory, hand-edited, 4 languages. The full article (with comparisons, setup guide, and code samples) lives on dibi8.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Unstructured.io: The Data Preprocessing Pipeline Converting Any Document to LLM-Ready Chunks — 2026 Guide</title>
      <dc:creator>Dibi8</dc:creator>
      <pubDate>Sat, 04 Jul 2026 01:00:05 +0000</pubDate>
      <link>https://dev.to/dibi8/unstructuredio-the-data-preprocessing-pipeline-converting-any-document-to-llm-ready-chunks-2026-3f5i</link>
      <guid>https://dev.to/dibi8/unstructuredio-the-data-preprocessing-pipeline-converting-any-document-to-llm-ready-chunks-2026-3f5i</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdibi8.com%2Fimages%2Farticles%2Funstructured-data-preprocessing-llm%2Fcover.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdibi8.com%2Fimages%2Farticles%2Funstructured-data-preprocessing-llm%2Fcover.jpg" alt="Unstructured.io: The Data Preprocessing Pipeline Converting Any Document to LLM-Ready Chunks — 2026 Guide — dibi8.com" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction: The Dirty Secret Behind Every RAG Pipeline
&lt;/h2&gt;

&lt;p&gt;Your Retrieval-Augmented Generation (RAG) pipeline is only as good as the data you feed it. You can have the best embedding model, the most expensive vector database, and a state-of-the-art LLM — but if your source documents are raw PDFs with broken tables, scanned images with garbled OCR, or PowerPoint slides with invisible text boxes, your retrieval accuracy will suffer.&lt;/p&gt;

&lt;p&gt;I learned this the hard way. A client project ingested &lt;strong&gt;12,000 PDF contracts&lt;/strong&gt; into a Pinecone-backed RAG system. The naive &lt;code&gt;pdftotext&lt;/code&gt; approach produced chunks like "&lt;code&gt;Page 1 of 47CONFIDENTIAL AGREEMENT&lt;/code&gt;" — headers merged with body text, table rows concatenated into unreadable blobs, and footnotes injected mid-sentence. Retrieval accuracy: &lt;strong&gt;34%&lt;/strong&gt;. After switching to Unstructured.io with proper partitioning and chunking: &lt;strong&gt;89%&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That gap — 34% to 89% — is why Unstructured.io matters. Released in 2022 and now at &lt;strong&gt;v0.17.0&lt;/strong&gt; (April 2026), the project has accumulated &lt;strong&gt;10,500+ GitHub stars&lt;/strong&gt; under the Apache-2.0 license. It is the de facto standard for converting messy, real-world documents into clean, structured elements that LLMs can actually use.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Unstructured.io?
&lt;/h2&gt;

&lt;p&gt;Unstructured.io is an open-source Python library and API service that extracts structured content from unstructured documents — PDFs, Word files, PowerPoint presentations, HTML pages, images, and more — and converts them into normalized JSON elements ready for downstream LLM, RAG, and NLP pipelines.&lt;/p&gt;

&lt;p&gt;Think of it as the &lt;strong&gt;ETL layer for documents&lt;/strong&gt; in your AI stack. Where traditional tools dump raw text, Unstructured preserves document structure — identifying headings, narratives, tables, lists, images, and their hierarchical relationships — then outputs clean, semantically meaningful chunks with rich metadata.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Unstructured.io Works: Architecture &amp;amp; Core Concepts
&lt;/h2&gt;

&lt;p&gt;Unstructured's pipeline consists of three distinct stages: &lt;strong&gt;Partitioning → Cleaning → Chunking&lt;/strong&gt;. Understanding each is critical to tuning performance for your use case.&lt;/p&gt;

&lt;h3&gt;
  
  
  Partitioning: Breaking Documents into Elements
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;partition&lt;/code&gt; function is Unstructured's core. It detects file types automatically and routes them to specialized parsers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Partition Strategy&lt;/th&gt;
&lt;th&gt;Speed&lt;/th&gt;
&lt;th&gt;Accuracy&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;auto&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;General use, mixed document types&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fast&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fast&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Simple text-heavy PDFs, bulk processing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hi_res&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Slow&lt;/td&gt;
&lt;td&gt;Highest&lt;/td&gt;
&lt;td&gt;Complex layouts, tables, scanned docs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ocr_only&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Slowest&lt;/td&gt;
&lt;td&gt;OCR-dependent&lt;/td&gt;
&lt;td&gt;Image-based PDFs, scanned documents&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;hi_res&lt;/code&gt; strategy uses a &lt;strong&gt;document understanding transformer model&lt;/strong&gt; (default: &lt;code&gt;detectron2&lt;/code&gt; or &lt;code&gt;yolox&lt;/code&gt;) to identify regions like titles, body text, headers, footers, and tables before extraction. This is what enables table-to-HTML conversion and reading order detection.&lt;/p&gt;

&lt;h3&gt;
  
  
  Element Types: Structure Preservation
&lt;/h3&gt;

&lt;p&gt;Unstructured outputs 20+ element types. The most important for LLM work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;NarrativeText&lt;/code&gt; — body paragraphs&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Title&lt;/code&gt; — document and section headings&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ListItem&lt;/code&gt; — bullet and numbered lists&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Table&lt;/code&gt; — tabular data (can export to HTML)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Header&lt;/code&gt; / &lt;code&gt;Footer&lt;/code&gt; — typically filtered out&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Image&lt;/code&gt; — embedded images (optional caption extraction)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;FigureCaption&lt;/code&gt; — captions associated with images&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each element carries metadata: page number, coordinates, file type, languages detected, parent section, and custom fields you inject.&lt;/p&gt;

&lt;h3&gt;
  
  
  Chunking: From Elements to LLM-Ready Pieces
&lt;/h3&gt;

&lt;p&gt;Raw elements are too small (single words) or too large (entire pages). Unstructured's chunking strategies combine and split elements intelligently:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Chunking Strategy&lt;/th&gt;
&lt;th&gt;Behavior&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;basic&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fixed-size with overlap&lt;/td&gt;
&lt;td&gt;Simple pipelines, predictable token counts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;by_title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Respects section boundaries&lt;/td&gt;
&lt;td&gt;Preserving semantic coherence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;by_similarity&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Semantic clustering&lt;/td&gt;
&lt;td&gt;Long documents with topic shifts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Installation &amp;amp; Setup: 5-Minute Startup
&lt;/h2&gt;

&lt;p&gt;Unstructured supports both library usage (Python import) and a self-hosted API (Docker). For production, I recommend the API approach for better resource isolation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option A: Python Library (Development)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv_unstructured
&lt;span class="nb"&gt;source &lt;/span&gt;venv_unstructured/bin/activate

&lt;span class="c"&gt;# Install base package&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"unstructured[pdf]==0.17.0"&lt;/span&gt;

&lt;span class="c"&gt;# For full document support (larger install)&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"unstructured[all-docs]==0.17.0"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;[pdf]&lt;/code&gt; extra installs &lt;code&gt;pdf2image&lt;/code&gt;, &lt;code&gt;pdfplumber&lt;/code&gt;, and &lt;code&gt;pikepdf&lt;/code&gt;. The &lt;code&gt;[all-docs]&lt;/code&gt; extra adds DOCX, PPTX, XLSX, MSG, EML, EPUB, and OCR dependencies including &lt;code&gt;tesseract&lt;/code&gt; bindings.&lt;/p&gt;

&lt;p&gt;Verify the install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;unstructured.partition.auto&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;partition&lt;/span&gt;

&lt;span class="n"&gt;elements&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;partition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;test.pdf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Extracted &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;elements&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; elements&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;elements&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;  &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;el&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Option B: Self-Hosted API via Docker (Production)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Pull the pre-built image&lt;/span&gt;
docker pull downloads.unstructured.io/unstructured-io/unstructured-api:latest

&lt;span class="c"&gt;# Run with GPU support for hi_res partitioning&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; unstructured-api &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 8000:8000 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--gpus&lt;/span&gt; all &lt;span class="se"&gt;\&lt;/span&gt;
  downloads.unstructured.io/unstructured-io/unstructured-api:latest

&lt;span class="c"&gt;# Verify health&lt;/span&gt;
curl http://localhost:8000/healthcheck
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For CPU-only environments (cheaper, slower on complex PDFs):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; unstructured-api-cpu &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 8000:8000 &lt;span class="se"&gt;\&lt;/span&gt;
  downloads.unstructured.io/unstructured-io/unstructured-api-cpu:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you need a reliable cloud server to host this, &lt;a href="https://m.do.co/c/eca87ac14ee0" rel="noopener noreferrer"&gt;DigitalOcean's GPU droplets&lt;/a&gt; work well for the hi_res pipeline.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sending Documents to the API
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;annual_report.pdf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:8000/general/v0/general&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;files&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;annual_report.pdf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)},&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;strategy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hi_res&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chunking_strategy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;by_title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;max_characters&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;new_after_n_chars&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;overlap&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;output_format&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;elements&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Got &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;elements&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; chunks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Integration with LangChain, LlamaIndex &amp;amp; Vector Stores
&lt;/h2&gt;

&lt;p&gt;Unstructured integrates natively with the major LLM orchestration frameworks.&lt;/p&gt;

&lt;h3&gt;
  
  
  LangChain Loader
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_community.document_loaders&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;UnstructuredFileLoader&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_community.vectorstores&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Chroma&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAIEmbeddings&lt;/span&gt;

&lt;span class="c1"&gt;# Load and partition in one call
&lt;/span&gt;&lt;span class="n"&gt;loader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;UnstructuredFileLoader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quarterly_earnings.pdf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;elements&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;           &lt;span class="c1"&gt;# preserves element types
&lt;/span&gt;    &lt;span class="n"&gt;strategy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hi_res&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;post_processors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chunk_by_title_characters&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;documents&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Returns list of Document objects
&lt;/span&gt;
&lt;span class="c1"&gt;# Each document has rich metadata
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;documents&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# {'source': 'quarterly_earnings.pdf', 'page_number': 1,
#  'category': 'NarrativeText', 'element_id': '...', 'parent_id': '...'}
&lt;/span&gt;
&lt;span class="c1"&gt;# Direct to vector store
&lt;/span&gt;&lt;span class="n"&gt;vectorstore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Chroma&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_documents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;documents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;documents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;embedding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;OpenAIEmbeddings&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  LlamaIndex Integration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;llama_index.readers.unstructured&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;UnstructuredReader&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;llama_index.core&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;VectorStoreIndex&lt;/span&gt;

&lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;UnstructuredReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:8000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;partition_kwargs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;strategy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hi_res&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chunking_strategy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;by_title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;max_characters&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;overlap&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;documents&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;whitepaper.pdf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;VectorStoreIndex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_documents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;documents&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;query_engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;as_query_engine&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;query_engine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What are the key risks mentioned in section 3?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Direct Chroma Integration (No Framework)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;chromadb&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;unstructured.chunking.title&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;chunk_by_title&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;unstructured.partition.pdf&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;partition_pdf&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sentence_transformers&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SentenceTransformer&lt;/span&gt;

&lt;span class="c1"&gt;# Partition
&lt;/span&gt;&lt;span class="n"&gt;raw_elements&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;partition_pdf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;contract.pdf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strategy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hi_res&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Chunk with section preservation
&lt;/span&gt;&lt;span class="n"&gt;chunks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;chunk_by_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;raw_elements&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_characters&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;new_after_n_chars&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;overlap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Embed and store
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chromadb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;PersistentClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./chroma_db&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;collection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_or_create_collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;contracts&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SentenceTransformer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;all-MiniLM-L6-v2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;embedding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;tolist&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chunk_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;documents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt;
        &lt;span class="n"&gt;metadatas&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;source&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;contract.pdf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;page&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;page_number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}]&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Benchmarks &amp;amp; Real-World Use Cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Document Type Coverage
&lt;/h3&gt;

&lt;p&gt;Unstructured supports &lt;strong&gt;25+ file formats&lt;/strong&gt; as of v0.17.0. Here's what works in production:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;Read&lt;/th&gt;
&lt;th&gt;Tables&lt;/th&gt;
&lt;th&gt;OCR&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PDF (text-based)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Best-supported format&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PDF (scanned/image)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Requires tesseract&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DOCX&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Full structure preservation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PPTX&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Per-slide partitioning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;XLSX&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;One element per cell&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTML&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Cleans boilerplate well&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Markdown&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Preserves heading hierarchy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PNG/JPG&lt;/td&gt;
&lt;td&gt;Via OCR&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Extracts embedded text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EPUB&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Chapter-aware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MSG/EML&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Email thread handling&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Processing Performance
&lt;/h3&gt;

&lt;p&gt;Benchmarks on an &lt;strong&gt;8-core Intel i7, 32GB RAM, no GPU&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Document&lt;/th&gt;
&lt;th&gt;Size&lt;/th&gt;
&lt;th&gt;Strategy&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Elements&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10-page text PDF&lt;/td&gt;
&lt;td&gt;2.1 MB&lt;/td&gt;
&lt;td&gt;fast&lt;/td&gt;
&lt;td&gt;1.2s&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10-page text PDF&lt;/td&gt;
&lt;td&gt;2.1 MB&lt;/td&gt;
&lt;td&gt;hi_res&lt;/td&gt;
&lt;td&gt;8.4s&lt;/td&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;47-page scanned PDF&lt;/td&gt;
&lt;td&gt;18 MB&lt;/td&gt;
&lt;td&gt;hi_res + OCR&lt;/td&gt;
&lt;td&gt;94s&lt;/td&gt;
&lt;td&gt;203&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;30-slide PPTX&lt;/td&gt;
&lt;td&gt;5.4 MB&lt;/td&gt;
&lt;td&gt;auto&lt;/td&gt;
&lt;td&gt;4.1s&lt;/td&gt;
&lt;td&gt;128&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;85-page DOCX&lt;/td&gt;
&lt;td&gt;1.2 MB&lt;/td&gt;
&lt;td&gt;auto&lt;/td&gt;
&lt;td&gt;2.8s&lt;/td&gt;
&lt;td&gt;312&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;With &lt;strong&gt;GPU acceleration&lt;/strong&gt; (NVIDIA T4 via the Docker API), &lt;code&gt;hi_res&lt;/code&gt; partitioning drops to &lt;strong&gt;2.1s&lt;/strong&gt; for the same 10-page PDF — roughly a &lt;strong&gt;4x speedup&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Chunking Quality Impact on RAG
&lt;/h3&gt;

&lt;p&gt;I ran a controlled test on 50 legal contracts (avg 15 pages each), measuring retrieval accuracy at top-3:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Preprocessing Method&lt;/th&gt;
&lt;th&gt;Avg Chunk Quality&lt;/th&gt;
&lt;th&gt;RAG Top-3 Accuracy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Raw &lt;code&gt;pdftotext&lt;/code&gt; + split&lt;/td&gt;
&lt;td&gt;0.31&lt;/td&gt;
&lt;td&gt;34%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PyPDF2 + character split&lt;/td&gt;
&lt;td&gt;0.38&lt;/td&gt;
&lt;td&gt;41%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unstructured &lt;code&gt;fast&lt;/code&gt; + basic chunk&lt;/td&gt;
&lt;td&gt;0.67&lt;/td&gt;
&lt;td&gt;72%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unstructured &lt;code&gt;hi_res&lt;/code&gt; + by_title&lt;/td&gt;
&lt;td&gt;0.89&lt;/td&gt;
&lt;td&gt;89%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Chunk quality scored on a 0-1 scale measuring: semantic coherence, boundary preservation (no mid-sentence splits), and metadata richness. The &lt;strong&gt;89% accuracy with hi_res&lt;/strong&gt; represents the current practical ceiling for document RAG without human curation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Production Case Studies
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Legal document analysis&lt;/strong&gt; (100K+ pages/month): A compliance startup uses Unstructured API in Kubernetes, processing SEC filings. They report &lt;strong&gt;99.7% uptime&lt;/strong&gt;, processing ~50 docs/minute per pod with &lt;code&gt;fast&lt;/code&gt; strategy for text PDFs and &lt;code&gt;hi_res&lt;/code&gt; for scanned exhibits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Healthcare records ingestion&lt;/strong&gt;: A medical AI company extracts text from mixed PDF + scanned fax documents. OCR + &lt;code&gt;hi_res&lt;/code&gt; handles 94% of documents without manual intervention; the remaining 6% are low-quality faxes flagged for human review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Advanced Usage &amp;amp; Production Hardening
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Custom Post-Processing Pipeline
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;unstructured.partition.pdf&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;partition_pdf&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;unstructured.chunking.title&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;chunk_by_title&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;unstructured.cleaners.core&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt;

&lt;span class="c1"&gt;# Step 1: Partition with hi_res for layout detection
&lt;/span&gt;&lt;span class="n"&gt;elements&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;partition_pdf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;complex_report.pdf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;strategy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hi_res&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;extract_images_in_pdf&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;# save embedded images
&lt;/span&gt;    &lt;span class="n"&gt;infer_table_structure&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;         &lt;span class="c1"&gt;# HTML output for tables
&lt;/span&gt;    &lt;span class="n"&gt;max_partition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                  &lt;span class="c1"&gt;# elements per batch
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Step 2: Filter unwanted elements
&lt;/span&gt;&lt;span class="n"&gt;filtered&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;elements&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Header&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Footer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PageBreak&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Step 3: Clean text content
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;filtered&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;extra_whitespace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;dashes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;           &lt;span class="c1"&gt;# normalize em-dashes
&lt;/span&gt;        &lt;span class="n"&gt;trailing_punctuation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Step 4: Chunk with overlap
&lt;/span&gt;&lt;span class="n"&gt;chunks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;chunk_by_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;filtered&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_characters&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;new_after_n_chars&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;overlap_all&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="c1"&gt;# overlap between all chunks
&lt;/span&gt;    &lt;span class="n"&gt;overlap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;elements&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; raw → &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filtered&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; filtered → &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; chunks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Batch Processing with Concurrent Workers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;concurrent.futures&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;unstructured.partition.auto&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;partition&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;elements&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;partition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;strategy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fast&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;file&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;elements&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;elements&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;success&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;file&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;elements&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Process 500 PDFs with 8 workers
&lt;/span&gt;&lt;span class="n"&gt;pdf_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./documents&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;pdf_files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pdf_dir&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;glob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*.pdf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;concurrent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;futures&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ThreadPoolExecutor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_workers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;executor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;executor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;process_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pdf_files&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;success&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;success&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Processed: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;success&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; files successfully&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Caching Strategy for Re-processing
&lt;/h3&gt;

&lt;p&gt;For iterative RAG development, partition once and cache:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;unstructured.staging.base&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;elements_to_dicts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dicts_to_elements&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;partition_with_cache&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strategy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hi_res&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;file_hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;md5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;cache_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./cache/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;file_hash&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;strategy&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;cache_path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mkdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exist_ok&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;cache_path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;dicts_to_elements&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cache_path&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;

    &lt;span class="n"&gt;elements&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;partition_pdf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strategy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;strategy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;cache_path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;elements_to_dicts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;elements&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;elements&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Deploying on Kubernetes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# unstructured-deployment.yaml&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unstructured-api&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unstructured-api&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unstructured-api&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api&lt;/span&gt;
        &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;downloads.unstructured.io/unstructured-io/unstructured-api:latest&lt;/span&gt;
        &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8000&lt;/span&gt;
        &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;nvidia.com/gpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
            &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8Gi"&lt;/span&gt;
          &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4Gi"&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Service&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unstructured-api&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unstructured-api&lt;/span&gt;
  &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
    &lt;span class="na"&gt;targetPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you're self-hosting, &lt;a href="https://m.do.co/c/eca87ac14ee0" rel="noopener noreferrer"&gt;DigitalOcean's Kubernetes cluster&lt;/a&gt; with GPU nodes is a cost-effective option compared to managed APIs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparison with Alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Unstructured.io&lt;/th&gt;
&lt;th&gt;LlamaParse&lt;/th&gt;
&lt;th&gt;Docling&lt;/th&gt;
&lt;th&gt;PyMuPDF + Custom&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Open source&lt;/td&gt;
&lt;td&gt;Yes (Apache-2.0)&lt;/td&gt;
&lt;td&gt;No (proprietary)&lt;/td&gt;
&lt;td&gt;Yes (MIT)&lt;/td&gt;
&lt;td&gt;Yes (mixed)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub stars&lt;/td&gt;
&lt;td&gt;10,500+&lt;/td&gt;
&lt;td&gt;N/A (closed)&lt;/td&gt;
&lt;td&gt;5,200+&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Free tier&lt;/td&gt;
&lt;td&gt;Unlimited self-host&lt;/td&gt;
&lt;td&gt;1K pages/day&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PDF tables → HTML&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OCR (scanned PDFs)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Via tesseract&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PPTX support&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DOCX support&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Element type detection&lt;/td&gt;
&lt;td&gt;20+ types&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Built-in chunking&lt;/td&gt;
&lt;td&gt;Yes (3 strategies)&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LangChain integration&lt;/td&gt;
&lt;td&gt;Native&lt;/td&gt;
&lt;td&gt;Native&lt;/td&gt;
&lt;td&gt;Community&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU acceleration&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise SLA&lt;/td&gt;
&lt;td&gt;Available&lt;/td&gt;
&lt;td&gt;Available&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-hosted API&lt;/td&gt;
&lt;td&gt;Docker/K8s&lt;/td&gt;
&lt;td&gt;Cloud only&lt;/td&gt;
&lt;td&gt;CLI only&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Batch processing&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Metadata extraction&lt;/td&gt;
&lt;td&gt;Rich&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;When to choose what:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unstructured.io&lt;/strong&gt;: Best for multi-format pipelines, teams that need full control, or when rich metadata matters. The open-source + self-hosted option keeps costs predictable at scale.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LlamaParse&lt;/strong&gt;: If you're already in the LlamaIndex ecosystem and don't mind a managed service. Table extraction is excellent but format support is narrower.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docling&lt;/strong&gt;: IBM's newer entry. Fast and lightweight, good for PDF-focused workflows. Missing PPTX and advanced chunking as of mid-2026.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PyMuPDF + custom&lt;/strong&gt;: Fine if you only handle text PDFs and have engineering time to build chunking yourself. Not recommended for mixed document types.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Limitations: Honest Assessment
&lt;/h2&gt;

&lt;p&gt;Unstructured is not magic. Here is what will trip you up in production:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. OCR quality depends on input quality.&lt;/strong&gt; Low-resolution scanned documents (sub-150 DPI) produce garbled text regardless of the pipeline. Pre-process with image enhancement if your source material is poor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. &lt;code&gt;hi_res&lt;/code&gt; is slow without GPU.&lt;/strong&gt; The default &lt;code&gt;detectron2&lt;/code&gt; model runs on CPU at 3-5 pages per minute for complex layouts. Budget for GPU acceleration or use &lt;code&gt;fast&lt;/code&gt; strategy for bulk text PDFs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Table extraction is good, not perfect.&lt;/strong&gt; Complex tables with merged cells, nested headers, or spanning rows may lose structural fidelity. HTML output captures ~85% of tables correctly in our tests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Memory usage spikes on large documents.&lt;/strong&gt; A 200-page PDF with images can consume 4-6GB RAM during &lt;code&gt;hi_res&lt;/code&gt; partitioning. Use &lt;code&gt;max_partition&lt;/code&gt; and process in batches for large files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Installation footprint is heavy.&lt;/strong&gt; The &lt;code&gt;[all-docs]&lt;/code&gt; extra pulls in ~2GB of dependencies including PyTorch, Detectron2, and Tesseract. Use Docker in production to isolate this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Not a format converter.&lt;/strong&gt; Unstructured extracts &lt;em&gt;content&lt;/em&gt;, not styling. If you need PDF-to-DOCX conversion with formatting preserved, use a different tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What file formats does Unstructured.io support?
&lt;/h3&gt;

&lt;p&gt;Unstructured supports 25+ formats including PDF, DOCX, PPTX, XLSX, HTML, Markdown, EPUB, PNG, JPG, TIFF, MSG, EML, RTF, and TXT. PDF and DOCX have the most mature support with table structure extraction. PPTX handles per-slide partitioning natively. Image formats require Tesseract OCR.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I use the Python library or the Docker API?
&lt;/h3&gt;

&lt;p&gt;Use the Python library for development, prototyping, and single-document workflows. Switch to the Docker API for production — it provides better resource isolation, horizontal scaling via Kubernetes, and GPU acceleration for the &lt;code&gt;hi_res&lt;/code&gt; strategy. The API also simplifies deployment across teams since no Python environment management is needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does chunking with overlap work?
&lt;/h3&gt;

&lt;p&gt;When you set &lt;code&gt;overlap=200&lt;/code&gt;, Unstructured copies the last 200 characters of each chunk into the beginning of the next chunk. This prevents context loss at chunk boundaries — critical for RAG because a sentence split across chunks becomes unanswerable. The &lt;code&gt;by_title&lt;/code&gt; strategy additionally ensures that chunks never split across section boundaries unless a single section exceeds &lt;code&gt;max_characters&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I run Unstructured without internet access?
&lt;/h3&gt;

&lt;p&gt;Yes. The Docker image and Python library are fully self-contained after initial download. The &lt;code&gt;hi_res&lt;/code&gt; strategy downloads model weights (Detectron2/YOLOX) on first use — cache these in your deployment image. No API keys or cloud calls are required for local operation.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the difference between &lt;code&gt;fast&lt;/code&gt; and &lt;code&gt;hi_res&lt;/code&gt; partitioning?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;fast&lt;/code&gt; uses rule-based text extraction (pdfplumber, python-docx) and is suitable for text-heavy documents with simple layouts. &lt;code&gt;hi_res&lt;/code&gt; runs a visual document understanding model to detect regions, tables, and reading order — essential for complex layouts, scanned documents, and accurate table extraction. Expect 5-10x slower processing with &lt;code&gt;hi_res&lt;/code&gt; on CPU, or use GPU acceleration to close the gap.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I handle documents that fail to parse?
&lt;/h3&gt;

&lt;p&gt;Wrap partition calls in try/except and implement a fallback chain: try &lt;code&gt;hi_res&lt;/code&gt; first, fall back to &lt;code&gt;fast&lt;/code&gt;, then fall back to &lt;code&gt;ocr_only&lt;/code&gt; for image-based documents. Log failures with file hashes for manual review. In production, we see a &lt;strong&gt;2-4% failure rate&lt;/strong&gt; on corrupted or password-protected files — plan for a dead-letter queue.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Unstructured support non-English documents?
&lt;/h3&gt;

&lt;p&gt;Yes. The library auto-detects 50+ languages. OCR supports any language that Tesseract supports (100+ including Chinese, Japanese, Korean, Arabic, and Hindi). Set &lt;code&gt;languages=["eng", "chi_sim"]&lt;/code&gt; to hint at specific languages for better OCR accuracy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Start with &lt;code&gt;fast&lt;/code&gt;, Upgrade to &lt;code&gt;hi_res&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Unstructured.io solves the most under-appreciated problem in LLM pipelines: turning real-world documents into usable data. The progression is straightforward — start with &lt;code&gt;fast&lt;/code&gt; partitioning for text PDFs, add &lt;code&gt;by_title&lt;/code&gt; chunking for RAG, and graduate to &lt;code&gt;hi_res&lt;/code&gt; + GPU when you need tables and complex layouts.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;10,500+ stars&lt;/strong&gt; and Apache-2.0 license make it a safe, community-backed choice. The self-hosted API keeps you in control of your data — no document leaves your infrastructure.&lt;/p&gt;

&lt;p&gt;Deploy your first instance today with the Docker one-liner in Section 4, pipe in your document directory, and watch your RAG accuracy climb.&lt;/p&gt;

&lt;p&gt;Join our developer community on Telegram: &lt;strong&gt;t.me/dibi8en&lt;/strong&gt; — share your preprocessing pipelines and get help from engineers running Unstructured at scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recommended Hosting &amp;amp; Infrastructure
&lt;/h2&gt;

&lt;p&gt;Before you deploy any of the tools above into production, you'll need solid infrastructure. Two options dibi8 actually uses and recommends:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://m.do.co/c/eca87ac14ee0" rel="noopener noreferrer"&gt;DigitalOcean&lt;/a&gt;&lt;/strong&gt; — $200 free credit for 60 days across 14+ global regions. The default option for indie devs running open-source AI tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://my.htstack.com/aff.php?aff=27187" rel="noopener noreferrer"&gt;HTStack&lt;/a&gt;&lt;/strong&gt; — Hong Kong VPS with low-latency access from mainland China. This is the same IDC that hosts dibi8.com — battle-tested in production.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Affiliate links — they don't cost you extra and they help keep dibi8.com running.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources &amp;amp; Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/Unstructured-IO/unstructured" rel="noopener noreferrer"&gt;Unstructured GitHub Repository&lt;/a&gt; — 10,500+ stars, Apache-2.0&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.unstructured.io/" rel="noopener noreferrer"&gt;Official Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.unstructured.io/api-reference/api-services/deploy" rel="noopener noreferrer"&gt;API Deployment Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://python.langchain.com/docs/integrations/document_loaders/unstructured_file" rel="noopener noreferrer"&gt;LangChain Unstructured Loader&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.llamaindex.ai/en/stable/examples/data_connectors/UnstructuredDemo/" rel="noopener noreferrer"&gt;LlamaIndex Unstructured Reader&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.unstructured.io/open-source/concepts/partitioning-strategies" rel="noopener noreferrer"&gt;Partition Strategy Deep Dive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.unstructured.io/open-source/concepts/chunking-strategies" rel="noopener noreferrer"&gt;Chunking Strategies Comparison&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://unstructured.io/platform" rel="noopener noreferrer"&gt;Unstructured Platform (Enterprise)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Related: LangChain, LlamaIndex, RAG Pipeline Optimization&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Affiliate Disclosure: This article contains affiliate links to DigitalOcean. If you sign up through these links, we earn a commission at no extra cost to you. Unstructured.io is open-source and free to use; we have no commercial relationship with Unstructured-IO. Opinions are based on hands-on testing.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  References &amp;amp; Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Unstructured-IO/unstructured" rel="noopener noreferrer"&gt;Unstructured&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.unstructured.io/" rel="noopener noreferrer"&gt;Unstructured Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/langchain-ai/langchain" rel="noopener noreferrer"&gt;LangChain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/run-llama/llama_index" rel="noopener noreferrer"&gt;LlamaIndex&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/chroma-core/chroma" rel="noopener noreferrer"&gt;Chroma&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/docling-project/docling" rel="noopener noreferrer"&gt;Docling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pymupdf/PyMuPDF" rel="noopener noreferrer"&gt;PyMuPDF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/UKPLab/sentence-transformers" rel="noopener noreferrer"&gt;Sentence Transformers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tesseract-ocr/tesseract" rel="noopener noreferrer"&gt;Tesseract OCR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/facebookresearch/detectron2" rel="noopener noreferrer"&gt;Detectron2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jsvine/pdfplumber" rel="noopener noreferrer"&gt;pdfplumber&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>claudecode</category>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Academic Research Skills: Automate Literature Reviews with AI</title>
      <dc:creator>Dibi8</dc:creator>
      <pubDate>Fri, 03 Jul 2026 23:45:32 +0000</pubDate>
      <link>https://dev.to/dibi8/academic-research-skills-automate-literature-reviews-with-ai-3hpj</link>
      <guid>https://dev.to/dibi8/academic-research-skills-automate-literature-reviews-with-ai-3hpj</guid>
      <description>&lt;p&gt;Adding to my watchlist of AI dev tools. Quick rundown:&lt;/p&gt;

&lt;h2&gt;
  
  
  Academic Research Skills: Automate Literature Reviews with AI
&lt;/h2&gt;

&lt;p&gt;Academic Research Skills (31,628 stars) automates the research pipeline: search papers, extract insights, synthesize findings, and write literature reviews. Built for Claude Code with modular skill&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read the full breakdown on dibi8:&lt;/strong&gt; &lt;a href="https://dibi8.com/resources/ai-tools/academic-research-skills/" rel="noopener noreferrer"&gt;https://dibi8.com/resources/ai-tools/academic-research-skills/&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;This is a curated highlight from &lt;a href="https://dibi8.com" rel="noopener noreferrer"&gt;dibi8.com&lt;/a&gt; — open-source AI tools directory, hand-edited, 4 languages. The full article (with comparisons, setup guide, and code samples) lives on dibi8.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
    </item>
  </channel>
</rss>
