← بازگشت به صفحه اصلی
Architecture

معماری سرویس گردش‌کار هوش مصنوعی

مستند زنده معماری پیاده‌سازی‌شده: مرز مسئولیت با core-api، قراردادهای HTTP و رویداد، workerهای context / prior-art / drafting / conversation، مسیر میراث edit، package محلی Office Action، خط لوله‌های AI و استقرار Docker.

اجزای اصلی

این جدول ownership و رابط هر جزء را نشان می‌دهد. core-api، RabbitMQ، Object Storage و providerهای AI وابستگی‌های بیرونی این repository هستند.

جزء نقش رابط رفتار مهم
core-api (بیرون از این مخزن) مالک پرونده، RBAC، outbox/inbox و projection وضعیت محصول RabbitMQ · InboxEvent · SSE/WS کلید artifact و شناسه‌ها را در requested می‌فرستد؛ document/context/prior-art/draft/conversation inboxها نتیجه را idempotent اعمال می‌کنند.
info-extraction (بیرون از این مخزن) پارس PDF/DOCX/TXT، OCR/ASR و نرمال‌سازی متن queue: document.extraction.requested فایل اصلی را read-only از Object Storage می‌خواند؛ محلی: extraction-mock. chunking، embedding و Milvus ندارد.
FastAPI API رابط HTTP همزمان برای health، credit، extract، prior-art، claims، description و rewrite docker-compose: api · /api/v1/* ('مسیر توسعه/ATP/Swagger؛ GET /api/v1/credit استثنای محصول برای موجودی AvalAI است؛ استخراج فقط .txt UTF-8؛ صفحات /، /architecture/، /quality/، /atp/. گفتگوی محصول HTTP ندارد.',)
Context extraction worker استخراج InventionContext و چرخه سؤال‌های تکمیلی queue: context.extraction.requested schema_version 2؛ artifact ورودی فقط‌خواندنی؛ snapshot را inline در completed/questions_required منتشر می‌کند.
Prior-art search worker جستجوی پیشینه فنی، غنی‌سازی IPC/CPC و رتبه‌بندی مراجع queue: prior_art.search.requested schema_version 2؛ InventionContext را از S3 می‌خواند؛ JSON نتیجه + manifest را می‌نویسد. محلی: prior-art-mock جایگزین‌پذیر است.
Prior-art report worker انتخاب خانوادهٔ متمایز top-k و تولید گزارش فارسی پیشینه queue: prior_art.report.requested نتیجه search را می‌خواند؛ top_k تا prior_art_report_top_k محدود می‌شود؛ report.md، JSON و manifest ذخیره می‌شوند.
Claims draft worker تولید ادعانامه فارسی از context و نتیجه جستجوی پیشینه queue: draft.claims.requested schema_version 1؛ ورودی فقط‌خواندنی از S3؛ claims_draft را inline در completed برمی‌گرداند؛ Core آن را در S3 و بخش claims می‌نویسد.
Description draft worker تولید توصیف و خلاصه فارسی با checkpoint و resume queue: draft.description.requested completed_checkpoints از Core را محترم می‌شمارد؛ progress مرحله‌ای دارد؛ description_draft (با abstract جدا) inline برمی‌گردد.
Conversation worker نوبت‌های discover و draft روی قرارداد conversation.v1 queue: conversation.turn.requested agent_key=discover (بسته گردش‌کار / دانش) و agent_key=draft (propose_draft_edit متن ساده، بدون ProseMirror). control + stream plane.
Draft edit / fragment workers (میراث) مسیرهای رویداد قدیمی بازنویسی واحد و fragment-edit draft.edit.* · draft.fragment_edit.* هنوز در compose هستند؛ مسیر محصول ویرایش انتخاب‌شده از طریق conversation draft است (ADR-0020 / event-schema ADR-0011).
Office Action package عامل پاسخ اظهارنظر اداره ثبت (دامنه آماده، bus هنوز نه) patent_genie_ai.office_action · harness run_office_action_response با phase-gated ReAct؛ بدون event-schema / worker / inbox در Core. agent_key=office_action برای conversation نامعتبر است.
RabbitMQ اتوبوس رویداد requested / progress / completed / failed / stream exchange: patent_genie.events · DLX: patent_genie.dlx Topic exchange، صف‌های durable، prefetch=1؛ conversation stream روی صف TTL جدا؛ DLQ برای خطای مدیریت‌نشده.
Object Storage (S3/Ceph) انتقال artifactهای حجیم میان Core و workerها workspaces/{workspace_id}/… context/draft/conversation: read-only؛ prior-art: read/write برای JSON/manifest/report؛ کلیدها قبل از دسترسی با workspace_id validate می‌شوند.
LLM و providerهای بیرونی استخراج ساخت‌یافته، عامل‌های ReAct، جستجو، واکشی محتوا و rerank AvalAI/OpenAI · Tavily · Firecrawl · Cohere rerank provider از environment؛ usage در outcomeها برای ledger Core؛ tracing اختیاری Langfuse در draft و conversation.

مرز سرویس در پلتفرم

این مخزن لایه اجرای AI است، نه مالک پرونده و نه پردازشگر فایل خام. core-api وضعیت محصول را نگه می‌دارد؛ info-extraction متن را از اسناد خام می‌سازد؛ ai-workflow روی متن نرمال‌شده، InventionContext، prior-art، پیش‌نویس claims/description، نوبت‌های conversation و (به‌صورت package محلی) Office Action کار می‌کند.

flowchart TB
  user["کاربر / Frontend MVP"] --> core["core-api"]
  core --> store[("S3 / Ceph")]
  providers["LLM / Search / Rerank"]

  subgraph stage1 ["1. Document extraction"]
    direction TB
    docReq["document.extraction.requested"] --> ie["info-extraction / mock"]
    ie --> docDone["completed / failed"]
  end

  subgraph stage2 ["2. Context extraction"]
    direction TB
    ctxReq["context.extraction.requested"] --> ctxW["context worker"]
    ctxW --> ctxDone["completed / questions_required / failed"]
  end

  subgraph stage3 ["3. Prior-art"]
    direction TB
    paReq["prior_art.search / report.requested"] --> paW["search + report workers"]
    paW --> paDone["completed / failed + artifacts"]
  end

  subgraph stage4 ["4. Drafting"]
    direction TB
    draftReq["draft.claims / description.requested"] --> draftW["claims + description workers"]
    draftW --> draftDone["progress / completed / failed"]
  end

  subgraph stage5 ["5. Conversation"]
    direction TB
    turnReq["conversation.turn.requested"] --> convW["conversation worker"]
    convW --> turnDone["completed / failed"]
    convW --> stream["progress / delta / tool-call"]
  end

  core --> docReq
  store -.-> ie
  docDone --> core
  core --> ctxReq
  store -.-> ctxW
  ctxDone --> core
  ctxW --> providers
  core --> paReq
  store <--> paW
  paDone --> core
  paW --> providers
  core --> draftReq
  store -.-> draftW
  draftDone --> core
  draftW --> providers
  core --> turnReq
  store -.-> convW
  turnDone --> core
  stream -.->|"advisory TTL"| core
  convW --> providers

مسیر HTTP همزمان

FastAPI مسیر مستقیمی برای توسعه، Swagger، ATP، صفحه کیفیت و یکپارچه‌سازی همزمان فراهم می‌کند. هر درخواست تا پایان فراخوانی‌های AI باز می‌ماند و RabbitMQ در این مسیر دخیل نیست.

flowchart TB
  client["Client / Swagger / ATP / Quality"] --> api["FastAPI"]

  api --> health["GET /api/v1/health"]
  api --> credit["GET /api/v1/credit"]
  api --> extract["POST /api/v1/extract"]
  api --> search["POST /api/v1/prior-art/search"]
  api --> report["POST /api/v1/prior-art/report"]
  api --> claims["POST /api/v1/draft/claims"]
  api --> description["POST /api/v1/draft/description"]
  api --> rewrite["POST /api/v1/draft/rewrite"]
  api --> pages["GET / architecture quality atp"]

  extract --> sectioned["sectioned A-F to G"] --> ctxOut["InventionContext"]
  search --> searchAgent["Search agent"] --> searchOut["PriorArtSearchResult"]
  report --> familySelect["distinct family top-k"] --> reportAgent["Report agent"] --> reportOut["report JSON / MD"]
  claims --> claimsAgent["Claims agent"] --> claimsOut["claims.v2"]
  description --> descAgent["Description agent"] --> descOut["description.v2"]
  rewrite --> rewriteRunner["run_draft_rewrite"] --> replacements["replacements[]"]
  credit --> avalaiUser["AvalAI GET /user/v1/credit"]

  searchOut -.-> report
  searchOut -.-> claims
  claimsOut -.-> description

مسیر ناهمزمان (RabbitMQ)

در مسیر تولید، core-api رویداد درخواست حاوی شناسه‌ها و کلید artifact را publish می‌کند. هر worker فقط صف اختصاصی خود را با prefetch=1 مصرف می‌کند و نتیجه terminal را به exchange برمی‌گرداند.

flowchart TB
  core["core-api outbox"] --> ex[("patent_genie.events")]
  ex -.-> dlx[("patent_genie.dlx")]
  ex --> ctx["context worker"]
  ex --> pa["prior-art search/report"]
  ex --> draft["claims + description"]
  ex --> conv["conversation worker"]
  ctx & pa & draft & conv --> s3[("S3 / Ceph")]
  ctx & pa & draft -->|"completed / failed / questions"| ex
  conv -->|"completed / failed"| ex
  conv -->|"progress / delta / tool-call"| stream["stream TTL queues"]
  ex --> inboxes["Core inboxes"]
  stream -.->|"conversation-stream-relay"| channels["Channels Redis"]
  inboxes --> coreState["product state"]
  channels --> fe["Frontend WS"]

جریان استخراج ساخت‌یافته

تنها پروفایل فعلی sectioned-device-parallel-fulltext است: ورودی یک‌بار آماده می‌شود، شش بخش مستقل همزمان استخراج می‌شوند و compiler آن‌ها را به مدل canonical تبدیل می‌کند.

flowchart TB
  input["PatentContextExtractionInput / .txt"] --> n0["N0 prepare"]
  n0 --> parallel["A B C D E F parallel extract"]
  parallel --> compile["G canonical compiler"]
  parallel -.-> recovery["retry + recovery"] -.-> compile
  compile --> out["InventionContext + missing_questions"]
  out --> gaps["snapshot_mapping
outstanding = BLOCKING or HIGH"] gaps --> ready{"outstanding gaps?"} ready -->|yes| qr["questions_required"] ready -->|no| done["completed or forced-complete"]

خط لوله پیشینه فنی

پیشینه فنی دو مرحله مستقل دارد که Core پشت‌سرهم orchestrate می‌کند: عامل جستجو مراجع و شواهد را تولید می‌کند؛ عامل گزارش پس از PriorArtSearchResult نمایندگان خانوادهٔ متمایز را تحلیل و گزارش فارسی می‌سازد.

flowchart TB
  subgraph prepare ["۱. آماده‌سازی جستجو"]
    direction LR
    ctx["InventionContext"] --> features["Technical summary
+ features"] --> terms["LLM search elements"] end subgraph retrieval ["۲. جستجو و غنی‌سازی"] direction LR agent["LangGraph ReAct
جستجو"] --> search["Tavily
AvalAI یا TavilyClient"] --> enrich["Firecrawl + IPC enrichment"] end subgraph ranking ["۳. رتبه‌بندی و خروجی جستجو"] direction LR normalize["Normalize + dedupe"] --> rerank["Cohere rerank
اختیاری"] --> result["PriorArtSearchResult"] end subgraph reporting ["۴. گزارش — درخواست مستقل Core"] direction LR clamp["resolve_report_top_k"] --> families["select_top_k_distinct_families"] --> report["Report ReAct agent"] --> quality["assess_report_quality"] --> doc["Persian MD / JSON"] end terms --> agent enrich --> normalize result -.->|"Core enqueue report"| clamp

خط لوله پیش‌نویس ادعا و توصیف

تولید سند دو مرحلهٔ متوالی دارد که Core orchestrate می‌کند: Claims سپس Description. ویرایش انتخاب‌شدهٔ محصول از conversation است؛ workerهای draft.edit / fragment_edit میراث‌اند.

flowchart TB
  core["core-api drafting"] --> claimsReq["draft.claims.requested"]
  claimsReq --> claimsAgent["Claims ReAct agent"]
  claimsAgent --> claimsOut["claims.v2 inline"]
  claimsOut --> coreApply["Core: write claims section + S3"]
  coreApply --> descReq["draft.description.requested"]
  descReq --> descAgent["Description ReAct agent"]
  descAgent --> descOut["description.v2 + abstract"]
  descOut --> unlock["Core: apply sections · unlock"]

  conv["conversation agent_key=draft"] --> propose["propose_draft_edit
plain text"] propose --> apply["Core draft_edit_apply
Slice + accept/reject"] legacy["draft.edit / fragment_edit
legacy workers"] -.->|"not product path"| discard["retired vs Core"]

گفتگو (discover + draft)

یک conversation-worker نوبت‌های صفحه discover و دستیار پیش‌نویس را روی conversation.v1 پاسخ می‌دهد. Frontend فقط با Core (REST + WebSocket) حرف می‌زند؛ این سرویس مستقیم به مرورگر وصل نیست.

flowchart TB
  fe["Frontend"] -->|"REST + WS"| core["core-api"]
  core -->|"turn.requested"| worker["conversation-worker"]
  bundle["ConversationContextBundle
scope · history · packages · tools"] --> worker worker --> route{"agent_key"} route -->|"discover"| discover["landing_chat logic
recommend / knowledge"] route -->|"draft"| draftA["draft agent
propose_draft_edit"] route -->|"other"| fail["failed unsupported_agent"] discover & draftA --> stream["progress / delta / tool-call"] discover & draftA --> done["completed / failed"] stream -.-> core done --> core core -->|"Channels"| fe draftA -.->|"accept/reject"| apply["Core draft_edit_apply"]

Office Action (دامنه محلی)

package office_action عامل پاسخ اظهارنظر را با phase-gated ReAct پیاده کرده است، اما هنوز به RabbitMQ، event-schema یا inbox Core وصل نشده است.

flowchart TB
  subgraph implemented ["پیاده‌سازی‌شده در ai-workflow"]
    ctx["OfficeActionCaseContext"] --> run["run_office_action_response"]
    run --> phases["phase-gated ReAct
+ tool allowlists"] phases --> res["OfficeActionResponseResult
+ markdown_fa"] run -.-> cb["on_progress sparse"] end subgraph missing ["هنوز پیاده‌سازی نشده"] es["event-schema office-action"] wh["RabbitMQ worker handler"] api["Core OfficeActionRun + inbox"] sse["SSE / workflow events"] es --> wh --> api --> sse end res -.->|"آینده"| wh

استقرار Docker Compose

Compose یک API و هشت process worker از یک image می‌سازد. RabbitMQ و S3 داخل این compose تعریف نشده‌اند و باید از قبل روی شبکه external در دسترس باشند.

flowchart TB
  subgraph compose ["docker-compose"]
    direction TB
    api["api"]
    w1["context worker"]
    w2["prior-art-search-worker"]
    w3["prior-art-report-worker"]
    w4["claims-draft-worker"]
    w5["description-draft-worker"]
    w6["conversation-worker"]
    legacy["draft-edit + fragment-edit
legacy"] end net[["patent-genie-local"]] rmq[("RabbitMQ")] s3[("S3 / Ceph")] providers["LLM providers"] compose --- net net --- rmq net --- s3 api & w1 & w2 & w3 & w4 & w5 & w6 --> providers legacy -.-> providers