mojtabaa4's picture
add application files
bc68b0b
from langchain_openai import OpenAI
import openai
import sys
import os
import requests
from json import JSONDecodeError
import time
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '../../')))
from config import *
class LLM_API_Call:
def __init__(self, type) -> None:
if type == "openai":
self.llm = OpenAI_API_Call(api_key = LLM_CONFIG[""],
model = LLM_CONFIG["model"])
elif type == "gilas":
self.llm = Gilas_API_Call(api_keys = GILAS_API_KEYS,
model = GILAS_CONFIG["model"],
base_url = GILAS_CONFIG["base_url"])
else:
self.llm = OpenAI(
**LLM_CONFIG
)
def get_LLM_response(self, prompt: str) -> str:
return self.llm.invoke(prompt)
class OpenAI_API_Call:
def __init__(self, api_key, model="gpt-4"):
self.api_key = api_key
openai.api_key = api_key
self.model = model
self.conversation = []
def add_message(self, role, content):
self.conversation.append({"role": role, "content": content})
def get_response(self):
response = openai.ChatCompletion.create(
model=self.model,
messages=self.conversation
)
return response['choices'][0]['message']['content']
def invoke(self, user_input):
self.add_message("user", user_input)
response = self.get_response()
self.add_message("assistant", response)
return response
class Gilas_API_Call:
def __init__(self, api_keys, base_url, model="gpt-4o-mini"):
self.api_keys = api_keys
self.base_url = base_url
self.model = model
self.headers = {
"Content-Type": "application/json"
}
self.conversation = []
self.retry_wait_time = 30
def add_message(self, role, content):
self.conversation.append({"role": role, "content": content})
def get_response(self, api_key):
self.headers["Authorization"] = f"Bearer {api_key}"
data = {
"model": self.model,
"messages": self.conversation
}
response = requests.post(
url=f"{self.base_url}/chat/completions",
headers=self.headers,
json=data
)
if response.status_code == 200:
try:
return response.json()['choices'][0]['message']['content']
except (KeyError, IndexError, ValueError) as e:
raise Exception(f"Unexpected API response format: {e}")
else:
raise Exception(f"Gilas API call failed: {response.status_code} - {response.text}")
def invoke(self, user_input, max_retries=3):
self.add_message("user", user_input)
retries = 0
while retries < max_retries:
for i, api_key in enumerate(self.api_keys):
try:
response = self.get_response(api_key)
self.add_message("assistant", response)
return response
except (JSONDecodeError, Exception) as e:
print(f"Error encountered with API key {api_key}: {e}. Trying next key...")
# Sleep before trying next key
if i == len(self.api_keys) - 1:
print(f"All keys failed. Retrying oldest key after {self.retry_wait_time} seconds...")
time.sleep(self.retry_wait_time)
self.retry_wait_time += 30 # Increase wait time for next retry
retries += 1
raise Exception(f"Failed to get a valid response after {max_retries} retries.")