From 5fde7173249c0b321ce4e80a8992fa2457f12307 Mon Sep 17 00:00:00 2001 From: andikarachman Date: Sat, 3 Jan 2026 09:40:58 +0700 Subject: [PATCH] feat: add rate limiting with asyncio.Semaphore to batch translations --- .../tasks/translation/providers/openai_provider.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/cognee/tasks/translation/providers/openai_provider.py b/cognee/tasks/translation/providers/openai_provider.py index 95597e368..b0508974a 100644 --- a/cognee/tasks/translation/providers/openai_provider.py +++ b/cognee/tasks/translation/providers/openai_provider.py @@ -100,19 +100,29 @@ class OpenAITranslationProvider(TranslationProvider): texts: list[str], target_language: str = "en", source_language: Optional[str] = None, + max_concurrent: int = 5, ) -> list[TranslationResult]: """ Translate multiple texts using OpenAI's LLM. + Uses a semaphore to limit concurrent requests and avoid API rate limits. + Args: texts: List of texts to translate target_language: Target language code source_language: Source language code (optional) + max_concurrent: Maximum concurrent translation requests (default: 5) Returns: 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) def is_available(self) -> bool: