deepseek-ocr.rs

TimmyOVOApache-2.0更新放缓

用 Rust 写的多后端 OCR/视觉语言模型引擎,支持 DeepSeek-OCR、PaddleOCR-VL 等模型和 DSQ 量化,无需 Python 即可本地跑起兼容 OpenAI 的服务和命令行。

Rust multi‑backend OCR/VLM engine (DeepSeek‑OCR-1/2, PaddleOCR‑VL, DotsOCR) with DSQ quantization and an OpenAI‑compatible server & CLI – run locally without Python.

v0.6.0-stage2e发布于 2026-02-21 12:28 UTC2,187star169fork同步于 2026-11-07 07:31 UTC

怎么上手

由 README 提炼,执行前请确认
git clone https://github.com/TimmyOVO/deepseek-ocr.rs.git && cd deepseek-ocr.rs && cargo fetch
cargo run -p deepseek-ocr-cli --release -- --prompt "<image>\n<|grounding|>Convert this receipt to markdown." --image baselines/sample/images/test.png --device cpu --max-new-tokens 512
硬件要求按 README 说明

DeepSeek-OCR FP16 权重约 6.3GB,推理约需 13GB 内存/显存;PaddleOCR-VL 约 4.7GB 权重、约 9GB 内存,可纯 CPU 跑;DotsOCR 高分辨率文档需 30–50GB。支持 Apple Silicon Metal、NVIDIA CUDA(alpha,需 CUDA 12.2+)和 CPU,x86 可选 Intel MKL。

24G 显存可跑纯 CPU 可运行支持 Apple Silicon需要 CUDA
下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

纯 Rust 实现的 DeepSeek-OCR 推理栈,带 CLI 和 OpenAI 兼容服务,本地跑 OCR 不用 Python

用 Rust 写的多后端 OCR/视觉语言模型引擎,支持 DeepSeek-OCR、PaddleOCR-VL 等模型和 DSQ 量化,无需 Python 即可本地跑起兼容 OpenAI 的服务和命令行。

核心能力

  • 用 Candle 做张量计算,支持 Metal、CUDA 和 FlashAttention
  • 提供 OpenAI 兼容的 /v1/responses 与 /v1/chat/completions 接口
  • 首次运行自动从 Hugging Face 或 ModelScope 下载并校验模型资产
  • 内置 DSQ 量化变体(Q4_K/Q6_K/Q8_0)降低显存占用
  • CLI 与服务器共用同一套配置和纯 Rust 视觉/提示词流水线

容易踩的坑

