Spaces:
Paused
Paused
| # filename: language_models.py | |
| """ | |
| Module for defining various language model classes and their invocation methods. | |
| """ | |
| import os | |
| import logging | |
| from abc import ABC, abstractmethod | |
| from time import time | |
| from langchain_openai import ChatOpenAI | |
| from langchain_anthropic import ChatAnthropic | |
| from langchain_google_genai import ChatGoogleGenerativeAI | |
| from log_config import get_logger | |
| # Configure logging | |
| logger = get_logger('LanguageModels') | |
| def get_api_key(service_name: str) -> str: | |
| """ | |
| Retrieve the API key from environment variables. | |
| Args: | |
| service_name (str): The name of the service. | |
| Returns: | |
| str: The API key for the service. | |
| Raises: | |
| ValueError: If the API key is not set in environment variables. | |
| """ | |
| api_key = os.getenv(service_name) | |
| if not api_key: | |
| logger.error(f"{service_name} environment variable not set.") | |
| raise ValueError(f"API key for {service_name} is required") | |
| return api_key | |
| class LanguageModel(ABC): | |
| """ | |
| Abstract base class for language models. | |
| Defines a common interface for different AI language models. | |
| """ | |
| def invoke(self, prompt: str) -> str: | |
| """ | |
| Send a prompt to the language model and return the response. | |
| Args: | |
| prompt (str): The text prompt to send to the language model. | |
| Returns: | |
| str: The response from the language model. | |
| Raises: | |
| Exception: Propagates any exceptions that occur during invocation. | |
| """ | |
| pass | |
| class GPT4Model(LanguageModel): | |
| """ | |
| A language model class for OpenAI's GPT-4. | |
| """ | |
| def __init__(self): | |
| api_key = get_api_key("OPENAI_API_KEY") | |
| self.model = ChatOpenAI( | |
| model=os.getenv('MODEL_NAME_GPT4', 'gpt-4o'), | |
| temperature=0, | |
| openai_api_key=api_key | |
| ) | |
| def invoke(self, prompt: str) -> str: | |
| if not prompt: | |
| logger.error("Empty prompt provided.") | |
| raise ValueError("Prompt cannot be empty.") | |
| start_time = time() | |
| try: | |
| response = self.model.invoke([prompt]) | |
| logger.info(f"Invocation successful in {time() - start_time:.2f} seconds.") | |
| return response | |
| except Exception as e: | |
| logger.error(f"Failed to invoke GPT-4 with prompt: '{prompt}', error: {str(e)}") | |
| raise | |
| class ClaudeModel(LanguageModel): | |
| """ | |
| A language model class for Anthropic's Claude. | |
| """ | |
| def __init__(self): | |
| api_key = get_api_key("ANTHROPIC_API_KEY") | |
| self.model = ChatAnthropic( | |
| model=os.getenv('MODEL_NAME_CLAUDE_OPUS', 'claude-3-opus-20240229'), | |
| temperature=0, | |
| anthropic_api_key=api_key | |
| ) | |
| def invoke(self, prompt: str) -> str: | |
| if not prompt: | |
| logger.error("Empty prompt provided.") | |
| raise ValueError("Prompt cannot be empty.") | |
| start_time = time() | |
| try: | |
| response = self.model.invoke([prompt]) | |
| logger.info(f"Invocation successful in {time() - start_time:.2f} seconds.") | |
| return response | |
| except Exception as e: | |
| logger.error(f"Failed to invoke Claude with prompt: '{prompt}', error: {str(e)}") | |
| raise | |
| class GeminiModel(LanguageModel): | |
| """ | |
| A language model class for Google's Generative AI, Gemini. | |
| """ | |
| def __init__(self): | |
| api_key = get_api_key("GOOGLE_API_KEY") | |
| self.model = ChatGoogleGenerativeAI( | |
| model=os.getenv('MODEL_NAME_GEMINI', 'gemini-1.5-pro-latest'), | |
| api_key=api_key | |
| ) | |
| def invoke(self, prompt: str) -> str: | |
| if not prompt: | |
| logger.error("Empty prompt provided.") | |
| raise ValueError("Prompt cannot be empty.") | |
| start_time = time() | |
| try: | |
| response = self.model.invoke([prompt]) | |
| logger.info(f"Invocation successful in {time() - start_time:.2f} seconds.") | |
| return response | |
| except Exception as e: | |
| logger.error(f"Failed to invoke Gemini with prompt: '{prompt}', error: {str(e)}") | |
| raise | |
| # file: language_models.py (end) | |