| import json |
| import logging |
| import os |
| from pathlib import Path |
|
|
| import openai |
| from dotenv import load_dotenv |
| from openai.error import (APIError, RateLimitError, ServiceUnavailableError, |
| Timeout, APIConnectionError, InvalidRequestError) |
| from tenacity import (before_sleep_log, retry, retry_if_exception_type, |
| stop_after_delay, wait_random_exponential, stop_after_attempt) |
| from tiktoken import Encoding, encoding_for_model |
|
|
| logger = logging.getLogger(__name__) |
|
|
| load_dotenv() |
|
|
| |
| MAX_MODEL_TOKEN_COUNT = 4096 |
| |
| MAX_RESPONSE_TOKEN_COUNT = 512 |
|
|
|
|
|
|
| @retry(retry=retry_if_exception_type((APIError, Timeout, RateLimitError, |
| ServiceUnavailableError, APIConnectionError, InvalidRequestError)), |
| wait=wait_random_exponential(max=60), stop=stop_after_attempt(10), |
| before_sleep=before_sleep_log(logger, logging.WARNING)) |
| def openai_api_response(prompt, model, api_key, save_path=None): |
| """ |
| Use a prompt to make a request to the OpenAI API and save the response to a |
| JSON file. |
| """ |
| openai.api_key = api_key |
| try: |
| prompt_messages = [{"role": "user", "content": prompt}] |
| response = openai.ChatCompletion.create( |
| model=model, messages=prompt_messages, temperature=0) |
| finish_reason = response.choices[0].finish_reason |
| if finish_reason != 'stop': |
| logger.error(f'`finish_reason` is `{finish_reason}` for {save_path}.') |
| save_data = {'model': response.model, 'usage': response.usage, |
| 'finish_reason': finish_reason, |
| 'prompt_messages': prompt_messages, |
| 'response': response.choices[0].message.content} |
| except InvalidRequestError: |
| logger.error(f'InvalidRequestError encountered 10 times. Returning empty string for {save_path}.') |
| save_data = {'model': None, 'usage': None, |
| 'finish_reason': 'invalid_request', |
| 'prompt_messages': prompt_messages, |
| 'response': ' '} |
| return save_data['response'] |
|
|