طلبك الأول في Node.js
- احصل على مفتاح API مجانيسجل حساباً جديداً وانسخه من لوحة التحكم الخاصة بك.
- قم بتخزينه في متغيّر بيئي
PDF_SUMMARIZE_KEY. - أنشئ نموذج بيانات (FormData)أضف ملف PDF كـ Blob تحت الحقل
file. - أرسل الطلب عبر POST واقرأ بصيغة JSON.
// summarize.mjs — node summarize.mjs report.pdf
import { readFile } from 'node:fs/promises';
import { basename } from 'node:path';
const API_URL = 'https://pdf-summarize.com/api/summarize.php';
const KEY = process.env.PDF_SUMMARIZE_KEY;
export async function summarizePdf(path, { length = 'medium', format = 'bullets', outputLang = 'auto' } = {}) {
const form = new FormData();
form.append('file', new Blob([await readFile(path)], { type: 'application/pdf' }), basename(path));
form.append('length', length);
form.append('format', format);
form.append('outputLang', outputLang);
const res = await fetch(API_URL, {
method: 'POST',
headers: { Authorization: `Bearer ${KEY}` },
body: form,
signal: AbortSignal.timeout(180_000),
});
const data = await res.json();
if (!res.ok || !data.success) throw new Error(`${res.status}: ${data.error ?? JSON.stringify(data)}`);
return data;
}
const result = await summarizePdf(process.argv[2]);
console.log(result.summary);
console.log(`${result.page_count} pages, ${result.processing_time}s, ${result.requests_remaining} requests left`);
تدفق الملخص (Streaming)
export async function streamSummary(path, onText) {
const form = new FormData();
form.append('file', new Blob([await readFile(path)], { type: 'application/pdf' }), basename(path));
form.append('length', 'long');
const res = await fetch(API_URL + '?stream=1', { method: 'POST', headers: { Authorization: `Bearer ${KEY}` }, body: form });
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const decoder = new TextDecoder();
let buffer = '';
for await (const chunk of res.body) {
buffer += decoder.decode(chunk, { stream: true });
const lines = buffer.split('\n');
buffer = lines.pop();
for (const line of lines) {
if (!line.startsWith('data: ')) continue;
const payload = line.slice(6);
if (payload === '[DONE]') return;
const event = JSON.parse(payload);
if (event.error) throw new Error(event.error);
if (event.type === 'summary') onText(event.content);
}
}
}
await streamSummary('paper.pdf', (t) => process.stdout.write(t));
نقطة نهاية Express لتطبيقك الخاص
تقوم الواجهة الأمامية لديك برفع الملف إلى خادمك، والذي يضيف بدوره المفتاح ويرسل الملف:
import express from 'express';
import multer from 'multer';
const app = express();
const upload = multer({ limits: { fileSize: 20 * 1024 * 1024 } });
app.post('/summarize', upload.single('file'), async (req, res) => {
if (!req.file) return res.status(400).json({ error: 'No file' });
const form = new FormData();
form.append('file', new Blob([req.file.buffer], { type: 'application/pdf' }), req.file.originalname);
form.append('length', req.body.length ?? 'medium');
const r = await fetch('https://pdf-summarize.com/api/summarize.php', {
method: 'POST', headers: { Authorization: `Bearer ${process.env.PDF_SUMMARIZE_KEY}` }, body: form,
});
res.status(r.status).json(await r.json());
});
app.listen(3000);
معالجة الأخطاء
| الحالة | المعنى |
|---|---|
| 400 | ملف مفقود، أو ليس ملف PDF، أو تم تجاوز حد الصفحات |
| 401 | مفتاح مفقود أو غير صالح |
| 413 | حجم الملف كبير جداً |
| 422 | لا يوجد نص قابل للقراءة في ملف PDF |
| 429 | تم بلوغ حد الاستخدام أو الحصة المسموح بها — أعد المحاولة لاحقاً مع تباعد الطلبات |
| 500 | خطأ مؤقت في التلخيص — أعد المحاولة |
الأسئلة الشائعة
هل يمكنني استدعاء واجهة برمجة التطبيقات (API) مباشرة من المتصفح؟
من الناحية التقنية نعم، ولكن سيكون مفتاحك مرئيًا لأي شخص. قم بتوجيه الطلبات عبر الواجهة الخلفية (Backend) كما في مثال Express.
هل تعمل مع Deno أو Bun أو Cloudflare Workers؟
نعم — أي بيئة تشغيل تدعم fetch وFormData القياسية ستعمل بنفس الطريقة تمامًا.
هل توجد حزمة SDK خاصة بلغة TypeScript؟
ليس بعد. واجهة برمجة التطبيقات عبارة عن نقطة نهاية واحدة بصيغة multipart، لذا فإن غلافاً برمجياً بسيطاً ومكتوباً (Typed wrapper) حول fetch يكفي تمامًا.
أين أجد الوثائق والمراجع الكاملة؟
في توثيق واجهة برمجة التطبيقات (API)، والذي يضم كافة المعلمات والأمثلة بعدة لغات.