6d2edc6753
Remove all local PDF/OCR extraction and quality gate logic from review_service.py, replacing it with calls to the shared-ai-platform document extraction service via the SDK. Removed from review_service.py: - 17 local PDF/OCR methods (_extract_text_from_pdf, _classify_pdf_source, _extract_text_from_pdf_with_ocr, _extract_text_from_image_with_ocr, _evaluate_ocr_quality, _looks_like_platform_review_report, etc.) - All PDF/OCR constants (PDF_TEXT_PATTERN, PDF_NOISE_LINE_PATTERN, REPORT_PDF_MARKERS, OCR_GATE_*, PDF_SOURCE_KIND_*, etc.) - Imports: pdfplumber, pypdfium2, pytesseract, PIL.Image Added: - extract_review_upload_text() now calls shared platform's client.extract_document_text() directly - _detect_upload_type() retained locally for upload validation only - Protocol methods extract_document_text, classify_pdf_source in client Removed from requirements.txt: pdfplumber, pytesseract Added to config: shared_ai_platform_document_extraction_enabled Also includes prior changes: - Model settings and chat history stabilization - Mobile UI polish - Governance launch-closure enhancements Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
97 lines
4.2 KiB
YAML
97 lines
4.2 KiB
YAML
version: "3.9"
|
|
|
|
services:
|
|
redis:
|
|
image: redis:7
|
|
restart: unless-stopped
|
|
|
|
backend:
|
|
build:
|
|
context: ./backend
|
|
dockerfile: Dockerfile
|
|
restart: unless-stopped
|
|
depends_on:
|
|
redis:
|
|
condition: service_started
|
|
environment:
|
|
APP_NAME: ${APP_NAME:-AI Contract Platform}
|
|
APP_ENV: ${APP_ENV:-production}
|
|
SECRET_KEY: ${SECRET_KEY:?Set SECRET_KEY in .env before starting production}
|
|
DATABASE_URL: ${DATABASE_URL:?Set DATABASE_URL in .env before starting production}
|
|
REDIS_URL: ${REDIS_URL:-redis://redis:6379/0}
|
|
MINIO_ENDPOINT: ${MINIO_ENDPOINT:-192.168.3.90:9000}
|
|
MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY:?Set MINIO_ACCESS_KEY in .env before starting production}
|
|
MINIO_SECRET_KEY: ${MINIO_SECRET_KEY:?Set MINIO_SECRET_KEY in .env before starting production}
|
|
MINIO_BUCKET: ${MINIO_BUCKET:-contracts}
|
|
SHARED_AI_PLATFORM_BASE_URL: ${SHARED_AI_PLATFORM_BASE_URL:-http://192.168.3.90:18011}
|
|
SHARED_AI_PLATFORM_API_PREFIX: ${SHARED_AI_PLATFORM_API_PREFIX:-/api/v0.2}
|
|
SHARED_AI_PLATFORM_APP_ID: ${SHARED_AI_PLATFORM_APP_ID:-ai-contract-platform}
|
|
SHARED_AI_PLATFORM_API_KEY: ${SHARED_AI_PLATFORM_API_KEY:?Set SHARED_AI_PLATFORM_API_KEY in .env before starting production}
|
|
SHARED_AI_PLATFORM_TIMEOUT_SECONDS: ${SHARED_AI_PLATFORM_TIMEOUT_SECONDS:-180}
|
|
SHARED_AI_PLATFORM_LEGAL_REVIEW_ENABLED: ${SHARED_AI_PLATFORM_LEGAL_REVIEW_ENABLED:-true}
|
|
SHARED_AI_PLATFORM_LEGAL_REVIEW_FALLBACK_TO_LOCAL: ${SHARED_AI_PLATFORM_LEGAL_REVIEW_FALLBACK_TO_LOCAL:-false}
|
|
command: >
|
|
sh -c "alembic upgrade head &&
|
|
uvicorn app.main:app --host 0.0.0.0 --port 8000"
|
|
volumes:
|
|
- backend_storage:/app/storage
|
|
ports:
|
|
- "8001:8000"
|
|
|
|
legal-change-impact-worker:
|
|
build:
|
|
context: ./backend
|
|
dockerfile: Dockerfile
|
|
restart: unless-stopped
|
|
depends_on:
|
|
backend:
|
|
condition: service_started
|
|
environment:
|
|
APP_NAME: ${APP_NAME:-AI Contract Platform}
|
|
APP_ENV: ${APP_ENV:-production}
|
|
SECRET_KEY: ${SECRET_KEY:?Set SECRET_KEY in .env before starting production}
|
|
DATABASE_URL: ${DATABASE_URL:?Set DATABASE_URL in .env before starting production}
|
|
REDIS_URL: ${REDIS_URL:-redis://redis:6379/0}
|
|
MINIO_ENDPOINT: ${MINIO_ENDPOINT:-192.168.3.90:9000}
|
|
MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY:?Set MINIO_ACCESS_KEY in .env before starting production}
|
|
MINIO_SECRET_KEY: ${MINIO_SECRET_KEY:?Set MINIO_SECRET_KEY in .env before starting production}
|
|
MINIO_BUCKET: ${MINIO_BUCKET:-contracts}
|
|
SHARED_AI_PLATFORM_BASE_URL: ${SHARED_AI_PLATFORM_BASE_URL:-http://192.168.3.90:18011}
|
|
SHARED_AI_PLATFORM_API_PREFIX: ${SHARED_AI_PLATFORM_API_PREFIX:-/api/v0.2}
|
|
SHARED_AI_PLATFORM_APP_ID: ${SHARED_AI_PLATFORM_APP_ID:-ai-contract-platform}
|
|
SHARED_AI_PLATFORM_API_KEY: ${SHARED_AI_PLATFORM_API_KEY:?Set SHARED_AI_PLATFORM_API_KEY in .env before starting production}
|
|
SHARED_AI_PLATFORM_TIMEOUT_SECONDS: ${SHARED_AI_PLATFORM_TIMEOUT_SECONDS:-180}
|
|
SHARED_AI_PLATFORM_LEGAL_REVIEW_ENABLED: ${SHARED_AI_PLATFORM_LEGAL_REVIEW_ENABLED:-true}
|
|
SHARED_AI_PLATFORM_LEGAL_REVIEW_FALLBACK_TO_LOCAL: ${SHARED_AI_PLATFORM_LEGAL_REVIEW_FALLBACK_TO_LOCAL:-false}
|
|
LEGAL_CHANGE_IMPACT_WORKER_BATCH_SIZE: ${LEGAL_CHANGE_IMPACT_WORKER_BATCH_SIZE:-10}
|
|
LEGAL_CHANGE_IMPACT_WORKER_INTERVAL_SECONDS: ${LEGAL_CHANGE_IMPACT_WORKER_INTERVAL_SECONDS:-300}
|
|
LEGAL_CHANGE_IMPACT_SEMANTIC_ENABLED: ${LEGAL_CHANGE_IMPACT_SEMANTIC_ENABLED:-true}
|
|
command: >
|
|
python -m app.tasks.legal_change_impact_worker
|
|
--limit 10
|
|
--interval-seconds 300
|
|
volumes:
|
|
- backend_storage:/app/storage
|
|
|
|
frontend:
|
|
profiles:
|
|
- single-host
|
|
build:
|
|
context: ./frontend
|
|
dockerfile: Dockerfile
|
|
args:
|
|
BACKEND_BASE_URL: ${FRONTEND_BACKEND_BASE_URL:-http://backend:8000}
|
|
restart: unless-stopped
|
|
depends_on:
|
|
backend:
|
|
condition: service_started
|
|
environment:
|
|
NEXT_PUBLIC_API_BASE_URL: ${NEXT_PUBLIC_API_BASE_URL:-/api/v1}
|
|
BACKEND_BASE_URL: ${FRONTEND_BACKEND_BASE_URL:-http://backend:8000}
|
|
NODE_ENV: production
|
|
ports:
|
|
- "${FRONTEND_HOST_PORT:-3003}:3000"
|
|
|
|
volumes:
|
|
backend_storage:
|