sHORTgpt / shortGPT /gpt /gpt_utils.py
ar08's picture
Update shortGPT/gpt/gpt_utils.py
4a123f1 verified
import json
import os
import re
from time import sleep, time
import openai
import tiktoken
import yaml
from shortGPT.config.api_db import ApiKeyManager
openai.base_url="https://api-inference.huggingface.co/models/mistralai/Mistral-Nemo-Instruct-2407/v1/chat/"
def num_tokens_from_messages(texts, model="gpt-3.5-turbo-0301"):
"""Returns the number of tokens used by a list of messages."""
try:
encoding = tiktoken.encoding_for_model(model)
except KeyError:
encoding = tiktoken.get_encoding("cl100k_base")
if model != "gpt-3.5-turbo-0301": # note: future models may deviate from this
if isinstance(texts, str):
texts = [texts]
score = 0
for text in texts:
score += 4 + len(encoding.encode(text))
return score
else:
raise NotImplementedError(f"""num_tokens_from_messages() is not presently implemented for model {model}.
See https://github.com/openai/openai-python/blob/main/chatml.md for information""")
def extract_biggest_json(string):
json_regex = r"\{(?:[^{}]|(?R))*\}"
json_objects = re.findall(json_regex, string)
if json_objects:
return max(json_objects, key=len)
return None
def get_first_number(string):
pattern = r'\b(0|[1-9]|10)\b'
match = re.search(pattern, string)
if match:
return int(match.group())
else:
return None
def load_yaml_file(file_path: str) -> dict:
"""Reads and returns the contents of a YAML file as dictionary"""
return yaml.safe_load(open_file(file_path))
def load_json_file(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
json_data = json.load(f)
return json_data
from pathlib import Path
def load_local_yaml_prompt(file_path):
_here = Path(__file__).parent
_absolute_path = (_here / '..' / file_path).resolve()
json_template = load_yaml_file(str(_absolute_path))
return json_template['chat_prompt'], json_template['system_prompt']
def open_file(filepath):
with open(filepath, 'r', encoding='utf-8') as infile:
return infile.read()
def gpt3Turbo_completion(chat_prompt="", system="You are an AI that can give the answer to anything", temp=0.7, model="gpt-3.5-turbo", max_tokens=1000, remove_nl=True, conversation=None):
openai.api_key = ApiKeyManager.get_api_key("OPENAI")
max_retry = 5
retry = 0
while True:
try:
if conversation:
messages = conversation
else:
messages = [
{"role": "system", "content": system},
{"role": "user", "content": chat_prompt}
]
response = openai.chat.completions.create(
model=model,
messages=messages,
max_tokens=max_tokens,
temperature=temp)
text = response.choices[0].message.content.strip()
if remove_nl:
text = re.sub('\s+', ' ', text)
filename = '%s_gpt3.txt' % time()
if not os.path.exists('.logs/gpt_logs'):
os.makedirs('.logs/gpt_logs')
with open('.logs/gpt_logs/%s' % filename, 'w', encoding='utf-8') as outfile:
outfile.write(f"System prompt: ===\n{system}\n===\n"+f"Chat prompt: ===\n{chat_prompt}\n===\n" + f'RESPONSE:\n====\n{text}\n===\n')
return text
except Exception as oops:
retry += 1
if retry >= max_retry:
raise Exception("GPT3 error: %s" % oops)
print('Error communicating with OpenAI:', oops)
sleep(1)