Merge pull request #127 from Hikari-Haru/set-conversation-model

Add the ability to set model in threads
Kaveen Kumarasinghe 2 years ago committed by GitHub
commit 3839ff2abe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -301,6 +301,11 @@ class Commands(discord.Cog, name="Commands"):
@discord.option( @discord.option(
name="prompt", description="The prompt to send to GPT3", required=True name="prompt", description="The prompt to send to GPT3", required=True
) )
@discord.option(
name="private",
description="Will only be visible to you",
required=False
)
@discord.option( @discord.option(
name="temperature", name="temperature",
description="Higher values means the model will take more risks", description="Higher values means the model will take more risks",
@ -334,13 +339,14 @@ class Commands(discord.Cog, name="Commands"):
self, self,
ctx: discord.ApplicationContext, ctx: discord.ApplicationContext,
prompt: str, prompt: str,
private: bool,
temperature: float, temperature: float,
top_p: float, top_p: float,
frequency_penalty: float, frequency_penalty: float,
presence_penalty: float, presence_penalty: float,
): ):
await self.converser_cog.ask_command( await self.converser_cog.ask_command(
ctx, prompt, temperature, top_p, frequency_penalty, presence_penalty ctx, prompt, private, temperature, top_p, frequency_penalty, presence_penalty
) )
@add_to_group("gpt") @add_to_group("gpt")
@ -360,6 +366,11 @@ class Commands(discord.Cog, name="Commands"):
required=False, required=False,
default="", default="",
) )
@discord.option(
name="private",
description="Will only be visible to you",
required=False
)
@discord.option( @discord.option(
name="temperature", name="temperature",
description="Higher values means the model will take more risks", description="Higher values means the model will take more risks",
@ -385,12 +396,13 @@ class Commands(discord.Cog, name="Commands"):
ctx: discord.ApplicationContext, ctx: discord.ApplicationContext,
instruction: str, instruction: str,
text: str, text: str,
private: bool,
temperature: float, temperature: float,
top_p: float, top_p: float,
codex: bool, codex: bool,
): ):
await self.converser_cog.edit_command( await self.converser_cog.edit_command(
ctx, instruction, text, temperature, top_p, codex ctx, instruction, text, private, temperature, top_p, codex
) )
@add_to_group("gpt") @add_to_group("gpt")
@ -422,6 +434,13 @@ class Commands(discord.Cog, name="Commands"):
required=False, required=False,
default=False, default=False,
) )
@discord.option(
name="model",
description="Which model to use with the bot",
required=False,
default=False,
autocomplete=Settings_autocompleter.get_models,
)
@discord.option( @discord.option(
name="temperature", name="temperature",
description="Higher values means the model will take more risks", description="Higher values means the model will take more risks",
@ -462,6 +481,7 @@ class Commands(discord.Cog, name="Commands"):
opener_file: str, opener_file: str,
private: bool, private: bool,
minimal: bool, minimal: bool,
model: str,
temperature: float, temperature: float,
top_p: float, top_p: float,
frequency_penalty: float, frequency_penalty: float,
@ -473,6 +493,7 @@ class Commands(discord.Cog, name="Commands"):
opener_file, opener_file,
private, private,
minimal, minimal,
model,
temperature, temperature,
top_p, top_p,
frequency_penalty, frequency_penalty,

@ -693,6 +693,7 @@ class GPT3ComCon(discord.Cog, name="GPT3ComCon"):
self, self,
ctx: discord.ApplicationContext, ctx: discord.ApplicationContext,
prompt: str, prompt: str,
private: bool,
temperature: float, temperature: float,
top_p: float, top_p: float,
frequency_penalty: float, frequency_penalty: float,
@ -720,7 +721,7 @@ class GPT3ComCon(discord.Cog, name="GPT3ComCon"):
if not user_api_key: if not user_api_key:
return return
await ctx.defer() await ctx.defer(ephemeral=private)
overrides = Override(temperature, top_p, frequency_penalty, presence_penalty) overrides = Override(temperature, top_p, frequency_penalty, presence_penalty)
@ -741,6 +742,7 @@ class GPT3ComCon(discord.Cog, name="GPT3ComCon"):
ctx: discord.ApplicationContext, ctx: discord.ApplicationContext,
instruction: str, instruction: str,
text: str, text: str,
private: bool,
temperature: float, temperature: float,
top_p: float, top_p: float,
codex: bool, codex: bool,
@ -766,7 +768,7 @@ class GPT3ComCon(discord.Cog, name="GPT3ComCon"):
if not user_api_key: if not user_api_key:
return return
await ctx.defer() await ctx.defer(ephemeral=private)
overrides = Override(temperature, top_p, 0, 0) overrides = Override(temperature, top_p, 0, 0)
@ -801,6 +803,7 @@ class GPT3ComCon(discord.Cog, name="GPT3ComCon"):
opener_file: str, opener_file: str,
private: bool, private: bool,
minimal: bool, minimal: bool,
model: str,
temperature: float, temperature: float,
top_p: float, top_p: float,
frequency_penalty: float, frequency_penalty: float,
@ -814,6 +817,7 @@ class GPT3ComCon(discord.Cog, name="GPT3ComCon"):
opener_file (str): A .txt or .json file which is appended before the opener opener_file (str): A .txt or .json file which is appended before the opener
private (bool): If the thread should be private private (bool): If the thread should be private
minimal (bool): If a minimal starter should be used minimal (bool): If a minimal starter should be used
model (str): The openai model that should be used
temperature (float): Sets the temperature override temperature (float): Sets the temperature override
top_p (float): Sets the top p override top_p (float): Sets the top p override
frequency_penalty (float): Sets the frequency penalty override frequency_penalty (float): Sets the frequency penalty override
@ -866,7 +870,7 @@ class GPT3ComCon(discord.Cog, name="GPT3ComCon"):
) )
self.conversation_threads[thread.id] = Thread(thread.id) self.conversation_threads[thread.id] = Thread(thread.id)
self.conversation_threads[thread.id].model = self.model.model self.conversation_threads[thread.id].model = self.model.model if not model else model
# Set the overrides for the conversation # Set the overrides for the conversation
self.conversation_threads[thread.id].set_overrides( self.conversation_threads[thread.id].set_overrides(

@ -30,7 +30,8 @@ from services.environment_service import EnvService
from models.openai_model import Model from models.openai_model import Model
__version__ = "9.0.4" __version__ = "9.1"
PID_FILE = Path("bot.pid") PID_FILE = Path("bot.pid")

@ -86,6 +86,17 @@ class Settings_autocompleter:
await ctx.interaction.response.defer() # defer so the autocomplete in int values doesn't error but rather just says not found await ctx.interaction.response.defer() # defer so the autocomplete in int values doesn't error but rather just says not found
return [] return []
async def get_models(
ctx: discord.AutocompleteContext,
):
"""Gets all models"""
return [
value
for value in Models.TEXT_MODELS
if value.startswith(ctx.value.lower())
]
async def get_value_moderations( async def get_value_moderations(
ctx: discord.AutocompleteContext, ctx: discord.AutocompleteContext,
): # Behaves a bit weird if you go back and edit the parameter without typing in a new command ): # Behaves a bit weird if you go back and edit the parameter without typing in a new command

@ -78,7 +78,7 @@ class Models:
@staticmethod @staticmethod
def get_max_tokens(model: str) -> int: def get_max_tokens(model: str) -> int:
return Models.TOKEN_MAPPING.get(model, 4024) return Models.TOKEN_MAPPING.get(model, 2024)
class ImageSize: class ImageSize:
@ -576,11 +576,16 @@ class Model:
self._prompt_min_length = value self._prompt_min_length = value
SETTINGS_DB["prompt_min_length"] = value SETTINGS_DB["prompt_min_length"] = value
def backoff_handler(details): def backoff_handler_http(details):
print( print(
f"Backing off {details['wait']:0.1f} seconds after {details['tries']} tries calling function {details['target']} | " f"Backing off {details['wait']:0.1f} seconds after {details['tries']} tries calling function {details['target']} | "
f"{details['exception'].status}: {details['exception'].message}" f"{details['exception'].status}: {details['exception'].message}"
) )
def backoff_handler_request(details):
print(
f"Backing off {details['wait']:0.1f} seconds after {details['tries']} tries calling function {details['target']} | "
f"{details['exception'].args[0]}"
)
async def valid_text_request(self, response): async def valid_text_request(self, response):
try: try:
@ -598,7 +603,7 @@ class Model:
factor=3, factor=3,
base=5, base=5,
max_tries=4, max_tries=4,
on_backoff=backoff_handler, on_backoff=backoff_handler_http,
) )
async def send_embedding_request(self, text, custom_api_key=None): async def send_embedding_request(self, text, custom_api_key=None):
async with aiohttp.ClientSession(raise_for_status=True) as session: async with aiohttp.ClientSession(raise_for_status=True) as session:
@ -624,11 +629,11 @@ class Model:
@backoff.on_exception( @backoff.on_exception(
backoff.expo, backoff.expo,
aiohttp.ClientResponseError, ValueError,
factor=3, factor=3,
base=5, base=5,
max_tries=6, max_tries=4,
on_backoff=backoff_handler, on_backoff=backoff_handler_request,
) )
async def send_edit_request( async def send_edit_request(
self, self,
@ -651,7 +656,7 @@ class Model:
) )
print(f"Overrides -> temp:{temp_override}, top_p:{top_p_override}") print(f"Overrides -> temp:{temp_override}, top_p:{top_p_override}")
async with aiohttp.ClientSession(raise_for_status=True) as session: async with aiohttp.ClientSession(raise_for_status=False) as session:
payload = { payload = {
"model": Models.EDIT if codex is False else Models.CODE_EDIT, "model": Models.EDIT if codex is False else Models.CODE_EDIT,
"input": "" if text is None else text, "input": "" if text is None else text,
@ -676,7 +681,7 @@ class Model:
factor=3, factor=3,
base=5, base=5,
max_tries=6, max_tries=6,
on_backoff=backoff_handler, on_backoff=backoff_handler_http,
) )
async def send_moderations_request(self, text): async def send_moderations_request(self, text):
# Use aiohttp to send the above request: # Use aiohttp to send the above request:
@ -695,11 +700,11 @@ class Model:
@backoff.on_exception( @backoff.on_exception(
backoff.expo, backoff.expo,
aiohttp.ClientResponseError, ValueError,
factor=3, factor=3,
base=5, base=5,
max_tries=4, max_tries=4,
on_backoff=backoff_handler, on_backoff=backoff_handler_request,
) )
async def send_summary_request(self, prompt, custom_api_key=None): async def send_summary_request(self, prompt, custom_api_key=None):
""" """
@ -718,7 +723,7 @@ class Model:
tokens = self.usage_service.count_tokens(summary_request_text) tokens = self.usage_service.count_tokens(summary_request_text)
async with aiohttp.ClientSession(raise_for_status=True) as session: async with aiohttp.ClientSession(raise_for_status=False) as session:
payload = { payload = {
"model": Models.DAVINCI, "model": Models.DAVINCI,
"prompt": summary_request_text, "prompt": summary_request_text,
@ -746,11 +751,11 @@ class Model:
@backoff.on_exception( @backoff.on_exception(
backoff.expo, backoff.expo,
aiohttp.ClientResponseError, ValueError,
factor=3, factor=3,
base=5, base=5,
max_tries=4, max_tries=4,
on_backoff=backoff_handler, on_backoff=backoff_handler_request,
) )
async def send_request( async def send_request(
self, self,
@ -774,20 +779,24 @@ class Model:
f"Prompt must be greater than {self.prompt_min_length} characters, it is currently: {len(prompt)} characters" f"Prompt must be greater than {self.prompt_min_length} characters, it is currently: {len(prompt)} characters"
) )
if not max_tokens_override:
if model:
max_tokens_override = Models.get_max_tokens(model) - tokens
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}"
) )
async with aiohttp.ClientSession(raise_for_status=True) as session: async with aiohttp.ClientSession(raise_for_status=False) as session:
payload = { payload = {
"model": self.model if model is None else model, "model": self.model if model is None else model,
"prompt": prompt, "prompt": prompt,
"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,
"top_p": self.top_p if top_p_override is None else top_p_override, "top_p": self.top_p if top_p_override is None else top_p_override,
"max_tokens": self.max_tokens - tokens "max_tokens": self.max_tokens - tokens
if not max_tokens_override if max_tokens_override is None
else max_tokens_override, else max_tokens_override,
"presence_penalty": self.presence_penalty "presence_penalty": self.presence_penalty
if presence_penalty_override is None if presence_penalty_override is None
@ -839,7 +848,7 @@ class Model:
factor=3, factor=3,
base=5, base=5,
max_tries=4, max_tries=4,
on_backoff=backoff_handler, on_backoff=backoff_handler_http,
) )
async def send_image_request( async def send_image_request(
self, ctx, prompt, vary=None, custom_api_key=None self, ctx, prompt, vary=None, custom_api_key=None

Loading…
Cancel
Save