CoolFace
Apppublic

atolat30/pythonic-rag-fastapi-react

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes
chatmodel.py86 linesDownload Raw Back to openai_utils
1from openai import OpenAI, AsyncOpenAI2from dotenv import load_dotenv3import os4 5load_dotenv()6 7 8class ChatOpenAI:9    def __init__(self, model_name: str = "gpt-4"):10        self.model_name = model_name11        self.openai_api_key = os.getenv("OPENAI_API_KEY")12        if self.openai_api_key is None:13            raise ValueError("OPENAI_API_KEY is not set")14        # More conservative token limits15        self.max_tokens = 4000  # Reduced from 8192 to leave room for context16        self.max_total_tokens = 8000  # Reduced from 16384 to be safe17        self.temperature = 0.718 19    def run(self, messages, text_only: bool = True, **kwargs):20        if not isinstance(messages, list):21            raise ValueError("messages must be a list")22 23        client = OpenAI()24        try:25            # Estimate tokens in messages (rough estimate: 1 token ≈ 4 characters)26            total_chars = sum(len(str(msg.get('content', ''))) for msg in messages)27            estimated_tokens = total_chars // 428            29            if estimated_tokens > 4000:  # If messages are too long30                print(f"Warning: Messages too long ({estimated_tokens} estimated tokens). Truncating...")31                # Keep only the most recent messages that fit32                while estimated_tokens > 4000 and len(messages) > 2:  # Keep system message and last user message33                    messages.pop(1)  # Remove oldest message after system message34                    total_chars = sum(len(str(msg.get('content', ''))) for msg in messages)35                    estimated_tokens = total_chars // 436 37            response = client.chat.completions.create(38                model=self.model_name,39                messages=messages,40                max_tokens=self.max_tokens,41                temperature=self.temperature,42                **kwargs43            )44            if text_only:45                return response.choices[0].message.content46            return response47        except Exception as e:48            print(f"Error in chat completion: {str(e)}")49            raise50    51    async def astream(self, messages, **kwargs):52        if not isinstance(messages, list):53            raise ValueError("messages must be a list")54        55        client = AsyncOpenAI()56 57        try:58            # Estimate tokens in messages (rough estimate: 1 token ≈ 4 characters)59            total_chars = sum(len(str(msg.get('content', ''))) for msg in messages)60            estimated_tokens = total_chars // 461            62            if estimated_tokens > 4000:  # If messages are too long63                print(f"Warning: Messages too long ({estimated_tokens} estimated tokens). Truncating...")64                # Keep only the most recent messages that fit65                while estimated_tokens > 4000 and len(messages) > 2:  # Keep system message and last user message66                    messages.pop(1)  # Remove oldest message after system message67                    total_chars = sum(len(str(msg.get('content', ''))) for msg in messages)68                    estimated_tokens = total_chars // 469 70            stream = await client.chat.completions.create(71                model=self.model_name,72                messages=messages,73                max_tokens=self.max_tokens,74                temperature=self.temperature,75                stream=True,76                **kwargs77            )78 79            async for chunk in stream:80                content = chunk.choices[0].delta.content81                if content is not None:82                    yield content83        except Exception as e:84            print(f"Error in chat completion stream: {str(e)}")85            raise86