mirror of
https://github.com/Paillat-dev/Botator.git
synced 2026-01-02 09:16:19 +00:00
Format with black
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
from src.utils.openaicaller import openai_caller
|
||||
|
||||
|
||||
async def moderate(api_key, text, recall_func=None):
|
||||
caller = openai_caller(api_key)
|
||||
response = await caller.moderation(
|
||||
@@ -7,4 +8,4 @@ async def moderate(api_key, text, recall_func=None):
|
||||
api_key=api_key,
|
||||
input=text,
|
||||
)
|
||||
return response["results"][0]["flagged"] # type: ignore
|
||||
return response["results"][0]["flagged"] # type: ignore
|
||||
|
||||
@@ -23,22 +23,44 @@ Refer to function and method documentation for further details.
|
||||
import openai as openai_module
|
||||
import asyncio
|
||||
|
||||
from openai.error import APIError, Timeout, RateLimitError, APIConnectionError, InvalidRequestError, AuthenticationError, ServiceUnavailableError
|
||||
from openai.error import (
|
||||
APIError,
|
||||
Timeout,
|
||||
RateLimitError,
|
||||
APIConnectionError,
|
||||
InvalidRequestError,
|
||||
AuthenticationError,
|
||||
ServiceUnavailableError,
|
||||
)
|
||||
from src.utils.tokens import num_tokens_from_messages
|
||||
|
||||
class bcolors:
|
||||
HEADER = '\033[95m'
|
||||
OKBLUE = '\033[94m'
|
||||
OKCYAN = '\033[96m'
|
||||
OKGREEN = '\033[92m'
|
||||
WARNING = '\033[93m'
|
||||
FAIL = '\033[91m'
|
||||
ENDC = '\033[0m'
|
||||
BOLD = '\033[1m'
|
||||
UNDERLINE = '\033[4m'
|
||||
|
||||
chat_models = ["gpt-4", "gpt-4-32k", "gpt-3.5-turbo", "gpt-3.5-turbo-16k", "gpt-3.5-turbo-0613"]
|
||||
text_models = ["text-davinci-003", "text-davinci-002", "text-curie-001", "text-babbage-001", "text-ada-001"]
|
||||
class bcolors:
|
||||
HEADER = "\033[95m"
|
||||
OKBLUE = "\033[94m"
|
||||
OKCYAN = "\033[96m"
|
||||
OKGREEN = "\033[92m"
|
||||
WARNING = "\033[93m"
|
||||
FAIL = "\033[91m"
|
||||
ENDC = "\033[0m"
|
||||
BOLD = "\033[1m"
|
||||
UNDERLINE = "\033[4m"
|
||||
|
||||
|
||||
chat_models = [
|
||||
"gpt-4",
|
||||
"gpt-4-32k",
|
||||
"gpt-3.5-turbo",
|
||||
"gpt-3.5-turbo-16k",
|
||||
"gpt-3.5-turbo-0613",
|
||||
]
|
||||
text_models = [
|
||||
"text-davinci-003",
|
||||
"text-davinci-002",
|
||||
"text-curie-001",
|
||||
"text-babbage-001",
|
||||
"text-ada-001",
|
||||
]
|
||||
|
||||
models_max_tokens = {
|
||||
"gpt-4": 8_192,
|
||||
@@ -53,26 +75,31 @@ models_max_tokens = {
|
||||
"text-ada-001": 2_049,
|
||||
}
|
||||
|
||||
|
||||
class openai_caller:
|
||||
def __init__(self, api_key=None) -> None:
|
||||
self.api_key = api_key
|
||||
|
||||
async def generate_response(self, error_call=None, **kwargs):
|
||||
if error_call is None:
|
||||
error_call = lambda x: 2 # do nothing
|
||||
error_call = lambda x: 2 # do nothing
|
||||
if kwargs.get("model", "") in chat_models:
|
||||
return await self.chat_generate(error_call, **kwargs)
|
||||
elif kwargs.get("engine", "") in text_models:
|
||||
raise NotImplementedError("Text models are not supported yet")
|
||||
else:
|
||||
raise ValueError("Model not found")
|
||||
|
||||
async def chat_generate(self, recall_func, **kwargs):
|
||||
tokens = await num_tokens_from_messages(kwargs['messages'], kwargs['model'])
|
||||
model_max_tokens = models_max_tokens[kwargs['model']]
|
||||
tokens = await num_tokens_from_messages(kwargs["messages"], kwargs["model"])
|
||||
model_max_tokens = models_max_tokens[kwargs["model"]]
|
||||
while tokens > model_max_tokens:
|
||||
kwargs['messages'] = kwargs['messages'][1:]
|
||||
print(f"{bcolors.BOLD}{bcolors.WARNING}Warning: Too many tokens. Removing first message.{bcolors.ENDC}")
|
||||
tokens = await num_tokens_from_messages(kwargs['messages'], kwargs['model'])
|
||||
kwargs['api_key'] = self.api_key
|
||||
kwargs["messages"] = kwargs["messages"][1:]
|
||||
print(
|
||||
f"{bcolors.BOLD}{bcolors.WARNING}Warning: Too many tokens. Removing first message.{bcolors.ENDC}"
|
||||
)
|
||||
tokens = await num_tokens_from_messages(kwargs["messages"], kwargs["model"])
|
||||
kwargs["api_key"] = self.api_key
|
||||
callable = lambda: openai_module.ChatCompletion.acreate(**kwargs)
|
||||
response = await self.retryal_call(recall_func, callable)
|
||||
return response
|
||||
@@ -92,60 +119,83 @@ class openai_caller:
|
||||
response = await callable()
|
||||
return response
|
||||
except APIError as e:
|
||||
print(f"\n\n{bcolors.BOLD}{bcolors.WARNING}APIError. This is not your fault. Retrying...{bcolors.ENDC}")
|
||||
await recall_func("`An APIError occurred. This is not your fault. Retrying...`")
|
||||
print(
|
||||
f"\n\n{bcolors.BOLD}{bcolors.WARNING}APIError. This is not your fault. Retrying...{bcolors.ENDC}"
|
||||
)
|
||||
await recall_func(
|
||||
"`An APIError occurred. This is not your fault. Retrying...`"
|
||||
)
|
||||
await asyncio.sleep(10)
|
||||
await recall_func()
|
||||
i += 1
|
||||
except Timeout as e:
|
||||
print(f"\n\n{bcolors.BOLD}{bcolors.WARNING}The request timed out. Retrying...{bcolors.ENDC}")
|
||||
print(
|
||||
f"\n\n{bcolors.BOLD}{bcolors.WARNING}The request timed out. Retrying...{bcolors.ENDC}"
|
||||
)
|
||||
await recall_func("`The request timed out. Retrying...`")
|
||||
await asyncio.sleep(10)
|
||||
await recall_func()
|
||||
i += 1
|
||||
except RateLimitError as e:
|
||||
print(f"\n\n{bcolors.BOLD}{bcolors.WARNING}RateLimitError. You are being rate limited. Retrying...{bcolors.ENDC}")
|
||||
print(
|
||||
f"\n\n{bcolors.BOLD}{bcolors.WARNING}RateLimitError. You are being rate limited. Retrying...{bcolors.ENDC}"
|
||||
)
|
||||
await recall_func("`You are being rate limited. Retrying...`")
|
||||
await asyncio.sleep(10)
|
||||
await recall_func()
|
||||
i += 1
|
||||
except APIConnectionError as e:
|
||||
print(f"\n\n{bcolors.BOLD}{bcolors.FAIL}APIConnectionError. There is an issue with your internet connection. Please check your connection.{bcolors.ENDC}")
|
||||
print(
|
||||
f"\n\n{bcolors.BOLD}{bcolors.FAIL}APIConnectionError. There is an issue with your internet connection. Please check your connection.{bcolors.ENDC}"
|
||||
)
|
||||
await recall_func()
|
||||
raise e
|
||||
except InvalidRequestError as e:
|
||||
print(f"\n\n{bcolors.BOLD}{bcolors.FAIL}InvalidRequestError. Please check your request.{bcolors.ENDC}")
|
||||
print(
|
||||
f"\n\n{bcolors.BOLD}{bcolors.FAIL}InvalidRequestError. Please check your request.{bcolors.ENDC}"
|
||||
)
|
||||
await recall_func()
|
||||
raise e
|
||||
except AuthenticationError as e:
|
||||
print(f"\n\n{bcolors.BOLD}{bcolors.FAIL}AuthenticationError. Please check your API key and if needed, also your organization ID.{bcolors.ENDC}")
|
||||
print(
|
||||
f"\n\n{bcolors.BOLD}{bcolors.FAIL}AuthenticationError. Please check your API key and if needed, also your organization ID.{bcolors.ENDC}"
|
||||
)
|
||||
await recall_func("`AuthenticationError. Please check your API key.`")
|
||||
raise e
|
||||
except ServiceUnavailableError as e:
|
||||
print(f"\n\n{bcolors.BOLD}{bcolors.WARNING}ServiceUnavailableError. The OpenAI API is not responding. Retrying...{bcolors.ENDC}")
|
||||
print(
|
||||
f"\n\n{bcolors.BOLD}{bcolors.WARNING}ServiceUnavailableError. The OpenAI API is not responding. Retrying...{bcolors.ENDC}"
|
||||
)
|
||||
await recall_func("`The OpenAI API is not responding. Retrying...`")
|
||||
await asyncio.sleep(10)
|
||||
await recall_func()
|
||||
i += 1
|
||||
finally:
|
||||
if i == 10:
|
||||
print(f"\n\n{bcolors.BOLD}{bcolors.FAIL}OpenAI API is not responding. Please try again later.{bcolors.ENDC}")
|
||||
raise TimeoutError("OpenAI API is not responding. Please try again later.")
|
||||
print(
|
||||
f"\n\n{bcolors.BOLD}{bcolors.FAIL}OpenAI API is not responding. Please try again later.{bcolors.ENDC}"
|
||||
)
|
||||
raise TimeoutError(
|
||||
"OpenAI API is not responding. Please try again later."
|
||||
)
|
||||
return response
|
||||
|
||||
|
||||
|
||||
##testing
|
||||
if __name__ == "__main__":
|
||||
|
||||
async def main():
|
||||
openai = openai_caller(api_key="sk-")
|
||||
response = await openai.generate_response(
|
||||
model="gpt-3.5-turbo",
|
||||
messages=[{"role":"user", "content":"ping"}],
|
||||
messages=[{"role": "user", "content": "ping"}],
|
||||
max_tokens=5,
|
||||
temperature=0.7,
|
||||
top_p=1,
|
||||
frequency_penalty=0,
|
||||
presence_penalty=0,
|
||||
stop=["\n", " Human:", " AI:"]
|
||||
stop=["\n", " Human:", " AI:"],
|
||||
)
|
||||
print(response)
|
||||
asyncio.run(main())
|
||||
|
||||
asyncio.run(main())
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
'''
|
||||
"""
|
||||
This file's purpose is to count the number of tokens used by a list of messages.
|
||||
It is used to check if the token limit of the model is reached.
|
||||
|
||||
Reference: https://github.com/openai/openai-cookbook/blob/main/examples/How_to_format_inputs_to_ChatGPT_models.ipynb
|
||||
'''
|
||||
"""
|
||||
|
||||
import tiktoken
|
||||
|
||||
|
||||
async def num_tokens_from_messages(messages, model="gpt-3.5-turbo"):
|
||||
"""Returns the number of tokens used by a list of messages."""
|
||||
try:
|
||||
@@ -16,13 +17,17 @@ async def num_tokens_from_messages(messages, model="gpt-3.5-turbo"):
|
||||
encoding = tiktoken.get_encoding("cl100k_base")
|
||||
|
||||
if model.startswith("gpt-3.5-turbo"):
|
||||
tokens_per_message = 4 # every message follows <|start|>{role/name}\n{content}<|end|>\n
|
||||
tokens_per_message = (
|
||||
4 # every message follows <|start|>{role/name}\n{content}<|end|>\n
|
||||
)
|
||||
tokens_per_name = -1 # if there's a name, the role is omitted
|
||||
elif model.startswith("gpt-4"):
|
||||
tokens_per_message = 3
|
||||
tokens_per_name = 1
|
||||
else:
|
||||
raise NotImplementedError(f"""num_tokens_from_messages() is not implemented for model {model}. See https://github.com/openai/openai-python/blob/main/chatml.md for information on how messages are converted to tokens.""")
|
||||
raise NotImplementedError(
|
||||
f"""num_tokens_from_messages() is not implemented for model {model}. See https://github.com/openai/openai-python/blob/main/chatml.md for information on how messages are converted to tokens."""
|
||||
)
|
||||
num_tokens = 0
|
||||
for message in messages:
|
||||
num_tokens += tokens_per_message
|
||||
@@ -31,4 +36,4 @@ async def num_tokens_from_messages(messages, model="gpt-3.5-turbo"):
|
||||
if key == "name":
|
||||
num_tokens += tokens_per_name
|
||||
num_tokens += 3 # every reply is primed with <|start|>assistant<|message|>
|
||||
return num_tokens
|
||||
return num_tokens
|
||||
|
||||
Reference in New Issue
Block a user