اسناد
تمام مسیرها زیر v1/assistants/:assistantCode/documents هستند. پردازش در
همهجا ناهمزمان است: Endpointهای نوشتن یک Job در صف را برمیگردانند،
نه یک سند نهایی — به پایش وضعیت پردازش اسناد
مراجعه کنید.
هیچ وبهوک/اعلان Pushای برای پایان پردازش وجود ندارد. باید
GET .../documents/jobs/:jobId را تا رسیدن Job به یک وضعیت نهایی Poll
کنید.
فرمتهای فایل پشتیبانیشده
متن، PDF، Word (.docx/.doc قدیمی)، تصویر و صوت. این بررسی با
خواندن بایتهای واقعی فایل انجام میشود (همان روشی که موتور استخراج خودش
استفاده میکند)، نه با اعتماد به پسوند فایل یا هدر Content-Type — یک
فایل با پسوند تغییریافته، بر اساس محتوای واقعیاش قضاوت میشود. یک فایل
پشتیبانینشده (آرشیو، فایل اجرایی، ویدیو و …) بلافاصله با 415 و
documents.unsupported_file_type رد میشود، نه اینکه بعداً بهصورت خاموش
بهشکل یک Job با errorMessage: "ingest_failed" شکست بخورد.
بارگذاری فایلها
POST /v1/assistants/:assistantCode/documentsmultipart/form-data. نام فیلد فایل files است (تکرارشونده — میتوانید
چند فایل را در یک درخواست بارگذاری کنید، حداکثر ۱۰ فایل در هر درخواست،
هر فایل تا ۲۵ مگابایت). فیلد اختیاری فرم folderId
(۳۲ کاراکتر Hex با حروف کوچک) اسناد را در یک پوشه قرار میدهد.
curl -X POST "https://api.plexit.ir/v1/assistants/<assistantCode>/documents" \
-H "Authorization: Bearer $PLEXIT_API_KEY" \
-F "files=@./handbook.pdf" \
-F "files=@./pricing.pdf" \
-F "folderId=1a2b3c4d5e6f70819293a4b5c6d7e8f9"const form = new FormData();
form.append("files", fileBlob, "handbook.pdf");
// form.append("folderId", "1a2b3c4d5e6f70819293a4b5c6d7e8f9"); // اختیاری
const res = await fetch(
`https://api.plexit.ir/v1/assistants/${assistantCode}/documents`,
{
method: "POST",
headers: { Authorization: `Bearer ${process.env.PLEXIT_API_KEY}` },
body: form,
},
);ساخت سند از متن خام
بدون نیاز به فایل — برای محتوایی که از پیش بهشکل رشته دارید (مثلاً تولید پویا یک مقالهی پشتیبانی).
POST /v1/assistants/:assistantCode/documents/textبدنه
| فیلد | نوع | الزامی | محدودیتها |
|---|---|---|---|
folderId | string | خیر | ۳۲ کاراکتر Hex با حروف کوچک |
filename | string | بله | باید با الگوی ^[^/\\]+\.[A-Za-z0-9]+$ مطابقت داشته باشد — یک نام فایل ساده همراه با پسوند، مثل notes.txt، بدون جداکنندهی مسیر |
content | string | بله | ۱ تا ۲٬۰۰۰٬۰۰۰ کاراکتر |
curl -X POST "https://api.plexit.ir/v1/assistants/<assistantCode>/documents/text" \
-H "Authorization: Bearer $PLEXIT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"filename": "return-policy.txt",
"content": "Items can be returned within 30 days of purchase..."
}'هر دو Endpoint بارگذاری، یکسان پاسخ میدهند
{
"data": {
"list": [
{
"id": "5c6d7e8f90a1b2c3d4e5f60718293a4b",
"status": "queued",
"path": "/handbook.pdf",
"kind": "create",
"resultFileId": null,
"resultNChunks": null,
"resultSizeBytes": null,
"errorMessage": null,
"createdAt": "2026-09-19T12:00:00.000Z",
"updatedAt": "2026-09-19T12:00:00.000Z"
}
],
"count": 1
},
"response": { "status": "success", "message": "..." }
}این همان DocumentIngestJobResponse است — یک ورودی برای هر فایل
بارگذاریشده (یا یک ورودی برای سندِ متنیِ تکی). این نشاندهندهی یک Job در
صف است، نه یک سند نهایی. مقادیر
resultFileId/resultNChunks/resultSizeBytes تا پایان Job برابر null
هستند.
پایش وضعیت یک Job
GET /v1/assistants/:assistantCode/documents/jobs/:jobId:jobId همان id از پاسخ بارگذاری بالاست.
{
"data": {
"id": "5c6d7e8f90a1b2c3d4e5f60718293a4b",
"status": "ready",
"path": "/handbook.pdf",
"kind": "create",
"resultFileId": "9a8b7c6d5e4f30211f0e1d2c3b4a5968",
"resultNChunks": 42,
"resultSizeBytes": 184320,
"errorMessage": null,
"createdAt": "2026-09-19T12:00:00.000Z",
"updatedAt": "2026-09-19T12:00:07.000Z"
},
"response": { "status": "success", "message": "..." }
}فیلدهای DocumentIngestJobResponse
| فیلد | نوع | توضیح |
|---|---|---|
id | string | شناسهی Job — برای Poll کردن از این استفاده کنید. |
status | string | یکی از queued، processing، ready، failed. مقادیر ready و failed نهایی هستند — Poll را متوقف کنید. |
path | string | مسیر مقصد سند (پوشه + نام فایل). |
kind | string | یکی از create، replace — اینکه آیا این Job یک سند جدید میسازد یا یک سند موجود را جایگزین میکند. |
resultFileId | string | null | پس از رسیدن status به ready مقداردهی میشود؛ همان شناسهای که باید در Endpointهای فهرست/حذف استفاده شود. |
resultNChunks | number | null | پس از ready مقداردهی میشود. |
resultSizeBytes | number | null | پس از ready مقداردهی میشود. |
errorMessage | string | null | زمانی که status برابر failed باشد مقداردهی میشود. |
createdAt / updatedAt | string (ISO 8601) |
برای الگوی پیشنهادیِ Backoff به راهنمای پایش وضعیت مراجعه کنید.
فهرست اسناد
GET /v1/assistants/:assistantCode/documents?folderId=<optional>اسناد نهایی و پردازششده را فهرست میکند — این Endpoint مستقیماً از
retrieval میخواند، نه از جدول Job محلی، پس فقط شامل اسنادی است که Job
پردازش آنها از پیش به ready رسیده باشد.
{
"data": {
"list": [
{
"fileId": "9a8b7c6d5e4f30211f0e1d2c3b4a5968",
"path": "/handbook.pdf",
"nChunks": 42,
"size": 184320,
"createdAt": 1758283207
}
],
"count": 1
},
"response": { "status": "success", "message": "..." }
}مقدار createdAt در اینجا یک عدد صحیح از نوع Unix-epoch بر حسب ثانیه
است — نه یک رشتهی ISO. هر برچسبزمان دیگری در این API از نوع ISO
8601 است. فقط همین یک فیلد، در همین یک Endpoint، اینطور نیست، چون
مستقیماً از created_at خودِ retrieval منعکس شده. آن را بدون تبدیل
مستقیماً به new Date(createdAt) ندهید — ابتدا در ۱۰۰۰ ضرب کنید:
new Date(createdAt * 1000).
حذف اسناد
DELETE /v1/assistants/:assistantCode/documentsبدنه
| فیلد | نوع | الزامی | محدودیتها |
|---|---|---|---|
fileIds | string[] | بله | حداقل ۱ عنصر — از مقادیر fileId در فهرست اسناد استفاده کنید |
curl -X DELETE "https://api.plexit.ir/v1/assistants/<assistantCode>/documents" \
-H "Authorization: Bearer $PLEXIT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"fileIds": ["9a8b7c6d5e4f30211f0e1d2c3b4a5968"]}'{ "data": null, "response": { "status": "success", "message": "..." } }