Spaces:
Build error
Build error
import json | |
import os | |
import re | |
from time import sleep, time | |
import openai | |
import tiktoken | |
import yaml | |
from shortGPT.config.api_db import ApiKeyManager | |
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) |