# راهنمای استفاده از API هشدارهای مزرعه این سند نحوه کار با API فعال هشدارهای مزرعه را توضیح می‌دهد. ## Endpoint فعال - `POST /api/farm-alerts/tracker/` نکته: - endpoint `POST /api/farm-alerts/timeline/` حذف شده و دیگر قابل استفاده نیست. ## کاربرد API این API با دریافت `farm_uuid` و یک لیست از `alerts`: - وضعیت فعلی هشدارهای مزرعه را تحلیل می‌کند - context مزرعه را همراه با alertهای ارسالی به RAG می‌فرستد - فقط notificationهای مهم را تولید می‌کند - notificationهای تولیدشده را در دیتابیس ذخیره می‌کند ## ساختار درخواست فیلدهای ورودی: - `farm_uuid`: شناسه مزرعه - `alerts`: لیست alertهای ورودی برای تحلیل فیلد `farm_uuid` الزامی است. ## ساختار هر alert هر آیتم داخل `alerts` می‌تواند این فیلدها را داشته باشد: - `alert_id`: شناسه هشدار - `level`: سطح هشدار مثل `info` یا `warning` یا `danger` - `title`: عنوان هشدار - `message`: توضیح هشدار - `suggested_action`: اقدام پیشنهادی - `source_metric_type`: نوع شاخص مثل `moisture` - `timestamp`: زمان هشدار با فرمت datetime - `payload`: داده تکمیلی به صورت JSON object همه فیلدهای داخل هر alert اختیاری هستند، ولی بهتر است برای تحلیل دقیق‌تر حداقل `title` یا `message` و در صورت امکان `level` و `source_metric_type` ارسال شوند. ## نمونه درخواست ```json { "farm_uuid": "11111111-1111-1111-1111-111111111111", "alerts": [ { "alert_id": "soil-moisture-001", "level": "warning", "title": "افت رطوبت خاک", "message": "رطوبت خاک کمتر از حد مطلوب گزارش شده است.", "suggested_action": "آبیاری اصلاحی بررسی شود.", "source_metric_type": "moisture", "timestamp": "2025-02-14T09:30:00Z", "payload": { "window": "3d", "current_value": 38.5, "threshold": 45 } }, { "alert_id": "fungal-risk-002", "level": "danger", "title": "ریسک قارچی بالا", "message": "شرایط محیطی برای بیماری قارچی شدید شده است.", "suggested_action": "بازدید و اقدام پیشگیرانه فوری انجام شود.", "source_metric_type": "fungal_risk", "timestamp": "2025-02-14T10:00:00Z", "payload": { "humidity": 89, "duration_hours": 18 } } ] } ``` ## نمونه درخواست با curl ```bash curl -X POST http://localhost:8000/api/farm-alerts/tracker/ \ -H "Content-Type: application/json" \ -d '{ "farm_uuid": "11111111-1111-1111-1111-111111111111", "alerts": [ { "alert_id": "soil-moisture-001", "level": "warning", "title": "افت رطوبت خاک", "message": "رطوبت خاک کمتر از حد مطلوب گزارش شده است.", "suggested_action": "آبیاری اصلاحی بررسی شود.", "source_metric_type": "moisture" } ] }' ``` ## ساختار پاسخ موفق پاسخ HTTP با envelope زیر برمی‌گردد: ```json { "code": 200, "msg": "success", "data": { "farm_uuid": "11111111-1111-1111-1111-111111111111", "service_id": "farm_alerts", "tracker": {}, "headline": "جمع بندی کوتاه وضعیت هشدارها", "overview": "توضیح کوتاه و اجرایی از مهم ترین وضعیت مزرعه", "status_level": "warning", "notifications": [ { "id": 12, "farm_uuid": "11111111-1111-1111-1111-111111111111", "endpoint": "tracker", "level": "warning", "title": "افت رطوبت خاک", "message": "تنش رطوبتی در مزرعه ادامه دارد.", "suggested_action": "آبیاری جبرانی کوتاه مدت اجرا شود.", "source_alert_id": "soil-moisture-001", "source_metric_type": "moisture", "payload": {}, "created_at": "2025-02-14T10:15:00+00:00", "updated_at": "2025-02-14T10:15:00+00:00" } ], "raw_llm_response": "{\"headline\":\"...\"}", "structured_context": {} } } ``` ## وضعیت‌های خطا ### خطای ورودی نامعتبر اگر `farm_uuid` ارسال نشود: ```json { "code": 400, "msg": "داده نامعتبر.", "data": { "farm_uuid": [ "farm_uuid الزامی است." ] } } ``` ### خطای داخلی اگر در مرحله تحلیل RAG یا تولید پاسخ خطایی رخ دهد: ```json { "code": 500, "msg": "خطا در تولید tracker هشدارها: ...", "data": null } ``` ## نکات رفتاری API - اگر `alerts` ارسال نشود، API آن را به صورت آرایه خالی در نظر می‌گیرد. - notificationهای ساخته‌شده برای endpoint `tracker` در دیتابیس ذخیره می‌شوند. - مدل باید notification تکراری نسازد و اگر مورد مهمی وجود نداشته باشد، خروجی notification می‌تواند خالی باشد. - تحلیل فقط روی endpoint `tracker` فعال است. ## پیشنهاد برای مصرف‌کننده API - برای هر alert یک `alert_id` پایدار بفرستید تا ردیابی و جلوگیری از تکرار بهتر انجام شود. - برای alertهای حساس، `timestamp` و `source_metric_type` را حتما ارسال کنید. - اگر داده تکمیلی دارید، آن را داخل `payload` بفرستید تا RAG context کامل‌تر شود.