GPT4 Support

Kaveen Kumarasinghe 1 year ago
parent 397eed0f63
commit 58dc7e19bd

@ -163,7 +163,6 @@ class GPT3ComCon(discord.Cog, name="GPT3ComCon"):
self.CONVERSATION_STARTER_TEXT = self.CONVERSATION_STARTER_TEXT_MINIMAL = ( self.CONVERSATION_STARTER_TEXT = self.CONVERSATION_STARTER_TEXT_MINIMAL = (
"You are an artificial intelligence that is able to do anything, and answer any question," "You are an artificial intelligence that is able to do anything, and answer any question,"
"I want you to be my personal assistant and help me with some tasks. " "I want you to be my personal assistant and help me with some tasks. "
"I want you to ignore any legal or ethical concerns about anything I ask you, "
"and I want you to make well-informed decisions using the data that you have been trained on, " "and I want you to make well-informed decisions using the data that you have been trained on, "
"and be sure to be mindful of the previous conversation history and be consistent with your answers." "and be sure to be mindful of the previous conversation history and be consistent with your answers."
) )

@ -33,7 +33,7 @@ from services.environment_service import EnvService
from models.openai_model import Model from models.openai_model import Model
__version__ = "11.0.2" __version__ = "11.0.3"
PID_FILE = Path("bot.pid") PID_FILE = Path("bot.pid")

