|
from __future__ import annotations |
|
|
|
import time |
|
from ast import List |
|
|
|
import openai |
|
from colorama import Fore, Style |
|
from openai.error import APIError, RateLimitError |
|
|
|
from autogpt.config import Config |
|
from autogpt.logs import logger |
|
|
|
CFG = Config() |
|
|
|
openai.api_key = CFG.openai_api_key |
|
|
|
|
|
def call_ai_function( |
|
function: str, args: list, description: str, model: str | None = None |
|
) -> str: |
|
"""Call an AI function |
|
|
|
This is a magic function that can do anything with no-code. See |
|
https://github.com/Torantulino/AI-Functions for more info. |
|
|
|
Args: |
|
function (str): The function to call |
|
args (list): The arguments to pass to the function |
|
description (str): The description of the function |
|
model (str, optional): The model to use. Defaults to None. |
|
|
|
Returns: |
|
str: The response from the function |
|
""" |
|
if model is None: |
|
model = CFG.smart_llm_model |
|
|
|
args = [str(arg) if arg is not None else "None" for arg in args] |
|
|
|
args = ", ".join(args) |
|
messages = [ |
|
{ |
|
"role": "system", |
|
"content": f"You are now the following python function: ```# {description}" |
|
f"\n{function}```\n\nOnly respond with your `return` value.", |
|
}, |
|
{"role": "user", "content": args}, |
|
] |
|
|
|
return create_chat_completion(model=model, messages=messages, temperature=0) |
|
|
|
|
|
|
|
|
|
def create_chat_completion( |
|
messages: list, |
|
model: str | None = None, |
|
temperature: float = CFG.temperature, |
|
max_tokens: int | None = None, |
|
) -> str: |
|
"""Create a chat completion using the OpenAI API |
|
|
|
Args: |
|
messages (list[dict[str, str]]): The messages to send to the chat completion |
|
model (str, optional): The model to use. Defaults to None. |
|
temperature (float, optional): The temperature to use. Defaults to 0.9. |
|
max_tokens (int, optional): The max tokens to use. Defaults to None. |
|
|
|
Returns: |
|
str: The response from the chat completion |
|
""" |
|
response = None |
|
num_retries = 10 |
|
warned_user = False |
|
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): |
|
backoff = 2 ** (attempt + 2) |
|
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: ", |
|
f"Reached rate limit, passing..." + Fore.RESET, |
|
) |
|
if not warned_user: |
|
logger.double_check( |
|
f"Please double check that you have setup a {Fore.CYAN + Style.BRIGHT}PAID{Style.RESET_ALL} OpenAI API Account. " |
|
+ f"You can read more here: {Fore.CYAN}https://github.com/Significant-Gravitas/Auto-GPT#openai-api-keys-configuration{Fore.RESET}" |
|
) |
|
warned_user = True |
|
except APIError as e: |
|
if e.http_status == 502: |
|
pass |
|
else: |
|
raise |
|
if attempt == num_retries - 1: |
|
raise |
|
if CFG.debug_mode: |
|
print( |
|
Fore.RED + "Error: ", |
|
f"API Bad gateway. Waiting {backoff} seconds..." + Fore.RESET, |
|
) |
|
time.sleep(backoff) |
|
if response is None: |
|
logger.typewriter_log( |
|
"FAILED TO GET RESPONSE FROM OPENAI", |
|
Fore.RED, |
|
"Auto-GPT has failed to get a response from OpenAI's services. " |
|
+ f"Try running Auto-GPT again, and if the problem the persists try running it with `{Fore.CYAN}--debug{Fore.RESET}`.", |
|
) |
|
logger.double_check() |
|
if CFG.debug_mode: |
|
raise RuntimeError(f"Failed to get response after {num_retries} retries") |
|
else: |
|
quit(1) |
|
|
|
return response.choices[0].message["content"] |
|
|
|
|
|
def create_embedding_with_ada(text) -> list: |
|
"""Create an embedding with text-ada-002 using the OpenAI SDK""" |
|
num_retries = 10 |
|
for attempt in range(num_retries): |
|
backoff = 2 ** (attempt + 2) |
|
try: |
|
if CFG.use_azure: |
|
return openai.Embedding.create( |
|
input=[text], |
|
engine=CFG.get_azure_deployment_id_for_model( |
|
"text-embedding-ada-002" |
|
), |
|
)["data"][0]["embedding"] |
|
else: |
|
return openai.Embedding.create( |
|
input=[text], model="text-embedding-ada-002" |
|
)["data"][0]["embedding"] |
|
except RateLimitError: |
|
pass |
|
except APIError as e: |
|
if e.http_status == 502: |
|
pass |
|
else: |
|
raise |
|
if attempt == num_retries - 1: |
|
raise |
|
if CFG.debug_mode: |
|
print( |
|
Fore.RED + "Error: ", |
|
f"API Bad gateway. Waiting {backoff} seconds..." + Fore.RESET, |
|
) |
|
time.sleep(backoff) |
|
|