从源码运行必须加 --release,debug 构建会慢 10 倍以上;首次运行要下载约 6.3GB 模型权重,建议配好 HF_TOKEN 和 HF_HOME;CUDA 支持仍是 alpha,需额外加 --features cuda 并指定 --device cuda --dtype f16;服务默认监听 0.0.0.0:8000。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v0.6.0-stage2e
  1. v0.6.0-stage2e最新正式版2026-02-21 · 2026-02-21 12:28 UTC

    这个版本没有写更新说明。

  2. v0.5.12025-11-15 · 2025-11-15 07:09 UTC
    查看更新说明

    BUG fixes

    #48

  3. v0.5.02025-11-14 · 2025-11-14 19:16 UTC
    查看更新说明

    Highlights

    After a few days of tight iteration and more than 6,000 lines of new code, we’re ready to introduce DSQ quantization to deepseek-ocr.rs.

    Unlike formats like GGUF or plain safetensors that usually ship full float checkpoints, DSQ behaves as a relatively compact patch on top of the base weights: the original float weights stay as‑is, and DSQ only adds a quantized snapshot of the heavy linear layers. This lets DeepSeek-OCR, PaddleOCR-VL and future OCR/VLM models share the same snapshot pipeline via small adapters instead of inventing a new weight format every time.

    We chose this weight‑patch design because the goal is to cut VRAM/RAM usage without needlessly hurting model quality. Concretely:

    • For DeepSeek-OCR, the adapters target the large language Transformer linears: attention projections (e.g. self_attn.q_proj/k_proj/v_proj/o_proj), MLP blocks (e.g. mlp.gate_proj/up_proj/down_proj, including MoE experts and shared_experts), and, when enabled, the multimodal projector (model.projector.layers.weight / bias). The lm_head.weight is also part of the snapshot, but when the primary precision is Q4_K or Q6_K, both lm_head.weight and model.projector.layers.weight are automatically promoted to Q8_0 to stay more conservative on the most critical heads.
    • For PaddleOCR-VL, the adapters cover the text decoder linears (attention q_proj/k_proj/v_proj/o_proj and MLP gate_proj/up_proj/down_proj, plus lm_head.weight), as well as the visual side: SigLIP encoder linears under visual.vision_model.encoder.layers.*, the visual.vision_model.head.* attention and MLP blocks, and the cross‑modal bridge linears mlp_AR.linear_1/linear_2.
    • Embeddings, layer norms, positional encodings, routing logic and other “fragile” components stay in float and are not written into DSQ.

    On the loading side, the DSQ runtime batches these linear specs and supports parallel loading, which helps tame cold‑start time for larger models where startup used to be dominated by weight IO and decoding. Out of the box, this release ships three tiers — Q4_K, Q6_K and Q8_0 — so you can pick the trade‑off that matches your hardware and tolerance for compression.

    New Quantized Models Table

    The following quantized model-ids are new in this release (the original deepseek-ocr / paddleocr-vl stay available):

    Model IDBase ModelPrecisionSuggested Use Case
    deepseek-ocr-q4kdeepseek-ocrQ4_KTight VRAM, local deployments, batch jobs
    deepseek-ocr-q6kdeepseek-ocrQ6_KDay‑to‑day balance of quality and size
    deepseek-ocr-q8kdeepseek-ocrQ8_0When you want to stay close to full precision
    paddleocr-vl-q4kpaddleocr-vlQ4_KHeavily compressed doc/table deployments
    paddleocr-vl-q6kpaddleocr-vlQ6_KCommon engineering setups
    paddleocr-vl-q8kpaddleocr-vlQ8_0Accuracy‑leaning, still smaller than FP16

    Memory / VRAM Comparison

    Using FP32 as a 1.0× baseline, you can think of the different precisions roughly like this:

    PrecisionApprox. Size vs FP32Notes
    FP321.0×Baseline
    FP16~0.5×Standard half precision
    Q8_0~0.25–0.3×Solid default for many workloads
    Q6_K~0.2–0.25×Smaller again while keeping good quality
    Q4_K~0.14×Roughly one seventh of FP32, very aggressive

    In short: lower precision → smaller weights → less pre

  4. v0.4.12025-11-10 · 2025-11-10 08:09 UTC
    查看更新说明

    Bug Fixes

  5. v0.4.02025-11-09 · 2025-11-09 18:24 UTC
    查看更新说明

    New Features

    • PaddleOCR‑VL backend (SigLIP + Ernie 0.9B with FlashAttention) is now selectable alongside DeepSeek‑OCR. Documentation covers model switching and architecture/memory differences.
    • Model-aware prompts with bilingual Markdown feedback when requests omit placeholders.
    • Lazy loading: the server defers weight mmap until the first request, reducing startup time.
    • Server/CLI sampling controls: --do-sample, --temperature, --top-p, --top-k, --repetition-penalty, and --no-repeat-ngram-size are now recognized across both entry points.

    Improvements

    • Common utilities (token sampling, embedding gathers, transformer KV cache) moved into deepseek-ocr-core, trimming duplication between DeepSeek and Paddle crates.
    • Documentation clarifies multi-model selection, DeepSeek-only dynamic crop mode, bilingual terminology, and per-flag behavior.
    • CLI/Server prompt builders choose the correct format per model, improving output quality without manual tweaks.

    Bug Fixes

    • ModelScope provider now respects arbitrary repo IDs and exact file paths, fixing Paddle asset downloads that previously fetched the wrong config.json.
    • Requests without images no longer throw transport errors; both sync and streaming responses return a structured bilingual warning instead.
    • Prompt/image mismatches surface as normal assistant replies instead of opaque “prompt formatting failed” errors, keeping clients compatible with standard OpenAI flows.

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    deepseek-ocr.rs 🚀

    Rust implementation of the DeepSeek-OCR inference stack with a fast CLI and an OpenAI-compatible HTTP server. The workspace packages multiple OCR backends, prompt tooling, and a serving layer so you can build document understanding pipelines that run locally on CPU, Apple Metal, or (alpha) NVIDIA CUDA GPUs.

    中文文档请看 README_CN.md。

    Want ready-made binaries? Latest macOS (Metal-enabled) and Windows bundles live in the build-binaries workflow artifacts. Grab them from the newest green run.

    Choosing a Model 🔬

    ModelMemory footprint*Best onWhen to pick it
    DeepSeek‑OCR≈6.3GB FP16 weights, ≈13GB RAM/VRAM with cache & activations (512-token budget)Apple Silicon + Metal (FP16), high-VRAM NVIDIA GPUs, 32GB+ RAM desktopsHighest accuracy, SAM+CLIP global/local context, MoE DeepSeek‑V2 decoder (3B params, ~570M active per token). Use when latency is secondary to quality.
    PaddleOCR‑VL≈4.7GB FP16 weights, ≈9GB RAM/VRAM with cache & activations16GB laptops, CPU-only boxes, mid-range GPUsDense 0.9B Ernie decoder with SigLIP vision tower. Faster startup, lower memory, great for batch jobs or lightweight deployments.
    DotsOCR≈9GB FP16 weights, but expect 30–50GB RAM/VRAM for high-res docs due to huge vision tokensApple Silicon + Metal BF16, ≥24GB CUDA cards, or 64GB RAM CPU workstationsUnified VLM (DotsVision + Qwen2) that nails layout, reading order, grounding, and multilingual math if you can tolerate the latency and memory bill.

    *Measured from the default FP16 safetensors. Runtime footprint varies with sequence length.

    Guidance:

    • Need maximum fidelity, multi-region reasoning, or already have 16–24GB VRAM? Use DeepSeek‑OCR. The hybrid SAM+CLIP tower plus DeepSeek‑V2 MoE decoder handles complex layouts best, but expect higher memory/latency.
    • Deploying to CPU-only nodes, 16GB laptops, or latency-sensitive services? Choose PaddleOCR‑VL. Its dense Ernie decoder (18 layers, hidden 1024) activates fewer parameters per token and keeps memory under 10GB while staying close in quality on most docs.
    • Chasing reading-order accuracy, layout grounding, or multi-page multilingual PDFs on roomy hardware? Pick DotsOCR with BF16 on Metal/CUDA. Prefill runs around 40–50 tok/s on M-series GPUs but can fall to ~12 tok/s on CPU because of the heavy vision tower.

    Why Rust? 💡

    The original DeepSeek-OCR ships as a Python + Transformers stack—powerful, but hefty to deploy and awkward to embed. Rewriting the pipeline in Rust gives us:

    • Smaller deployable artifacts with zero Python runtime or conda baggage.
    • Memory-safe, thread-friendly infrastructure that blends into native Rust backends.
    • Unified tooling (CLI + server) running on Candle + Rocket without the Python GIL overhead.
    • Drop-in compatibility with OpenAI-style clients while tuned for single-turn OCR prompts.

    Technical Stack ⚙️

    • Candle for tensor compute, with Metal and CUDA backends and FlashAttention support.
    • Rocket + async streaming for OpenAI-compatible /v1/responses and /v1/chat/completions.
    • tokenizers (upstream DeepSeek release) wrapped by crates/assets for deterministic caching via Hugging Face and ModelScope mirrors.
    • Pure Rust vision/prompt pipeline shared by CLI and server to avoid duplicated logic.

    Advantages over the Python Release 🥷

    • Faster cold-start on Apple Silicon, lower RSS, and native binary distribution.
    • Deterministic dual-source (Hugging Face + ModelScope) asset download + verification built into the workspace.
    • Automatic single-turn chat compaction so OCR outputs stay stable even when clients send history.
    • Ready-to-use OpenAI compatibility for tools like Open WebUI without adapters.

    Highlights ✨

    • One repo, two entrypoints – a batteries-included CLI for batch jobs and a Rocket-based server that speaks /v1/responses and /v1/chat/completions.
    • Works out of the box – pulls model weights, configs, and tokenizer from whichever of Hugging Face or ModelScope responds fastest on first run.
    • Optimised for Apple Silicon – optional Metal backend with FP16 execution for real-time OCR on laptops.
    • CUDA (alpha) – experimental support via --features cuda + --device cuda --dtype f16; expect rough edges while we finish kernel coverage.
    • Intel MKL (preview) – faster BLAS on x86 via --features mkl (install Intel oneMKL beforehand).
    • OpenAI client compatibility – drop-in replacement for popular SDKs; the server automatically collapses chat history to the latest user turn for OCR-friendly prompts.

    Model Matrix 📦

    The workspace exposes three base model IDs plus DSQ-quantized variants for DeepSeek‑OCR, PaddleOCR‑VL, and DotsOCR:

    Model IDBase ModelPrecisionSuggested Use Case
    deepseek-ocrdeepseek-ocrFP16 (select via --dtype)Full-fidelity DeepSeek‑OCR stack with SAM+CLIP + MoE decoder; use when you prioritise quality on capable Metal/CUDA/CPU hosts.
    deepseek-ocr-q4kdeepseek-ocrQ4_KTight VRAM, local deployments, and batch jobs that still want DeepSeek’s SAM+CLIP pipeline.
    deepseek-ocr-q6kdeepseek-ocrQ6_KDay‑to‑day balance of quality and size on mid‑range GPUs.
    deepseek-ocr-q8kdeepseek-ocrQ8_0Stay close to full‑precision quality with manageable memory savings.
    paddleocr-vlpaddleocr-vlFP16 (select via --dtype)Default choice for lighter hardware; 0.9B Ernie + SigLIP tower with strong doc/table OCR and low latency.
    paddleocr-vl-q4kpaddleocr-vlQ4_KHeavily compressed doc/table deployments with aggressive memory budgets.
    paddleocr-vl-q6kpaddleocr-vlQ6_KCommon engineering setups; blends accuracy and footprint.
    paddleocr-vl-q8kpaddleocr-vlQ8_0Accuracy‑leaning deployments that still want a smaller footprint than FP16.
    dots-ocrdots-ocrFP16 / BF16 (via --dtype)DotsVision + Qwen2 VLM for high‑precision layout, reading order, grounding, and multilingual docs; expect high memory (30–50GB on large pages).
    dots-ocr-q4kdots-ocrQ4_KSidecar DSQ snapshot over the DotsOCR baseline; reduces weight memory/compute while keeping the heavy vision token profile unchanged.
    dots-ocr-q6kdots-ocrQ6_KRecommended balance of size and quality when you already accept DotsOCR’s memory footprint but want cheaper weights.
    dots-ocr-q8kdots-ocrQ8_0Accuracy‑leaning DotsOCR deployment that stays close to FP16/BF16 quality with modest memory savings.

    Quick Start 🏁

    Prerequisites

    • Rust 1.78+ (edition 2024 support)
    • Git
    • Optional: Apple Silicon running macOS 13+ for Metal acceleration
    • Optional: CUDA 12.2+ toolkit + driver for experimental NVIDIA GPU acceleration on Linux/Windows
    • Optional: Intel oneAPI MKL for preview x86 acceleration (see below)
    • (Recommended) Hugging Face account with HF_TOKEN when pulling from the deepseek-ai/DeepSeek-OCR repo (ModelScope is used automatically when it’s faster/reachable).

    Clone the Workspace

    git clone https://github.com/TimmyOVO/deepseek-ocr.rs.git
    cd deepseek-ocr.rs
    cargo fetch
    

    Model Assets

    The first invocation of the CLI or server downloads the config, tokenizer, and model-00001-of-000001.safetensors (~6.3GB) into DeepSeek-OCR/. To prefetch manually:

    cargo run -p deepseek-ocr-cli --release -- --help # dev profile is extremely slow; always prefer --release
    

    Always include --release when running from source; debug builds on this model are extremely slow. Set HF_HOME/HF_TOKEN if you store Hugging Face caches elsewhere (ModelScope downloads land alongside the same asset tree). The full model package is ~6.3GB on disk and typically requires ~13GB of RAM headroom during inference (model + activations).

    Configuration & Overrides 🗂️

    The CLI and server share the same configuration. On first launch we create a config.toml populated with defaults; later runs reuse it so both entrypoints stay in sync.

    PlatformConfig file (default)Model cache root
    Linux~/.config/deepseek-ocr/config.toml~/.cache/deepseek-ocr/models/<id>/…
    macOS~/Library/Application Support/deepseek-ocr/config.toml~/Library/Caches/deepseek-ocr/models/<id>/…
    Windows%APPDATA%\deepseek-ocr\config.toml%LOCALAPPDATA%\deepseek-ocr\models\<id>\…
    • Override the location with --config /path/to/config.toml (available on both CLI and server). Missing files are created automatically.
    • Each [models.entries."<id>"] record can point to custom config, tokenizer, or weights files. When omitted we fall back to the cache directory above and download/update assets as required.
    • Runtime values resolve in this order: command-line flags → values stored in config.toml → built-in defaults. The HTTP API adds a final layer where request payload fields (for example max_tokens) override everything else for that call.

    The generated file starts with the defaults below; adjust them to persistently change behaviour:

    [models]
    active = "deepseek-ocr"
    
    [models.entries.deepseek-ocr]
    
    [inference]
    device = "cpu"
    template = "plain"
    base_size = 1024
    image_size = 640
    crop_mode = true
    max_new_tokens = 512
    use_cache = true
    
    [server]
    host = "0.0.0.0"
    port = 8000
    
    • [models] picks the active model and lets you add more entries (each entry can point to its own config/tokenizer/weights).
    • [inference] controls notebook-friendly defaults shared by the CLI and server (device, template, vision sizing, decoding budget, cache usage).
    • [server] sets the network binding and the model identifier reported by /v1/models.

    See crates/cli/README.md and crates/server/README.md for concise override tables.

    Benchmark Snapshot 📊

    Single-request Rust CLI (Accelerate backend on macOS) compared with the reference Python pipeline on the same prompt and image:

    Stageref total (ms)ref avg (ms)python totalpython/ref
    Decode – Overall (decode.generate)30077.84030077.84056554.8731.88x
    Decode – Token Loop (decode.iterative)26930.21626930.21639227.9741.46x
    Decode – Prompt Prefill (decode.prefill)3147.3373147.3375759.6841.83x
    Prompt – Build Tokens (prompt.build_tokens)0.4660.46645.43497.42x
    Prompt – Render Template (prompt.render)0.0050.0050.0193.52x
    Vision – Embed Images (vision.compute_embeddings)6391.4356391.4353953.4590.62x
    Vision – Prepare Inputs (vision.prepare_inputs)62.52462.52445.4380.73x

    Command-Line Interface 🖥️

    Build and run directly from the workspace:

    cargo run -p deepseek-ocr-cli --release -- \
      --prompt "<image>\n<|grounding|>Convert this receipt to markdown." \
      --image baselines/sample/images/test.png \
      --device cpu --max-new-tokens 512
    

    Tip: --release is required for reasonable throughput; debug builds can be 10x slower.

    macOS tip: append --features metal to the cargo run/cargo build commands to compile with Accelerate + Metal backends.

    CUDA tip (Linux/Windows): append --features cuda and run with --device cuda --dtype f16 to target NVIDIA GPUs—feature is still alpha, so be ready for quirks.

    Intel MKL preview: install Intel oneMKL, then build with --features mkl for faster CPU matmuls on x86.

    Install the CLI as a binary:

    cargo install --path crates/cli
    deepseek-ocr-cli --help
    

    Key flags:

    • --prompt / --prompt-file: text with <image> slots
    • --image: path(s) matching <image> placeholders
    • --device and --dtype: choose metal + f16 on Apple Silicon or cuda + f16 on NVIDIA GPUs
    • --max-new-tokens: decoding budget
    • Sampling controls: --do-sample, --temperature, --top-p, --top-k, --repetition-penalty, --no-repeat-ngram-size, --seed
      • By default decoding stays deterministic (do_sample=false, temperature=0.0, no_repeat_ngram_size=20)
      • To use stochastic sampling set --do-sample true --temperature 0.8 (and optionally adjust the other knobs)

    Switching Models

    The autogenerated config.toml now lists three entries:

    • deepseek-ocr (default) – the original DeepSeek vision-language stack.
    • paddleocr-vl – the PaddleOCR-VL 0.9B SigLIP + Ernie release.
    • dots-ocr – the Candle port of dots.ocr with DotsVision + Qwen2 (use BF16 on Metal/CUDA if possible; see the release matrix for memory notes).

    Pick which one to load via --model:

    deepseek-ocr-cli --model paddleocr-vl --prompt "<image> Summarise"
    

    The CLI (and server) will download the matching config/tokenizer/weights from the appropriate repository (deepseek-ai/DeepSeek-OCR, PaddlePaddle/PaddleOCR-VL, or dots-ocr) into your cache on first use. You can still override paths with --model-config, --tokenizer, or --weights if you maintain local fine-tunes.

    HTTP Server ☁️

    Launch an OpenAI-compatible endpoint:

    cargo run -p deepseek-ocr-server --release -- \
      --host 0.0.0.0 --port 8000 \
      --device cpu --max-new-tokens 512
    

    Keep --release on the server as well; the debug profile is far too slow for inference workloads. macOS tip: add --features metal to the cargo run -p deepseek-ocr-server command when you want the server binary to link against Accelerate + Metal (and pair it with --device metal at runtime).

    CUDA tip: add --features cuda and start the server with --device cuda --dtype f16 to offload inference to NVIDIA GPUs (alpha-quality support).

    Intel MKL preview: install Intel oneMKL before building with --features mkl to accelerate CPU workloads on x86.

    Notes:

    • Use data: URLs or remote http(s) links; local paths are rejected.
    • The server collapses multi-turn chat inputs to the latest user message to keep prompts OCR-friendly.
    • Works out of the box with tools such as Open WebUI or any OpenAI-compatible client—just point the base URL to your server (http://localhost:8000/v1) and select either the deepseek-ocr or paddleocr-vl model ID exposed in /v1/models.
    • Adjust the request body limit with Rocket config if you routinely send large images.

    Open WebUI connected to deepseek-ocr.rs

    GPU Acceleration ⚡

    • Metal (macOS 13+ Apple Silicon) – pass --device metal --dtype f16 and build binaries with --features metal so Candle links against Accelerate + Metal.
    • CUDA (alpha, NVIDIA GPUs) – install CUDA 12.2+ toolkits, build with --features cuda, and launch the CLI/server with --device cuda --dtype f16; still experimental.
    • Intel MKL (preview) – install Intel oneMKL and build with --features mkl to speed up CPU workloads on x86.
    • For either backend, prefer release builds (e.g. cargo build --release -p deepseek-ocr-cli --features metal|cuda) to maximise throughput.
    • Combine GPU runs with --max-new-tokens and crop tuning flags to balance latency vs. quality.

    Repository Layout 🗂️

    • crates/core – shared inference pipeline, model loaders, conversation templates.
    • crates/cli – command-line frontend (deepseek-ocr-cli).
    • crates/server – Rocket server exposing OpenAI-compatible endpoints.
    • crates/assets – asset management (configuration, tokenizer, Hugging Face + ModelScope download helpers).
    • baselines/ – reference inputs and outputs for regression testing.

    Detailed CLI usage lives in crates/cli/README.md. The server’s OpenAI-compatible interface is covered in crates/server/README.md.

    Troubleshooting 🛠️

    • Where do assets come from? – downloads automatically pick between Hugging Face and ModelScope based on latency; the CLI prints the chosen source for each file.
    • Slow first response – model load and GPU warm-up (Metal/CUDA alpha) happen on the initial request; later runs are faster.
    • Large image rejection – increase Rocket JSON limits in crates/server/src/main.rs or downscale the input.

    Roadmap 🗺️

    • ✅ Apple Metal backend with FP16 support and CLI/server parity on macOS.
    • ✅ NVIDIA CUDA backend (alpha) – build with --features cuda, run with --device cuda --dtype f16 for Linux/Windows GPUs; polishing in progress.
    • 🔄 Parity polish – finish projector normalisation + crop tiling alignment; extend intermediate-tensor diff suite beyond the current sample baseline.
    • 🔄 Grounding & streaming – port the Python post-processing helpers (box extraction, markdown polish) and refine SSE streaming ergonomics.
    • 🔄 Cross-platform acceleration – continue tuning CUDA kernels, add automatic device detection across CPU/Metal/CUDA, and publish opt-in GPU benchmarks.
    • 🔄 Packaging & Ops – ship binary releases with deterministic asset checksums, richer logging/metrics, and Helm/docker references for server deploys.
    • 🔜 Structured outputs – optional JSON schema tools for downstream automation once parity gaps close.

    License 📄

    This repository inherits the licenses of its dependencies and the upstream DeepSeek-OCR model. Refer to DeepSeek-OCR/LICENSE for model terms and apply the same restrictions to downstream use.