import os from abc import ABC, abstractmethod from dotenv import load_dotenv, find_dotenv import openai from typing import List class AIEmailGenerator(ABC): """Abstract base class for generating emails using AI.""" @abstractmethod def _configure_api(self): """Configure the API settings.""" pass @abstractmethod def generate_mail_contents(self, email_contents: List[str]) -> List[str]: """Generate more formal and elaborate content for each email topic.""" pass @abstractmethod def generate_mail_format(self, sender: str, recipient: str, style: str, email_contents: List[str]) -> str: """Generate a formatted email with updated content.""" pass class AzureOpenAIEmailGenerator(AIEmailGenerator): """Concrete class for generating emails using OpenAI on Azure.""" def __init__(self, engine: str): """Initialize the AzureOpenAIEmailGenerator class by loading environment variables and configuring OpenAI.""" self.engine = engine self._load_environment() self._configure_api() def _load_environment(self): """Load environment variables from .env file.""" load_dotenv(find_dotenv()) def _configure_api(self): """Configure OpenAI API settings.""" openai.api_type = "azure" openai.api_base = os.getenv('OPENAI_API_BASE') openai.api_version = "2023-03-15-preview" openai.api_key = os.getenv("OPENAI_API_KEY") def generate_mail_contents(self, email_contents: List[str]) -> List[str]: """Generates more formal and elaborate content for each email topic.""" for i, input_text in enumerate(email_contents): prompt = ( f"Rewrite the text to be elaborate and polite.\n" f"Abbreviations need to be replaced.\n" f"Text: {input_text}\n" f"Rewritten text:" ) response = openai.ChatCompletion.create( engine=self.engine, messages=[ {"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": prompt} ], temperature=0, max_tokens=len(input_text) * 3, top_p=0.95, frequency_penalty=0, presence_penalty=0 ) email_contents[i] = response['choices'][0]['message']['content'] return email_contents def generate_mail_format(self, sender: str, recipient: str, style: str, email_contents: List[str]) -> str: """Generates a formatted email with updated content.""" email_contents = self.generate_mail_contents(email_contents) contents_str = "" contents_length = 0 for i, content in enumerate(email_contents): contents_str += f"\nContent{i + 1}: {content}" contents_length += len(content) prompt = ( f"Write a professional email that sounds {style} and includes Content1 and Content2 in that order.\n\n" f"Sender: {sender}\n" f"Recipient: {recipient}{contents_str}\n\n" f"Email Text:" ) response = openai.ChatCompletion.create( engine=self.engine, messages=[ {"role": "system", "content": "You are an AI assistant that helps people find information."}, {"role": "user", "content": prompt} ], temperature=0, max_tokens=contents_length * 2, top_p=0.95, frequency_penalty=0, presence_penalty=0 ) return response['choices'][0]['message']['content'] # Esempio di utilizzo: if __name__ == "__main__": engine = "gpt-4" # Specificare l'engine desiderato email_generator = AzureOpenAIEmailGenerator(engine) sender = "example_sender@example.com" recipient = "example_recipient@example.com" style = "formal" email_contents = ["This is the first content.", "This is the second content."] formatted_email = email_generator.generate_mail_format(sender, recipient, style, email_contents) print(formatted_email)