PrivyTranslate

Local API de escritorio · v1

Un endpoint de traducción que nunca sale de tu máquina.

La app de macOS puede exponer una API REST y WebSocket enlazada a 127.0.0.1, para que tus propios scripts y herramientas traduzcan por la misma canalización local que usa la app.

Resumen

Activa la Local API en los ajustes de PrivyTranslate. El servicio escucha entonces solo en la interfaz de bucle local: no es accesible desde otra máquina y ninguna petición se redirige a ninguna parte.

URL basehttp://127.0.0.1:49321/v1
Versión de la APIv1
PlataformamacOS
Tipo de contenidoapplication/json

Descargar el JSON de OpenAPI ↓

Autenticación

Los ajustes muestran un token de API en cuanto la Local API está activada. Todos los endpoints salvo /health y /capabilities lo requieren. Se aceptan tres transportes:

  • Cabecera X-Privy-Token — la forma principal para las peticiones HTTP.
  • Authorization: Bearer — aceptada tanto por las peticiones HTTP como por el saludo inicial de WebSocket.
  • ?token= o ?access_token= — parámetros de consulta para los clientes WebSocket del navegador, que no pueden fijar cabeceras.

Trata el token como cualquier otra credencial: concede traducción en tu máquina a quien lo tenga.

Endpoints

Traducir

POST /translate acepta un lote de hasta 128 cadenas y devuelve un resultado por elemento, en orden. source vale auto por defecto; target es obligatorio.

Petición

curl
curl -s http://127.0.0.1:49321/v1/translate \
  -H "X-Privy-Token: $PRIVY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "source": "auto",
    "target": "zh-Hans",
    "texts": ["Could you confirm the revised delivery schedule?"],
    "mode": "paragraph",
    "format": "text",
    "options": { "engine": "auto", "sensitive": true }
  }'

mode acepta selection, paragraph, webpage, subtitle, message o document. format acepta text, html o markdown. Dentro de options, engine fija un backend concreto (local-llm, ollama, lm-studio, openai-compatible) y sensitive: true mantiene la petición fuera del historial de traducciones.

Respuesta

200 · application/json
{
  "id": "tr_8F2A6D4E-5F58-4A37-8E92-7B4FD40BE2D2",
  "object": "translation",
  "created": 1755561600,
  "engine": "local-llm",
  "model": "translategemma-4b-it.Q4_K_M.gguf",
  "source": "en",
  "target": "zh-Hans",
  "results": [
    {
      "index": 0,
      "text": "能否确认修订后的交付时间表?",
      "detected_source": "en",
      "confidence": 0.98,
      "alternatives": []
    }
  ],
  "usage": { "input_chars": 48, "output_chars": 15, "latency_ms": 412 }
}

Detectar

POST /detect devuelve un código de idioma y una puntuación de confianza entre 0 y 1 para cada elemento, sin traducirlo.

curl
curl -s http://127.0.0.1:49321/v1/detect \
  -H "Authorization: Bearer $PRIVY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "texts": ["Guten Morgen", "早上好"] }'
200 · application/json
{
  "id": "det_8F2A6D4E-5F58-4A37-8E92-7B4FD40BE2D2",
  "object": "language_detection",
  "created": 1755561600,
  "results": [
    { "index": 0, "language": "de", "confidence": 0.97 },
    { "index": 1, "language": "zh-Hans", "confidence": 0.99 }
  ],
  "usage": { "input_chars": 16, "latency_ms": 24 }
}

WebSocket

GET /ws/translate conmuta a WebSocket. Cada trama que envías es un TranslateRequest; cada trama que recibes es un TranslateResponse o un ErrorResponse. Úsalo cuando traduzcas un flujo de elementos cortos y quieras evitar la sobrecarga por petición.

JavaScript
const socket = new WebSocket(
  "ws://127.0.0.1:49321/v1/ws/translate?token=" + PRIVY_TOKEN
);

socket.addEventListener("open", () => {
  socket.send(JSON.stringify({
    target: "ja",
    texts: ["The quarterly invoice is attached."]
  }));
});

socket.addEventListener("message", (event) => {
  const frame = JSON.parse(event.data);
  if (frame.error) console.error(frame.error.message);
  else console.log(frame.results[0].text);
});

Límites e idiomas

GET /capabilities informa de los valores en vivo; estos son los predeterminados.

max_items128
max_chars_per_item8000
max_total_chars50000

Códigos de idioma

Los idiomas de destino usan códigos BCP 47. source acepta además auto.

  • enEnglish
  • zh-Hans简体中文
  • zh-Hant繁體中文
  • ja日本語
  • ko한국어
  • frFrançais
  • deDeutsch
  • esEspañol
  • viTiếng Việt
  • thไทย
  • idBahasa Indonesia
  • msBahasa Melayu
  • filFilipino
  • myမြန်မာ
  • kmខ្មែរ
  • loລາວ

Errores

Los fallos devuelven un único objeto error con un type estable.

invalid_request_error 400, 413, 422 Cuerpo mal formado, campo desconocido o lote por encima de los límites.
authentication_error 401, 403 Token de API ausente, incorrecto o revocado.
server_error 500, 503 La canalización de traducción falló, o la app aún no está lista.
400 · application/json
{
  "error": {
    "code": "batch_too_large",
    "message": "texts exceeds max_items (128)",
    "type": "invalid_request_error",
    "param": "texts"
  }
}