import time import openai from openai.error import APIError, RateLimitError from colorama import Fore from autogpt.config import Config cfg = Config() openai.api_key = cfg.openai_api_key # Overly simple abstraction until we create something better # simple retry mechanism when getting a rate error or a bad gateway def create_chat_completion( messages, model=None, temperature=cfg.temperature, max_tokens=None ) -> str: """Create a chat completion using the OpenAI API""" response = None num_retries = 5 if cfg.debug_mode: print( Fore.GREEN + f"Creating chat completion with model {model}, temperature {temperature}," f" max_tokens {max_tokens}" + Fore.RESET ) for attempt in range(num_retries): try: if cfg.use_azure: response = openai.ChatCompletion.create( deployment_id=cfg.get_azure_deployment_id_for_model(model), model=model, messages=messages, temperature=temperature, max_tokens=max_tokens, ) else: response = openai.ChatCompletion.create( model=model, messages=messages, temperature=temperature, max_tokens=max_tokens, ) break except RateLimitError: if cfg.debug_mode: print( Fore.RED + "Error: ", "API Rate Limit Reached. Waiting 20 seconds..." + Fore.RESET, ) time.sleep(20) except APIError as e: if e.http_status == 502: if cfg.debug_mode: print( Fore.RED + "Error: ", "API Bad gateway. Waiting 20 seconds..." + Fore.RESET, ) time.sleep(20) else: raise if attempt == num_retries - 1: raise if response is None: raise RuntimeError("Failed to get response after 5 retries") return response.choices[0].message["content"]