| from langchain_groq import ChatGroq
|
| from langchain_openai import ChatOpenAI
|
| from src.config.settings import settings
|
| from typing import Union, Literal
|
|
|
| class LLMFactory:
|
| """Factory for creating LLM instances"""
|
|
|
| _groq_instance = None
|
| _openai_instance = None
|
|
|
| @classmethod
|
| def get_llm(cls, provider: Literal["groq", "openai"] = "groq") -> Union[ChatGroq, ChatOpenAI]:
|
| """Get or create LLM instance (singleton pattern)"""
|
| if provider == "groq":
|
| if cls._groq_instance is None:
|
| cls._groq_instance = ChatGroq(
|
| model=settings.GROQ_MODEL,
|
| temperature=settings.GROQ_TEMPERATURE,
|
| groq_api_key=settings.GROQ_API_KEY
|
| )
|
| return cls._groq_instance
|
| elif provider == "openai":
|
| if cls._openai_instance is None:
|
| cls._openai_instance = ChatOpenAI(
|
| model=settings.OPENAI_MODEL,
|
| temperature=settings.OPENAI_TEMPERATURE,
|
| openai_api_key=settings.OPENAI_API_KEY
|
| )
|
| return cls._openai_instance
|
| else:
|
| raise ValueError(f"Unsupported provider: {provider}")
|
|
|
| @classmethod
|
| def create_new_llm(cls, provider: Literal["groq", "openai"] = "groq", **kwargs) -> Union[ChatGroq, ChatOpenAI]:
|
| """Create a new LLM instance with custom parameters"""
|
| if provider == "groq":
|
| return ChatGroq(
|
| model=kwargs.get("model", settings.GROQ_MODEL),
|
| temperature=kwargs.get("temperature", settings.GROQ_TEMPERATURE),
|
| groq_api_key=kwargs.get("api_key", settings.GROQ_API_KEY)
|
| )
|
| elif provider == "openai":
|
| return ChatOpenAI(
|
| model=kwargs.get("model", settings.OPENAI_MODEL),
|
| temperature=kwargs.get("temperature", settings.OPENAI_TEMPERATURE),
|
| openai_api_key=kwargs.get("api_key", settings.OPENAI_API_KEY)
|
| )
|
| else:
|
| raise ValueError(f"Unsupported provider: {provider}")
|
|
|
| @classmethod
|
| def get_groq_llm(cls) -> ChatGroq:
|
| """Convenience method to get Groq LLM"""
|
| return cls.get_llm("groq")
|
|
|
| @classmethod
|
| def get_openai_llm(cls) -> ChatOpenAI:
|
| """Convenience method to get OpenAI LLM"""
|
| return cls.get_llm("openai")
|
|
|
| @classmethod
|
| def reset_instances(cls):
|
| """Reset singleton instances (useful for testing)"""
|
| cls._groq_instance = None
|
| cls._openai_instance = None |