mirror of
https://github.com/qodo-ai/pr-agent.git
synced 2025-07-03 20:30:41 +08:00
Merge pull request #1808 from group-3-sPRinter/fix/retry-exclude-rate-limit-error
fix: exclude RateLimitError from `@retry` in `AIHandler.chat_completion()`
This commit is contained in:
@ -6,8 +6,8 @@ except: # we don't enforce langchain as a dependency, so if it's not installed,
|
|||||||
|
|
||||||
import functools
|
import functools
|
||||||
|
|
||||||
from openai import APIError, RateLimitError, Timeout
|
import openai
|
||||||
from retry import retry
|
from tenacity import retry, retry_if_exception_type, retry_if_not_exception_type, stop_after_attempt
|
||||||
|
|
||||||
from pr_agent.algo.ai_handlers.base_ai_handler import BaseAiHandler
|
from pr_agent.algo.ai_handlers.base_ai_handler import BaseAiHandler
|
||||||
from pr_agent.config_loader import get_settings
|
from pr_agent.config_loader import get_settings
|
||||||
@ -36,8 +36,10 @@ class LangChainOpenAIHandler(BaseAiHandler):
|
|||||||
"""
|
"""
|
||||||
return get_settings().get("OPENAI.DEPLOYMENT_ID", None)
|
return get_settings().get("OPENAI.DEPLOYMENT_ID", None)
|
||||||
|
|
||||||
@retry(exceptions=(APIError, Timeout, AttributeError, RateLimitError),
|
@retry(
|
||||||
tries=OPENAI_RETRIES, delay=2, backoff=2, jitter=(1, 3))
|
retry=retry_if_exception_type(openai.APIError) & retry_if_not_exception_type(openai.RateLimitError),
|
||||||
|
stop=stop_after_attempt(OPENAI_RETRIES),
|
||||||
|
)
|
||||||
async def chat_completion(self, model: str, system: str, user: str, temperature: float = 0.2):
|
async def chat_completion(self, model: str, system: str, user: str, temperature: float = 0.2):
|
||||||
try:
|
try:
|
||||||
messages = [SystemMessage(content=system), HumanMessage(content=user)]
|
messages = [SystemMessage(content=system), HumanMessage(content=user)]
|
||||||
@ -47,9 +49,15 @@ class LangChainOpenAIHandler(BaseAiHandler):
|
|||||||
finish_reason = "completed"
|
finish_reason = "completed"
|
||||||
return resp.content, finish_reason
|
return resp.content, finish_reason
|
||||||
|
|
||||||
except (Exception) as e:
|
except openai.RateLimitError as e:
|
||||||
get_logger().error("Unknown error during OpenAI inference: ", e)
|
get_logger().error(f"Rate limit error during LLM inference: {e}")
|
||||||
raise e
|
raise
|
||||||
|
except openai.APIError as e:
|
||||||
|
get_logger().warning(f"Error during LLM inference: {e}")
|
||||||
|
raise
|
||||||
|
except Exception as e:
|
||||||
|
get_logger().warning(f"Unknown error during LLM inference: {e}")
|
||||||
|
raise openai.APIError from e
|
||||||
|
|
||||||
def _create_chat(self, deployment_id=None):
|
def _create_chat(self, deployment_id=None):
|
||||||
try:
|
try:
|
||||||
|
@ -3,7 +3,7 @@ import litellm
|
|||||||
import openai
|
import openai
|
||||||
import requests
|
import requests
|
||||||
from litellm import acompletion
|
from litellm import acompletion
|
||||||
from tenacity import retry, retry_if_exception_type, stop_after_attempt
|
from tenacity import retry, retry_if_exception_type, retry_if_not_exception_type, stop_after_attempt
|
||||||
|
|
||||||
from pr_agent.algo import CLAUDE_EXTENDED_THINKING_MODELS, NO_SUPPORT_TEMPERATURE_MODELS, SUPPORT_REASONING_EFFORT_MODELS, USER_MESSAGE_ONLY_MODELS
|
from pr_agent.algo import CLAUDE_EXTENDED_THINKING_MODELS, NO_SUPPORT_TEMPERATURE_MODELS, SUPPORT_REASONING_EFFORT_MODELS, USER_MESSAGE_ONLY_MODELS
|
||||||
from pr_agent.algo.ai_handlers.base_ai_handler import BaseAiHandler
|
from pr_agent.algo.ai_handlers.base_ai_handler import BaseAiHandler
|
||||||
@ -274,8 +274,8 @@ class LiteLLMAIHandler(BaseAiHandler):
|
|||||||
return get_settings().get("OPENAI.DEPLOYMENT_ID", None)
|
return get_settings().get("OPENAI.DEPLOYMENT_ID", None)
|
||||||
|
|
||||||
@retry(
|
@retry(
|
||||||
retry=retry_if_exception_type((openai.APIError, openai.APIConnectionError, openai.APITimeoutError)), # No retry on RateLimitError
|
retry=retry_if_exception_type(openai.APIError) & retry_if_not_exception_type(openai.RateLimitError),
|
||||||
stop=stop_after_attempt(OPENAI_RETRIES)
|
stop=stop_after_attempt(OPENAI_RETRIES),
|
||||||
)
|
)
|
||||||
async def chat_completion(self, model: str, system: str, user: str, temperature: float = 0.2, img_path: str = None):
|
async def chat_completion(self, model: str, system: str, user: str, temperature: float = 0.2, img_path: str = None):
|
||||||
try:
|
try:
|
||||||
@ -371,13 +371,13 @@ class LiteLLMAIHandler(BaseAiHandler):
|
|||||||
get_logger().info(f"\nUser prompt:\n{user}")
|
get_logger().info(f"\nUser prompt:\n{user}")
|
||||||
|
|
||||||
response = await acompletion(**kwargs)
|
response = await acompletion(**kwargs)
|
||||||
except (openai.RateLimitError) as e:
|
except openai.RateLimitError as e:
|
||||||
get_logger().error(f"Rate limit error during LLM inference: {e}")
|
get_logger().error(f"Rate limit error during LLM inference: {e}")
|
||||||
raise
|
raise
|
||||||
except (openai.APIError, openai.APITimeoutError) as e:
|
except openai.APIError as e:
|
||||||
get_logger().warning(f"Error during LLM inference: {e}")
|
get_logger().warning(f"Error during LLM inference: {e}")
|
||||||
raise
|
raise
|
||||||
except (Exception) as e:
|
except Exception as e:
|
||||||
get_logger().warning(f"Unknown error during LLM inference: {e}")
|
get_logger().warning(f"Unknown error during LLM inference: {e}")
|
||||||
raise openai.APIError from e
|
raise openai.APIError from e
|
||||||
if response is None or len(response["choices"]) == 0:
|
if response is None or len(response["choices"]) == 0:
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
from os import environ
|
from os import environ
|
||||||
from pr_agent.algo.ai_handlers.base_ai_handler import BaseAiHandler
|
from pr_agent.algo.ai_handlers.base_ai_handler import BaseAiHandler
|
||||||
import openai
|
import openai
|
||||||
from openai import APIError, AsyncOpenAI, RateLimitError, Timeout
|
from openai import AsyncOpenAI
|
||||||
from retry import retry
|
from tenacity import retry, retry_if_exception_type, retry_if_not_exception_type, stop_after_attempt
|
||||||
|
|
||||||
from pr_agent.algo.ai_handlers.base_ai_handler import BaseAiHandler
|
from pr_agent.algo.ai_handlers.base_ai_handler import BaseAiHandler
|
||||||
from pr_agent.config_loader import get_settings
|
from pr_agent.config_loader import get_settings
|
||||||
@ -38,8 +38,10 @@ class OpenAIHandler(BaseAiHandler):
|
|||||||
"""
|
"""
|
||||||
return get_settings().get("OPENAI.DEPLOYMENT_ID", None)
|
return get_settings().get("OPENAI.DEPLOYMENT_ID", None)
|
||||||
|
|
||||||
@retry(exceptions=(APIError, Timeout, AttributeError, RateLimitError),
|
@retry(
|
||||||
tries=OPENAI_RETRIES, delay=2, backoff=2, jitter=(1, 3))
|
retry=retry_if_exception_type(openai.APIError) & retry_if_not_exception_type(openai.RateLimitError),
|
||||||
|
stop=stop_after_attempt(OPENAI_RETRIES),
|
||||||
|
)
|
||||||
async def chat_completion(self, model: str, system: str, user: str, temperature: float = 0.2):
|
async def chat_completion(self, model: str, system: str, user: str, temperature: float = 0.2):
|
||||||
try:
|
try:
|
||||||
get_logger().info("System: ", system)
|
get_logger().info("System: ", system)
|
||||||
@ -57,12 +59,12 @@ class OpenAIHandler(BaseAiHandler):
|
|||||||
get_logger().info("AI response", response=resp, messages=messages, finish_reason=finish_reason,
|
get_logger().info("AI response", response=resp, messages=messages, finish_reason=finish_reason,
|
||||||
model=model, usage=usage)
|
model=model, usage=usage)
|
||||||
return resp, finish_reason
|
return resp, finish_reason
|
||||||
except (APIError, Timeout) as e:
|
except openai.RateLimitError as e:
|
||||||
get_logger().error("Error during OpenAI inference: ", e)
|
get_logger().error(f"Rate limit error during LLM inference: {e}")
|
||||||
raise
|
raise
|
||||||
except (RateLimitError) as e:
|
except openai.APIError as e:
|
||||||
get_logger().error("Rate limit error during OpenAI inference: ", e)
|
get_logger().warning(f"Error during LLM inference: {e}")
|
||||||
raise
|
|
||||||
except (Exception) as e:
|
|
||||||
get_logger().error("Unknown error during OpenAI inference: ", e)
|
|
||||||
raise
|
raise
|
||||||
|
except Exception as e:
|
||||||
|
get_logger().warning(f"Unknown error during LLM inference: {e}")
|
||||||
|
raise openai.APIError from e
|
||||||
|
Reference in New Issue
Block a user