Spaces:
Sleeping
Sleeping
Update translator.py
Browse files- translator.py +54 -2
translator.py
CHANGED
|
@@ -13,7 +13,13 @@ from typing import Dict, List, Optional, Set, Tuple, Any
|
|
| 13 |
from enum import Enum
|
| 14 |
import requests
|
| 15 |
from tqdm import tqdm
|
| 16 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 17 |
# --- Core Library Diagnostics ---
|
| 18 |
print("🔍 System Check...")
|
| 19 |
|
|
@@ -81,6 +87,7 @@ class TranslationBackend(Enum):
|
|
| 81 |
OPENAI = "openai"
|
| 82 |
ANTHROPIC = "anthropic"
|
| 83 |
OLLAMA = "ollama"
|
|
|
|
| 84 |
AUTO = "auto"
|
| 85 |
|
| 86 |
|
|
@@ -517,6 +524,11 @@ class LLMTranslator:
|
|
| 517 |
f"Provide a natural, fluent translation. "
|
| 518 |
f"Return ONLY the translation:\n\n{text}"
|
| 519 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 520 |
|
| 521 |
for provider_name, provider in self.providers.items():
|
| 522 |
try:
|
|
@@ -1000,6 +1012,41 @@ class SlideMetadata:
|
|
| 1000 |
# DOCUMENT TRANSLATOR
|
| 1001 |
# ============================================================================
|
| 1002 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1003 |
class UltimateDocumentTranslator:
|
| 1004 |
"""Document translator with configurable backends and M1 optimization."""
|
| 1005 |
|
|
@@ -1039,7 +1086,12 @@ class UltimateDocumentTranslator:
|
|
| 1039 |
|
| 1040 |
elif nmt_backend == "opus":
|
| 1041 |
self.opus = OpusMTTranslator(src_lang, tgt_lang)
|
| 1042 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1043 |
elif nmt_backend == "madlad":
|
| 1044 |
self.madlad = Madlad400Translator(src_lang, tgt_lang, "3b")
|
| 1045 |
|
|
|
|
| 13 |
from enum import Enum
|
| 14 |
import requests
|
| 15 |
from tqdm import tqdm
|
| 16 |
+
# Add to existing imports
|
| 17 |
+
try:
|
| 18 |
+
from gradio_client import Client
|
| 19 |
+
HAS_GRADIO_CLIENT = True
|
| 20 |
+
except ImportError:
|
| 21 |
+
HAS_GRADIO_CLIENT = False
|
| 22 |
+
|
| 23 |
# --- Core Library Diagnostics ---
|
| 24 |
print("🔍 System Check...")
|
| 25 |
|
|
|
|
| 87 |
OPENAI = "openai"
|
| 88 |
ANTHROPIC = "anthropic"
|
| 89 |
OLLAMA = "ollama"
|
| 90 |
+
SAUERKRAUT = "sauerkraut"
|
| 91 |
AUTO = "auto"
|
| 92 |
|
| 93 |
|
|
|
|
| 524 |
f"Provide a natural, fluent translation. "
|
| 525 |
f"Return ONLY the translation:\n\n{text}"
|
| 526 |
)
|
| 527 |
+
|
| 528 |
+
# Sauerkraut API
|
| 529 |
+
if hasattr(self, 'sauerkraut') and self.sauerkraut and self.sauerkraut.available:
|
| 530 |
+
result = self.sauerkraut.translate_batch([text])[0]
|
| 531 |
+
if result and result.strip() != text.strip(): return result
|
| 532 |
|
| 533 |
for provider_name, provider in self.providers.items():
|
| 534 |
try:
|
|
|
|
| 1012 |
# DOCUMENT TRANSLATOR
|
| 1013 |
# ============================================================================
|
| 1014 |
|
| 1015 |
+
class SauerkrautTranslator:
|
| 1016 |
+
"""External API Backend: SauerkrautLM-Translator via Gradio Client."""
|
| 1017 |
+
def __init__(self, target_lang: str):
|
| 1018 |
+
self.target_lang = target_lang
|
| 1019 |
+
self.available = False
|
| 1020 |
+
if not HAS_GRADIO_CLIENT:
|
| 1021 |
+
return
|
| 1022 |
+
|
| 1023 |
+
try:
|
| 1024 |
+
logger.info("NMT | Connecting to SauerkrautLM API...")
|
| 1025 |
+
self.client = Client("VAGOsolutions/SauerkrautLM-Translator-LFM2.5-1.2b-Demo")
|
| 1026 |
+
self.available = True
|
| 1027 |
+
logger.info("✓ NMT | SauerkrautLM API Ready")
|
| 1028 |
+
except Exception as e:
|
| 1029 |
+
logger.error(f"NMT | SauerkrautLM connection failed: {e}")
|
| 1030 |
+
|
| 1031 |
+
def translate_batch(self, texts: List[str]) -> List[str]:
|
| 1032 |
+
if not self.available or not texts:
|
| 1033 |
+
return texts
|
| 1034 |
+
|
| 1035 |
+
results = []
|
| 1036 |
+
for text in texts:
|
| 1037 |
+
try:
|
| 1038 |
+
# The API returns (Prompt, Raw Response, Translation)
|
| 1039 |
+
res = self.client.predict(
|
| 1040 |
+
text=text,
|
| 1041 |
+
target_lang=self.target_lang,
|
| 1042 |
+
api_name="/translate"
|
| 1043 |
+
)
|
| 1044 |
+
results.append(res[2])
|
| 1045 |
+
except Exception as e:
|
| 1046 |
+
logger.error(f"Sauerkraut API Error: {e}")
|
| 1047 |
+
results.append(text) # Fallback to original
|
| 1048 |
+
return results
|
| 1049 |
+
|
| 1050 |
class UltimateDocumentTranslator:
|
| 1051 |
"""Document translator with configurable backends and M1 optimization."""
|
| 1052 |
|
|
|
|
| 1086 |
|
| 1087 |
elif nmt_backend == "opus":
|
| 1088 |
self.opus = OpusMTTranslator(src_lang, tgt_lang)
|
| 1089 |
+
|
| 1090 |
+
elif nmt_backend == "sauerkraut":
|
| 1091 |
+
self.sauerkraut = SauerkrautTranslator(tgt_lang)
|
| 1092 |
+
if not self.sauerkraut.available:
|
| 1093 |
+
logger.error("INIT | Sauerkraut API requested but client not available.")
|
| 1094 |
+
|
| 1095 |
elif nmt_backend == "madlad":
|
| 1096 |
self.madlad = Madlad400Translator(src_lang, tgt_lang, "3b")
|
| 1097 |
|