File size: 7,626 Bytes
e294914
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
import os
import logging

from abc import ABC
from typing import Any

from llm.utils.hf_interface import HFInterface
from llm.utils.config import config

from langchain_community.llms import HuggingFaceEndpoint


logger = logging.getLogger(__name__)
logger.setLevel(logging.ERROR)  # because if something went wrong in execution, application can't be work anyway

file_handler = logging.FileHandler(
    "logs/chelsea_llm_huggingfacehub.log")  # for all modules here template for logs file is "llm/logs/chelsea_{module_name}_{dir_name}.log"
logger.setLevel(logging.INFO)  # informed

formatted = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
file_handler.setFormatter(formatted)

logger.addHandler(file_handler)
logger.info("Getting information from apimodel module")

_api = os.environ.get("HUGGINGFACEHUB_API_TOKEN")

class HF_Mistaril(HFInterface, ABC):
    """
    This class represents an interface for the Mistaril large language model from Hugging Face.

    It inherits from `HFInterface` (likely an interface from a Hugging Face library)
    and `ABC` (for abstract base class) to enforce specific functionalities.
    """

    def __init__(self):
        """
        Initializer for the `HF_Mistaril` class.

        - Retrieves configuration values for the Mistaril model from a `config` dictionary:
            - `repo_id`: The ID of the repository containing the Mistaril model on Hugging Face.
            - `max_length`: Maximum length of the generated text.
            - `temperature`: Controls randomness in the generation process.
            - `top_k`: Restricts the vocabulary used for generation.
        - Raises a `ValueError` if the `api` key (presumably stored elsewhere) is missing.
        - Creates an instance of `HuggingFaceEndpoint` using the retrieved configuration
          and the `api` key.
        """

        repo_id = config["HF_Mistrail"]["model"]
        max_length = config["HF_Mistrail"]["max_new_tokens"]
        temperature = config["HF_Mistrail"]["temperature"]
        top_k = config["HF_Mistrail"]["top_k"]

        if not _api:
            raise ValueError(f"API key not provided {_api}")

        self.llm = HuggingFaceEndpoint(
            repo_id=repo_id, max_length=max_length, temperature=temperature, top_k=top_k, token=_api
        )

    def execution(self) -> Any:
        """
        This method attempts to return the underlying `llm` (likely a language model object).

        It wraps the retrieval in a `try-except` block to catch potential exceptions.
        On success, it returns the `llm` object.
        On failure, it logs an error message with the exception details using a logger
        (assumed to be available elsewhere).
        """
        try:
            return self.llm  # `invoke()`
        except Exception as e:
            logger.error("Something wrong with API or HuggingFaceEndpoint", exc_info=e)
            print(f"Something wrong with API or HuggingFaceEndpoint: {e}")

    def model_name(self):
        """
        Simple method that returns the Mistaril model name from the configuration.

        This can be useful for identifying the specific model being used.
        """
        return config["HF_Mistrail"]["model"]

    def __str__(self):
        """
        Defines the string representation of the `HF_Mistaril` object for human readability.

        It combines the class name and the model name retrieved from the `model_name` method
        with an underscore separator.
        """
        return f"{self.__class__.__name__}_{self.model_name()}"

    def __repr__(self):
        """
        Defines the representation of the `HF_Mistaril` object for debugging purposes.

        It uses `hasattr` to check if the `llm` attribute is set.
        - If `llm` exists, it returns a string like `HF_Mistaril(llm=HuggingFaceEndpoint(...))`,
          showing the class name and the `llm` object information.
        - If `llm` is not yet set (during initialization), it returns
          `HF_Mistaril(llm=not initialized)`, indicating the state.
        """
        llm_info = f"llm={self.llm}" if hasattr(self, 'llm') else 'llm=not initialized'
        return f"{self.__class__.__name__}({llm_info})"



class HF_TinyLlama(HFInterface, ABC):
    """
    This class represents an interface for the TinyLlama large language model from Hugging Face.

    It inherits from `HFInterface` (likely an interface from a Hugging Face library)
    and `ABC` (for abstract base class) to enforce specific functionalities.
    """
        
    def __init__(self):
        """
        Initializer for the `HF_TinyLlama` class.

        - Retrieves configuration values for the Mistaril model from a `config` dictionary:
            - `repo_id`: The ID of the repository containing the TinyLlama model on Hugging Face.
            - `max_length`: Maximum length of the generated text.
            - `temperature`: Controls randomness in the generation process.
            - `top_k`: Restricts the vocabulary used for generation.
        - Raises a `ValueError` if the `api` key (presumably stored elsewhere) is missing.
        - Creates an instance of `HuggingFaceEndpoint` using the retrieved configuration
          and the `api` key.
        """

        repo_id = config["HF_TinyLlama"]["model"]
        max_length = config["HF_TinyLlama"]["max_new_tokens"]
        temperature = config["HF_TinyLlama"]["temperature"]
        top_k = config["HF_TinyLlama"]["top_k"]

        if not _api:
            raise ValueError(f"API key not provided {_api}")

        self.llm = HuggingFaceEndpoint(
            repo_id=repo_id, max_length=max_length, temperature=temperature, top_k=top_k, token=_api
        )

    def execution(self) -> Any:
        """
        This method attempts to return the underlying `llm` (likely a language model object).

        It wraps the retrieval in a `try-except` block to catch potential exceptions.
        On success, it returns the `llm` object.
        On failure, it logs an error message with the exception details using a logger
        (assumed to be available elsewhere).
        """
        try:
            return self.llm
        except Exception as e:
            logger.error("Something wrong with API or HuggingFaceEndpoint", exc_info=e)
            print(f"Something wrong with API or HuggingFaceEndpoint: {e}")
        
    def model_name(self):
        """
        Simple method that returns the TinyLlama model name from the configuration.

        This can be useful for identifying the specific model being used.
        """
        return config["HF_TinyLlama"]["model"]
        
    def __str__(self):
        """
        Defines the string representation of the `HF_TinyLlama` object for human readability.

        It combines the class name and the model name retrieved from the `model_name` method
        with an underscore separator.
        """
        return f"{self.__class__.__name__}_{self.model_name()}"

    def __repr__(self):
        """
        Defines the representation of the `HF_TinyLlama` object for debugging purposes.

        It uses `hasattr` to check if the `llm` attribute is set.
        - If `llm` exists, it returns a string like `HF_TinyLlama(llm=HuggingFaceEndpoint(...))`,
          showing the class name and the `llm` object information.
        - If `llm` is not yet set (during initialization), it returns
          `HF_TinyLlama(llm=not initialized)`, indicating the state.
        """
        llm_info = f"llm={self.llm}" if hasattr(self, 'llm') else 'llm=not initialized'
        return f"{self.__class__.__name__}({llm_info})"