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.
- npm:
polylingo - Sorgente: UsePolyLingo/polylingo-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)
})
| Opzione | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
apiKey | string | Sì | Chiave API (Authorization: Bearer …). |
baseURL | string | No | Prefisso API incluso /v1. Default https://api.usepolylingo.com/v1. |
timeout | number | No | Timeout 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:
| Classe | Quando |
|---|---|
PolyLingoError | Base — ha status, error (stringa codice API), message. |
AuthError | HTTP 401. |
RateLimitError | HTTP 429 — opzionale retryAfter (secondi) da JSON retry_after o header Retry-After. |
JobFailedError | Helper 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)
- Polling fire-and-forget:
jobs.create→ il tuo worker chiamajobs.geta intervalli finché non ècompletedofailed. - Polling integrato:
jobs.translate— stessa semantica, conpollInterval,timeouteonProgress.
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.