🌟 Ümumi Giriş və Təhlükəsizlik Arxitekturası
MESD Metadata Filler sistemi dövlət sənədlərinin (PDF/DOCX) mətni və skanlarından 23 qeydiyyat sahəsinin avtomatlaşdırılmış çıxarışını təmin edir. Bütün xarici inteqrasiyalar (SESDA və digər qurumlar) vahid giriş nöqtəsindən xidmət alır.
🔑 Tələb olunan Başlıqlar (Headers):
• Sənəd xidmətləri üçün:
• İnzibatçı / Audit xidmətləri üçün:
• Sənəd xidmətləri üçün:
X-API-Key: sesda-secret-key-2026 və ya Authorization: Bearer <SESDA_API_KEY>• İnzibatçı / Audit xidmətləri üçün:
X-Settings-Password: admin-mesd-2026
🔒 Məxfilik Zəmanəti: Sistem loglarına sənədlərin mətni, daxili məzmunu və fərdlərə aid şəxsi məlumatlar qətiyyən yazılmır.
POST /api/v1/extract 🔑 SESDA_API_KEY tələb olunur
SESDA Vahid Ön Qapı (Single Entry Gate): PDF və ya DOCX faylını qəbul edir, OCR və süni intellektlə emal edir, bütün 23 MESD qeydiyyat sahəsini nömrələnmiş (
1..23) strukturda qaytarır.| Parametr | Növ | Harada | Təsvir |
|---|---|---|---|
| file | multipart/form-data | Body * | PDF və ya DOCX sənəd faylı (bir və ya bir neçə qoşma) |
| use_ai | boolean | Form | Süni intellektlə (vLLM) dəqiqləşdirmə (standart: false) |
| X-API-Key | string | Header * | SESDA üçün təyin edilmiş gizli açar |
curl -X POST "http://127.0.0.1:8009/api/v1/extract" \ -H "X-API-Key: sesda-secret-key-2026" \ -F "file=@/yol/mektub_0412.pdf" \ -F "use_ai=false"
import requests
url = "http://127.0.0.1:8009/api/v1/extract"
headers = {
"X-API-Key": "sesda-secret-key-2026"
}
files = {
"file": open("mektub_0412.pdf", "rb")
}
data = {
"use_ai": "false"
}
response = requests.post(url, headers=headers, files=files, data=data)
result = response.json()
print(f"Status: {result.get('status')}, Sorğu №: {result.get('request_id')}")
# 23 Nömrələnmiş sahə:
for num, field in result.get("numbered_fields", {}).items():
print(f"[{num}] {field['name']}: {field['value']} (dəqiqlik: {field['conf']})")
const formData = new FormData();
formData.append('file', fileInput.files[0]);
formData.append('use_ai', 'false');
const response = await fetch('http://127.0.0.1:8009/api/v1/extract', {
method: 'POST',
headers: {
'X-API-Key': 'sesda-secret-key-2026'
},
body: formData
});
const data = await response.json();
console.log('Nəticə:', data.numbered_fields);
{
"status": "success",
"request_id": "5bed9ea4d9e444ae91055cbf21467dd8",
"id": "5bed9ea4d9e444ae91055cbf21467dd8",
"file": "mektub_0412.pdf",
"created": "2026-11-12T12:00:00",
"numbered_fields": {
"1": {"name": "Müraciətin tipi", "value": "Məktub", "conf": "yüksək", "required": true},
"2": {"name": "Daxilolma yolu", "value": "Elektron", "conf": "yüksək", "required": true},
"3": {"name": "Daxilolma tarixi", "value": "12.11.2026", "conf": "yüksək", "required": false},
"4": {"name": "Sənədin nömrəsi", "value": "04-12/987", "conf": "yüksək", "required": true},
"5": {"name": "Sənədin tarixi", "value": "11.11.2026", "conf": "yüksək", "required": true},
"6": {"name": "Sənədi imzalayan", "value": "Əliyev Vüqar", "conf": "yüksək", "required": false},
"7": {"name": "Sənədin icraçısı", "value": "Məmmədova Leyla", "conf": "orta", "required": false},
"8": {"name": "Göndərənin nəzarəti", "value": "Xeyr", "conf": "yüksək", "required": false},
"9": {"name": "Kimə ünvanlanıb", "value": "Azərbaycan Respublikası Energetika Nazirliyinə", "conf": "yüksək", "required": true},
"10": {"name": "Yazışmanın növü", "value": "Xidməti məktub", "conf": "yüksək", "required": true},
"11": {"name": "Yazışmanın mövzusu", "value": "Bərpa olunan enerji layihələri", "conf": "yüksək", "required": true},
"12": {"name": "Məzmun", "value": "Günəş elektrik stansiyasının tikintisi barədə layihə sənədlərinin razılaşdırılması", "conf": "orta", "required": true},
"13": {"name": "Yeni-Cavab", "value": "Yeni", "conf": "yüksək", "required": true},
"14": {"name": "Qeyd", "value": "", "conf": "aşağı", "required": false},
"15": {"name": "Yazışmanın vacibliyi", "value": "Sadə", "conf": "yüksək", "required": true},
"16": {"name": "Qoşma yazışmalar", "value": "", "conf": "aşağı", "required": false},
"17": {"name": "Nəzarət", "value": "Xeyr", "conf": "yüksək", "required": false},
"18": {"name": "İcranın xarakteri", "value": "İcra üçün", "conf": "yüksək", "required": true},
"19": {"name": "Biznes proses – Nəzarətçi", "value": "", "conf": "aşağı", "required": true},
"20": {"name": "Biznes proses – Dərkənar sahibi", "value": "Nazir müavini", "conf": "orta", "required": true},
"21": {"name": "Biznes proses – İcraya nəzarət üçün", "value": "", "conf": "aşağı", "required": false},
"22": {"name": "Biznes proses – İcraçılar", "value": "Enerji səmərəliliyi şöbəsi", "conf": "orta", "required": false},
"23": {"name": "Biznes proses – Məlumat üçün", "value": "", "conf": "aşağı", "required": false}
},
"extra_fields": {
"Təşkilat": {"name": "Təşkilat", "value": "Azərenerji ASC", "conf": "yüksək", "note": "Reyestrdən təsdiqləndi"}
}
}
/* HTTP 401 Unauthorized (Açarsız müraciət) */
{
"status": "error",
"error": "Açar tələb olunur: 'X-API-Key' və ya 'Authorization: Bearer ' başlığı daxil edin",
"request_id": "7befbfa7b383498d9c9dcccd9f4ee875"
}
/* HTTP 403 Forbidden (Yanlış açar) */
{
"status": "error",
"error": "Yanlış və ya etibarsız API açarı",
"request_id": "18d9060a137049c8b8de125c139721fb"
}
/* HTTP 400 Bad Request (Uyğunsuz fayl) */
{
"status": "error",
"error": "Yalnız PDF və DOCX faylları qəbul olunur",
"request_id": "bfc02367335242108ed293454e1e78a2"
}
POST /api/auth/verify
İstifadəçinin daxil etdiyi API açarını təhlükəsiz şəkildə yoxlayır və veb sistemə giriş icazəsi verir.
curl -X POST "http://127.0.0.1:8009/api/auth/verify" \
-H "Content-Type: application/json" \
-d '{"api_key": "sesda-secret-key-2026"}'
import requests
r = requests.post("http://127.0.0.1:8009/api/auth/verify", json={"api_key": "sesda-secret-key-2026"})
print(r.status_code, r.json())
# 200 {'ok': True, 'status': 'authenticated', 'role': 'user', 'message': 'API açarı etibarlıdır'}
/* Uğurlu Giriş (200 OK) */
{
"ok": true,
"status": "authenticated",
"role": "user",
"message": "API açarı etibarlıdır"
}
/* Xəta (403 Forbidden) */
{
"ok": false,
"error": "Yanlış və ya etibarsız API açarı"
}
GET /api/v1/status
Xidmətin cari sağlamlığını, vLLM AI modelinin vəziyyətini, aktiv paralel işçiləri və bugünkü sorğu statistikalarını qaytarır.
curl -X GET "http://127.0.0.1:8009/api/v1/status"
{
"workers": 4,
"running": 0,
"done": 12,
"ai": "vllm",
"vision": "",
"vllm_url": "http://host.docker.internal:18005/v1",
"ai_ready": true,
"today_stats": {
"date": "2026-11-12",
"success": 10,
"failed": 2,
"total": 12,
"avg_duration_sec": 2.45,
"recent": [
{
"timestamp": "2026-11-12T06:06:34",
"request_id": "9d58f68450b6459896be29542dbd6ccf",
"status": "uğurlu",
"status_code": 200,
"duration_sec": 3.27,
"file_name": "sened.pdf",
"client_ip": "92.39.81.81",
"origin_type": "SESDA / Xarici Şəbəkə",
"error_reason": null
}
]
}
}
GET /api/audit/logs 🔒 Admin Şifrəsi Tələb Olunur
İnzibatçı üçün bütün tarixi audit loglarını və sorğuların hansı müştəri IP-lərindən gəldiyini qaytarır.
| Parametr | Növ | Harada | Təsvir |
|---|---|---|---|
| X-Settings-Password | string | Header * | Admin şifrəsi (SETTINGS_PASSWORD) |
| date | string | Query | Tarix üzrə filtr (məs. 2026-11-12) |
| status | string | Query | Status üzrə filtr (uğurlu, uğursuz, 401, 403) |
| ip | string | Query | Müştəri IP üzrə filtr (məs. 92.39.81.81) |
| limit | integer | Query | Maksimum log sayı (standart: 500) |
curl -X GET "http://127.0.0.1:8009/api/audit/logs?status=uğurlu&limit=50" \ -H "X-Settings-Password: admin-mesd-2026"
{
"total": 120,
"filtered": 1,
"dates": ["2026-11-12", "2026-11-11"],
"logs": [
{
"timestamp": "2026-11-12T06:06:34",
"date": "2026-11-12",
"request_id": "9d58f68450b6459896be29542dbd6ccf",
"status": "uğurlu",
"status_code": 200,
"duration_sec": 3.27,
"file_name": "mektub.pdf",
"client_ip": "92.39.81.81",
"origin_type": "SESDA / Xarici Şəbəkə",
"user_agent": "python-requests/2.31.0",
"error_reason": null
}
]
}
GET /api/audit/origins 🔒 Admin Şifrəsi Tələb Olunur
Sorğuların hansı IP ünvanlarından və mənbələrdən (Haradan gəlib) daxil olduğunun xülasəsi.
curl -X GET "http://127.0.0.1:8009/api/audit/origins" \ -H "X-Settings-Password: admin-mesd-2026"
GET /api/history
Sistemdə saxlanılmış sənədlərin xülasə siyahısını qaytarır.
curl -X GET "http://127.0.0.1:8009/api/history"
PUT /api/history/{doc_id}
İstifadəçi sənəd sahələrini dəyişdikdə bu metod çağırılır və proqram avtomatik olaraq gələcək sənədlər üçün öyrənir.
curl -X PUT "http://127.0.0.1:8009/api/history/5bed9ea4d9e444ae91055cbf21467dd8" \
-H "Content-Type: application/json" \
-d '{
"fields": {
"Yazışmanın növü": {"value": "Sərəncam"},
"Yazışmanın mövzusu": {"value": "Kadr məsələləri"}
}
}'