docling-Studio

scub-franceMIT活跃维护

可视化文档解析工作台,基于 Docling 在浏览器里配置抽取流程、查看文本表格和边界框,再切分、向量化并写入 OpenSearch 和 Neo4j,方便搭 RAG 和知识图谱。

Visual document analysis studio powered by Docling — configure the extraction pipeline, inspect text, tables and bounding boxes in the browser, then chunk, embed and index into OpenSearch and Neo4j.

v0.7.3发布于 2026-11-02 16:05 UTC271star29fork同步于 2026-11-11 00:01 UTC

怎么上手

由 README 提炼,执行前请确认
docker run -p 3000:3000 ghcr.io/scub-france/docling-studio:latest-local
硬件要求按 README 说明

README 明确说明无需 GPU,可在容器内直接运行 Docling;未列出具体显存或 GPU 型号要求。

纯 CPU 可运行有 Docker 镜像
下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

基于 Docling 的可视化文档解析工作台,在浏览器里看清 PDF 抽出的每个元素

可视化文档解析工作台,基于 Docling 在浏览器里配置抽取流程、查看文本表格和边界框,再切分、向量化并写入 OpenSearch 和 Neo4j,方便搭 RAG 和知识图谱。

核心能力

  • 在页面上画出每个标题、段落、表格和图片的边界框
  • 点击文档树元素即显示其文本或表格内容,可隐藏指定元素类型
  • 用本地 Ollama 模型对文档提问并展示推理步骤
  • 把解析结果导出为 Markdown 或 Docling JSON
  • 通过 MCP 让 AI 代理读取并引用文档内容

容易踩的坑

MCP 默认开启且无身份验证,需保持 3000 端口不对外暴露;Ask 功能需另行启用本地 Ollama 模型;也可改为连接自建的 Docling Serve 服务器而非容器内置解析。

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

最近发版

