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.
- npm:
polylingo - Źródło: UsePolyLingo/polylingo-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)
})
| Opcja | Typ | Wymagane | Opis |
|---|---|---|---|
apiKey | string | Tak | Klucz API (Authorization: Bearer …). |
baseURL | string | Nie | Prefiks API zawierający /v1. Domyślnie https://api.usepolylingo.com/v1. |
timeout | number | Nie | Timeout 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:
| Klasa | Kiedy |
|---|---|
PolyLingoError | Podstawowa — posiada status, error (kod API jako string), message. |
AuthError | HTTP 401. |
RateLimitError | HTTP 429 — opcjonalne retryAfter (sekundy) z JSON retry_after lub nagłówka Retry-After. |
JobFailedError | Pomocnik 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)
- Fire-and-forget polling:
jobs.create→ twój worker wywołujejobs.getw odstępach czasu aż docompletedlubfailed. - Wbudowany polling:
jobs.translate— ta sama semantyka, zpollInterval,timeoutionProgress.
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.