Add local MarianMT translation service

This commit is contained in:
Adolfo Reyna
2026-08-14 12:40:58 -04:00
parent 65a4178e2b
commit c257fd1ec7
8 changed files with 211 additions and 2 deletions
+27
View File
@@ -1,6 +1,8 @@
const axios = require("axios");
const DEFAULT_MODEL = process.env.OPENAI_TRANSLATION_MODEL || process.env.OPENAI_MODEL || "gpt-4o-mini";
const TRANSLATION_PROVIDER = (process.env.TRANSLATION_PROVIDER || "openai").trim().toLowerCase();
const MARIAN_TRANSLATION_URL = (process.env.MARIAN_TRANSLATION_URL || "http://127.0.0.1:8000").replace(/\/$/, "");
const normalizeLanguageCode = (rawLanguage) => {
if (!rawLanguage || typeof rawLanguage !== "string") return "en";
@@ -40,6 +42,31 @@ const translateText = async ({ text, sourceLang, targetLang }) => {
};
}
if (TRANSLATION_PROVIDER === "marian") {
try {
const response = await axios.post(
`${MARIAN_TRANSLATION_URL}/translate`,
{ text, sourceLang: sourceLang || "auto", targetLang: normalizedTarget },
{ timeout: 30000, headers: { "Content-Type": "application/json" } }
);
const translatedText = response?.data?.translatedText?.trim();
if (!translatedText) return null;
return {
translatedText,
provider: response.data.provider || "marianmt",
model: response.data.model || "unknown",
};
} catch (error) {
console.error("Error translating with MarianMT", error?.response?.data || error?.message || error);
return null;
}
}
if (TRANSLATION_PROVIDER !== "openai") {
console.error(`Unsupported translation provider: ${TRANSLATION_PROVIDER}`);
return null;
}
const apiKey = process.env.OPENAI_API_KEY;
if (!apiKey) return null;