واجهة API
المصادقة بمفتاح API في الترويسة Authorization: Bearer sfh_…. الأخطاء بصيغة موحدة { error: { code, message } }. المواصفة الكاملة في docs/openapi.yaml داخل المستودع.
| الطريقة | المسار | الوصف |
|---|---|---|
POST | /api/v1/libraries | إنشاء مكتبة |
GET | /api/v1/libraries | قائمة المكتبات المتاحة |
POST | /api/v1/documents/upload | رفع مستند (multipart) مع بياناته الوصفية وحقوقه |
GET | /api/v1/documents/:id | تفاصيل المستند: الصفحات والكتل والجودة والإصدارات |
GET | /api/v1/documents/:id/status | حالة المعالجة (خطوة، تقدم، خطأ) |
POST | /api/v1/documents/:id/reprocess | إعادة المعالجة |
POST | /api/v1/documents/:id/transition | اعتماد / نشر / سحب |
POST | /api/v1/search | بحث هجين مع فلاتر |
POST | /api/v1/answer | إجابة بمصادر (SSE عند stream=true) |
POST | /api/v1/evals | إنشاء مجموعة تقييم |
POST | /api/v1/evals/:id/run | تشغيل على عدة مودلات |
GET | /api/v1/evals/:id/results | نتائج التشغيل |
POST | /api/v1/feedback | تقييم إجابة: صحيحة / جزئية / خاطئة |
GET | /api/v1/models | المودلات والمزودون المتاحون |
مثال: إجابة بمصادر
curl -X POST $APP_URL/api/v1/answer \
-H "Authorization: Bearer sfh_..." \
-H "Content-Type: application/json" \
-d '{"query":"ما مدة الإجازة السنوية؟","libraryIds":["<uuid>"],"limit":8}'SDK (TypeScript)
import { SafahClient } from "@safah/sdk";
const safah = new SafahClient({ baseUrl: "http://localhost:3000", apiKey: "sfh_..." });
const hits = await safah.search({ query: "ساعات العمل", libraryIds: [libraryId] });
const answer = await safah.answer({ query: "كم ساعات العمل اليومية؟", libraryIds: [libraryId] });
for await (const ev of safah.answerStream({ query: "…", libraryIds: [libraryId] })) { /* delta | sources | done */ }