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 فعال
فرآیند آزمون
- تأیید can_continue_to_prior_art از workflow-state
- ارسال POST بدون body (یا با پارامترهای آینده)
- دریافت 202 با search_execution.status=pending
- پس از outbox confirm: status=queued؛ poll prior-art/current یا workflow-state / SSE
- پس از 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: مسیر موفق
- ارسال
POST /api/v1/invention-cases/{invention_case_id}/prior-art/search/ - دریافت پاسخ موفق
- بررسی ساختار پاسخ
سناریو 2: خطا - درخواست نامعتبر
- ارسال درخواست با داده یا شناسه نامعتبر
- دریافت کد خطای 4xx
- بررسی پیام خطای استاندارد API
سناریو 3: E2E جستجوی موفق
- context ready
- POST search → 202
- poll تا latest_search_status=completed
- GET search-results و بررسی reference_count
سناریو 4: خطا — context آماده نیست
- context در questions_required
- POST search
- دریافت 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.
روال صحتسنجی
- بررسی 202 و status=pending
- بررسی outbox command و confirm → queued
- بررسی عدم افشای داده حساس
- 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 شروع نمیشود.