Node.js SDK (polylingo)
Официальный клиент TypeScript для PolyLingo REST API. Использует runtime fetch (Node.js 18+), поставляется как ESM и CJS, и не имеет зависимостей во время выполнения кроме Node.
- npm:
polylingo - Исходники: UsePolyLingo/polylingo-node
Для подробностей HTTP смотрите Справочник API.
Установка
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)
})
| Опция | Тип | Обязательно | Описание |
|---|---|---|---|
apiKey | string | Да | Ключ API (Authorization: Bearer …). |
baseURL | string | Нет | Префикс API включая /v1. По умолчанию https://api.usepolylingo.com/v1. |
timeout | number | Нет | Таймаут на запрос в мс. По умолчанию 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 // 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', // необязательно
model: 'standard', // необязательно
})
b.results[0].translations.de
b.usage.total_tokens
client.usage()
GET /usage. Возвращает использование плана для аутентифицированного ключа.
const u = await client.usage()
Jobs (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 возвращает translations и usage на верхнем уровне JSON объекта (не вложены в result).
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, // **общий** лимит времени в мс для опроса; по умолчанию 20 минут
onProgress: (pos) => console.log(`Позиция в очереди: ${pos}`), // необязательно; вызывается во время ожидания/обработки
})
done.translations.de
done.usage.total_tokens
Жизненный цикл задачи в API использует статусы pending, processing, completed и failed.
Обработка ошибок
Все ошибки SDK (кроме багов) наследуются от PolyLingoError:
| Класс | Когда |
|---|---|
PolyLingoError | Базовый. Имеет status, error (строка кода API), message. |
AuthError | HTTP 401. |
RateLimitError | HTTP 429. Опционально retryAfter (секунды) из 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 */ }
}
Паттерн асинхронных задач (кратко)
- Fire-and-forget polling:
jobs.create→ ваш воркер вызываетjobs.getс интервалом доcompletedилиfailed. - Встроенный polling:
jobs.translate. Те же семантика, сpollInterval,timeoutиonProgress.
Большие нагрузки и длительные переводы лучше выполнять через jobs, а не синхронно через translate, чтобы избежать таймаутов HTTP.
TypeScript
Пакет экспортирует типы для опций, результатов и ошибок. Импортируйте именованные типы из polylingo по необходимости (см. опубликованный dist/index.d.ts).
Changelog
0.1.2
- Обслуживание: URL базовой API по умолчанию
https://api.usepolylingo.com/v1.
0.1.0
- Первоначальный релиз:
health,languages,translate,batch,usage,jobs.create,jobs.get,jobs.translate.