feat: add rate limiting with asyncio.Semaphore to batch translations
This commit is contained in:
parent
2b30febf8e
commit
5fde717324
1 changed files with 11 additions and 1 deletions
|
|
@ -100,19 +100,29 @@ class OpenAITranslationProvider(TranslationProvider):
|
||||||
texts: list[str],
|
texts: list[str],
|
||||||
target_language: str = "en",
|
target_language: str = "en",
|
||||||
source_language: Optional[str] = None,
|
source_language: Optional[str] = None,
|
||||||
|
max_concurrent: int = 5,
|
||||||
) -> list[TranslationResult]:
|
) -> list[TranslationResult]:
|
||||||
"""
|
"""
|
||||||
Translate multiple texts using OpenAI's LLM.
|
Translate multiple texts using OpenAI's LLM.
|
||||||
|
|
||||||
|
Uses a semaphore to limit concurrent requests and avoid API rate limits.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
texts: List of texts to translate
|
texts: List of texts to translate
|
||||||
target_language: Target language code
|
target_language: Target language code
|
||||||
source_language: Source language code (optional)
|
source_language: Source language code (optional)
|
||||||
|
max_concurrent: Maximum concurrent translation requests (default: 5)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
List of TranslationResult objects
|
List of TranslationResult objects
|
||||||
"""
|
"""
|
||||||
tasks = [self.translate(text, target_language, source_language) for text in texts]
|
semaphore = asyncio.Semaphore(max_concurrent)
|
||||||
|
|
||||||
|
async def limited_translate(text: str) -> TranslationResult:
|
||||||
|
async with semaphore:
|
||||||
|
return await self.translate(text, target_language, source_language)
|
||||||
|
|
||||||
|
tasks = [limited_translate(text) for text in texts]
|
||||||
return await asyncio.gather(*tasks)
|
return await asyncio.gather(*tasks)
|
||||||
|
|
||||||
def is_available(self) -> bool:
|
def is_available(self) -> bool:
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue