فهرست منبع

Merge pull request #243 from whomata120/feature/PDFMathTranslate

Added interfaces for Dify and AnythingLLM to construct a translation process with an integrated knowledge base, improving translation quality.
Byaidu 1 سال پیش
والد
کامیت
18068bdeed
6فایلهای تغییر یافته به همراه84 افزوده شده و 1 حذف شده
  1. 2 0
      README.md
  2. 2 0
      README_ja-JP.md
  3. 2 0
      README_zh-CN.md
  4. 3 1
      pdf2zh/converter.py
  5. 4 0
      pdf2zh/gui.py
  6. 71 0
      pdf2zh/translator.py

+ 2 - 0
README.md

@@ -206,6 +206,8 @@ The table below outlines the required [environment variables](https://chatgpt.co
 |**Gemini**|`gemini`|`GEMINI_API_KEY`, `GEMINI_MODEL`|`[Your Key]`, `gemini-1.5-flash`|See [Gemini](https://ai.google.dev/gemini-api/docs/openai)|
 |**Azure**|`azure`|`AZURE_ENDPOINT`, `AZURE_API_KEY`|`https://api.translator.azure.cn`, `[Your Key]`|See [Azure](https://docs.azure.cn/en-us/ai-services/translator/text-translation-overview)|
 |**Tencent**|`tencent`|`TENCENTCLOUD_SECRET_ID`, `TENCENTCLOUD_SECRET_KEY`|`[Your ID]`, `[Your Key]`|See [Tencent](https://www.tencentcloud.com/products/tmt?from_qcintl=122110104)|
+|**Dify**|`dify`|`DIFY_API_URL`, `DIFY_API_KEY`|`[Your DIFY URL]`, `[Your Key]`|See [Dify](https://github.com/langgenius/dify),Three variables, lang_out, lang_in, and text, need to be defined in Dify's workflow input.|
+|**AnythingLLM**|`anythingllm`|`AnythingLLM_URL`, `AnythingLLM_APIKEY`|`[Your AnythingLLM URL]`, `[Your Key]`|See [anything-llm](https://github.com/Mintplex-Labs/anything-llm)|
 
 Use `-s service` or `-s service:model` to specify service:
 

+ 2 - 0
README_ja-JP.md

@@ -206,6 +206,8 @@ pdf2zh example.pdf -li en -lo ja
 |**Gemini**|`gemini`|`GEMINI_API_KEY`, `GEMINI_MODEL`|`[Your Key]`, `gemini-1.5-flash`|See [Gemini](https://ai.google.dev/gemini-api/docs/openai)|
 |**Azure**|`azure`|`AZURE_ENDPOINT`, `AZURE_API_KEY`|`https://api.translator.azure.cn`, `[Your Key]`|See [Azure](https://docs.azure.cn/en-us/ai-services/translator/text-translation-overview)|
 |**Tencent**|`tencent`|`TENCENTCLOUD_SECRET_ID`, `TENCENTCLOUD_SECRET_KEY`|`[Your ID]`, `[Your Key]`|See [Tencent](https://www.tencentcloud.com/products/tmt?from_qcintl=122110104)|
+|**Dify**|`dify`|`DIFY_API_URL`, `DIFY_API_KEY`|`[Your DIFY URL]`, `[Your Key]`|See [Dify](https://github.com/langgenius/dify),Three variables, lang_out, lang_in, and text, need to be defined in Dify's workflow input.|
+|**AnythingLLM**|`anythingllm`|`AnythingLLM_URL`, `AnythingLLM_APIKEY`|`[Your AnythingLLM URL]`, `[Your Key]`|See [anything-llm](https://github.com/Mintplex-Labs/anything-llm)|
 
 `-s service` または `-s service:model` を使用してサービスを指定します:
 

+ 2 - 0
README_zh-CN.md

@@ -206,6 +206,8 @@ pdf2zh example.pdf -li en -lo ja
 |**Gemini**|`gemini`|`GEMINI_API_KEY`, `GEMINI_MODEL`|`[Your Key]`, `gemini-1.5-flash`|See [Gemini](https://ai.google.dev/gemini-api/docs/openai)|
 |**Azure**|`azure`|`AZURE_ENDPOINT`, `AZURE_API_KEY`|`https://api.translator.azure.cn`, `[Your Key]`|See [Azure](https://docs.azure.cn/en-us/ai-services/translator/text-translation-overview)|
 |**Tencent**|`tencent`|`TENCENTCLOUD_SECRET_ID`, `TENCENTCLOUD_SECRET_KEY`|`[Your ID]`, `[Your Key]`|See [Tencent](https://www.tencentcloud.com/products/tmt?from_qcintl=122110104)|
+|**Dify**|`dify`|`DIFY_API_URL`, `DIFY_API_KEY`|`[Your DIFY URL]`, `[Your Key]`|See [Dify](https://github.com/langgenius/dify),Three variables, lang_out, lang_in, and text, need to be defined in Dify's workflow input.|
+|**AnythingLLM**|`anythingllm`|`AnythingLLM_URL`, `AnythingLLM_APIKEY`|`[Your AnythingLLM URL]`, `[Your Key]`|See [anything-llm](https://github.com/Mintplex-Labs/anything-llm)|
 
 使用 `-s service` 或 `-s service:model` 指定翻译服务:
 

+ 3 - 1
pdf2zh/converter.py

@@ -30,6 +30,8 @@ from pdf2zh.translator import (
     GeminiTranslator,
     AzureTranslator,
     TencentTranslator,
+    DifyTranslator,
+    AnythingLLMTranslator,
 )
 from pymupdf import Font
 
@@ -143,7 +145,7 @@ class TranslateConverter(PDFConverterEx):
         service_name = param[0]
         service_model = param[1] if len(param) > 1 else None
         for translator in [GoogleTranslator, BingTranslator, DeepLTranslator, DeepLXTranslator, OllamaTranslator, AzureOpenAITranslator,
-                           OpenAITranslator, ZhipuTranslator, SiliconTranslator, GeminiTranslator, AzureTranslator, TencentTranslator]:
+                           OpenAITranslator, ZhipuTranslator, SiliconTranslator, GeminiTranslator, AzureTranslator, TencentTranslator, DifyTranslator, AnythingLLMTranslator]:
             if service_name == translator.name:
                 self.translator = translator(lang_in, lang_out, service_model)
         if not self.translator:

+ 4 - 0
pdf2zh/gui.py

@@ -17,6 +17,8 @@ from pdf2zh.translator import (
     GeminiTranslator,
     AzureTranslator,
     TencentTranslator,
+    DifyTranslator,
+    AnythingLLMTranslator,
 )
 
 import gradio as gr
@@ -38,6 +40,8 @@ service_map: dict[str, BaseTranslator] = {
     "Gemini": GeminiTranslator,
     "Azure": AzureTranslator,
     "Tencent": TencentTranslator,
+    "Dify": DifyTranslator,
+    "AnythingLLM": AnythingLLMTranslator,
 }
 lang_map = {
     "Chinese": "zh",

+ 71 - 0
pdf2zh/translator.py

@@ -352,3 +352,74 @@ class TencentTranslator(BaseTranslator):
         self.req.SourceText = text
         resp: TextTranslateResponse = self.client.TextTranslate(self.req)
         return resp.TargetText
+class AnythingLLMTranslator(BaseTranslator):
+    name = "anythingllm"
+    envs = {
+        "AnythingLLM_URL": None,
+        "AnythingLLM_APIKEY": "api_key",
+    }
+
+    def __init__(self, lang_out, lang_in, model):
+        super().__init__(lang_out, lang_in, model)
+        self.api_url = os.getenv("AnythingLLM_URL", self.envs["AnythingLLM_URL"])
+        self.api_key = os.getenv("AnythingLLM_APIKEY", self.envs["AnythingLLM_APIKEY"])
+        self.headers = {
+            "accept": "application/json",
+            "Authorization": f"Bearer {self.api_key}",
+            "Content-Type": "application/json",
+        }
+
+    def translate(self, text):
+        messages = self.prompt(text)
+        payload = {
+            "message": messages,
+            "mode": "chat",
+            "sessionId": "translation_expert",
+        }
+
+        response = requests.post(self.api_url, headers=self.headers, data=json.dumps(payload))
+        response.raise_for_status()
+        data = response.json()
+
+        if "textResponse" in data:
+            return data["textResponse"].strip()
+
+class DifyTranslator(BaseTranslator):
+    name = "dify"
+    envs = {
+        "DIFY_API_URL": None,  # 填写实际 Dify API 地址
+        "DIFY_API_KEY": "api_key"  # 替换为实际 API 密钥
+    }
+
+    def __init__(self, lang_out, lang_in, model):
+        super().__init__(lang_out, lang_in, model)
+        self.api_url = os.getenv("DIFY_API_URL", self.envs["DIFY_API_URL"])
+        self.api_key = os.getenv("DIFY_API_KEY", self.envs["DIFY_API_KEY"])
+
+    def translate(self, text):
+        headers = {
+            "Authorization": f"Bearer {self.api_key}",
+            "Content-Type": "application/json"
+        }
+
+        payload = {
+            "inputs": {
+                "lang_out": self.lang_out,
+                "lang_in": self.lang_in,
+                "text": text
+            },
+            "response_mode": "blocking",
+            "user": "translator-service"
+        }
+
+        # 向 Dify 服务器发送请求
+        response = requests.post(
+            self.api_url,
+            headers=headers,
+            data=json.dumps(payload)
+        )
+        response.raise_for_status()
+        response_data = response.json()
+
+        # 解析响应
+        return response_data.get('data', {}).get('outputs', {}).get('text', [])