Implement Datalab-compatible API with async endpoints and deepseek OCR backend

- New endpoints: /api/v1/convert, /api/v1/extract, /api/v1/segment,
  /api/v1/ocr, /api/v1/table_rec, /api/v1/marker (deprecated),
  /api/v1/create-document, /api/v1/files/*, /api/v1/thumbnails
- Async submit-and-poll pattern matching Datalab API spec
- X-API-Key authentication via API_KEY env var
- Filesystem-based request store for multi-worker support
- OCR_BACKEND=deepseek mode: uses deepseek-ocr via ollama for OCR
  (prompt: <|grounding|>Free OCR.)
- build_options() now propagates output_format to parsed_opts
- Fixed docs page CSS curly brace conflict with .format()
- Renamed marker_endpoint_referece.md -> marker_endpoint_reference.md
- Containerfile: added poppler-utils, pandoc; 3 gunicorn workers
- gunicorn.conf: post_fork hook for background worker threads
This commit is contained in:
oval
2026-06-08 11:12:55 +02:00
parent df8d0d6b74
commit 5883565b87
8 changed files with 3237 additions and 263 deletions
+30 -21
View File
@@ -10,7 +10,8 @@ FROM rocm/pytorch:rocm7.2.4_ubuntu24.04_py3.12_pytorch_release_2.9.1
RUN apt-get update && \
apt-get install -y --no-install-recommends \
curl ca-certificates tini procps git gcc g++ zlib1g-dev libjpeg-dev \
libpango-1.0-0 libharfbuzz0b libpangoft2-1.0-0 && \
libpango-1.0-0 libharfbuzz0b libpangoft2-1.0-0 \
poppler-utils pandoc && \
apt-get remove -y python3-blinker || true && \
rm -rf /var/lib/apt/lists/*
@@ -38,34 +39,42 @@ RUN mkdir -p /app/marker/static/fonts && \
chown marker:marker /app/marker/static/fonts/GoNotoCurrent-Regular.ttf
# ---- final image ----
COPY app.py /app/
COPY app.py /app/
COPY request_store.py /app/
COPY deepseek_ocr.py /app/
COPY gunicorn.conf.py /app/
COPY entrypoint.sh /app/entrypoint.sh
RUN chmod +x /app/entrypoint.sh
ENV \
HOME=/app \
PYTHONUNBUFFERED=1 \
PYTHONDONTWRITEBYTECODE=1 \
MARKER_OUTPUT_DIR=/app/conversion_results \
UPLOAD_DIR=/app/uploads \
OLLAMA_HOST=http://localhost:11435 \
DEESEEK_OCR_MODEL=deepseek-ocr \
AMD_COMPUTE=true \
TORCH_DEVICE= \
MODEL_DTYPE=float32 \
PORT=8000 \
HOST=0.0.0.0 \
LLM_SERVICE=marker.services.openai.OpenAIService \
USE_LLM=false \
OPENAI_BASE_URL=http://localhost:11435/v1 \
OPENAI_MODEL= \
GUNICORN_WORKERS=1
ENV HOME=/app
ENV PYTHONUNBUFFERED=1
ENV PYTHONDONTWRITEBYTECODE=1
ENV MARKER_OUTPUT_DIR=/app/conversion_results
ENV UPLOAD_DIR=/app/uploads
ENV RESULTS_DIR=/app/conversion_results
ENV SELF_URL=http://localhost:8001
ENV OLLAMA_HOST=http://localhost:11435
ENV DEESEEK_OCR_MODEL=deepseek-ocr
ENV AMD_COMPUTE=true
ENV TORCH_DEVICE=
ENV MODEL_DTYPE=float32
ENV PORT=8001
ENV HOST=0.0.0.0
ENV LLM_SERVICE=marker.services.openai.OpenAIService
ENV USE_LLM=false
ENV OPENAI_BASE_URL=http://localhost:11435/v1
ENV OPENAI_MODEL=
ENV OCR_BACKEND=marker
ENV DEEPSEEK_OLLAMA_HOST=http://localhost:11434
ENV DEEPSEEK_OCR_MODEL=deepseek-ocr:latest
ENV DEEPSEEK_OCR_PROMPT="<|grounding|>Free OCR."
ENV API_KEY=
ENV GUNICORN_WORKERS=3
USER marker
EXPOSE 8000
EXPOSE 8001
ENTRYPOINT ["/app/entrypoint.sh"]
CMD ["gunicorn", "-c", "gunicorn.conf.py", "app:app_instance"]