openai.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import openai
  2. import requests
  3. from .logging import Logger
  4. from typing import Dict, List, Tuple, Generator
  5. class OpenAI:
  6. api_key: str
  7. chat_model: str = "gpt-3.5-turbo"
  8. logger: Logger
  9. def __init__(self, api_key, chat_model=None, logger=None):
  10. self.api_key = api_key
  11. self.chat_model = chat_model or self.chat_model
  12. self.logger = logger or Logger()
  13. def generate_chat_response(self, messages: List[Dict[str, str]]) -> Tuple[str, int]:
  14. """Generate a response to a chat message.
  15. Args:
  16. messages (List[Dict[str, str]]): A list of messages to use as context.
  17. Returns:
  18. Tuple[str, int]: The response text and the number of tokens used.
  19. """
  20. self.logger.log(f"Generating response to {len(messages)} messages using {self.chat_model}...")
  21. response = openai.ChatCompletion.create(
  22. model=self.chat_model,
  23. messages=messages,
  24. api_key=self.api_key
  25. )
  26. result_text = response.choices[0].message['content']
  27. tokens_used = response.usage["total_tokens"]
  28. self.logger.log(f"Generated response with {tokens_used} tokens.")
  29. return result_text, tokens_used
  30. def generate_image(self, prompt: str) -> Generator[bytes, None, None]:
  31. """Generate an image from a prompt.
  32. Args:
  33. prompt (str): The prompt to use.
  34. Yields:
  35. bytes: The image data.
  36. """
  37. self.logger.log(f"Generating image from prompt '{prompt}'...")
  38. response = openai.Image.create(
  39. prompt=prompt,
  40. n=1,
  41. api_key=self.api_key,
  42. size="1024x1024"
  43. )
  44. for image in response.data:
  45. image = requests.get(image.url).content
  46. yield image