5 个版本v0.7.3
  1. v0.7.3最新正式版2026-11-02 · 2026-11-02 16:05 UTC

    This release opens your parsed documents to AI agents. A built-in MCP server lets Claude Code, Claude Desktop or any MCP client read a document the way it is structured: the agent reads the map, then only the sections a question needs, and cites passages the server verifies. There are no chunks and no embeddings. Around it, Studio learns to import Docling analyses and to analyse documents in batches, and the document workspace moves onto the analysis viewer.


    ✨ Added

    MCP document server — Chunkless RAG (#327, #363, #364)

    Studio now serves its parsed documents over MCP. It is on by default over HTTP at /mcp, and also available over stdio through mcp_stdio.py.

    An agent finds a document with find_documents and reads its map with get_outline, where each entry carries its reading cost in tokens. It then reads one section at a time with read_element, under a token budget. Every element comes back with a dstudio:// anchor pinned to the parse it was read from. verify_citation checks each quote server-side before it is published, and a citation's deep link opens the analysis on the cited element.

    • The chunkless_rag prompt runs that loop in at most 5 rounds, the same cap as Studio's own Ask. Each round reads one section, says why it was read, and says what it found.
    • The answer ends on one MCP Apps card, show_sources. It shows a strip of the document's pages with each quote's place marked, and the real page with the quoted lines highlighted, found in the PDF's text layer. Each quote is marked as verified or not. A details tab adds the rounds, the tokens and the share of the document that was read.
    • Settings → MCP server turns the server off and on with no restart (when it is off, /mcp answers 503). It also edits the round cap, the read ceiling and the deep-link base live, gives ready-to-copy client configs, and lists what the running server publishes. New routes: GET, PUT and DELETE /api/config/mcp, and GET /api/mcp/server.

    The server has no authentication, like the rest of the app: anyone who can reach /mcp can read every document. MCP_ALLOWED_HOSTS blocks DNS rebinding from a browser, but it does not control network access. Keep port 3000 private, put an authenticating proxy in front, or set MCP_ENABLED=false. A Hugging Face Space keeps the server off unless MCP_ENABLED=true is set. Client configs and the full tool contract are in docs/mcp-server.md.

    Import a Docling analysis (#359)

    A Docling JSON made elsewhere, by the docling CLI, Docling Serve or another Studio, can now be attached to a document without converting it again. Import analysis, in a document's actions menu, takes a .json file, and the upload area takes a PDF and its Docling JSON together. The JSON is validated against the DoclingDocument schema, then stored as a completed analysis with its Markdown, HTML, page details and History entry, as if Studio had converted it. New route: POST /api/analyses/import.

    Batch analysis (#354)

    Analysing a corpus meant opening each document and clicking New analysis. The documents library now has a checkbox per row and a select-all checkbox. Analyze starts one analysis per selected document and opens the Analyses page. That page refreshes the statuses until the analyses end, and shows the percentage of the batched ones. The statuses come from a new, light GET /api/analyses/summaries, polled every 3 s, because the full list carries every analysis's content.

    Parse view — Show all and Hide boxes (#338, #343)

    Selecting an element dims every other bbox, and nothing in the UI led back out. Show all in the LAYERS bar now clears the selection, so every visible bbox is drawn at full strength again. Seeing the bare page meant clicking every LAYERS chip. Hide boxes now hides every element type in one click, and Show boxes brings them back.


    🔧 Changed

    • **The document workspace uses the ana
  2. v0.7.22026-09-22 · 2026-09-22 12:12 UTC
    查看更新说明

    A hotfix for 0.7.1. No backend or API change.

    🐛 Fixed

    The preview scrolls to the focused element once, without the page collapsing (#336).

    Selecting a node in the structure tree made the stacked preview flicker and land somewhere other than the element. The preview only mounts the raster of pages inside its render window, and nothing reserved the box of the others: an off-window card collapsed to its header and re-inflated once its image decoded. Every scroll target was computed against a layout changing underneath it.

    Each page frame now holds the page's own aspect ratio and natural raster width, so a card keeps its height with no image mounted. On top of that stable layout:

    • the focus scroll measures the frame rather than the image, so a bbox on a page far outside the window is centred on the first click, not on a later load event;
    • the three watchers a single focus wakes (highlight, focus tick, current page) coalesce into one scroll per flush instead of three competing smooth scrolls;
    • the page carrying the highlight keeps its raster — and its overlay — for as long as it is the target.

    🛠️ Development

    Worktree-friendly development stack (#324). docker-compose.dev.yml no longer binds fixed host ports or named volumes, so several worktrees can run their stack side by side: the parser is reached over the compose network, uploads and SQLite state are bind-mounted under document-parser/, and the frontend host port comes from FRONTEND_HOST_PORT (default 3000). A new .development_scripts/worktree_setup.sh prepares dependencies and copies local state into a fresh worktree; paseo.json wires it up for Paseo users.

    Heads-up for existing dev setups: the dev parser no longer publishes port 8000 on the host, and its data moved from the uploads_data / db_data named volumes to document-parser/uploads and document-parser/data. Documents stored in the old volumes are not migrated. Published images and docker-compose.yml are unaffected.

    Trying it

    docker run -p 3000:3000 ghcr.io/scub-france/docling-studio:0.7.2-local
    

    Full changelog: CHANGELOG.md · Compare: v0.7.1...v0.7.2

  3. v0.7.12026-08-24 · 2026-08-24 20:24 UTC
    查看更新说明

    A packaging fix for 0.7.0. No feature changes.

    🐛 Fixed

    The published local image now contains the reasoning stack.

    release.yml never passed the WITH_REASONING build argument, so docling-agent and mellea were excluded from ghcr.io/scub-france/docling-studio:0.7.0-local. On that image, POST /api/documents/{docId}/reasoning answered 503 and the Ask panel stayed hidden — 0.7.0's headline feature was unreachable from the image people actually pull. The runtime configuration panel added in #317 can toggle reasoning, but it cannot install packages.

    release.yml now passes WITH_REASONING=true on the local target. The lightweight remote image is unchanged — its build stage does not declare the ARG and stays deliberately slim — and builds from source keep the opt-in default (--build-arg WITH_REASONING=true).

    README reasoning section corrected. It still described the v1 graph overlay that 0.7.0 removed, and still called the stack "disabled by default". It now documents the Parse-view timeline, what the published image contains, and two upstream limits that had never been written down: docling-agent 0.6.0's chunkless loop emits only READ steps (the other kinds are reserved wire-contract values), and it reports no per-step duration, so the timeline renders in "step-order" mode by design rather than as a fallback.

    ⚠️ Known gap

    The release gate has no reasoning coverage at all: no workflow builds a WITH_REASONING image, and release-gate.yml contains no reasoning job. A fully green gate says nothing about this feature — which is precisely how 0.7.0 shipped without it. The e2e-ui-reasoning job specified in docs/design/303-reasoning-trace-v2-parse-view.md was never created. Recorded here rather than quietly carried; worth landing before the next release that touches reasoning.

    Trying it

    docker run -p 3000:3000 ghcr.io/scub-france/docling-studio:0.7.1-local
    

    For reasoning, add a reachable Ollama with your model already pulled:

    docker run -p 3000:3000 \
      --add-host=host.docker.internal:host-gateway \
      -e REASONING_ENABLED=true \
      -e OLLAMA_HOST=http://host.docker.internal:11434 \
      -e REASONING_MODEL_ID=gpt-oss:20b \
      ghcr.io/scub-france/docling-studio:0.7.1-local
    

    On native Linux Docker, --network=host with OLLAMA_HOST=http://localhost:11434 also works.

    Full changelog: CHANGELOG.md · Compare: v0.7.0...v0.7.1

  4. v0.7.02026-08-24 · 2026-08-24 20:04 UTC
    查看更新说明

    This release replaces the standalone reasoning page with a trace surface built into the Parse view, where every citation resolves to a real element of your PDF. It also makes the reasoning stack configurable at runtime, and considerably slims down what the app tries to be.


    ✨ Added

    Reasoning Trace v2 — timeline + Ask panel in the Parse view (#303)

    Reasoning runs inside the Parse view of an analysis (Analyses → open a run), replacing the standalone /reasoning page.

    • A conversational Ask panel (composer + turn cards) drives the runs.
    • Each step carries a typed kind. The wire contract defines PLAN, RETRIEVE, RERANK, READ, VERIFY, ANSWER and MAP, reserved end-to-end so future agent phases render without a contract change. docling-agent 0.6.0's chunkless RAG loop emits only READ, so today every step in a real trace is a READ.
    • Timing: the run's wall-clock total is captured server-side and is real. Per-step durations are not reported by docling-agent 0.6.0, so the timeline renders in its uniform "step-order" mode with an explicit footnote rather than drawing bars that would be fiction. Per-step bars light up automatically once docling-agent#42 lands.
    • The part that works today, and is the point of the release: focusing a step reveals and scrolls the linked element across the PDF preview, the document tree and the Parse view — page flip, bbox highlight, ancestor auto-expand, and reverse selection. Citations are anchored in the document, not printed beside it.

    Backend trace projection (#303)

    A pure domain.trace_builder projects the raw docling-agent ReasoningResult onto a debugger-facing ReasoningTrace. A new ReasoningService owns the run (query validation, latest-analysis lookup, wall-clock timing), so api/documents/{id}/reasoning no longer reaches into app.state directly.

    Runtime reasoning configuration from the admin panel (#317)

    A Reasoning section in /settings enables/disables reasoning and sets the Ollama URL, default model and RAG max_iterations — without a backend restart. The runner and service are rebuilt in place and /api/health follows, so the Ask surface appears and disappears live.

    • Overrides persist in a new SQLite app_settings table. Env vars become bootstrap defaults; each field reports whether its value came from env or db, and reset to environment drops the overrides.
    • A test connection action probes the host and turns the model field into a select of the models actually installed.
    • Read-only diagnostics (docling-agent version + import path, provider, availability) make boot failures visible from the UI instead of the container logs.
    • New endpoints: GET / PUT / DELETE /api/config/reasoning and POST /api/config/reasoning/test. On HuggingFace deployments only GET is served — PUT, DELETE and the connection probe return 403, the probe included because it is a server-side request to a user-supplied URL.
    • max_iterations is now actually threaded into DoclingRAGAgent (new REASONING_MAX_ITERATIONS, default 5).

    Analyses workspace

    A dedicated Analyses section lists every run and opens its saved visualization independently of the document preview. A document can carry several analyses, and this is where the Parse view (and therefore reasoning) now lives.


    🔧 Changed

    • The document workspace is preview-only. /docs/:id renders the document header and page preview. Chunking and ingestion controls are gone from it, related analyses are listed separately, and deleting a document explicitly confirms the analysis cascade.
    • Reasoning backend ported to the public run_with_trace() surface (#303). docling-agent is pinned to 0.6.0 and the adapter binds to a public, version-asserted API instead of the private _rag_loop(). A missing or unusable agent is detected *
  5. v0.6.22026-06-09 · 2026-06-09 08:23 UTC
    查看更新说明

    0.6.2 — audit-driven release. Closes the 4 CRIT + 4 MAJ flagged by the 0.6.1 audit and the 0.6.2 release-gate audit.

    Highlights

    • Image size cut by ~half — latest-local drops from 6.04 GB to 3.11 GB (-48%), and a new slim latest-remote ships at 547 MB. Details below.
    • docling-serve container added under the remote compose profile — the backend now ships a slim image that delegates conversion to quay.io/docling-project/docling-serve-cpu:v1.21.0 over HTTP. Zero HuggingFace Hub dependency in build or runtime.
    • Backend + embedding-service migrated from pip to uv. Single source of truth is now pyproject.toml + uv.lock. BREAKING for anyone bootstrapping from requirements*.txt.
    • BAKE_MODELS default flipped from true to false in both Dockerfiles. The only sanctioned HF touch in the project is now the latest-local GHCR build in release.yml. BREAKING for operators building from source — pass --build-arg BAKE_MODELS=true explicitly to restore the old behaviour. See docs/architecture/huggingface-dependency-map.md.
    • Reasoning stack made opt-in via --build-arg WITH_REASONING=true (#254). BREAKING — without the flag, /api/reasoning responds 503.

    Pre-built images — major size reduction

    The latest-local image dropped by ~48% (-2.93 GB) versus 0.5.1, and the new remote variant ships at 547 MB — about an order of magnitude smaller than 0.5.1's only published variant. Pulls are faster, hosts use less disk, and cold starts are quicker.

    Image0.5.10.6.2Δ
    latest-local (Docling + models baked in)6.04 GB3.11 GB-2.93 GB (-48%)
    latest-remote (talks to docling-serve over HTTP)—547 MBnew — -91% vs 0.5.1 local

    Where the bytes went:

    • uv migration (#254) — smaller resolved venv vs pip, deterministic lockfile, no transitive bloat that nobody noticed under pip's resolver.
    • Explicit CPU-only torch via [tool.uv.sources] — drops ~3 GB of useless CUDA wheels that used to come along for the ride on latest-local.
    • Reasoning made opt-in — docling-agent + mellea + their LLM SDK transitive weight move out of the default image. Rebuild with --build-arg WITH_REASONING=true to keep them.
    • BAKE_MODELS opt-in for non-release builds — only release.yml builds the local target with the ~1.3 GB Docling checkpoint bake; the remote variant carries none.
    • Hardened .dockerignore — leaner build context, no spurious layer churn on every rebuild.

    Tags published

    Both targets are tagged three ways for pinning flexibility:

    • ghcr.io/scub-france/docling-studio:0.6.2-remote / 0.6-remote / latest-remote
    • ghcr.io/scub-france/docling-studio:0.6.2-local / 0.6-local / latest-local

    Added

    • Docling Serve container wired into compose (#audit-10, dd1962e, bc9b4f8): new docling-serve service under the remote compose profile, pinned to quay.io/docling-project/docling-serve-cpu:v1.21.0. Pairs with CONVERSION_MODE=remote so the backend image stays slim and talks to a Docling Serve container over HTTP — no HF Hub dep on the build or runtime path. CI/release-gate E2E jobs now use this combo.
    • HuggingFace dependency map (docs/architecture/huggingface-dependency-map.md): exhaustive list of every HF call site in the project, the single sanctioned touch point (release.yml → latest-local), and the maintenance rule that every new HF dep must be opt-in.

    Changed

    • Backend + embedding-service migrated from pip to uv (#254, 4d9bcf6): document-parser/requirements*.txt and embedding-service/requirements.txt removed; uv.lock plus `pyp

用户点评

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

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

    README 原文

    未翻译

    Docling Studio

    License: MIT Python Node Docling CI GitHub Stars

    See what Docling extracts from your PDFs: every title, paragraph, table and picture, with its box drawn on the page.

    Docling Studio parses a PDF, then Claude answers from it over MCP, with cited sources

    Run it

    docker run -p 3000:3000 ghcr.io/scub-france/docling-studio:latest-local
    

    Open http://localhost:3000 and import a PDF. No GPU needed.

    To build from source with Docker Compose, or to turn on Ask with a local model, see Get started.

    What it does

    • Runs Docling on your PDFs, in the container or on your own Docling Serve server.
    • Draws the box of every element on the page, next to the document tree.
    • Shows the text or the table of the element you click. Element types can be hidden.
    • Answers questions about a document with a local model (Ollama), and shows the steps it took.
    • Exports the result as Markdown or Docling JSON.
    • Lets AI agents read and cite your documents over MCP (on by default, no authentication: keep port 3000 private; switchable in Settings).

    Documentation

    PageWhat is in it
    Get startedDocker image, Docker Compose, turning on Ask
    User guideThe screens, step by step
    ConfigurationSettings and optional services
    MCP serverLetting agents read and cite your documents
    TroubleshootingCommon problems
    ArchitectureHow the code is organized
    ContributingDev setup, tests, branches, pull requests

    The same pages are online at https://scub-france.github.io/Docling-Studio/.

    License

    MIT

    Star history