diff --git a/docutranslate/agents/agent.py b/docutranslate/agents/agent.py index dd06c18..7ff2780 100644 --- a/docutranslate/agents/agent.py +++ b/docutranslate/agents/agent.py @@ -122,7 +122,6 @@ class RateLimiter: # Check RPM if self.rpm and len(self.request_timestamps) >= self.rpm: - # 取最早的一条记录,计算还需要等待多久才能腾出位置 earliest = self.request_timestamps[0] wait_time = max(wait_time, 60 - (now - earliest)) @@ -130,14 +129,10 @@ class RateLimiter: if self.tpm: current_tokens = sum(t[1] for t in self.token_timestamps) if current_tokens + tokens > self.tpm: - # 稍微复杂点:需要移除足够多的旧token才能放入新token - # 这里做一个简化估算:如果超限,等到最早的记录过期 if self.token_timestamps: earliest = self.token_timestamps[0][0] wait_time = max(wait_time, 60 - (now - earliest)) else: - # 这种情况理论上不应该发生,除非单次请求超过了TPM上限 - # 如果单次超过上限,强制等待1秒(防止死循环)并允许通过(或者抛异常,这里选择允许) pass return wait_time @@ -156,14 +151,19 @@ class RateLimiter: return while True: + # print(f"[RateLimiter-Async] 准备获取锁...") with self.lock: + print(f"[RateLimiter-Async] 已加锁 (Checking)") + wait_time = self._check_and_get_wait_time(tokens) if wait_time <= 0: self._record_usage(tokens) + print(f"[RateLimiter-Async] 释放锁 (成功获取配额)") return - # 释放锁后等待,避免阻塞其他协程/线程的检查 - # 添加一点点缓冲时间,避免刚唤醒时毫秒级误差导致再次等待 + print(f"[RateLimiter-Async] 释放锁 (需等待 {wait_time:.2f}s)") + + # 释放锁后等待 await asyncio.sleep(wait_time + 0.1) def acquire_sync(self, tokens: int = 0): @@ -172,12 +172,18 @@ class RateLimiter: return while True: + # print(f"[RateLimiter-Sync] 准备获取锁...") with self.lock: + print(f"[RateLimiter-Sync] 已加锁 (Checking)") + wait_time = self._check_and_get_wait_time(tokens) if wait_time <= 0: self._record_usage(tokens) + print(f"[RateLimiter-Sync] 释放锁 (成功获取配额)") return + print(f"[RateLimiter-Sync] 释放锁 (需等待 {wait_time:.2f}s)") + time.sleep(wait_time + 0.1) diff --git a/docutranslate/translator/ai_translator/ass_translator.py b/docutranslate/translator/ai_translator/ass_translator.py index 53765f6..31c1321 100644 --- a/docutranslate/translator/ai_translator/ass_translator.py +++ b/docutranslate/translator/ai_translator/ass_translator.py @@ -40,7 +40,9 @@ class AssTranslator(AiTranslator): glossary_dict=config.glossary_dict, retry=config.retry, system_proxy_enable=config.system_proxy_enable, - force_json=config.force_json + force_json=config.force_json, + rpm=config.rpm, + tpm=config.tpm ) self.translate_agent = SegmentsTranslateAgent(agent_config) self.insert_mode = config.insert_mode diff --git a/docutranslate/translator/ai_translator/docx_translator.py b/docutranslate/translator/ai_translator/docx_translator.py index 2ac6659..d9e9970 100644 --- a/docutranslate/translator/ai_translator/docx_translator.py +++ b/docutranslate/translator/ai_translator/docx_translator.py @@ -129,7 +129,9 @@ class DocxTranslator(AiTranslator): api_key=config.api_key, model_id=config.model_id, temperature=config.temperature, thinking=config.thinking, concurrent=config.concurrent, timeout=config.timeout, logger=self.logger, glossary_dict=config.glossary_dict, retry=config.retry, - system_proxy_enable=config.system_proxy_enable, force_json=config.force_json + system_proxy_enable=config.system_proxy_enable, force_json=config.force_json, + rpm=config.rpm, + tpm=config.tpm ) self.translate_agent = SegmentsTranslateAgent(agent_config) self.insert_mode = config.insert_mode diff --git a/docutranslate/translator/ai_translator/epub_translator.py b/docutranslate/translator/ai_translator/epub_translator.py index ae3a073..96000be 100644 --- a/docutranslate/translator/ai_translator/epub_translator.py +++ b/docutranslate/translator/ai_translator/epub_translator.py @@ -51,7 +51,9 @@ class EpubTranslator(AiTranslator): glossary_dict=config.glossary_dict, retry=config.retry, system_proxy_enable=config.system_proxy_enable, - force_json=config.force_json + force_json=config.force_json, + rpm=config.rpm, + tpm=config.tpm ) self.translate_agent = SegmentsTranslateAgent(agent_config) self.insert_mode = config.insert_mode diff --git a/docutranslate/translator/ai_translator/html_translator.py b/docutranslate/translator/ai_translator/html_translator.py index 2054742..0d6e3f1 100644 --- a/docutranslate/translator/ai_translator/html_translator.py +++ b/docutranslate/translator/ai_translator/html_translator.py @@ -69,7 +69,9 @@ class HtmlTranslator(AiTranslator): glossary_dict=config.glossary_dict, retry=config.retry, system_proxy_enable=config.system_proxy_enable, - force_json=config.force_json + force_json=config.force_json, + rpm=config.rpm, + tpm=config.tpm ) self.translate_agent = SegmentsTranslateAgent(agent_config) self.insert_mode = config.insert_mode diff --git a/docutranslate/translator/ai_translator/json_translator.py b/docutranslate/translator/ai_translator/json_translator.py index da18c2f..211fbdc 100644 --- a/docutranslate/translator/ai_translator/json_translator.py +++ b/docutranslate/translator/ai_translator/json_translator.py @@ -37,7 +37,9 @@ class JsonTranslator(AiTranslator): glossary_dict=config.glossary_dict, retry=config.retry, system_proxy_enable=config.system_proxy_enable, - force_json=config.force_json + force_json=config.force_json, + rpm=config.rpm, + tpm=config.tpm ) self.translate_agent = SegmentsTranslateAgent(agent_config) self.json_paths = config.json_paths diff --git a/docutranslate/translator/ai_translator/md_translator.py b/docutranslate/translator/ai_translator/md_translator.py index 4e19e77..5600ccf 100644 --- a/docutranslate/translator/ai_translator/md_translator.py +++ b/docutranslate/translator/ai_translator/md_translator.py @@ -40,7 +40,10 @@ class MDTranslator(AiTranslator): logger=self.logger, glossary_dict=config.glossary_dict, retry=config.retry, - system_proxy_enable=config.system_proxy_enable) + system_proxy_enable=config.system_proxy_enable, + rpm=config.rpm, + tpm=config.tpm + ) self.translate_agent = MDTranslateAgent(agent_config) def translate(self, document: MarkdownDocument) -> Self: diff --git a/docutranslate/translator/ai_translator/pptx_translator.py b/docutranslate/translator/ai_translator/pptx_translator.py index 6ffa5f1..f2fdfb0 100644 --- a/docutranslate/translator/ai_translator/pptx_translator.py +++ b/docutranslate/translator/ai_translator/pptx_translator.py @@ -3,14 +3,14 @@ import asyncio from dataclasses import dataclass from io import BytesIO -from typing import Self, Literal, List, Dict, Any, Tuple, Optional +from typing import Self, Literal, List, Dict, Any, Tuple from pptx import Presentation +from pptx.enum.dml import MSO_COLOR_TYPE from pptx.enum.shapes import MSO_SHAPE_TYPE from pptx.enum.text import MSO_AUTO_SIZE -from pptx.enum.dml import MSO_COLOR_TYPE -from pptx.text.text import _Paragraph, TextFrame from pptx.oxml.ns import qn +from pptx.text.text import _Paragraph, TextFrame from docutranslate.agents.segments_agent import SegmentsTranslateAgentConfig, SegmentsTranslateAgent from docutranslate.ir.document import Document @@ -46,7 +46,9 @@ class PPTXTranslator(AiTranslator): api_key=config.api_key, model_id=config.model_id, temperature=config.temperature, thinking=config.thinking, concurrent=config.concurrent, timeout=config.timeout, logger=self.logger, glossary_dict=config.glossary_dict, retry=config.retry, - system_proxy_enable=config.system_proxy_enable, force_json=config.force_json + system_proxy_enable=config.system_proxy_enable, force_json=config.force_json, + rpm=config.rpm, + tpm=config.tpm ) self.translate_agent = SegmentsTranslateAgent(agent_config) self.insert_mode = config.insert_mode @@ -335,4 +337,4 @@ class PPTXTranslator(AiTranslator): translated = await self.translate_agent.send_segments_async(originals, self.chunk_size) if self.translate_agent else originals document.content = await asyncio.to_thread(self._after_translate, prs, elements, translated, originals) - return self \ No newline at end of file + return self diff --git a/docutranslate/translator/ai_translator/srt_translator.py b/docutranslate/translator/ai_translator/srt_translator.py index afa0d38..6d7a18d 100644 --- a/docutranslate/translator/ai_translator/srt_translator.py +++ b/docutranslate/translator/ai_translator/srt_translator.py @@ -42,7 +42,9 @@ class SrtTranslator(AiTranslator): glossary_dict=config.glossary_dict, retry=config.retry, system_proxy_enable=config.system_proxy_enable, - force_json=config.force_json + force_json=config.force_json, + rpm=config.rpm, + tpm=config.tpm ) self.translate_agent = SegmentsTranslateAgent(agent_config) self.insert_mode = config.insert_mode diff --git a/docutranslate/translator/ai_translator/txt_translator.py b/docutranslate/translator/ai_translator/txt_translator.py index 691354a..2b8e8b3 100644 --- a/docutranslate/translator/ai_translator/txt_translator.py +++ b/docutranslate/translator/ai_translator/txt_translator.py @@ -74,7 +74,9 @@ class TXTTranslator(AiTranslator): glossary_dict=config.glossary_dict, retry=config.retry, system_proxy_enable=config.system_proxy_enable, - force_json=config.force_json + force_json=config.force_json, + rpm=config.rpm, + tpm=config.tpm ) self.translate_agent = SegmentsTranslateAgent(agent_config) self.insert_mode = config.insert_mode diff --git a/docutranslate/translator/ai_translator/xlsx_translator.py b/docutranslate/translator/ai_translator/xlsx_translator.py index d1b0e67..8d63963 100644 --- a/docutranslate/translator/ai_translator/xlsx_translator.py +++ b/docutranslate/translator/ai_translator/xlsx_translator.py @@ -43,7 +43,9 @@ class XlsxTranslator(AiTranslator): glossary_dict=config.glossary_dict, retry=config.retry, system_proxy_enable=config.system_proxy_enable, - force_json=config.force_json + force_json=config.force_json, + rpm=config.rpm, + tpm=config.tpm ) self.translate_agent = SegmentsTranslateAgent(agent_config) self.insert_mode = config.insert_mode