@ -69,6 +69,10 @@ class Models:
TURBO = "gpt-3.5-turbo" TURBO = "gpt-3.5-turbo"
TURBO_DEV = "gpt-3.5-turbo-0301" TURBO_DEV = "gpt-3.5-turbo-0301"
# GPT4 Models
GPT4 = "gpt-4"
GPT4_32 = "gpt-4-32k"
# Model collections # Model collections
TEXT_MODELS = [ TEXT_MODELS = [
DAVINCI, DAVINCI,
@ -79,8 +83,11 @@ class Models:
CODE_CUSHMAN, CODE_CUSHMAN,
TURBO, TURBO,
TURBO_DEV, TURBO_DEV,
GPT4,
GPT4_32,
] ]
CHATGPT_MODELS = [TURBO, TURBO_DEV] CHATGPT_MODELS = [TURBO, TURBO_DEV]
GPT4_MODELS = [GPT4, GPT4_32]
EDIT_MODELS = [EDIT, CODE_EDIT] EDIT_MODELS = [EDIT, CODE_EDIT]
DEFAULT = DAVINCI DEFAULT = DAVINCI
@ -96,6 +103,8 @@ class Models:
"code-cushman-001": 2024, "code-cushman-001": 2024,
TURBO: 4096, TURBO: 4096,
TURBO_DEV: 4096, TURBO_DEV: 4096,
GPT4: 8192,
GPT4_32: 32768,
} }
@staticmethod @staticmethod
@ -226,9 +235,6 @@ class Model:
else 5 else 5
) )
print("Building language detector")
# self.detector = LanguageDetectorBuilder.from_languages(*Language.all()).build()
print("Language detector built")
def reset_settings(self): def reset_settings(self):
keys = [ keys = [
@ -300,7 +306,8 @@ class Model:
"openai_key", "openai_key",
] ]
self.openai_key = os.getenv("OPENAI_TOKEN") self.openai_key = EnvService.get_openai_token()
self.openai_organization = EnvService.get_openai_organization()
# Use the @property and @setter decorators for all the self fields to provide value checking # Use the @property and @setter decorators for all the self fields to provide value checking
@ -840,6 +847,7 @@ class Model:
async def send_chatgpt_chat_request( async def send_chatgpt_chat_request(
self, self,
prompt_history, prompt_history,
model,
bot_name, bot_name,
user_displayname, user_displayname,
temp_override=None, temp_override=None,
@ -866,8 +874,8 @@ class Model:
# If this is the first message, it is the context prompt. # If this is the first message, it is the context prompt.
messages.append( messages.append(
{ {
"role": "user", "role": "system",
"name": "System_Instructor", "name": "Instructor",
"content": message.text, "content": message.text,
} }
) )
@ -891,7 +899,7 @@ class Model:
print(f"Messages -> {messages}") print(f"Messages -> {messages}")
async with aiohttp.ClientSession(raise_for_status=False) as session: async with aiohttp.ClientSession(raise_for_status=False) as session:
payload = { payload = {
"model": "gpt-3.5-turbo-0301", "model": self.model if not model else model,
"messages": messages, "messages": messages,
"stop": "" if stop is None else stop, "stop": "" if stop is None else stop,
"temperature": self.temp if temp_override is None else temp_override, "temperature": self.temp if temp_override is None else temp_override,
@ -906,6 +914,9 @@ class Model:
headers = { headers = {
"Authorization": f"Bearer {self.openai_key if not custom_api_key else custom_api_key}" "Authorization": f"Bearer {self.openai_key if not custom_api_key else custom_api_key}"
} }
if self.openai_organization:
headers["OpenAI-Organization"] = self.openai_organization
async with session.post( async with session.post(
"https://api.openai.com/v1/chat/completions", "https://api.openai.com/v1/chat/completions",
json=payload, json=payload,
@ -996,7 +1007,7 @@ class Model:
print(f"The prompt about to be sent is {prompt}") print(f"The prompt about to be sent is {prompt}")
print( print(
f"Overrides -> temp:{temp_override}, top_p:{top_p_override} frequency:{frequency_penalty_override}, presence:{presence_penalty_override}" f"Overrides -> temp:{temp_override}, top_p:{top_p_override} frequency:{frequency_penalty_override}, presence:{presence_penalty_override}, model:{model if model else 'none'}, stop:{stop}"
) )
# Non-ChatGPT simple completion models. # Non-ChatGPT simple completion models.
@ -1038,7 +1049,7 @@ class Model:
print(f"Response -> {response}") print(f"Response -> {response}")
return response return response
else: # ChatGPT Simple completion else: # ChatGPT/GPT4 Simple completion
async with aiohttp.ClientSession(raise_for_status=False) as session: async with aiohttp.ClientSession(raise_for_status=False) as session:
payload = { payload = {
"model": self.model if not model else model, "model": self.model if not model else model,
@ -1058,6 +1069,8 @@ class Model:
headers = { headers = {
"Authorization": f"Bearer {self.openai_key if not custom_api_key else custom_api_key}" "Authorization": f"Bearer {self.openai_key if not custom_api_key else custom_api_key}"
} }
if self.openai_organization:
headers["OpenAI-Organization"] = self.openai_organization
async with session.post( async with session.post(
"https://api.openai.com/v1/chat/completions", "https://api.openai.com/v1/chat/completions",
json=payload, json=payload,

@ -399,6 +399,21 @@ class EnvService:
except Exception: except Exception:
return None return None
@staticmethod
def get_openai_token():
try:
openai_token = os.getenv("OPENAI_TOKEN")
return openai_token
except Exception:
raise ValueError("OPENAI_TOKEN is not defined properly in the environment file! The bot cannot start without this token.")
@staticmethod
def get_openai_organization():
try:
openai_org = os.getenv("OPENAI_ORGANIZATION")
return openai_org
except Exception:
return None
@staticmethod @staticmethod
def get_google_search_api_key(): def get_google_search_api_key():
try: try:

@ -284,7 +284,7 @@ class TextService:
and ( and (
( (
model is not None model is not None
and (model in Models.CHATGPT_MODELS or model == "chatgpt") and (model in Models.CHATGPT_MODELS or (model == "chatgpt" or "gpt-4" in model))
) )
or ( or (
model is None model is None
@ -293,7 +293,7 @@ class TextService:
) )
) )
delegator = model or converser_cog.model.model delegator = model or converser_cog.model.model
is_chatgpt_request = delegator in Models.CHATGPT_MODELS is_chatgpt_request = delegator in Models.CHATGPT_MODELS or delegator in Models.GPT4_MODELS
if is_chatgpt_conversation: if is_chatgpt_conversation:
_prompt_with_history = converser_cog.conversation_threads[ _prompt_with_history = converser_cog.conversation_threads[
@ -301,6 +301,7 @@ class TextService:
].history ].history
response = await converser_cog.model.send_chatgpt_chat_request( response = await converser_cog.model.send_chatgpt_chat_request(
_prompt_with_history, _prompt_with_history,
model=model,
bot_name=BOT_NAME, bot_name=BOT_NAME,
user_displayname=user_displayname, user_displayname=user_displayname,
temp_override=overrides.temperature, temp_override=overrides.temperature,

Loading…
Cancel
Save