Node.js SDK (polylingo)

Client ufficiale TypeScript-first per la PolyLingo REST API. Usa il runtime fetch (Node.js 18+), viene distribuito come ESM e CJS, e non ha dipendenze a runtime oltre Node.

Per dettagli HTTP grezzi, vedi API reference.


Installazione

npm install polylingo

Node.js: >= 18


Costruttore

import PolyLingo from 'polylingo'

const client = new PolyLingo({
  apiKey: process.env.POLYLINGO_API_KEY!, // obbligatorio
  baseURL: 'https://api.usepolylingo.com/v1', // opzionale; questo è il default
  timeout: 120_000, // opzionale; timeout della richiesta in millisecondi (default 120_000)
})
OpzioneTipoObbligatorioDescrizione
apiKeystringChiave API (Authorization: Bearer …).
baseURLstringNoPrefisso API incluso /v1. Default https://api.usepolylingo.com/v1.
timeoutnumberNoTimeout per richiesta in ms. Default 120_000.

Metodi

client.health()

GET /health — nessuna autenticazione richiesta sul server; il client comunque invia l'header Authorization se configurato.

Restituisce { status, timestamp }.

const h = await client.health()

client.languages()

GET /languages — lista delle lingue supportate.

const { languages } = await client.languages()

client.translate(params)

POST /translate

const r = await client.translate({
  content: '# Hello',
  targets: ['es', 'fr'],
  format: 'markdown', // opzionale — omesso = rilevamento automatico sull'API
  source: 'en',       // suggerimento opzionale
  model: 'standard',  // opzionale: 'standard' | 'advanced'
})

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

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

client.usage()

GET /usage — utilizzo del piano per la chiave autenticata.

const u = await client.usage()

Jobs — client.jobs

client.jobs.create(params)

POST /jobs — inserisce lavoro asincrono in coda. Risolve con il corpo 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 — polling dello stato. Quando status === 'completed', l'API restituisce translations e usage al livello superiore dell'oggetto JSON (non annidati sotto result).

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

client.jobs.translate(params) — comodità

Invia un lavoro, poi esegue polling finché non è completed o failed, o finché il budget di polling non è esaurito.

const done = await client.jobs.translate({
  content: longMarkdown,
  targets: ['de', 'fr', 'es'],
  format: 'markdown',
  pollInterval: 10_000, // ms tra i polling; default 5_000
  timeout: 600_000,     // budget **totale** ms per il polling; default 20 minuti
  onProgress: (pos) => console.log(`Queue position: ${pos}`), // opzionale; chiamato mentre in coda/in elaborazione
})

done.translations.de
done.usage.total_tokens

Il ciclo di vita del job sull'API usa gli stati pending, processing, completed e failed.


Gestione degli errori

Tutti i fallimenti dallo SDK (eccetto bug) estendono PolyLingoError:

ClasseQuando
PolyLingoErrorBase — ha status, error (stringa codice API), message.
AuthErrorHTTP 401.
RateLimitErrorHTTP 429 — opzionale retryAfter (secondi) da JSON retry_after o header Retry-After.
JobFailedErrorHelper polling: job status === 'failed', o risultato mancante su completed, o timeout di polling. Ha jobId.
import PolyLingo, {
  PolyLingoError,
  AuthError,
  RateLimitError,
  JobFailedError,
} from 'polylingo'

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

Pattern lavori asincroni (sintesi)

  1. Polling fire-and-forget: jobs.create → il tuo worker chiama jobs.get a intervalli finché non è completed o failed.
  2. Polling integrato: jobs.translate — stessa semantica, con pollInterval, timeout e onProgress.

Payload grandi e traduzioni di lunga durata dovrebbero preferire jobs rispetto a translate sincrono per evitare timeout HTTP.


TypeScript

Il pacchetto esporta tipi per opzioni, risultati ed errori. Importa tipi nominati da polylingo secondo necessità (vedi dist/index.d.ts pubblicato).


Changelog

0.1.0

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