Node.js SDK (polylingo)

Oficjalny klient TypeScript-first dla PolyLingo REST API. Używa runtime fetch (Node.js 18+), jest dostarczany jako ESM i CJS i nie ma zależności runtime poza Node.

Szczegóły surowego HTTP znajdziesz w referencji API.


Instalacja

npm install polylingo

Node.js: >= 18


Konstruktor

import PolyLingo from 'polylingo'

const client = new PolyLingo({
  apiKey: process.env.POLYLINGO_API_KEY!, // wymagane
  baseURL: 'https://api.usepolylingo.com/v1', // opcjonalne; to jest domyślne
  timeout: 120_000, // opcjonalne; timeout żądania w milisekundach (domyślnie 120_000)
})
OpcjaTypWymaganeOpis
apiKeystringTakKlucz API (Authorization: Bearer …).
baseURLstringNiePrefiks API zawierający /v1. Domyślnie https://api.usepolylingo.com/v1.
timeoutnumberNieTimeout na żądanie w ms. Domyślnie 120_000.

Metody

client.health()

GET /health — brak wymaganego uwierzytelnienia po stronie serwera; klient nadal wysyła nagłówek Authorization, jeśli jest skonfigurowany.

Zwraca { status, timestamp }.

const h = await client.health()

client.languages()

GET /languages — lista obsługiwanych języków.

const { languages } = await client.languages()

client.translate(params)

POST /translate

const r = await client.translate({
  content: '# Hello',
  targets: ['es', 'fr'],
  format: 'markdown', // opcjonalne — pominięte = automatyczne wykrywanie w API
  source: 'en',       // opcjonalna wskazówka
  model: 'standard',  // opcjonalne: 'standard' | 'advanced'
})

r.translations.es // string
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',    // opcjonalne
  model: 'standard', // opcjonalne
})

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

client.usage()

GET /usage — użycie planu dla uwierzytelnionego klucza.

const u = await client.usage()

Zadania — client.jobs

client.jobs.create(params)

POST /jobs — dodaj asynchroniczne zadanie do kolejki. Zwraca JSON z kodem 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 — sprawdzanie statusu. Gdy status === 'completed', API zwraca translations i usage na górnym poziomie obiektu JSON (nie zagnieżdżone pod result).

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

client.jobs.translate(params) — wygodna metoda

Wysyła zadanie, a następnie sprawdza status aż do completed lub failed, lub do wyczerpania budżetu sprawdzania.

const done = await client.jobs.translate({
  content: longMarkdown,
  targets: ['de', 'fr', 'es'],
  format: 'markdown',
  pollInterval: 10_000, // ms między sprawdzeniami; domyślnie 5_000
  timeout: 600_000,     // **całkowity** budżet ms na sprawdzanie; domyślnie 20 minut
  onProgress: (pos) => console.log(`Pozycja w kolejce: ${pos}`), // opcjonalne; wywoływane podczas oczekiwania/przetwarzania
})

done.translations.de
done.usage.total_tokens

Cykl życia zadania w API używa statusów pending, processing, completed i failed.


Obsługa błędów

Wszystkie błędy SDK (poza błędami programistycznymi) rozszerzają klasę PolyLingoError:

KlasaKiedy
PolyLingoErrorPodstawowa — posiada status, error (kod API jako string), message.
AuthErrorHTTP 401.
RateLimitErrorHTTP 429 — opcjonalne retryAfter (sekundy) z JSON retry_after lub nagłówka Retry-After.
JobFailedErrorPomocnik do sprawdzania: zadanie status === 'failed', brak wyniku przy completed lub przekroczenie limitu czasu sprawdzania. Posiada jobId.
import PolyLingo, {
  PolyLingoError,
  AuthError,
  RateLimitError,
  JobFailedError,
} from 'polylingo'

try {
  await client.translate({ content: 'Hi', targets: ['es'] })
} catch (e) {
  if (e instanceof AuthError) { /* nieprawidłowy klucz */ }
  else if (e instanceof RateLimitError) { /* e.retryAfter */ }
  else if (e instanceof JobFailedError) { /* e.jobId */ }
  else if (e instanceof PolyLingoError) { /* e.status, e.error */ }
}

Wzorzec zadań asynchronicznych (podsumowanie)

  1. Fire-and-forget polling: jobs.create → twój worker wywołuje jobs.get w odstępach czasu aż do completed lub failed.
  2. Wbudowany polling: jobs.translate — ta sama semantyka, z pollInterval, timeout i onProgress.

Duże ładunki i długotrwałe tłumaczenia powinny preferować jobs zamiast synchronicznego translate, aby uniknąć timeoutów HTTP.


TypeScript

Pakiet eksportuje typy dla opcji, wyników i błędów. Importuj nazwane typy z polylingo według potrzeb (zobacz opublikowany dist/index.d.ts).


Dziennik zmian

0.1.0

  • Pierwsze wydanie: health, languages, translate, batch, usage, jobs.create, jobs.get, jobs.translate.
<!-- i18n workflow trigger bump -->
Node.js SDK | dokumentacja PolyLingo | PolyLingo