PrivyTranslate

Local API de bureau · v1

Un point de terminaison de traduction qui ne quitte jamais votre machine.

L'app macOS peut exposer une API REST et WebSocket liée à 127.0.0.1, pour que vos propres scripts et outils traduisent via la même chaîne locale que l'app.

Présentation

Activez la Local API dans les réglages de PrivyTranslate. Le service n'écoute alors que sur l'interface de bouclage : il n'est pas joignable depuis une autre machine, et aucune requête n'est relayée où que ce soit.

URL de basehttp://127.0.0.1:49321/v1
Version de l'APIv1
PlateformemacOS
Type de contenuapplication/json

Télécharger le JSON OpenAPI ↓

Authentification

Les réglages affichent un jeton d'API dès que la Local API est activée. Tous les points de terminaison sauf /health et /capabilities l'exigent. Trois transports sont acceptés :

  • En-tête X-Privy-Token — la forme principale pour les requêtes HTTP.
  • Authorization: Bearer — accepté aussi bien par les requêtes HTTP que par la poignée de main WebSocket.
  • ?token= ou ?access_token= — paramètres de requête pour les clients WebSocket du navigateur, qui ne peuvent pas définir d'en-têtes.

Traitez le jeton comme n'importe quel autre identifiant : il accorde la traduction sur votre machine à quiconque le détient.

Points de terminaison

Traduire

POST /translate prend un lot d'au plus 128 chaînes et renvoie un résultat par élément, dans l'ordre. source vaut auto par défaut ; target est obligatoire.

Requête

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 accepte selection, paragraph, webpage, subtitle, message ou document. format accepte text, html ou markdown. Sous options, engine fixe un backend précis (local-llm, ollama, lm-studio, openai-compatible) et sensitive: true tient la requête hors de l'historique de traduction.

Réponse

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

Détecter

POST /detect renvoie un code de langue et un score de confiance entre 0 et 1 pour chaque élément, sans le traduire.

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 bascule en WebSocket. Chaque trame que vous envoyez est un TranslateRequest ; chaque trame reçue est soit un TranslateResponse, soit un ErrorResponse. À utiliser pour traduire un flux d'éléments courts en évitant le coût par requête.

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

Limites et langues

GET /capabilities renvoie les valeurs en vigueur ; voici les valeurs par défaut.

max_items128
max_chars_per_item8000
max_total_chars50000

Codes de langue

Les langues cibles utilisent des codes BCP 47. source accepte en plus 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ລາວ

Erreurs

Les échecs renvoient un unique objet error avec un type stable.

invalid_request_error 400, 413, 422 Corps mal formé, champ inconnu ou lot au-delà des limites.
authentication_error 401, 403 Jeton d'API manquant, incorrect ou révoqué.
server_error 500, 503 La chaîne de traduction a échoué, ou l'app n'est pas encore prête.
400 · application/json
{
  "error": {
    "code": "batch_too_large",
    "message": "texts exceeds max_items (128)",
    "type": "invalid_request_error",
    "param": "texts"
  }
}