PrivyTranslate

Local API per desktop · v1

Un endpoint di traduzione che non lascia mai la tua macchina.

L'app per macOS può esporre un'API REST e WebSocket legata a 127.0.0.1, così i tuoi script e strumenti traducono attraverso la stessa pipeline locale che usa l'app.

Panoramica

Attiva la Local API nelle impostazioni di PrivyTranslate. Il servizio si mette in ascolto solo sull'interfaccia di loopback: non è raggiungibile da un'altra macchina e nessuna richiesta viene inoltrata altrove.

URL di basehttp://127.0.0.1:49321/v1
Versione APIv1
PiattaformamacOS
Tipo di contenutoapplication/json

Scarica il JSON OpenAPI ↓

Autenticazione

Le impostazioni mostrano un token API una volta attivata la Local API. Tutti gli endpoint tranne /health e /capabilities lo richiedono. Sono accettati tre modi di trasmetterlo:

  • Intestazione X-Privy-Token — la forma principale per le richieste HTTP.
  • Authorization: Bearer — accettata sia dalle richieste HTTP sia dall'handshake WebSocket.
  • ?token= oppure ?access_token= — parametri di query per i client WebSocket del browser, che non possono impostare intestazioni.

Tratta il token come qualsiasi altra credenziale: concede la traduzione sulla tua macchina a chiunque lo possieda.

Endpoint

Traduzione

POST /translate accetta un lotto di massimo 128 stringhe e restituisce un risultato per elemento, nello stesso ordine. source vale auto per impostazione predefinita; target è obbligatorio.

Richiesta

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 accetta selection, paragraph, webpage, subtitle, message o document. format accetta text, html o markdown. Dentro options, engine fissa un backend preciso (local-llm, ollama, lm-studio, openai-compatible) e sensitive: true tiene la richiesta fuori dalla cronologia delle traduzioni.

Risposta

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 }
}

Rilevamento

POST /detect restituisce un codice di lingua e un punteggio di confidenza tra 0 e 1 per ciascun elemento, senza tradurlo.

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 passa a WebSocket. Ogni frame che invii è un TranslateRequest; ogni frame che ricevi è un TranslateResponse oppure un ErrorResponse. Usalo quando traduci un flusso di elementi brevi e vuoi evitare il costo di ogni singola richiesta.

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);
});

Limiti e lingue

GET /capabilities riporta i valori effettivi; questi sono quelli predefiniti.

max_items128
max_chars_per_item8000
max_total_chars50000

Codici di lingua

Le lingue di destinazione usano codici BCP 47. source accetta inoltre auto.

Scopri tutte le 57 lingue →

  • ararabo
  • bnbengalese
  • mybirmano
  • bgbulgaro
  • cacatalano
  • csceco
  • zh-Hanscinese semplificato
  • zh-Hantcinese tradizionale
  • kocoreano
  • hrcroato
  • dadanese
  • heebraico
  • etestone
  • filfilippino
  • fifinlandese
  • frfrancese
  • jagiapponese
  • elgreco
  • gugujarati
  • hihindi
  • idindonesiano
  • eninglese
  • isislandese
  • ititaliano
  • knkannada
  • kmkhmer
  • lolao
  • lvlettone
  • ltlituano
  • mlmalayalam
  • msmalese
  • mrmarathi
  • nonorvegese
  • nlolandese
  • fapersiano
  • plpolacco
  • pt-BRportoghese brasiliano
  • pt-PTportoghese europeo
  • papunjabi
  • rorumeno
  • rurusso
  • srserbo
  • skslovacco
  • slsloveno
  • esspagnolo
  • svsvedese
  • swswahili
  • tatamil
  • detedesco
  • tetelugu
  • ththailandese
  • trturco
  • ukucraino
  • huungherese
  • ururdu
  • vivietnamita
  • zuzulu

Errori

I fallimenti restituiscono un unico oggetto error con un type stabile.

invalid_request_error 400, 413, 422 Corpo malformato, campo sconosciuto o lotto oltre i limiti.
authentication_error 401, 403 Token API mancante, errato o revocato.
server_error 500, 503 La pipeline di traduzione è fallita, oppure l'app non è ancora pronta.
400 · application/json
{
  "error": {
    "code": "batch_too_large",
    "message": "texts exceeds max_items (128)",
    "type": "invalid_request_error",
    "param": "texts"
  }
}