from openai import OpenAI, AsyncOpenAI from dotenv import load_dotenv import os load_dotenv() class ChatOpenAI: def __init__(self, model_name: str = "gpt-4o-mini"): self.model_name = model_name self.openai_api_key = os.getenv("OPENAI_API_KEY") if self.openai_api_key is None: raise ValueError("OPENAI_API_KEY is not set") def run(self, messages, text_only: bool = True, **kwargs): if not isinstance(messages, list): raise ValueError("messages must be a list") client = OpenAI() response = client.chat.completions.create( model=self.model_name, messages=messages, **kwargs ) if text_only: return response.choices[0].message.content return response async def astream(self, messages, **kwargs): if not isinstance(messages, list): raise ValueError("messages must be a list") client = AsyncOpenAI() stream = await client.chat.completions.create( model=self.model_name, messages=messages, stream=True, **kwargs ) async for chunk in stream: content = chunk.choices[0].delta.content if content is not None: yield content