|
import os |
|
import logging |
|
|
|
import instructor |
|
import openai |
|
from openai import OpenAI, AsyncOpenAI |
|
from dotenv import load_dotenv |
|
|
|
logger = logging.getLogger(__name__) |
|
logging.basicConfig(level=logging.INFO) |
|
|
|
load_dotenv(".env") |
|
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") |
|
|
|
|
|
def api_function_call( |
|
system_message, |
|
query: str, |
|
model: str = "gpt-4o", |
|
response_model=None, |
|
max_retries: int = 0, |
|
stream: bool = False, |
|
): |
|
|
|
client = instructor.patch(OpenAI()) |
|
try: |
|
message_data = { |
|
"model": model, |
|
"messages": [ |
|
{"role": "system", "content": system_message}, |
|
{"role": "user", "content": query}, |
|
], |
|
"max_retries": max_retries, |
|
"stream": stream, |
|
} |
|
if response_model is not None: |
|
message_data["response_model"] = response_model |
|
|
|
response = client.chat.completions.create(**message_data) |
|
error = False |
|
|
|
except openai.BadRequestError: |
|
error = True |
|
logger.exception("Invalid request to OpenAI API. See traceback:") |
|
error_message = ( |
|
"Something went wrong while connecting with OpenAI, try again soon!" |
|
) |
|
return error_message, error |
|
|
|
except openai.RateLimitError: |
|
error = True |
|
logger.exception("RateLimit error from OpenAI. See traceback:") |
|
error_message = "OpenAI servers seem to be overloaded, try again later!" |
|
return error_message, error |
|
|
|
except Exception as e: |
|
error = True |
|
logger.exception( |
|
"Some kind of error happened trying to generate the response. See traceback:" |
|
) |
|
error_message = ( |
|
"Something went wrong with connecting with OpenAI, try again soon!" |
|
) |
|
return error_message, error |
|
|
|
if stream is True and response_model is None: |
|
|
|
def answer_generator(): |
|
for chunk in response: |
|
token = chunk.choices[0].delta.content |
|
|
|
token = "" if token is None else token |
|
|
|
yield token |
|
|
|
return answer_generator(), error |
|
|
|
else: |
|
return response, error |
|
|