بازگشت به فهرست ATP →
پیشینه فنی

شروع جستجوی prior-art

POST /api/v1/invention-cases/{invention_case_id}/prior-art/search/ مشاهده در Swagger

ATP - شروع جستجوی prior-art (POST /api/v1/invention-cases/{invention_case_id}/prior-art/search/)

Endpoint

POST /api/v1/invention-cases/{invention_case_id}/prior-art/search/

هدف آزمون

ایجاد/بازیابی PriorArtRun و enqueue جستجو در ai-workflow.

شرایط آزمون

  • context readiness برابر ready
  • InventionContextSnapshot فعلی با readiness_state=ready
  • بدون search execution در حال in-flight (pending/queued)
  • RabbitMQ و prior-art workers فعال

فرآیند آزمون

  1. تأیید can_continue_to_prior_art از workflow-state
  2. ارسال POST بدون body (یا با پارامترهای آینده)
  3. دریافت 202 با search_execution.status=pending
  4. پس از outbox confirm: status=queued؛ poll prior-art/current یا workflow-state / SSE
  5. پس از completed: GET search-results

معرفی ویژگی

مرحله ۱ prior-art — مستقل از report. core-api snapshot context را در رویداد prior_art.search.requested می‌فرستد. workerهای ai-workflow (LangGraph ReAct + Tavily/AvalAI + Cohere rerank) نتایج را در S3 می‌نویسند.

  • lifecycle: pending → queued (broker confirm) → completed | failed
  • RabbitMQ: prior_art.search.requested → workers
  • completed/failed: prior_art.search.completed | failed
  • S3 artifact: search_result_artifact_key تحت prefix tenancy (validation در Core و worker)
  • reference_count: در execution پس از completed
  • exhaustion: error_code=command_publish_exhausted → retry endpoint

سناریوی آزمون

سناریو 1: مسیر موفق

  1. ارسال POST /api/v1/invention-cases/{invention_case_id}/prior-art/search/
  2. دریافت پاسخ موفق
  3. بررسی ساختار پاسخ

سناریو 2: خطا - درخواست نامعتبر

  1. ارسال درخواست با داده یا شناسه نامعتبر
  2. دریافت کد خطای 4xx
  3. بررسی پیام خطای استاندارد API

سناریو 3: E2E جستجوی موفق

  1. context ready
  2. POST search → 202
  3. poll تا latest_search_status=completed
  4. GET search-results و بررسی reference_count

سناریو 4: خطا — context آماده نیست

  1. context در questions_required
  2. POST search
  3. دریافت 400

قالب API

مولفه نوع نوع داده اجباری توضیحات
invention_case_id Path uuid بله شناسه پرونده اختراع

Swagger

post:
  summary: شروع جستجوی prior-art
  responses:
    201:
      description: منبع ایجاد شد
    400:
      description: داده ورودی نامعتبر
    401:
      description: احراز هویت نامعتبر

نمونه ورودی

curl -X POST "http://localhost:8000/api/v1/invention-cases/{invention_case_id}/prior-art/search/" \
  -H "Authorization: Bearer <access>" \
  -H "Content-Type: application/json"

نمونه خروجی

{
  "success": true,
  "data": {
    "run": { "id": "...", "context_snapshot_version": 2 },
    "search_execution": {
      "id": "...",
      "status": "pending",
      "attempt_number": 1,
      "retryable": true
    },
    "prior_art": { "sub_state": "search_running", "capabilities": {} },
    "workflow_state": { "revision": 20 }
  }
}

Status Codes

  • 202: جستجو schedule شد (pending تا confirm)
  • 400: context آماده نیست
  • 409: جستجوی فعال موجود

نتیجه مورد انتظار

202 با search_execution.status=pending؛ پس از publisher confirm → queued.

روال صحت‌سنجی

  1. بررسی 202 و status=pending
  2. بررسی outbox command و confirm → queued
  3. بررسی عدم افشای داده حساس
  4. late outcome روی terminal = no-op

توضیحات

  • مسیر باید با پیاده‌سازی فعلی urls.py هم‌خوان باشد
  • sub_state=search_running یعنی in-flight از دید projection؛ execution status خود pending/queued است

جریان یکپارچه‌سازی

1. POST prior-art/search
2. core-api: PriorArtRun + PriorArtSearchExecution (pending) + command_event_id
3. outbox publisher (confirm) → RabbitMQ: prior_art.search.requested
4. domain → queued
5. ai-workflow workers: multi-agent search pipeline → S3 JSON
6. RabbitMQ: prior_art.search.completed | failed
7. core-api inbox: UPDATE execution + reference_count (monotonic)
8. GET prior-art/runs/{id}/search-results (sanitized refs)

توجه: Search و Report دو مرحله مستقل‌اند؛ report بدون search completed شروع نمی‌شود.