مستندات فنی

راهنمای توسعه و یکپارچه‌سازی مدل

SmartDx به پژوهشگران اجازه می‌دهد مدل‌های پیش‌بینی خود را یکپارچه کنند. شما می‌توانید مدل خود را با هر زبانی (پایتون، راست، سی‌پلاس‌پلاس) بسازید، تا زمانی که با قرارداد API ما مطابقت داشته باشد.

معرفی کلی

اسمارت‌دی‌ایکس از دو نوع مدل پشتیبانی می‌کند:

تک مدل

یک مدل یادگیری ماشین آموزش‌دیده روی یک دیتاست برای هدف بالینی خاص.

مدل مقایسه‌ای

مدل اصلی شما در کنار امتیازهای بالینی موجود، نوموگرام‌ها یا فرمول‌های مبتنی بر قانون مقایسه می‌شود.

نکته: اگر چند پژوهشگر مدل‌های یادگیری ماشین متفاوتی برای یک دیتاست توسعه دهند، باید به عنوان 'تب مدل' جداگانه در آن دیتاست ثبت شود، نه به عنوان یک مدل مقایسه‌ای.

معماری استقرار

مدیریت شده توسط ما (توصیه شده)

شما یک باینری کامپایل‌شده (مثلاً راست) یا یک کانتینر داکر ارائه می‌دهید. ما آن را روی زیرساخت خود میزبانی می‌کنیم، پورت اختصاص می‌دهیم و چرخه حیات آن را مدیریت می‌کنیم.

میزبانی شخصی

شما مدل را روی سرور مجازی خود میزبانی می‌کنید. شما IP، پورت و یک کلید API را به ما می‌دهید. ما درخواست‌ها را به صورت امن به سرور شما ارجاع می‌دهیم.

تکنولوژی‌های توصیه شده

Rust (Actix/Axum)
بهترین برای فرمول‌های مبتنی بر قانون یا مدل‌های ساده ML. مصرف رم بسیار پایین (حدود ۱۰ مگابایت) و فوق‌العاده سریع. بدون پشتیبانی SHAP.
Python (FastAPI)
بهترین در صورت نیاز به نمودارهای SHAP یا استفاده از مدل‌های پیچیده. مصرف رم کمتری نسبت به فلاسک دارد.
C++ / Others
تا زمانی که با داکر کانتینری شده و تمام بررسی‌های API را پاس کند، قابل قبول است.

قرارداد API (اندپوینت‌ها)

GET /health

وضعیت سلامت سرویس را برمی‌گرداند. پلتفرم برای پایش در دسترس بودن از این اندپوینت استفاده کرده و مدل را به صورت خودکار سالم/ناسالم علامت‌گذاری می‌کند.

پاسخ مورد انتظار:
{
    "status": "healthy",
    "success": "true"
}
GET /manifest

مانیفست مدل (متادیتا) را در قالب استاندارد برمی‌گرداند.

GET /schema

تعریف فرم (فیلدها، انواع، برچسب‌های دوزبانه) را برمی‌گرداند.

POST /predict

داده‌های بیمار را دریافت کرده، احتمال، ریسک، مقایسه و اهمیت ویژگی/SHAP را برمی‌گرداند.

قالب درخواست: ورودی‌های فرم هنگام ارسال به اندپوینت /predict در کلید JSON سطح بالای data قرار می‌گیرند.
predict_request.json
{
    "data": {
        "age": 45,
        "sex": "male",
        "total_cholesterol": 6.2,
        "hdl_cholesterol": 1.1,
        "systolic_bp": 140,
        "bp_treated": "yes",
        "smoker": "no"
    }
}

نمونه‌های کامل JSON

در ادامه نمونه‌های کاملی برای مدل‌های تک و مقایسه‌ای آورده شده است. برای تغییر از تب‌ها استفاده کنید.

