مستند زنده معماری پیادهسازیشده: مرز مسئولیت در پلتفرم Patent Genie،
قراردادهای RabbitMQ، خط لوله LangGraph، مسیر dev ingest و استقرار Docker.
اجزای اصلی
این جدول ownership و رابط هر جزء را نشان میدهد. core-api، RabbitMQ و Object Storage
وابستگیهای بیرونی این repository هستند.
جزء
نقش
رابط
رفتار مهم
core-api (بیرون از این مخزن)
مالک پرونده، آپلود سند و orchestrator استخراج ناهمزمان
RabbitMQ: patent_genie.events
DocumentExtractionRequested را publish میکند و completed/failed را از inbox دریافت و متن نرمالشده را در Object Storage ذخیره میکند.
FastAPI API
health، ATP، صفحه معماری و dev ingest همزمان
docker-compose profile: api · /api/v1/*
POST /api/v1/dev/ingest/extract فقط در APP_ENV=local|docker-dev فعال است؛ Swagger در production بهطور پیشفرض غیرفعال است.
Extraction worker
مصرفکننده DocumentExtractionRequested و اجرای خط لوله LangGraph
queue: document.extraction.requested
فایل اصلی را از Object Storage میخواند، checksum را اعتبارسنجی میکند و متن نرمالشده را inline در completed منتشر میکند.
LangGraph intake pipeline
validate → parse (pdf/docx/txt) → normalize
src/graphs/intake_graph.py
PDF با PyPDFLoader، PyMuPDF و OCR fallback؛ DOCX/TXT با loader اختصاصی؛ خروجی صفحات نرمالشده با metadata کیفیت و زبان.
RabbitMQ
انتقال durable رویدادهای requested، completed و failed
exchange: patent_genie.events
Topic exchange، صف document.extraction.requested با prefetch=1؛ خطاهای retryable دوباره در صف قرار میگیرند.
Object Storage (S3/Ceph)
ذخیره فایل اصلی سند؛ worker فقط read-only
bucket: storage_bucket در رویداد
کلید artifact با workspace_id اعتبارسنجی میشود؛ worker نتیجه را روی دیسک پایدار نمینویسد.
OCR engine
fallback برای PDF اسکنشده یا متن ضعیف
src/ingestion/ocr.py
وقتی متن native از PDF کوتاهتر از آستانه باشد، OCR فارسی/انگلیسی اجرا میشود؛ فایلهای موقت پس از پردازش حذف میشوند.
مرز سرویس در پلتفرم
این مخزن مسئول پارس و نرمالسازی متن خام PDF، DOCX و TXT است. core-api مالک پرونده و وضعیت محصول است؛ ai-workflow روی متن نرمالشده استخراج زمینه اختراع انجام میدهد.
ورودی production: رویداد DocumentExtractionRequested با bucket، storage_key، checksum و metadata سند.
worker فایل اصلی را از Object Storage دانلود میکند؛ خروجی terminal: completed با normalized_text_inline یا failed با error_category.
core-api متن inline را در inbox دریافت و بهعنوان artifact در Object Storage ذخیره میکند؛ سپس context.extraction.requested را به ai-workflow میفرستد.
این سرویس chunking، embedding، Milvus و index برداری انجام نمیدهد.
مسیر dev: POST /api/v1/dev/ingest/extract همان خط لوله intake را بدون RabbitMQ اجرا میکند.
flowchart TB
user["کاربر / Frontend"]
core["core-api<br/>مالک پرونده"]
store[("S3 / Ceph<br/>فایل اصلی + artifact متن")]
aw["ai-workflow<br/>استخراج زمینه اختراع"]
user --> core
core -->|"آپلود سند"| store
subgraph extraction ["info-extraction — این مخزن"]
direction LR
docReq["RabbitMQ<br/>document.extraction.requested"]
worker["extraction-worker<br/>LangGraph intake"]
docResult["RabbitMQ<br/>document.extraction.completed / failed"]
docReq --> worker --> docResult
end
core --> docReq
store -->|"خواندن read-only"| worker
docResult -->|"متن نرمالشده inline"| core
core -->|"ذخیره artifact متن"| store
core -->|"context.extraction.requested"| aw
store -->|"خواندن متن نرمالشده"| aw
مسیر ناهمزمان (RabbitMQ)
در production، core-api رویداد درخواست را publish میکند. extraction-worker با prefetch=1 هر پیام را پردازش میکند و رویداد terminal را به exchange برمیگرداند.
FastAPI برای health، ATP، معماری و dev ingest در دسترس است. مسیر dev ingest همان intake graph را بدون RabbitMQ اجرا میکند.
GET /health و GET /api/v1/health: وضعیت سرویس و وابستگیهای RabbitMQ و object storage.
POST /api/v1/dev/ingest/extract: multipart upload PDF/DOCX/TXT تا 50MB؛ فقط وقتی APP_ENV=local یا docker-dev باشد.
GET /، /atp/، /architecture/: صفحات HTML فارسی برای مستندات داخلی.
Swagger/ReDoc فقط در local، docker-dev یا با ENABLE_API_DOCS=true فعال است.
flowchart TB
client["Client / Swagger / ATP"]
api["FastAPI — info-extraction/api"]
home["GET /"]
health["GET /api/v1/health"]
atp["GET /atp/*"]
arch["GET /architecture/"]
dev["POST /api/v1/dev/ingest/extract<br/>dev only"]
intakePipeline["ingest_document<br/>LangGraph"]
response["DevIngestResponse<br/>pages + full text + metrics"]
client --> api
api --> home
api --> health
api --> atp
api --> arch
api --> dev --> intakePipeline --> response
استقرار Docker Compose
Compose دو profile دارد: api برای HTTP و extraction-worker برای مصرف RabbitMQ. RabbitMQ و S3/Ceph روی شبکه external patent-genie-local باید از قبل در دسترس باشند.
api: Dockerfile.dev، uvicorn با reload، bind-mount src/scripts/contracts، پورت پیشفرض 8000.
extraction-worker: Dockerfile production، scripts/run_event_worker.py، بدون پورت عمومی.
هر دو سرویس به rabbitmq:5672 و rgw:7480 متصل میشوند؛ credentialها از .env میآیند.
docker-compose.dev.yml برای worker توسعه با mount قابل نوشتن src در دسترس است.
flowchart TB
subgraph compose ["docker-compose.yml"]
api["api (profile: api)<br/>uvicorn :8000 --reload"]
worker["extraction-worker (profile: worker)<br/>run_event_worker.py"]
end
net[["external network<br/>patent-genie-local"]]
rmq[("RabbitMQ :5672")]
s3[("S3 / Ceph rgw:7480")]
api --- net
worker --- net
net --- rmq
net --- s3