import os import logging from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI from langchain_community.llms import HuggingFaceHub from langchain_community.chat_models.huggingface import ChatHuggingFace from dotenv import load_dotenv # Configure logging logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') MISTRAL_ID = "mistralai/Mistral-7B-Instruct-v0.1" ZEPHYR_ID = "HuggingFaceH4/zephyr-7b-beta" def get_model(repo_id="ChatGPT", **kwargs): """ Loads and configures the specified language model. Args: repo_id: The model identifier ("ChatGPT", MISTRAL_ID, or ZEPHYR_ID). **kwargs: Additional keyword arguments for model configuration. Returns: A configured ChatOpenAI or ChatHuggingFace model. """ try: if repo_id == "ChatGPT": model_name = kwargs.get("model_name", "gpt-4o-mini") logging.info(f"Loading OpenAI model: {model_name}") chat_model = ChatOpenAI( openai_api_key = kwargs.get("openai_api_key", None), base_url = "https://openrouter.ai/api/v1", model = "nousresearch/hermes-3-llama-3.1-405b", temperature = 0 ) else: logging.info(f"Loading Hugging Face model: {repo_id}") huggingfacehub_api_token = kwargs.get("HUGGINGFACEHUB_API_TOKEN", None) if not huggingfacehub_api_token: huggingfacehub_api_token = os.environ.get("HUGGINGFACEHUB_API_TOKEN", None) if not huggingfacehub_api_token: raise ValueError("HuggingFace Hub API token not found. " "Set HUGGINGFACEHUB_API_TOKEN environment variable.") os.environ["HF_TOKEN"] = huggingfacehub_api_token llm = HuggingFaceHub( repo_id=repo_id, task="text-generation", model_kwargs={ "max_new_tokens": 512, "top_k": 30, "temperature": 0.1, "repetition_penalty": 1.03, "huggingfacehub_api_token": huggingfacehub_api_token, }) chat_model = ChatHuggingFace(llm=llm) return chat_model except Exception as e: logging.error(f"Error loading model '{repo_id}': {e}") # Handle the error based on your needs: # - Return a default model: # return ChatOpenAI(temperature=0, model="gpt-3.5-turbo") # - Raise a custom exception: # raise RuntimeError(f"Failed to load model: {e}") # - Exit the application: # sys.exit(1) def basic_chain(model=None, prompt=None): """ Creates a basic LangChain chain with a prompt and a language model. Args: model: The language model to use. prompt: The prompt template. Returns: A LangChain chain. """ if not model: model = get_model() if not prompt: prompt = ChatPromptTemplate.from_template("Tell me the most noteworthy books by the author {author}") chain = prompt | model return chain def main(): """ Main function to demonstrate the basic chain. """ load_dotenv() prompt = ChatPromptTemplate.from_template("Tell me the most noteworthy books by the author {author}") chain = basic_chain(prompt=prompt) | StrOutputParser() try: results = chain.invoke({"author": "William Faulkner"}) print(results) except Exception as e: logging.error(f"Error during chain execution: {e}") if __name__ == '__main__': main()