1. پاسخ اسکیما (تک) (GET /schema)
schema_single.json
{
    "success": true,
    "schema": {
        "all_required": true,
        "fields": [
            {
                "name": "age",
                "label_fa": "سن بیمار",
                "label_en": "Patient Age",
                "type": "number",
                "required": true,
                "min": 30,
                "max": 79,
                "step": 1,
                "help_text_fa": "سن باید بین ۳۰ تا ۷۹ سال باشد",
                "help_text_en": "Age must be between 30 and 79 years",
                "order": 1
            },
            {
                "name": "sex",
                "label_fa": "جنسیت",
                "label_en": "Sex",
                "type": "select",
                "required": true,
                "options": [
                    {"value": "male", "label_fa": "مرد", "label_en": "Male"},
                    {"value": "female", "label_fa": "زن", "label_en": "Female"}
                ],
                "order": 2
            },
            {
                "name": "total_cholesterol",
                "label_fa": "کلسترول کل (mmol/L)",
                "label_en": "Total Cholesterol (mmol/L)",
                "type": "number",
                "required": true,
                "min": 3,
                "max": 9,
                "step": 0.1,
                "help_text_fa": "میزان کلسترول کل آزمایشگاهی",
                "help_text_en": "Total blood cholesterol level",
                "order": 3
            },
            {
                "name": "hdl_cholesterol",
                "label_fa": "کلسترول HDL (mmol/L)",
                "label_en": "HDL Cholesterol (mmol/L)",
                "type": "number",
                "required": true,
                "min": 0.5,
                "max": 4.0,
                "step": 0.1,
                "help_text_fa": "کلسترول خوب",
                "help_text_en": "High-density lipoprotein cholesterol",
                "order": 4
            },
            {
                "name": "systolic_bp",
                "label_fa": "فشار خون سیستولیک (mmHg)",
                "label_en": "Systolic Blood Pressure (mmHg)",
                "type": "number",
                "required": true,
                "min": 90,
                "max": 200,
                "step": 1,
                "help_text_fa": "عدد بالای فشار خون",
                "help_text_en": "Top number of blood pressure reading",
                "order": 5
            },
            {
                "name": "bp_treated",
                "label_fa": "تحت درمان دارویی فشار خون",
                "label_en": "Treated for High Blood Pressure",
                "type": "select",
                "required": true,
                "options": [
                    {"value": "no", "label_fa": "خیر", "label_en": "No"},
                    {"value": "yes", "label_fa": "بله", "label_en": "Yes"}
                ],
                "help_text_fa": "آیا بیمار داروی کاهش فشار خون مصرف می‌کند؟",
                "help_text_en": "Is the patient currently taking hypertension medication?",
                "order": 6
            },
            {
                "name": "smoker",
                "label_fa": "مصرف سیگار",
                "label_en": "Smoker",
                "type": "select",
                "required": true,
                "options": [
                    {"value": "no", "label_fa": "خیر", "label_en": "No"},
                    {"value": "yes", "label_fa": "بله", "label_en": "Yes"}
                ],
                "help_text_fa": "آیا بیمار سیگاری است؟",
                "help_text_en": "Does the patient currently smoke?",
                "order": 7
            }
        ],
        "field_groups": [
            {
                "name_fa": "اطلاعات دموگرافیک",
                "name_en": "Demographic Information",
                "fields": ["age", "sex", "smoker"]
            },
            {
                "name_fa": "علائم بالینی و آزمایشگاهی",
                "name_en": "Clinical & Laboratory Factors",
                "fields": ["total_cholesterol", "hdl_cholesterol", "systolic_bp", "bp_treated"]
            }
        ]
    }
}
2. پاسخ مانیفست (تک) (GET /manifest)
manifest_single.json
{
    "success": true,
    "info": {
        "name_fa": "تخمین خطر ۱۰ ساله بیماری سخت عروق کرونر (فرامینگهام)",
        "name_en": "Framingham 10-Year Hard CHD Risk Score",
        "description_fa": "تخمین میزان احتمال ۱۰ ساله ابتلا به حوادث سخت عروق کرونر (سکته قلبی یا مرگ ناشی از بیماری قلبی) بر اساس الگوریتم دقیق رگرسیون کوکس (Cox Model) و ۸ شاخص بالینی و آزمایشگاهی.",
        "description_en": "Estimates the 10-year probability of hard coronary heart disease events (myocardial infarction or CHD death) using the continuous Cox proportional hazards model based on 8 clinical and laboratory variables.",
        "developer": {
            "name": "علیرضا خزاعی زاده",
            "name_en": "Alireza Khazaeizadeh",
            "email": "alireza.khazaeizadeh80@gamil.com",
            "phone": "",
            "institution_fa": "دانشگاه فردوسی مشهد",
            "institution_en": "Ferdowsi University of Mashhad"
        },
        "authors": [
            {
                "name": "Ralph B. D'Agostino Sr",
                "affiliation_fa": "دانشگاه بوستون و مطالعه قلب فرامینگهام",
                "affiliation_en": "Boston University & Framingham Heart Study",
                "orcid": "https://orcid.org/0000-0000-0000-0000"
            }
        ],
        "version": "1.0",
        "last_updated": "2026-07-06",
        "algorithm": "Cox Proportional Hazards Model",
        "followup": {
            "enabled": false,
            "days": 0,
            "question_fa": "",
            "question_en": "",
            "options": []
        },
        "metrics": {
            "auc": 0.77,
            "accuracy": 0.73,
            "sensitivity": 0.71,
            "specificity": 0.74,
            "f1": 0.38
        },
        "clinical_notes": {
            "input_type": "سن، جنسیت، کلسترول کل، کلسترول HDL، فشار خون سیستولیک، وضعیت درمان فشار خون و مصرف سیگار",
            "benefit": "غربالگری و طبقه‌بندی خطر بیماران بدون سابقه قبلی بیماری قلبی جهت تصمیم‌گیری برای شروع درمان دارویی (استاتین و ضد فشارخون)"
        },
        "tags": [
            "فرامینگهام",
            "خطر ۱۰ ساله قلبی",
            "عروق کرونر"
        ],
        "tags_en": [
            "Framingham Risk Score",
            "Hard CHD",
            "Cardiovascular Risk"
        ]
    }
}
3. پاسخ پیش‌بینی (تک) (POST /predict)
predict_single_response.json
{
    "success": true,
    "prediction": {
        "probability": 0.75,
        "probability_formatted": "75.0٪",
        "gauge_title_fa": "احتمال بیماری قلبی",
        "gauge_title_en": "Heart Disease Probability",
        "class": 1,
        "class_label_fa": "در معرض خطر",
        "class_label_en": "At Risk",
        "risk_category": "high",
        "risk_label_fa": "ریسک بالا",
        "risk_label_en": "High Risk",
        "risk_color": "#f44336"
    },
    "explanations": {
        "shap": {
            "format": "image",
            "waterfall": "data:image/png;base64,iVBORw0KGgo..."
        },
        "feature_importance": {
            "format": "data",
            "values": [
                {
                    "feature": "age",
                    "feature_fa": "سن",
                    "feature_en": "Age",
                    "importance": 0.45,
                    "contribution": 0.30,
                    "effect": "positive",
                    "active": true
                }
            ]
        }
    },
    "interpretation": {
        "summary_fa": "احتمال بیماری قلبی ۷۵٪ است.",
        "summary_en": "Heart disease probability is 75%.",
        "key_factors_fa": ["سن: افزایش ریسک"],
        "recommendation_fa": "توصیه می‌شود ویزیت متخصص قلب انجام شود."
    }
}
1. پاسخ اسکیما (مقایسه‌ای) (GET /schema)
schema_comparative.json
{
    "success": true,
    "schema": {
        "all_required": false,
        "fields": [
            {
                "name": "age",
                "label_fa": "سن",
                "label_en": "Age",
                "type": "select",
                "required": true,
                "options": [
                    {"value": "<50", "label_fa": "زیر ۵۰", "label_en": "< 50"},
                    {"value": ">=50", "label_fa": "۵۰ و بالاتر", "label_en": "≥ 50"}
                ],
                "help_text_fa": "استفاده در: مدل اصلی، فرمول قبلی",
                "help_text_en": "Used by: Main Model, Old Formula",
                "order": 1
            },
            {
                "name": "specific_marker",
                "label_fa": "نشانگر خاص",
                "label_en": "Specific Marker",
                "type": "number",
                "required": false,
                "help_text_fa": "فقط برای مدل اصلی",
                "help_text_en": "Main model only",
                "order": 2
            }
        ],
        "field_groups": [
            {
                "name_fa": "فیلدهای الزامی برای محاسبه",
                "name_en": "Required Fields for Calculation",
                "required_group": true,
                "fields": ["age"]
            },
            {
                "name_fa": "فیلدهای اختیاری",
                "name_en": "Optional Fields",
                "required_group": false,
                "fields": ["specific_marker"]
            }
        ]
    }
}
2. پاسخ مانیفست (مقایسه‌ای) (GET /manifest)
manifest_comparative.json
{
    "success": true,
    "info": {
        "name_fa": "مدل مقایسه‌ای آمبولی",
        "name_en": "Comparative Embolism Model",
        "capabilities": {
            "comparison_mode": true,
            "has_shap": false
        },
        "metrics": {
            "main_model": {
                "auc": 0.81,
                "sensitivity": 0.91
            },
            "old_formula": {
                "auc": 0.58,
                "sensitivity": 0.94
            }
        },
        "clinical_notes": {
            "benefit": "مقایسه مدل جدید با فرمول قدیمی"
        }
    }
}
3. پاسخ پیش‌بینی (مقایسه‌ای) (POST /predict)
predict_comparative_response.json
{
    "success": true,
    "prediction": {
        "probability": 0.81,
        "probability_formatted": "81.0٪",
        "risk_category": "high",
        "risk_label_fa": "ریسک بالا",
        "risk_label_en": "High Risk",
        "risk_color": "#f44336"
    },
    "comparison": {
        "main_logistic_regression": {
            "name_fa": "رگرسیون لجستیک اصلی",
            "name_en": "Main Logistic Regression",
            "probability": 0.81,
            "probability_formatted": "81.0٪",
            "risk_label_fa": "ریسک بالا",
            "risk_color": "#f44336",
            "computable": true
        },
        "old_formula": {
            "name_fa": "فرمول قدیمی",
            "name_en": "Old Formula",
            "score": 4.5,
            "score_label_fa": "امتیاز: ۴.۵",
            "risk_label_fa": "ریسک متوسط",
            "risk_color": "#ff9800",
            "computable": true
        },
        "uncomputed_model": {
            "name_en": "Missing Data Model",
            "computable": false,
            "message_fa": "فیلدهای اختیاری وارد نشده‌اند"
        }
    },
    "explanations": {
        "feature_importance": {
            "format": "data",
            "values": [
                {
                    "feature": "age",
                    "feature_fa": "سن",
                    "feature_en": "Age",
                    "importance": 0.5,
                    "effect": "positive"
                }
            ]
        }
    },
    "interpretation": {
        "summary_fa": "احتمال آمبولی ۸۱٪ است.",
        "summary_en": "Embolism probability is 81%.",
        "key_factors_fa": ["سن: افزایش ریسک"]
    }
}

چک‌لیست ارسال

قبل از ارسال مدل خود، لطفاً مطمئن شوید مراحل زیر را تکمیل کرده‌اید:

  • اندپوینت‌های API
    اندپوینت‌های /health، /manifest، /schema و /predict پیاده‌سازی شده و به درستی پاسخ می‌دهند.
  • محتوای دوزبانه
    فایل manifest.json و اسکیما برچسب‌ها، توضیحات و راهنماهای فارسی (fa) و انگلیسی (en) را ارائه می‌دهند.
  • قرارداد JSON
    پاسخ پیش‌بینی دقیقاً از ساختار JSON مورد انتظار پیروی می‌کند (شامل آبجکت 'comparison' در صورت مقایسه‌ای بودن مدل).
  • روش استقرار
    در صورت مدیریت‌شده، باینری کامپایل‌شده یا کانتینر داکر را ارائه کرده‌اید.
    در صورت میزبانی شخصی، سرویس شما فعال است و IP، پورت و کلید API را آماده اشتراک‌گذاری دارید.

آماده ارسال مدل خود هستید؟

تماس با ما