Initialize the RAG component. Args: provider: Model provider to use (google, openai, openrouter, ollama) model: Model name to use with the provider use_s3: Whether to use S3 for database storage (default: False)
(self, provider="google", model=None, use_s3: bool = False)
| 155 | If you want to load a new repos, call prepare_retriever(repo_url_or_path) first.""" |
| 156 | |
| 157 | def __init__(self, provider="google", model=None, use_s3: bool = False): # noqa: F841 - use_s3 is kept for compatibility |
| 158 | """ |
| 159 | Initialize the RAG component. |
| 160 | |
| 161 | Args: |
| 162 | provider: Model provider to use (google, openai, openrouter, ollama) |
| 163 | model: Model name to use with the provider |
| 164 | use_s3: Whether to use S3 for database storage (default: False) |
| 165 | """ |
| 166 | super().__init__() |
| 167 | |
| 168 | self.provider = provider |
| 169 | self.model = model |
| 170 | |
| 171 | # Import the helper functions |
| 172 | from api.config import get_embedder_config, get_embedder_type |
| 173 | |
| 174 | # Determine embedder type based on current configuration |
| 175 | self.embedder_type = get_embedder_type() |
| 176 | self.is_ollama_embedder = (self.embedder_type == 'ollama') # Backward compatibility |
| 177 | |
| 178 | # Check if Ollama model exists before proceeding |
| 179 | if self.is_ollama_embedder: |
| 180 | from api.ollama_patch import check_ollama_model_exists |
| 181 | from api.config import get_embedder_config |
| 182 | |
| 183 | embedder_config = get_embedder_config() |
| 184 | if embedder_config and embedder_config.get("model_kwargs", {}).get("model"): |
| 185 | model_name = embedder_config["model_kwargs"]["model"] |
| 186 | if not check_ollama_model_exists(model_name): |
| 187 | raise Exception(f"Ollama model '{model_name}' not found. Please run 'ollama pull {model_name}' to install it.") |
| 188 | |
| 189 | # Initialize components |
| 190 | self.memory = Memory() |
| 191 | self.embedder = get_embedder(embedder_type=self.embedder_type) |
| 192 | |
| 193 | self_weakref = weakref.ref(self) |
| 194 | # Patch: ensure query embedding is always single string for Ollama |
| 195 | def single_string_embedder(query): |
| 196 | # Accepts either a string or a list, always returns embedding for a single string |
| 197 | if isinstance(query, list): |
| 198 | if len(query) != 1: |
| 199 | raise ValueError("Ollama embedder only supports a single string") |
| 200 | query = query[0] |
| 201 | instance = self_weakref() |
| 202 | assert instance is not None, "RAG instance is no longer available, but the query embedder was called." |
| 203 | return instance.embedder(input=query) |
| 204 | |
| 205 | # Use single string embedder for Ollama, regular embedder for others |
| 206 | self.query_embedder = single_string_embedder if self.is_ollama_embedder else self.embedder |
| 207 | |
| 208 | self.initialize_db_manager() |
| 209 | |
| 210 | # Set up the output parser |
| 211 | data_parser = adal.DataClassParser(data_class=RAGAnswer, return_data_class=True) |
| 212 | |
| 213 | # Format instructions to ensure proper output structure |
| 214 | format_instructions = data_parser.get_output_format_str() + """ |
no test coverage detected