editor-app-v10 / language_models.py
gilzero's picture
Upload folder using huggingface_hub
cb1a5c9 verified
# 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.
"""
@abstractmethod
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)