Node.js SDK (polylingo)

کلاینت رسمی TypeScript-first برای PolyLingo REST API. از runtime fetch (Node.js 18+) استفاده می‌کند، به صورت ESM و CJS عرضه می‌شود و هیچ وابستگی در زمان اجرا فراتر از Node ندارد.

برای جزئیات HTTP خام، به API reference مراجعه کنید.


نصب

npm install polylingo

Node.js: >= 18


سازنده

import PolyLingo from 'polylingo'

const client = new PolyLingo({
  apiKey: process.env.POLYLINGO_API_KEY!, // الزامی
  baseURL: 'https://api.usepolylingo.com/v1', // اختیاری؛ این مقدار پیش‌فرض است
  timeout: 120_000, // اختیاری؛ زمان‌تایم‌اوت درخواست به میلی‌ثانیه (پیش‌فرض 120_000)
})
گزینهنوعالزامیتوضیح
apiKeystringبلهکلید API (Authorization: Bearer …).
baseURLstringخیرپیشوند API شامل /v1. پیش‌فرض https://api.usepolylingo.com/v1.
timeoutnumberخیرزمان‌تایم‌اوت هر درخواست به ms. پیش‌فرض 120_000.

متدها

client.health()

GET /health — احراز هویت در سرور لازم نیست؛ کلاینت در صورت تنظیم، هدر Authorization را ارسال می‌کند.

برمی‌گرداند { status, timestamp }.

const h = await client.health()

client.languages()

GET /languages — فهرست زبان‌های پشتیبانی‌شده.

const { languages } = await client.languages()

client.translate(params)

POST /translate

const r = await client.translate({
  content: '# Hello',
  targets: ['es', 'fr'],
  format: 'markdown', // اختیاری — اگر حذف شود، API به صورت خودکار تشخیص می‌دهد
  source: 'en',       // راهنمای اختیاری
  model: 'standard',  // اختیاری: 'standard' | 'advanced'
})

r.translations.es // رشته
r.usage.total_tokens
r.usage.input_tokens
r.usage.output_tokens

client.batch(params)

POST /translate/batch

const b = await client.batch({
  items: [
    { id: 'a', content: 'Hello' },
    { id: 'b', content: '## Title', format: 'markdown' },
  ],
  targets: ['de'],
  source: 'en',    // اختیاری
  model: 'standard', // اختیاری
})

b.results[0].translations.de
b.usage.total_tokens

client.usage()

GET /usage — استفاده از پلن برای کلید احراز هویت شده.

const u = await client.usage()

شغل‌ها — client.jobs

client.jobs.create(params)

POST /jobs — افزودن کار ناهمزمان به صف. با بدنه JSON 202 (job_id, status, created_at, …) پاسخ می‌دهد.

const job = await client.jobs.create({
  content: longMarkdown,
  targets: ['de', 'fr'],
  format: 'markdown',
})
console.log(job.job_id)

client.jobs.get(jobId)

GET /jobs/:id — بررسی وضعیت. وقتی status === 'completed'، API در سطح بالای شیء JSON (نه در زیر result) translations و usage را برمی‌گرداند.

const status = await client.jobs.get(job.job_id)

client.jobs.translate(params) — راحتی

یک کار ارسال می‌کند، سپس تا زمانی که completed یا failed شود یا بودجه بررسی تمام شود، به صورت دوره‌ای وضعیت را می‌پرسد.

const done = await client.jobs.translate({
  content: longMarkdown,
  targets: ['de', 'fr', 'es'],
  format: 'markdown',
  pollInterval: 10_000, // میلی‌ثانیه بین پرسش‌ها؛ پیش‌فرض 5_000
  timeout: 600_000,     // بودجه **کل** میلی‌ثانیه برای پرسش‌ها؛ پیش‌فرض ۲۰ دقیقه
  onProgress: (pos) => console.log(`Queue position: ${pos}`), // اختیاری؛ هنگام قرار داشتن در صف/پردازش فراخوانی می‌شود
})

done.translations.de
done.usage.total_tokens

چرخه عمر شغل در API از وضعیت‌های pending، processing، completed و failed استفاده می‌کند.


مدیریت خطا

تمام شکست‌ها از SDK (به جز باگ‌ها) از PolyLingoError مشتق شده‌اند:

کلاسچه زمانی
PolyLingoErrorپایه — دارای status، error (کد API)، message.
AuthErrorHTTP 401.
RateLimitErrorHTTP 429retryAfter اختیاری (ثانیه) از JSON retry_after یا هدر Retry-After.
JobFailedErrorکمک‌ کننده پرسش: شغل با status === 'failed'، یا نتیجه گم‌شده در completed، یا تایم‌اوت پرسش. دارای jobId.
import PolyLingo, {
  PolyLingoError,
  AuthError,
  RateLimitError,
  JobFailedError,
} from 'polylingo'

try {
  await client.translate({ content: 'Hi', targets: ['es'] })
} catch (e) {
  if (e instanceof AuthError) { /* کلید نامعتبر */ }
  else if (e instanceof RateLimitError) { /* e.retryAfter */ }
  else if (e instanceof JobFailedError) { /* e.jobId */ }
  else if (e instanceof PolyLingoError) { /* e.status, e.error */ }
}

الگوی شغل‌های ناهمزمان (خلاصه)

  1. پرسش بدون انتظار: jobs.create → کارگر شما به صورت دوره‌ای jobs.get را تا completed یا failed فراخوانی می‌کند.
  2. پرسش داخلی: jobs.translate — همان معنا، با pollInterval، timeout و onProgress.

بارهای بزرگ و ترجمه‌های طولانی باید شغل‌ها را به جای translate همزمان ترجیح دهند تا از تایم‌اوت HTTP جلوگیری کنند.


TypeScript

بسته انواع گزینه‌ها، نتایج و خطاها را صادر می‌کند. انواع نام‌گذاری شده را از polylingo به صورت مورد نیاز وارد کنید (به dist/index.d.ts منتشر شده مراجعه کنید).


تغییرات

0.1.0

  • انتشار اولیه: health, languages, translate, batch, usage, jobs.create, jobs.get, jobs.translate.
<!-- i18n workflow trigger bump -->
SDK نود.js | مستندات PolyLingo | PolyLingo